-% -*- Fundamental -*-
+% 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 <hanwen@xs4all.nl>
+%
+% 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 <http://www.gnu.org/licenses/>.
fet_begingroup ("accordion");
-
%
% These dimensions are the same for all register symbols.
% The different symbols should calculate their other dimensions from them.
define_pixels (accreg_dot_size, accreg_linethickness, accreg_lh);
-fet_beginchar ("accDiscant", "accDiscant")
+fet_beginchar ("accordion register discant", "discant")
save r, pat, lh, lt;
path pat;
set_char_box (r# + accreg_linethickness# / 2,
r# + accreg_linethickness# / 2,
- 0, 2 r# + 0.7 accreg_linethickness#);
+ 0.7 accreg_linethickness# / 2,
+ 2 r# + 0.7 accreg_linethickness# / 2);
lh = vround (2/3 r);
lt = vround (0.7 accreg_linethickness);
-
- h := 3 lh + lt;
+ d := vround (0.7 accreg_linethickness / 2);
+ h := 3 lh + lt - d;
b := w := (3 lh + hround accreg_linethickness) / 2;
penpos1 (hround accreg_linethickness, 0);
penpos3 (hround accreg_linethickness, 180);
penpos4 (lt, 270);
- z1r = (w, h / 2);
+ z1r = (w, 0.5 [-d, h]);
z2r = (0, h);
- z3r = (-b, h / 2);
- z4r = (0, 0);
+ z3r = (-b, 0.5 [-d, h]);
+ z4r = (0, -d);
penlabels (1, 2, 3, 4);
% mf doesn't handle pixel dropouts in outline objects, so we use
% `draw' if not called by mpost
if known miterlimit:
- penstroke z1e
- .. z2e
- .. z3e
- .. z4e
- .. cycle;
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+ unfill z1l
+ .. z2l
+ .. z3l
+ .. z4l
+ .. cycle;
else:
pickup pencircle xscaled accreg_linethickness yscaled lt;
draw z1
pickup penrazor scaled lt rotated 90;
- top z5 = pat intersectionpoint ((0, lh + lt) -- (w, lh + lt));
+ top z5 = pat intersectionpoint ((0, lh + lt - d) -- (w, lh + lt - d));
z6 = z5 xscaled -1;
- bot z7 = pat intersectionpoint ((0, 2 lh) -- (w, 2 lh));
+ bot z7 = pat intersectionpoint ((0, 2 lh - d) -- (w, 2 lh - d));
z8 = z7 xscaled -1;
labels (5, 6, 7, 8);
fet_endchar;
-fet_beginchar ("accDot", "accDot")
+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);
fet_endchar;
-fet_beginchar ("accFreebase", "accFreebase")
+fet_beginchar ("accordion register freebass", "freebass")
save r, lh, lt;
r# = accreg_lh#;
set_char_box (r# + accreg_linethickness# / 2,
r# + accreg_linethickness# / 2,
- 0, 2 r# + 0.7 accreg_linethickness#);
+ 0.7 accreg_linethickness# / 2,
+ 2 r# + 0.7 accreg_linethickness# / 2);
lh = vround r;
lt = vround (0.7 accreg_linethickness);
-
- h := 2 lh + lt;
+ 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);
penpos3 (accreg_linethickness, 180);
penpos4 (lt, 270);
- z1r = (w, h / 2);
+ z1r = (w, 0.5 [-d, h]);
z2r = (0, h);
- z3r = (-b, h / 2);
- z4r = (0, 0);
+ z3r = (-b, 0.5 [-d, h]);
+ z4r = (0, -d);
penlabels (1, 2, 3, 4);
% mf doesn't handle pixel dropouts in outline objects, so we use
% `draw' if not called by mpost
if known miterlimit:
- penstroke z1e
- .. z2e
- .. z3e
- .. z4e
- .. cycle;
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+ unfill z1l
+ .. z2l
+ .. z3l
+ .. z4l
+ .. cycle;
else:
pickup pencircle xscaled accreg_linethickness yscaled lt;
draw z1
fet_endchar;
-fet_beginchar ("accStdbase", "accStdbase")
+fet_beginchar ("accordion register stdbass", "stdbass")
save r, p, lh, lt;
path pat;
set_char_box (r# + accreg_linethickness# / 2,
r# + accreg_linethickness# / 2,
- 0, 2 r# + 0.7 accreg_linethickness#);
+ 0.7 accreg_linethickness# / 2,
+ 2 r# + 0.7 accreg_linethickness# / 2);
lh = vround (1/2 r);
lt = vround (0.7 accreg_linethickness);
-
- h := 4 lh + lt;
+ d := vround (0.7 accreg_linethickness / 2);
+ h := 4 lh + lt - d;
b := w := (4 lh + hround accreg_linethickness) / 2;
penpos1 (hround accreg_linethickness, 0);
penpos3 (hround accreg_linethickness, 180);
penpos4 (lt, 270);
- z1r = (w, h / 2);
+ z1r = (w, 0.5 [-d, h]);
z2r = (0, h);
- z3r = (-b, h / 2);
- z4r = (0, 0);
+ z3r = (-b, 0.5 [-d, h]);
+ z4r = (0, -d);
penlabels (1, 2, 3, 4);
% mf doesn't handle pixel dropouts in outline objects, so we use
% `draw' if not called by mpost
if known miterlimit:
- penstroke z1e
- .. z2e
- .. z3e
- .. z4e
- .. cycle;
+ fill z1r
+ .. z2r
+ .. z3r
+ .. z4r
+ .. cycle;
+ unfill z1l
+ .. z2l
+ .. z3l
+ .. z4l
+ .. cycle;
else:
pickup pencircle xscaled accreg_linethickness yscaled lt;
draw z1
pickup penrazor scaled lt rotated 90;
- top z5 = pat intersectionpoint ((0, lh + lt) -- (w, lh + lt));
+ top z5 = pat intersectionpoint ((0, lh + lt - d) -- (w, lh + lt - d));
z6 = z5 xscaled -1;
- bot z7 = pat intersectionpoint ((0, 3 lh) -- (w, 3 lh));
+ bot z7 = pat intersectionpoint ((0, 3 lh - d) -- (w, 3 lh - d));
z8 = z7 xscaled -1;
labels (5, 6, 7, 8);
fet_endchar;
-fet_beginchar ("accBayanbase", "accBayanbase")
+fet_beginchar ("accordion register bayanbass", "bayanbass")
save lh, lt;
lh = vround accreg_lh;
set_char_box (accreg_lh# + accreg_linethickness# / 2,
accreg_lh# + accreg_linethickness# / 2,
- 0, 3 accreg_lh# + accreg_linethickness#);
+ accreg_linethickness# / 2,
+ 3 accreg_lh# + accreg_linethickness# / 2);
- h := 3 lh + lt;
+ d := vround (accreg_linethickness# / 2);
+ h := 3 lh + lt - d;
- draw_rounded_block ((-w, 0), (-w + lt, h), lt);
- draw_rounded_block ((w - lt, 0), (w, h), lt);
+ 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, 0);
- bot z2 = (-w + lt / 2, lh);
- bot z3 = (-w + lt / 2, 2 lh);
- bot z4 = (-w + lt / 2, 3 lh);
+ 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, 0);
- bot z6 = (w - lt / 2, lh);
- bot z7 = (w - lt / 2, 2 lh);
- bot z8 = (w - lt / 2, 3 lh);
+ 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;
enddef;
-fet_beginchar ("accOldEE", "accOldEE")
+fet_beginchar ("accordion oldEE", "oldEE")
save r, pp, ir, lh, lt, stroke_width;
r# = staff_space#;
z1 = (0, 0);
z2 = (0, ir);
+ z3 = (0, -ir);
penpos1 (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;
pickup pencircle scaled lr;
h := lh + lt;
b := w := (lh + hround accreg_linethickness) / 2;
- penpos3 (hround accreg_linethickness, 0);
- penpos4 (lt, 90);
- penpos5 (hround accreg_linethickness, 180);
- penpos6 (lt, 270);
+ penpos10 (hround accreg_linethickness, 0);
+ penpos11 (lt, 90);
+ penpos12 (hround accreg_linethickness, 180);
+ penpos13 (lt, 270);
- z3r = (w, h / 2);
- z4r = (0, h);
- z5r = (-b, h / 2);
- z6r = (0, 0);
+ z10r = (w, h / 2);
+ z11r = (0, h);
+ z12r = (-b, h / 2);
+ z13r = (0, 0);
- % penlabels (1, 2, 3, 4, 5, 6);
+ % 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:
- penstroke z3e
- .. z4e
- .. z5e
- .. z6e
- .. cycle;
+ fill z10r
+ .. z11r
+ .. z12r
+ .. z13r
+ .. cycle;
+ unfill z10l
+ .. z11l
+ .. z12l
+ .. z13l
+ .. cycle;
else:
pickup pencircle xscaled accreg_linethickness yscaled lt;
- draw z3
- .. z4
- .. z5
- .. z6
+ draw z10
+ .. z11
+ .. z12
+ .. z13
.. cycle;
fi;
+fet_endchar;
+
+
+fet_beginchar ("accordion push", "push");
+ 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#, 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;
+
+ 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_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");