]> git.donarmstrong.com Git - lilypond.git/blobdiff - mf/feta-accordion.mf
Release: bump Welcome versions.
[lilypond.git] / mf / feta-accordion.mf
index e362826faa62eafc64b9aa7bc8b1e6ca6141f5e2..4b8640b8c22546eee8abd33cef1a03a4e02bae09 100644 (file)
@@ -1,8 +1,24 @@
-% -*- 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--2015 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.
@@ -15,21 +31,22 @@ accreg_lh# := 1.0 staff_space#;
 define_pixels (accreg_dot_size, accreg_linethickness, accreg_lh);
 
 
-fet_beginchar ("accDiscant", "accDiscant")
-       save r, p, lh, lt;
-       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# + 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);
@@ -37,21 +54,26 @@ fet_beginchar ("accDiscant", "accDiscant")
        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
@@ -61,15 +83,15 @@ fet_beginchar ("accDiscant", "accDiscant")
                     .. cycle;
        fi;
 
-       p := z4{right}
-            .. z1{up}
-            .. {left}z2;
+       pat := z4{right}
+              .. z1{up}
+              .. {left}z2;
 
        pickup penrazor scaled lt rotated 90;
 
-       top z5 = p 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 = p 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);
@@ -81,7 +103,7 @@ fet_beginchar ("accDiscant", "accDiscant")
 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);
 
@@ -94,21 +116,21 @@ fet_beginchar ("accDot", "accDot")
 fet_endchar;
 
 
-fet_beginchar ("accFreebase", "accFreebase")
-       save r, p, lh, lt;
-       path p;
+fet_beginchar ("accordion register freebass", "freebass")
+       save r, lh, lt;
 
        r# = accreg_lh#;
        define_pixels (r);
 
        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);
@@ -116,21 +138,26 @@ fet_beginchar ("accFreebase", "accFreebase")
        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
@@ -147,21 +174,22 @@ fet_beginchar ("accFreebase", "accFreebase")
 fet_endchar;
 
 
-fet_beginchar ("accStdbase", "accStdbase")
+fet_beginchar ("accordion register stdbass", "stdbass")
        save r, p, lh, lt;
-       path p;
+       path pat;
 
        r# = 2 accreg_lh#;
        define_pixels (r);
 
        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);
@@ -169,21 +197,26 @@ fet_beginchar ("accStdbase", "accStdbase")
        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
@@ -193,15 +226,15 @@ fet_beginchar ("accStdbase", "accStdbase")
                     .. cycle;
        fi;
 
-       p := z4{right}
-            .. z1{up}
-            .. {left}z2;
+       pat := z4{right}
+              .. z1{up}
+              .. {left}z2;
 
        pickup penrazor scaled lt rotated 90;
 
-       top z5 = p 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 = p 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);
@@ -215,7 +248,7 @@ fet_beginchar ("accStdbase", "accStdbase")
 fet_endchar;
 
 
-fet_beginchar ("accBayanbase", "accBayanbase")
+fet_beginchar ("accordion register bayanbass", "bayanbass")
        save lh, lt;
 
        lh = vround accreg_lh;
@@ -223,24 +256,26 @@ fet_beginchar ("accBayanbase", "accBayanbase")
 
        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;
@@ -343,7 +378,7 @@ def def_some_vars =
 enddef;
 
 
-fet_beginchar ("accOldEE", "accOldEE")
+fet_beginchar ("accordion oldEE", "oldEE")
        save r, pp, ir, lh, lt, stroke_width;
 
        r# = staff_space#;
@@ -359,17 +394,21 @@ fet_beginchar ("accOldEE", "accOldEE")
 
        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;
@@ -384,36 +423,147 @@ fet_beginchar ("accOldEE", "accOldEE")
        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");