X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mf%2Ffeta-accordion.mf;h=084092a30961145d03bcb9dc791c040e68ff3e1d;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=5da0be8a57ea4888a892ae3f681ff17997626fb3;hpb=71dd5f6c45009b85d2f9232d31370ee81cf21f5a;p=lilypond.git diff --git a/mf/feta-accordion.mf b/mf/feta-accordion.mf index 5da0be8a57..084092a309 100644 --- a/mf/feta-accordion.mf +++ b/mf/feta-accordion.mf @@ -1,61 +1,101 @@ -% -*- Fundamental -*- - -fet_begingroup ("accordion") +% Feta (not the Font-En-Tja) music font -- draw accordion symbols +% This file is part of LilyPond, the GNU music typesetter. +% +% Copyright (C) 1998--2014 Han-Wen Nienhuys +% +% The LilyPond font is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version, or you can redistribute it under +% the SIL Open Font License. +% +% LilyPond is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with LilyPond. If not, see . -accreg_dot_size# := .5 staff_space#; -accreg_linethickness# := 1.3 stafflinethickness#; +fet_begingroup ("accordion"); % -% This dimension is the same for all register symbols. -% The different symbols should calculate their other -% dimensions from this and accreg_dot_size. +% These dimensions are the same for all register symbols. +% The different symbols should calculate their other dimensions from them. % +accreg_dot_size# := .5 staff_space#; +accreg_linethickness# := 1.3 stafflinethickness#; accreg_lh# := 1.0 staff_space#; define_pixels (accreg_dot_size, accreg_linethickness, accreg_lh); -fet_beginchar ("accDiscant", "accDiscant") - save r, p; - path p; +fet_beginchar ("accordion register discant", "discant") + save r, pat, lh, lt; + path pat; r# = 3/2 accreg_lh#; define_pixels (r); - set_char_box (r#, r#, 0, 2 r#); - - penpos1 (accreg_linethickness, 0); - penpos2 (0.7 accreg_linethickness, 90); - penpos3 (accreg_linethickness, 180); - penpos4 (0.7 accreg_linethickness, 270); + set_char_box (r# + accreg_linethickness# / 2, + r# + accreg_linethickness# / 2, + 0.7 accreg_linethickness# / 2, + 2 r# + 0.7 accreg_linethickness# / 2); - z1 = (r, r); - z2 = (0, 2 r); - z3 = (-r, r); - z4 = (0, 0); + lh = vround (2/3 r); + lt = vround (0.7 accreg_linethickness); + d := vround (0.7 accreg_linethickness / 2); + h := 3 lh + lt - d; + b := w := (3 lh + hround accreg_linethickness) / 2; - penlabels (1, 2, 3, 4); + penpos1 (hround accreg_linethickness, 0); + penpos2 (lt, 90); + penpos3 (hround accreg_linethickness, 180); + penpos4 (lt, 270); - penstroke z1e - .. z2e - .. z3e - .. z4e - .. cycle; + z1r = (w, 0.5 [-d, h]); + z2r = (0, h); + z3r = (-b, 0.5 [-d, h]); + z4r = (0, -d); - p := z4{right} - .. z1{up} - .. {left}z2; + penlabels (1, 2, 3, 4); - z5 = p intersectionpoint ((0, 4/3 r) -- (r, 4/3 r)); + % mf doesn't handle pixel dropouts in outline objects, so we use + % `draw' if not called by mpost + if known miterlimit: + fill z1r + .. z2r + .. z3r + .. z4r + .. cycle; + unfill z1l + .. z2l + .. z3l + .. z4l + .. cycle; + else: + pickup pencircle xscaled accreg_linethickness yscaled lt; + draw z1 + .. z2 + .. z3 + .. z4 + .. cycle; + fi; + + pat := z4{right} + .. z1{up} + .. {left}z2; + + pickup penrazor scaled lt rotated 90; + + top z5 = pat intersectionpoint ((0, lh + lt - d) -- (w, lh + lt - d)); z6 = z5 xscaled -1; - z7 = p intersectionpoint ((0, 2/3 r) -- (r, 2/3 r)); + bot z7 = pat intersectionpoint ((0, 2 lh - d) -- (w, 2 lh - d)); z8 = z7 xscaled -1; labels (5, 6, 7, 8); - pickup penrazor scaled 0.7 accreg_linethickness rotated 90; - draw z5 -- z6; draw z7 @@ -63,89 +103,142 @@ fet_beginchar ("accDiscant", "accDiscant") fet_endchar; -fet_beginchar ("accDot", "accDot") - set_char_box (accreg_dot_size#, accreg_dot_size#, 0, 0); +fet_beginchar ("accordion register dot", "dot") + set_char_box (accreg_dot_size# / 2, accreg_dot_size# / 2, + accreg_dot_size# / 2, accreg_dot_size# / 2); pickup pencircle scaled accreg_dot_size; - drawdot (0, 0); + rt x0 = hround (accreg_dot_size / 2); + top y0 = vround (accreg_dot_size / 2); + + drawdot z0; fet_endchar; -fet_beginchar ("accFreebase", "accFreebase") - save r, p; - path p; +fet_beginchar ("accordion register freebass", "freebass") + save r, lh, lt; r# = accreg_lh#; define_pixels (r); - set_char_box (r#, r#, 0, 2 r#); + set_char_box (r# + accreg_linethickness# / 2, + r# + accreg_linethickness# / 2, + 0.7 accreg_linethickness# / 2, + 2 r# + 0.7 accreg_linethickness# / 2); - penpos1 (accreg_linethickness, 0); - penpos2 (0.7 accreg_linethickness, 90); + lh = vround r; + lt = vround (0.7 accreg_linethickness); + d := vround (0.7 accreg_linethickness / 2); + h := 2 lh + lt - d; + b := w := (2 lh + hround accreg_linethickness) / 2; + + penpos1 (hround accreg_linethickness, 0); + penpos2 (lt, 90); penpos3 (accreg_linethickness, 180); - penpos4 (0.7 accreg_linethickness, 270); + penpos4 (lt, 270); - z1 = (r, r); - z2 = (0, 2 r); - z3 = (-r, r); - z4 = (0, 0); + z1r = (w, 0.5 [-d, h]); + z2r = (0, h); + z3r = (-b, 0.5 [-d, h]); + z4r = (0, -d); penlabels (1, 2, 3, 4); - penstroke z1e - .. z2e - .. z3e - .. z4e - .. cycle; - - pickup penrazor scaled 0.7 accreg_linethickness rotated 90; + % mf doesn't handle pixel dropouts in outline objects, so we use + % `draw' if not called by mpost + if known miterlimit: + fill z1r + .. z2r + .. z3r + .. z4r + .. cycle; + unfill z1l + .. z2l + .. z3l + .. z4l + .. cycle; + else: + pickup pencircle xscaled accreg_linethickness yscaled lt; + draw z1 + .. z2 + .. z3 + .. z4 + .. cycle; + fi; + + pickup penrazor scaled lt rotated 90; draw z1 -- z3; fet_endchar; -fet_beginchar ("accStdbase", "accStdbase") - save r, p; - path p; +fet_beginchar ("accordion register stdbass", "stdbass") + save r, p, lh, lt; + path pat; r# = 2 accreg_lh#; define_pixels (r); - set_char_box (r#, r#, 0, 2 r#); - - penpos1 (accreg_linethickness, 0); - penpos2 (0.7 accreg_linethickness, 90); - penpos3 (accreg_linethickness, 180); - penpos4 (0.7 accreg_linethickness, 270); + set_char_box (r# + accreg_linethickness# / 2, + r# + accreg_linethickness# / 2, + 0.7 accreg_linethickness# / 2, + 2 r# + 0.7 accreg_linethickness# / 2); - z1 = (r, r); - z2 = (0, 2 r); - z3 = (-r, r); - z4 = (0, 0); + lh = vround (1/2 r); + lt = vround (0.7 accreg_linethickness); + d := vround (0.7 accreg_linethickness / 2); + h := 4 lh + lt - d; + b := w := (4 lh + hround accreg_linethickness) / 2; - penlabels (1, 2, 3, 4); + penpos1 (hround accreg_linethickness, 0); + penpos2 (lt, 90); + penpos3 (hround accreg_linethickness, 180); + penpos4 (lt, 270); - penstroke z1e - .. z2e - .. z3e - .. z4e - .. cycle; + z1r = (w, 0.5 [-d, h]); + z2r = (0, h); + z3r = (-b, 0.5 [-d, h]); + z4r = (0, -d); - p := z4{right} - .. z1{up} - .. {left}z2; + penlabels (1, 2, 3, 4); - z5 = p intersectionpoint ((0, 3/2 r) -- (r, 3/2 r)); + % mf doesn't handle pixel dropouts in outline objects, so we use + % `draw' if not called by mpost + if known miterlimit: + fill z1r + .. z2r + .. z3r + .. z4r + .. cycle; + unfill z1l + .. z2l + .. z3l + .. z4l + .. cycle; + else: + pickup pencircle xscaled accreg_linethickness yscaled lt; + draw z1 + .. z2 + .. z3 + .. z4 + .. cycle; + fi; + + pat := z4{right} + .. z1{up} + .. {left}z2; + + pickup penrazor scaled lt rotated 90; + + top z5 = pat intersectionpoint ((0, lh + lt - d) -- (w, lh + lt - d)); z6 = z5 xscaled -1; - z7 = p intersectionpoint ((0, 1/2 r) -- (r, 1/2 r)); + bot z7 = pat intersectionpoint ((0, 3 lh - d) -- (w, 3 lh - d)); z8 = z7 xscaled -1; labels (5, 6, 7, 8); - pickup penrazor scaled 0.7 accreg_linethickness rotated 90; - draw z1 -- z3; draw z5 @@ -155,19 +248,43 @@ fet_beginchar ("accStdbase", "accStdbase") fet_endchar; -fet_beginchar ("accBayanbase", "accBayanbase") - save lh; - lh = accreg_lh; +fet_beginchar ("accordion register bayanbass", "bayanbass") + save lh, lt; + + lh = vround accreg_lh; + lt = vround accreg_linethickness; - set_char_box (accreg_lh#, accreg_lh#, 0, 3 accreg_lh#); + set_char_box (accreg_lh# + accreg_linethickness# / 2, + accreg_lh# + accreg_linethickness# / 2, + accreg_linethickness# / 2, + 3 accreg_lh# + accreg_linethickness# / 2); - draw_gridline ((-w, 0), (w, 0), accreg_linethickness); - draw_gridline ((-w, lh),(w, lh), accreg_linethickness); - draw_gridline ((-w, 2 lh), (w, 2 lh), accreg_linethickness); - draw_gridline ((-w, 3 lh), (w, 3 lh), accreg_linethickness); + d := vround (accreg_linethickness# / 2); + h := 3 lh + lt - d; - draw_gridline ((-w, 0), (-w, 3 lh), accreg_linethickness); - draw_gridline ((w, 0), (w, 3 lh), accreg_linethickness); + draw_rounded_block ((-w, -d), (-w + lt, h), lt); + draw_rounded_block ((w - lt, -d), (w, h), lt); + + pickup penrazor scaled lt rotated 90; + + bot z1 = (-w + lt / 2, -d); + bot z2 = (-w + lt / 2, lh - d); + bot z3 = (-w + lt / 2, 2 lh - d); + bot z4 = (-w + lt / 2, 3 lh - d); + + bot z5 = (w - lt / 2, -d); + bot z6 = (w - lt / 2, lh - d); + bot z7 = (w - lt / 2, 2 lh - d); + bot z8 = (w - lt / 2, 3 lh - d); + + draw z1 + -- z5; + draw z2 + -- z6; + draw z3 + -- z7; + draw z4 + -- z8; fet_endchar; @@ -261,54 +378,192 @@ def def_some_vars = enddef; -fet_beginchar ("accOldEE", "accOldEE") - save pp; +fet_beginchar ("accordion oldEE", "oldEE") + save r, pp, ir, lh, lt, stroke_width; - set_char_box (staff_space#, staff_space#, 0, 2 staff_space#); + r# = staff_space#; + define_pixels (r); - r = staff_space; lr = .4 staff_space - linethickness; ir = .6 staff_space; + stroke_width = .05 staff_space + .5 linethickness; + + set_char_box (r# + accreg_linethickness# / 2, + r# + accreg_linethickness# / 2, + 0, 2 r# + 0.7 accreg_linethickness#); z1 = (0, 0); z2 = (0, ir); + z3 = (0, -ir); penpos1 (blot_diameter, 0); - penpos2 (.05 staff_space + .5 linethickness + blot_diameter, 0); + penpos2 (stroke_width + blot_diameter, 0); + penpos3 (stroke_width + blot_diameter, 0); pickup pencircle scaled (lr + blot_diameter); - for pp := 0 step 45 until 360: - drawdot (0, 0) shifted (ir * (dir pp)); + for pp := 0 step 45 until 135: + drawdot z2 rotated pp; + drawdot z3 rotated pp; - penstroke (z1e - -- z2e) rotated pp; + penstroke (z2e + -- z1e + -- z3e) rotated pp; endfor; - penpos3 (accreg_linethickness, 0); - penpos4 (0.7 accreg_linethickness, 90); - penpos5 (accreg_linethickness, 180); - penpos6 (0.7 accreg_linethickness, 270); + pickup pencircle scaled lr; + + drawdot (0, 0); + + currentpicture := currentpicture shifted (0, h / 2); + + lh = vround (2 r); + lt = vround (0.7 accreg_linethickness); + + h := lh + lt; + b := w := (lh + hround accreg_linethickness) / 2; + + penpos10 (hround accreg_linethickness, 0); + penpos11 (lt, 90); + penpos12 (hround accreg_linethickness, 180); + penpos13 (lt, 270); + + z10r = (w, h / 2); + z11r = (0, h); + z12r = (-b, h / 2); + z13r = (0, 0); + + % penlabels (1, 2, 10, 11, 12, 13); + + % mf doesn't handle pixel dropouts in outline objects, so we use + % `draw' if not called by mpost + if known miterlimit: + fill z10r + .. z11r + .. z12r + .. z13r + .. cycle; + unfill z10l + .. z11l + .. z12l + .. z13l + .. cycle; + else: + pickup pencircle xscaled accreg_linethickness yscaled lt; + draw z10 + .. z11 + .. z12 + .. z13 + .. cycle; + fi; +fet_endchar; - z3 = (r, 0); - z4 = (0, r); - z5 = (-r, 0); - z6 = (0, -r); - % penlabels (1, 2, 3, 4, 5, 6); +fet_beginchar ("accordion push", "push"); + save width, height; - penstroke z3e - .. z4e - .. z5e - .. z6e - .. cycle; + height# := 2.0 staff_space# + 3.0 stafflinethickness#; + width# := 0.4 height#; - pickup pencircle scaled lr; + define_pixels(height, width); - drawdot (0, 0); + save linewidth; + + linewidth# := stafflinethickness# + .05 staff_space#; + define_whole_blacker_pixels (linewidth); + + set_char_box (width#, 0, + 0, height#); + + pickup pencircle scaled linewidth; + + lft x1 = -width; + top y1 = height; + + rt x2 = 0; + y2 = 0.5 * (y1 + y3); + + x3 = x1; + bot y3 = 0; + + save nw_offset, ne_offset; + pair nw_offset, ne_offset; + save sw_offset, se_offset, line_radius; + pair sw_offset, se_offset; + + line_radius := linewidth / 2; + nw_offset := line_radius * unitvector (z1 - z2); + ne_offset := nw_offset rotated -90; + sw_offset := line_radius * unitvector (z3 - z2); + se_offset := sw_offset rotated 90; - currentpicture := currentpicture shifted (0, r); + z4 = ((z1 - ne_offset) + -- (z2 - ne_offset)) + intersectionpoint + ((z2 - se_offset) + -- (z3 - se_offset)); + + fill z1 + ne_offset + -- z2 + ne_offset + .. rt z2 {down} + .. z2 + se_offset + -- z3 + se_offset + .. z3 + sw_offset {- se_offset} + .. z3 - se_offset + -- z4 + -- z1 - ne_offset + .. z1 + nw_offset {ne_offset} + .. cycle; fet_endchar; -fet_endgroup ("accordion") +fet_beginchar ("accordion pull", "pull"); + save width, height; + + height# := 2.0 staff_space# + 3.0 stafflinethickness#; + width# := 0.4 height#; + + define_pixels(height, width); + + save linewidth; + + linewidth# := stafflinethickness# + .05 staff_space#; + define_whole_blacker_pixels (linewidth); + + set_char_box (width# - linewidth#, linewidth#, + 0, height#); + + pickup pencircle scaled linewidth; + + save penradius; + penradius := linewidth / 2; + + rt x1 = linewidth; + bot y1 = 0; + + x2 = x1; + top y2 = height; + + lft x3= -width + linewidth; + y3 = y2; + + x4 = x3; + y4 = y2 - linewidth; + + x5 = x1; + y5 = y4; + + fill z1 + penradius * right {up} + -- z2 + penradius * right {up} + .. z2 + penradius * up {left} + -- z3 + penradius * up {left} + .. z3 + penradius * left {down} + -- z4 + penradius * left {down} + .. z4 + penradius * down {right} + -- z5 + penradius * (down + left) + -- z1 + penradius * left {down} + .. z1 + penradius * down {right} + .. cycle; +fet_endchar; + +fet_endgroup ("accordion");