]> git.donarmstrong.com Git - lilypond.git/blobdiff - mf/feta-schrift.mf
Run `make grand-replace'.
[lilypond.git] / mf / feta-schrift.mf
index 5822941af2179d7f807619e7d8c714f9be7d7a96..6c003c4685ba09ccbe5ca3490dcb167ef40e0759 100644 (file)
@@ -4,15 +4,15 @@
 % source file of the Feta (defintively not an abbreviation for Font-En-Tja)
 % music font
 %
-% (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %      Jan Nieuwenhuizen <janneke@gnu.org>
 %
 
 
-fet_begingroup ("scripts")
+fet_begingroup ("scripts");
 
 def draw_fermata =
-       save alpha, radius, crook_thinness, crook_fatness, dot_radius;
+       save alpha, radius, crook_thinness, crook_fatness, dot_size;
        save pat;
        path pat;
 
@@ -30,7 +30,9 @@ def draw_fermata =
        set_char_box (w#, w#, crook_thinness# / 2, h#);
 
        define_pixels (radius, crook_thinness, crook_fatness);
-       dot_radius = round (4/6 crook_fatness);
+
+       dot_size# = 8/6 crook_fatness#;
+       define_whole_blacker_pixels (dot_size);
 
        penpos1 (crook_thinness, 0);
        penpos2 (crook_fatness, -90);
@@ -42,38 +44,38 @@ def draw_fermata =
               .. {dir (90 - alpha)}z1r
               .. {right}z2r;
        pat := pat
-              & reverse pat xscaled -1
-              & cycle;
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
        fill pat;
 
-       pickup pencircle scaled 2 dot_radius;
+       pickup pencircle scaled dot_size;
        x4 = 0;
-       bot y4 = -crook_thinness / 2;
+       bot y4 = vround (-crook_thinness / 2);
        drawdot z4;
 enddef;
 
 
-fet_beginchar ("fermata up", "ufermata")
+fet_beginchar ("fermata up", "ufermata");
        draw_fermata;
        penlabels (1, 2, 4);
 fet_endchar;
 
 
-fet_beginchar ("fermata down", "dfermata")
+fet_beginchar ("fermata down", "dfermata");
        draw_fermata;
        y_mirror_char;
 fet_endchar;
 
 
 def draw_short_fermata =
-       save fat_factor, thinness, dot_radius;
-       save left_dist, right_dist;
-       pair left_dist, right_dist;
+       save fat_factor, thinness, dot_size;
+       save left_dist, right_dist, se, ne;
+       pair left_dist, right_dist, se, ne;
 
        set_char_box (staff_space#, staff_space#, 0, 2.2 staff_space#);
 
-       dot_radius# = 0.133 staff_space# + 1.33 linethickness#;
-       define_pixels (dot_radius)
+       dot_size# = 0.266 staff_space# + 2.666 linethickness#;
+       define_whole_blacker_pixels (dot_size);
 
        fat_factor = .11;
        thinness = 1.5 linethickness;
@@ -90,54 +92,58 @@ def draw_short_fermata =
        z1 - z4 = whatever * (charwd, -charht);
        z4 = fat_factor [z3, z5];
 
-       left_dist = (unitvector (z3 - z5) rotated 90) * 0.5 thinness;
-       right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 thinness;
-
-       fill bot z5
-            .. (z5 - left_dist)
-            --- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
-                  ((z1 - right_dist) -- (z4 - right_dist)))
-            --- (z1 - right_dist)
-            .. bot z1
-            --- bot z2
-            .. (z2 + right_dist)
-            --- (z3 + right_dist)
+       ne = unitvector (z3 - z5);
+       se = unitvector (z2 - z3);
+
+       left_dist = (ne rotated 90) * 0.5 thinness;
+       right_dist = (se rotated 90) * 0.5 thinness;
+
+       fill bot z5{right}
+            .. (z5 - left_dist){ne}
+            -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
+                 ((z1 - right_dist) -- (z4 - right_dist)))
+            -- (z1 - right_dist){se}
+            .. bot z1{right}
+            -- bot z2{right}
+            .. (z2 + right_dist){-se}
+            -- (z3 + right_dist){-se}
             .. top z3
-            .. (z3 + left_dist)
-            --- (z5 + left_dist)
+            .. (z3 + left_dist){-ne}
+            -- (z5 + left_dist){-ne}
             .. cycle;
 
-       pickup pencircle scaled 2 dot_radius;
+       pickup pencircle scaled dot_size;
 
-       x1 - 2x6 = x2;
+       x1 - 2 x6 = x2;
+       x6 := vround (x6);
        bot y6 = -d;
 
        drawdot z6;
 enddef;
 
-fet_beginchar ("short fermata up", "ushortfermata")
+fet_beginchar ("short fermata up", "ushortfermata");
        draw_short_fermata;
        labels (1, 2, 3, 4, 5, 6);
 fet_endchar;
 
 
-fet_beginchar ("short fermata down", "dshortfermata")
+fet_beginchar ("short fermata down", "dshortfermata");
        draw_short_fermata;
        xy_mirror_char;
 fet_endchar;
 
 
 def draw_long_fermata =
-       save stemthick, beamheight, dot_radius, wd;
+       save stemthick, beamheight, dot_size, wd;
        save pat;
        path pat;
 
-       define_pixels (wd, dot_radius);
-
        wd# = 2.5 staff_space#;
-       stemthick = 1.5 linethickness;
+       stemthick = hround (1.5 linethickness);
        beamheight = 0.3 staff_space + linethickness;
-       dot_radius# = 0.133 staff_space# + 1.333 * linethickness#;
+       dot_size# = 0.266 staff_space# + 2.666 * linethickness#;
+       define_pixels (wd);
+       define_whole_blacker_pixels (dot_size);
 
        set_char_box (wd# / 2, wd# / 2, 0, 3/2 staff_space#);
 
@@ -145,49 +151,44 @@ def draw_long_fermata =
 
        top y1 = h;
        lft x1 = -b;
-       x2 = x3 = 0;
-       y2 = h;
-       y3 = h - beamheight;
 
-       pat := z2
-              --- top z1
-              .. lft z1;
+       pat := top z1{left}
+              .. {down}lft z1;
 
        pickup pencircle scaled stemthick;
 
-       x4 = -b + stemthick;
-       y4 = y3;
-       lft x5 = -b;
-       bot y5 = -d;
+       x2 = -b + stemthick;
+       y2 = h - beamheight;
+       lft x3 = -b;
+       bot y3 = -d;
 
        pat := pat
-              --- lft z5
-              .. bot z5
-              .. rt z5
-              --- z4
-              --- z3;
+              -- lft z3
+              .. bot z3
+              .. rt z3
+              -- z2;
        pat := pat
-              & reverse pat xscaled -1
-              & cycle;
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
 
        fill pat;
 
-       pickup pencircle scaled 2 dot_radius;
+       pickup pencircle scaled dot_size;
 
-       x6 = 0;
-       bot y6 = -d;
+       x4 = 0;
+       bot y4 = -d;
 
-       drawdot z6;
+       drawdot z4;
 enddef;
 
 
-fet_beginchar ("long fermata up", "ulongfermata")
+fet_beginchar ("long fermata up", "ulongfermata");
        draw_long_fermata;
-       labels (1, 2, 3, 4, 5, 6);
+       labels (1, 2, 3, 4);
 fet_endchar;
 
 
-fet_beginchar ("long fermata down", "dlongfermata")
+fet_beginchar ("long fermata down", "dlongfermata");
        draw_long_fermata;
        y_mirror_char;
 fet_endchar;
@@ -196,21 +197,23 @@ fet_endchar;
 def draw_very_long_fermata =
        save ibeamheight, obeamheight;
        save ihwd, ohwd, iht, oht;      % inner/outer half_width/height
-       save stemthick, dot_radius;
+       save stemthick, dot_size;
        save opat, ipat;
        path opat, ipat;
 
-       define_pixels (ihwd, ohwd, iht, oht)
-
        ihwd# = 1.0 staff_space#;
        ohwd# = 1.5 staff_space#;
        iht# = 0.9 staff_space#;
        oht# = 1.6 staff_space#;
+       define_pixels (ihwd, ohwd, iht, oht)
+
+       stemthick = hround (1.5 linethickness);
+       ibeamheight# = 0.3 staff_space#;
+       obeamheight# = 0.5 staff_space#;
+       define_pixels (ibeamheight, obeamheight);
 
-       stemthick = 1.5 linethickness;
-       ibeamheight = 0.3 staff_space;
-       obeamheight = 0.5 staff_space;
-       dot_radius = (iht - ibeamheight) * 4/10;
+       dot_size# = (iht# - ibeamheight#) * 8/10;
+       define_whole_blacker_pixels (dot_size);
 
        set_char_box (ohwd#, ohwd#, 0, oht#);
 
@@ -218,71 +221,61 @@ def draw_very_long_fermata =
 
        top y1 = oht;
        lft x1 = -ohwd;
-       x2 = x3 = 0;
-       y2 = oht;
-       y3 = oht - obeamheight;
        top y11 = iht;
        lft x11 = -ihwd;
-       x12 = x13 = 0;
-       y12 = iht;
-       y13 = iht - ibeamheight;
 
-       opat := z2
-               --- top z1
-               .. lft z1;
-       ipat := z12
-               --- top z11
-               .. lft z11;
+       opat := top z1{left}
+               .. {down}lft z1;
+       ipat := top z11{left}
+               .. {down}lft z11;
 
        pickup pencircle scaled stemthick;
 
-       x4 = -ohwd + stemthick;
-       y4 = y3;
-       lft x5 = -ohwd;
-       bot y5 = 0;
-       x14 = -ihwd + stemthick;
-       y14 = y13;
-       lft x15 = -ihwd;
-       bot y15 = 0;
+       x2 = -ohwd + stemthick;
+       y2 = oht - obeamheight;
+       lft x3 = -ohwd;
+       bot y3 = 0;
+       x12 = -ihwd + stemthick;
+       y12 = iht - ibeamheight;
+       lft x13 = -ihwd;
+       bot y13 = 0;
 
        opat := opat
-               --- lft z5
-               .. bot z5
-               .. rt z5
-               --- z4
-               --- z3;
+               -- lft z3
+               .. bot z3
+               .. rt z3
+               -- z2;
        opat := opat
-               & reverse opat xscaled -1
-               & cycle;
+               -- reverse opat xscaled -1 shifted (-feta_eps, 0)
+               -- cycle;
        ipat := ipat
-               --- lft z15
-               .. bot z15
-               .. rt z15
-               --- z14
-               --- z13;
+               -- lft z13
+               .. bot z13
+               .. rt z13
+               -- z12;
        ipat := ipat
-               & reverse ipat xscaled -1
-               & cycle;
+               -- reverse ipat xscaled -1 shifted (-feta_eps, 0)
+               -- cycle;
 
        fill opat;
        fill ipat;
 
-       pickup pencircle scaled 2 dot_radius;
+       pickup pencircle scaled dot_size;
 
-       x6 = 0;
-       bot y6 = -d;
+       x4 = 0;
+       bot y4 = -d;
 
-       drawdot z6;
+       drawdot z4;
 enddef;
 
 
-fet_beginchar ("very long fermata up", "uverylongfermata")
+fet_beginchar ("very long fermata up", "uverylongfermata");
        draw_very_long_fermata;
-       labels (1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 6);
+       labels (1, 2, 3, 11, 12, 13, 4);
 fet_endchar;
 
 
-fet_beginchar ("very long fermata down", "dverylongfermata")
+fet_beginchar ("very long fermata down", "dverylongfermata");
        draw_very_long_fermata;
        y_mirror_char;
 fet_endchar;
@@ -294,7 +287,7 @@ fet_endchar;
 % the same way in the score.
 %
 
-fet_beginchar ("Thumb", "thumb")
+fet_beginchar ("Thumb", "thumb");
        save thin, height, width, thick, depth;
        height# = 5/4 width#;
        height# = staff_space#;
@@ -335,13 +328,13 @@ fet_beginchar ("Thumb", "thumb")
 fet_endchar;
 
 
-%
-% FIXME: rounded endings
 %
 % `\accent' is TeX reserved.
 %
 
 def draw_accent (expr bottom_left, top_right, thickness, diminish) =
+       save thinning_start;
+       thinning_start = 0.4;
        pickup pencircle scaled thickness;
 
        lft x1 = xpart bottom_left;
@@ -350,7 +343,7 @@ def draw_accent (expr bottom_left, top_right, thickness, diminish) =
        bot y6 = ypart bottom_left;
 
        rt z4 = (xpart top_right, (ypart top_right + ypart bottom_left) / 2);
-       x5 = x3 = (xpart top_right + xpart bottom_left) / 2
+       x5 = x3 = thinning_start [xpart top_right, xpart bottom_left]
                  - linethickness + 0.1 staff_space;
        z3 = whatever [z1, z4];
        z5 = whatever [z6, z4];
@@ -365,35 +358,35 @@ def draw_accent (expr bottom_left, top_right, thickness, diminish) =
        y7 = y4;
 
        fill z1l
-            --- z3l
-            --- z7
-            --- z5l
-            --- z6l
+            -- z3l
+            -- z7
+            -- z5l
+            -- z6l
             .. lft z6{down}
             .. bot z6
             .. z6r
-            --- z4l
+            -- z4l
             ..tension 0.8.. rt z4
             ..tension 0.8.. z4r
-            --- z1r
+            -- z1r
             .. top z1
             .. lft z1{down}
             .. cycle;
 enddef;
 
 
-fet_beginchar ("> accent", "sforzato")
+fet_beginchar ("> accent", "sforzato");
        set_char_box (.9 staff_space#, .9 staff_space#,
                      .5 staff_space#, .5 staff_space#);
 
        draw_accent ((-w, -d), (w, h),
-                    0.05 staff_space + linethickness, 0.6);
+                    0.05 staff_space + linethickness, 0.7);
        penlabels (1, 3, 4, 5, 6);
        labels (7);
 fet_endchar;
 
 
-fet_beginchar ("espr", "espr")
+fet_beginchar ("espr", "espr");
        set_char_box (1.9 staff_space#, 1.9 staff_space#,
                      .5 staff_space#, .5 staff_space#);
 
@@ -403,7 +396,7 @@ fet_beginchar ("espr", "espr")
 fet_endchar;
 
 
-fet_beginchar ("staccato dot", "staccato")
+fet_beginchar ("staccato dot", "staccato");
        save radius;
        radius# = 0.20 * staff_space#;
        define_whole_pixels (radius);
@@ -419,7 +412,7 @@ def draw_staccatissimo =
        save radius, height;
        height# = .8 staff_space#;
        radius# = linethickness# + .1 staff_space#;
-       define_whole_pixels (radius);
+       define_whole_blacker_pixels (radius);
        define_pixels (height);
 
        draw_brush ((0, 0), linethickness, (0, height), 2 radius);
@@ -429,52 +422,51 @@ def draw_staccatissimo =
 enddef;
 
 
-fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo")
+fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo");
        draw_staccatissimo;
 fet_endchar;
 
 
-fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo")
+fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo");
        draw_staccatissimo;
        y_mirror_char;
 fet_endchar;
 
 
-fet_beginchar ("portato/single tenuto", "tenuto")
+fet_beginchar ("portato/single tenuto", "tenuto");
        save thick;
        thick# = 1.6 linethickness#;
-       define_whole_pixels (thick);
+       define_whole_blacker_pixels (thick);
 
        set_char_box (.6 staff_space#, .6 staff_space#,
-                     thick# / 2,thick# / 2);
+                     thick# / 2, thick# / 2);
 
-       pickup pencircle scaled thick;
        draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
 fet_endchar;
 
 
 def draw_portato =
-       save thick, radius;
+       save thick, dot_size;
        thick# = 1.4 linethickness#;
-       radius# = 1.2 linethickness# + 0.04 staff_space#;
-       define_whole_pixels (thick, radius);
+       dot_size# = 2.4 linethickness# + 0.08 staff_space#;
+       define_whole_blacker_pixels (thick, dot_size);
 
        set_char_box (.6 staff_space#, .6 staff_space#,
-                     thick# / 2, .5 staff_space# + radius#);
+                     thick# / 2, .5 staff_space# + .5 dot_size#);
 
        draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
 
-       pickup pencircle scaled 2 radius;
+       pickup pencircle scaled dot_size;
        drawdot (0, h);
 enddef;
 
 
-fet_beginchar ("portato/tenuto with staccato", "uportato")
+fet_beginchar ("portato/tenuto with staccato", "uportato");
        draw_portato;
 fet_endchar;
 
 
-fet_beginchar ("portato/tenuto with staccato", "dportato")
+fet_beginchar ("portato/tenuto with staccato", "dportato");
        draw_portato;
        y_mirror_char
 fet_endchar;
@@ -482,8 +474,8 @@ fet_endchar;
 
 def draw_marcato =
        save fat_factor, thinness;
-       save left_dist, right_dist;
-       pair left_dist, right_dist;
+       save left_dist, right_dist, ne, se;
+       pair left_dist, right_dist, ne, se;
 
        set_char_box (staff_space# / 2, staff_space# / 2,
                      0, 1.1 staff_space#);
@@ -503,26 +495,29 @@ def draw_marcato =
        z1 - z4 = whatever * (charwd, -charht);
        z4 = fat_factor [z3, z5];
 
-       left_dist = (unitvector (z3 - z5) rotated 90) * 0.5 thinness;
-       right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 thinness;
-
-       fill bot z5
-            .. (z5 - left_dist)
-            --- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
-                  ((z1 - right_dist) -- (z4 - right_dist)))
-            --- (z1 - right_dist)
-            .. bot z1
-            --- bot z2
-            .. (z2 + right_dist)
-            --- (z3 + right_dist)
+       ne = unitvector (z3 - z5);
+       se = unitvector (z2 - z3);
+
+       left_dist = (ne rotated 90) * 0.5 thinness;
+       right_dist = (se rotated 90) * 0.5 thinness;
+
+       fill bot z5{right}
+            .. (z5 - left_dist){ne}
+            -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
+                 ((z1 - right_dist) -- (z4 - right_dist)))
+            -- (z1 - right_dist){se}
+            .. bot z1{right}
+            -- bot z2{right}
+            .. (z2 + right_dist){-se}
+            -- (z3 + right_dist){-se}
             .. top z3
-            .. (z3 + left_dist)
-            --- (z5 + left_dist)
+            .. (z3 + left_dist){-ne}
+            -- (z5 + left_dist){-ne}
             .. cycle;
 enddef;
 
 
-fet_beginchar ("marcato up", "umarcato")
+fet_beginchar ("marcato up", "umarcato");
        draw_marcato;
        labels (1, 2, 3, 4, 5);
 fet_endchar;
@@ -534,7 +529,7 @@ fet_endchar;
 % it is *point*-symmetric with the "up" version
 %
 
-fet_beginchar ("marcato down", "dmarcato")
+fet_beginchar ("marcato down", "dmarcato");
        draw_marcato;
        xy_mirror_char;
 fet_endchar;
@@ -546,7 +541,7 @@ fet_endchar;
 % TODO: too light at 20pt
 %
 
-fet_beginchar ("open (unstopped)", "open")
+fet_beginchar ("open (unstopped)", "open");
        save thin, height, width, thick;
 
        height# = 5/4 width#;
@@ -578,20 +573,29 @@ fet_beginchar ("open (unstopped)", "open")
 fet_endchar;
 
 
-fet_beginchar ("plus (stopped)", "stopped")
-       save thick, size;
+fet_beginchar ("plus (stopped)", "stopped");
+       save hthick, vthick, size, outer_hsize, outer_vsize;
 
-       thick = 2 linethickness;
+       hthick# = vthick# = 2 linethickness#;
        size# = 1.1 staff_space#;
+       define_whole_blacker_pixels (vthick);
+       define_whole_vertical_blacker_pixels (hthick);
 
        set_char_box (size# / 2, size# / 2, size# / 2, size# / 2);
 
-       draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
-       addto currentpicture also currentpicture rotated 90;
+       outer_hsize = hround ((b + w - vthick) / 2);
+       outer_vsize = vround ((h + d - hthick) / 2);
+       w := b := (2 outer_hsize + vthick) / 2;
+       h := d := (2 outer_vsize + hthick) / 2;
+
+       draw_rounded_block ((-b, -d + outer_vsize),
+                           (w, -d + outer_vsize + hthick), hthick);
+       draw_rounded_block ((-b + outer_hsize, -d),
+                           (-b + outer_hsize + vthick, h), vthick);
 fet_endchar;
 
 
-fet_beginchar ("Upbow", "upbow")
+fet_beginchar ("Upbow", "upbow");
        save ht, wd, thick;
 
        thick = 1.4 linethickness;
@@ -605,15 +609,15 @@ fet_beginchar ("Upbow", "upbow")
 fet_endchar;
 
 
-fet_beginchar ("Downbow", "downbow")
+fet_beginchar ("Downbow", "downbow");
        save stemthick, beamheight, wd;
        save pat;
        path pat;
 
+       wd# = 1.5 staff_space#;
        define_pixels (wd);
 
-       wd# = 1.5 staff_space#;
-       stemthick = 1.2 linethickness;
+       stemthick = hround (1.2 linethickness);
 
        set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#);
 
@@ -623,32 +627,29 @@ fet_beginchar ("Downbow", "downbow")
 
        top y1 = h;
        lft x1 = -b;
-       x2 = x3 = 0;
-       y2 = h;
-       y3 = h - beamheight;
 
-       pat := z2
-              --- top z1
-              .. lft z1;
+       pat := top z1{left}
+              .. {down}lft z1;
 
        pickup pencircle scaled stemthick;
 
-       x4 = -b + stemthick;
-       y4 = y3;
-       lft x5 = -b;
-       bot y5 = -d;
+       x2 = -b + stemthick;
+       y2 = h - beamheight;
+       lft x3 = -b;
+       bot y3 = -d;
 
        pat := pat
-              --- lft z5
-              .. bot z5
-              .. rt z5
-              --- z4
-              --- z3;
+              -- lft z3
+              .. bot z3
+              .. rt z3
+              -- z2;
        pat := pat
-              & reverse pat xscaled -1
-              & cycle;
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
 
        fill pat;
+
+       labels (1, 2, 3);
 fet_endchar;
 
 %
@@ -695,7 +696,7 @@ def draw_turn =
                  .. z3r{down}
                  .. z2r{left};
        fill swoosh
-            .. (swoosh scaled -1)
+            .. swoosh scaled -1 shifted (-feta_eps, -feta_eps)
             .. cycle;
 
        x5r = x4;
@@ -710,17 +711,17 @@ def draw_turn =
                 .. z6l
                 -- cycle;
        fill ploop;
-       fill ploop scaled -1;
+       fill ploop scaled -1 shifted (-feta_eps, -feta_eps);
 enddef;
 
 
-fet_beginchar ("Reverse turn","reverseturn")
+fet_beginchar ("Reverse turn", "reverseturn");
        draw_turn;
        currentpicture := currentpicture yscaled -1;
 fet_endchar;
 
 
-fet_beginchar ("Turn","turn")
+fet_beginchar ("Turn", "turn");
        draw_turn;
        penlabels (1, 2, 3, 4, 5, 6, 7);
 fet_endchar;
@@ -735,7 +736,7 @@ fet_endchar;
 % FIXME generic macros for serifs: top of the t and bottom of r
 %
 
-fet_beginchar ("Trill (`tr')", "trill")
+fet_beginchar ("Trill (`tr')", "trill");
        save start_nib_angle, ascender_extra, ex, hair_thick, fatness;
        save slant, t_fatness, r_fatness, kerning, t_overshoot;
        save uitschieter, bulb_size, krul_ang;
@@ -805,8 +806,8 @@ fet_beginchar ("Trill (`tr')", "trill")
        krul_p := z4{up}
                  ..tension 0.98.. z5
                  .. z6
-                 .. z5
-                 --- z7;
+                 .. z5{z7 - z5}
+                 -- z7;
 
        z4' = point 0.85 of krul_p;
        penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90);
@@ -822,7 +823,6 @@ fet_beginchar ("Trill (`tr')", "trill")
             .. z4r{down}
             .. z3r{left}
             ..tension (1.5 + .7 slant).. z2r{up}
-            .. z1r
             -- cycle;
 
        z5' = point 1.1 of krul_p;
@@ -840,8 +840,8 @@ fet_beginchar ("Trill (`tr')", "trill")
        z6''' = point 2.9 of krul_p;
        penpos6''' (hair_thick, angle (direction 2.9 of krul_p) + 90);
        penpos7 (hair_thick, up_angle + 90);
-       z7' = point 3.3 of krul_p;
-       penpos7' (hair_thick, angle (direction 3.3 of krul_p) + 90);
+       z7' = point 3.2 of krul_p;
+       penpos7' (hair_thick, angle (direction 3.2 of krul_p) + 90);
 
        % the left loop
        penstroke z5'e{direction 1.1 of krul_p}
@@ -863,7 +863,7 @@ fet_beginchar ("Trill (`tr')", "trill")
        penpos11 (hair_thick, -4);
        z11r = z9r;
 
-       z13l = (x9l + r_width, y11 -  linethickness);
+       z13l = (x9l + r_width, y11 - linethickness);
        penpos13 (r_flare, 180);
 
        z15 = z13r - (bulb_size * r_fatness, 0);
@@ -874,30 +874,33 @@ fet_beginchar ("Trill (`tr')", "trill")
        before := z13l{up}
                  .. {down}z11l;
        after := z9r{up}
-                .. z7r
-                --- z7'r;
+                .. z7r{z7' - z7}
+                -- z7'r;
        (u, v) = before intersectiontimes after;
 
+       save before_bulb, after_bulb;
+       path before_bulb, after_bulb;
+       before_bulb := z9r{up}
+                      ..tension 0.94.. z13r{down};
+       after_bulb := z13l{up}
+                     ..tension 1.06.. z15{down};
+       (u_bulb, v_bulb) = before_bulb intersectiontimes after_bulb;
+
        % the connection between `t' and `r', the body of the `r',
-       % and part of the bulb
+       % and the bulb
        fill z7'l
-            --- z7l
+            -- z7l{z7 - z7'}
             .. z9l{down}
-            --- simple_serif (z10l, z10r, -30)
-            --- z9r{up}
-            ..tension 0.94.. z13r{down}
-            -- z15{down}
+            -- simple_serif (z10l, z10r, -30)
+            -- z9r{up}
+            .. subpath (0, u_bulb) of before_bulb
+            .. subpath (v_bulb, infinity) of after_bulb
+            .. z14
             .. z13l{up}
             .. subpath (0, u) of before
             .. subpath (v, infinity) of after
             -- cycle;
 
-       % the rest of the bulb
-       fill z15{up}
-            ..tension 1.06.. z13l{down}
-            .. z14
-            .. cycle;
-
        penlabels (range 1 thru 15);
        penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7');
 fet_endchar;
@@ -909,11 +912,10 @@ def draw_heel =
        path pat;
 
        radius# := .5 staff_space#;
-       define_pixels (radius);
 
        set_char_box (radius#, radius#, radius#, 2/3 staff_space#);
 
-       thickness := 1.5 linethickness;
+       thickness := hround (1.5 linethickness);
 
        pickup pencircle scaled thickness;
 
@@ -928,25 +930,25 @@ def draw_heel =
 
        pat := top z3{right}
               .. lft z2{up}
-              .. lft z1{up}
+              -- lft z1
               .. top z1
-              .. rt z1{down}
-              .. rt z2{down}
+              .. rt z1
+              -- rt z2{down}
               .. bot z3{left};
        pat := pat
-              & reverse pat xscaled -1
-              & cycle;
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
        fill pat;
 enddef;
 
 
-fet_beginchar ("left heel", "upedalheel")
+fet_beginchar ("left heel", "upedalheel");
        draw_heel;
        labels (1, 2, 3);
 fet_endchar;
 
 
-fet_beginchar ("right heel", "dpedalheel")
+fet_beginchar ("right heel", "dpedalheel");
        draw_heel;
        y_mirror_char;
 fet_endchar;
@@ -966,49 +968,60 @@ def draw_toe =
 enddef;
 
 
-fet_beginchar ("left toe", "upedaltoe")
+fet_beginchar ("left toe", "upedaltoe");
        draw_toe;
 fet_endchar;
 
 
-fet_beginchar ("right toe", "dpedaltoe")
+fet_beginchar ("right toe", "dpedaltoe");
        draw_toe;
        y_mirror_char;
 fet_endchar;
 
 
-fet_beginchar ("Flageolet", "flageolet")
-       save height, width, thickness;
-       height #= 4/15 staffsize#;
-       width #= height#;
-       thickness #= blot_diameter#;
-       define_pixels (height, width, thickness);
+fet_beginchar ("Flageolet", "flageolet");
+       save height, width, thickness, superness;
 
-       set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
+       height# = 4/15 staffsize#;
+       width# = height#;
+       thickness# = blot_diameter#;
+       define_pixels (height, width);
+       define_whole_blacker_pixels (thickness);
 
-       pickup pencircle scaled thickness;
+       set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
 
        penpos1 (thickness, 90);
        penpos2 (thickness, 180);
        penpos3 (thickness, 270);
        penpos4 (thickness, 0);
 
-       x1= .5 [x2, x4];
        x1 = 0;
-       top y1 = height / 2;
-       rt x4 - lft x2 = width;
+       y1r = h;
+       x4r = w;
+       x2r = -x4r;
        y2 = 0;
        y4 = y2;
        x3 = x1;
-       bot y3 = -height / 2;
+       y3r = -y1r;
 
        penlabels (1, 2, 3, 4);
 
-       penstroke z1e
-                 .. z2e
-                 .. z3e
-                 .. z4e
-                 .. cycle;
+       % 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;
+       else:
+               pickup pencircle scaled thickness;
+               draw z1
+                    .. z2
+                    .. z3
+                    .. z4
+                    .. cycle;
+       fi;
 fet_endchar;
 
 
@@ -1016,7 +1029,7 @@ fet_endchar;
 % TODO:  ARGRGHGH code dup.
 %
 
-fet_beginchar ("Segno", "segno")
+fet_beginchar ("Segno", "segno");
        save thin, thick, ball_diam, darkness, pointheight;
        save wd, ht, thick_nibangle, ball_nib_thick;
        save turndir;
@@ -1092,7 +1105,7 @@ fet_beginchar ("Segno", "segno")
 fet_endchar;
 
 
-fet_beginchar ("Coda", "coda")
+fet_beginchar ("Coda", "coda");
        save stickout, thin, thick, codawidth, codaheight;
 
        stickout# = 0.35 staff_space#;
@@ -1120,18 +1133,23 @@ fet_beginchar ("Coda", "coda")
 
        penlabels (1, 2, 3, 4);
 
-       penstroke z1e{up}
-                 .. z2e{right}
-                 .. z3e{down}
-                 .. z4e{left}
-                 .. cycle;
+       fill z1l{up}
+            .. z2l{right}
+            .. z3l{down}
+            .. z4l{left}
+            .. cycle;
+       unfill z1r{up}
+              .. z2r{right}
+              .. z3r{down}
+              .. z4r{left}
+              .. cycle;
 
-       draw_gridline ((0,-h),(0,h),thin);
-       draw_gridline ((-w,0),(w,0),thin);
+       draw_gridline ((0, -h), (0, h), thin);
+       draw_gridline ((-w, 0), (w, 0), thin);
 fet_endchar;
 
 
-fet_beginchar ("Varied Coda", "varcoda")
+fet_beginchar ("Varied Coda", "varcoda");
        save thin, thick, codawidth, codaheight;
        thin# = 1.2 linethickness#;
        thick# = 1.0 linethickness# + 0.25 staff_space#;
@@ -1142,17 +1160,17 @@ fet_beginchar ("Varied Coda", "varcoda")
        set_char_box (codawidth# + thick#, codawidth# + thick#,
                      codaheight# + thick#, codaheight# + thick#);
 
-       x1 = -codawidth;
+       x1 = -codawidth + thick - .5 blot_diameter;
        y1 = y2 - thin;
-       x2 = codawidth;
+       x2 = codawidth - thick + .5 blot_diameter;
        y2 = codaheight;
-       draw_rounded_block (z1, z2, blot_diameter);
+       draw_square_block (z1, z2);
 
-       x3 = x1;
+       x3 = -codawidth;
        y3 = -codaheight;
-       x4 = x1 + thick;
+       x4 = x3 + thick;
        y4 = y2;
-       draw_rounded_block (z3, z4, blot_diameter);
+       draw_block (z3, z4);
 
        labels (1, 2, 3, 4);
 
@@ -1189,7 +1207,7 @@ def draw_comma =
             .. z2r{dir alpha}
             .. z1r{dir (alpha - 90)}
             .. z3l{dir (270 - alpha)}
-            .. z4l{dir (alpha + 180)}
+            .. z4l{dir (180 - alpha)}
             .. z3r{dir (90-alpha)}
             .. cycle;
 enddef;
@@ -1249,7 +1267,7 @@ def draw_arpeggio =
        save alpha;
        save ne, nw, se, sw;
        save x, y;
-       pair ne,nw,se,sw;
+       pair ne, nw, se, sw;
 
        alpha := -40;
 
@@ -1277,22 +1295,20 @@ def draw_arpeggio =
        z9 = 2 [z7, (width / 2, height / 2)];
 
        fill z1l{se}
-            --- z6
+            -- z6
             .. z3l
             .. z7{se}
-            --- z5l
+            -- z5l
             .. z5r{nw}
-            --- z8
+            -- z8
             .. z3r
             .. z9{nw}
-            --- z1r
+            -- z1r
             .. cycle;
 enddef;
 
 
 fet_beginchar ("Arpeggio", "arpeggio");
-%      draw_staff (-2, 2, 0.0);
-
        save height, overshoot, width;
        height# = staff_space#;
        width# = 0.8 height#;
@@ -1302,6 +1318,8 @@ fet_beginchar ("Arpeggio", "arpeggio");
        set_char_box (0, width#, 0, height#);
        draw_arpeggio;
        penlabels (range 1 thru 9);
+
+       draw_staff (-2, 2, 0.0);
 fet_endchar;
 
 
@@ -1365,14 +1383,14 @@ def draw_arpeggio_arrow =
        z6 = z2l + 1/2 rthin * sw;
        z9 = (width / 2, height) + overshoot * se;
 
-       bot z10 = (0.5 w, 0);
-       lft z11 = (-0.3 w, 0.8 h);
-       rt z12 = (1.3 w, 0.8 h);
+       pickup pencircle scaled vround (0.5 rthin);
 
-       pickup pencircle scaled 0.5 rthin;
+       bot z10 = (0.5 w, 0);
+       lft z11 = (0.5 w - hround (0.8 w), 0.8 h);
+       rt z12 = (0.5 w + hround (0.8 w), 0.8 h);
 
        before_left := z1l
-                      --- z6
+                      -- z6{z6 - z1l}
                       .. {down}z3l;
        after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw))))
                      -- (z11 + 0.25 rthin * ne);
@@ -1381,8 +1399,8 @@ def draw_arpeggio_arrow =
        before_right := (z12 + 0.25 rthin * nw)
                        -- (z3 + (0, -0.25 rthin / cosd (angle (nw))));
        after_right := z3r{up}
-                      .. z9
-                      --- z1r;
+                      .. z9{z1r - z9}
+                      -- z1r;
        (u_right, v_right) = before_right intersectiontimes after_right;
 
        fill subpath (0, u_left) of before_left
@@ -1400,19 +1418,13 @@ def draw_arpeggio_arrow =
             .. subpath (v_right, infinity) of after_right
             .. cycle;
 
-%      fill (z3 + (0, -0.25 rthin / cosd (angle (nw))))
-%           -- (z12 + 0.25 rthin * nw)
-%           .. top z12
-%           .. rt z12
-%           .. (z12 + 0.25 rthin * se){dir -130}
-%           .. {dir -110}(z10 + 0.25 rthin * se)
-%           .. bot z10
-%           .. (z10 + 0.25 rthin * sw){dir 110}
-%           .. {dir 130}(z11 + 0.25 rthin * sw)
-%           .. lft z11
-%           .. top z11
-%           .. (z11 + 0.25 rthin * ne)
-%           -- cycle;
+       % mf doesn't handle pixel dropouts in outline objects, so we use
+       % `draw' if not called by mpost
+       if not known miterlimit:
+               pickup pencircle scaled 0.7 rthin;
+               draw z1
+                    -- (z9 + 0.5 rthin * dir (alpha - 90));
+       fi;
 enddef;
 
 
@@ -1425,8 +1437,7 @@ fet_endchar;
 fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1");
        draw_arpeggio_arrow;
        currentpicture := currentpicture scaled -1
-                                        shifted (0.8 staff_space,
-                                                 staff_space);
+                                        shifted (w - feta_eps, h - feta_eps);
 fet_endchar;
 
 
@@ -1434,18 +1445,17 @@ fet_endchar;
 input feta-slag;
 
 
-% railroad tracks.
 %
-% I actually have no clue how they should look, so we use a slightly curvy
-% and tapered shape.
+% Railroad tracks.  We define two variants of these -- both as slightly
+% tapered, comma-shaped curves and as two straight parallel slashes.
 %
 
-fet_beginchar ("Caesura", "caesura");
+fet_beginchar ("Curved caesura", "caesura.curved");
        save slant, space_between, clearance;
-       save alpha, p;
+       save alpha, pat;
        save botthick, topthick;
        save krom;
-       path p;
+       path pat;
 
        botthick = 1.5 linethickness;
        topthick = 2.5 linethickness;
@@ -1459,7 +1469,8 @@ fet_beginchar ("Caesura", "caesura");
 
        set_char_box (0, 2.0 staff_space#,
                      staff_space# - clearance#, height#);
-       define_pixels (space_between, clearance, height);
+       define_pixels (clearance, height);
+       define_whole_pixels (space_between);
 
        bot y1 = -d;
        top y2 = h;
@@ -1481,16 +1492,69 @@ fet_beginchar ("Caesura", "caesura");
 
        penlabels (1, 2, 3, 4);
 
-       p := z3r{(z1r - z1l)}
-            .. z4r{z2r-z2l}
-            .. z2r{z4l-z4r}
-            .. z4l{z2l-z2r}
-            .. z3l{z1l-z1r}
-            .. z1l{z3r-z3l}
-            .. cycle;
-       fill p;
-       fill p shifted (space_between, 0);
+       pat := z3r{(z1r - z1l)}
+              .. z4r{z2r-z2l}
+              .. z2r{z4l-z4r}
+              .. z4l{z2l-z2r}
+              .. z3l{z1l-z1r}
+              .. z1l{z3r-z3l}
+              .. cycle;
+       fill pat;
+       fill pat shifted (space_between, 0);
 fet_endchar;
 
 
+fet_beginchar ("Straight caesura", "caesura.straight");
+       save slant, space_between, clearance;
+       save thick, ne, pat;
+       path pat;
+       pair ne;
+
+       slant = 2.0;
+       thick = 2.88 linethickness;
+
+       space_between# = 0.56 staff_space#;
+       clearance# = 0.2 staff_space#;
+
+       set_char_box (0, 2.0 staff_space#,
+                     staff_space# - clearance#, 1.2 staff_space#);
+       define_whole_pixels (space_between);
+
+       x1 = 0;
+       x2 = x1 + thick;
+       y1 = y2 = -d;
+
+       x3 = x4 + thick;
+       x4 = x1 + (h + d) / slant;
+       y3 = y4 = h;
+
+       ne = unitvector (z4 - z1);
+       
+       z1a = z1 + blot_diameter * ne;
+       z1b = z1 + blot_diameter * right;
+       z2a = z2 + blot_diameter * ne;
+       z2b = z2 + blot_diameter * left;
+
+       z3a = z3 - blot_diameter * ne;
+       z3b = z3 + blot_diameter * left;
+       z4a = z4 - blot_diameter * ne;
+       z4b = z4 + blot_diameter * right;
+
+       pat = z1a{-ne}
+             .. {right}z1b
+             -- z2b{right}
+             .. {ne}z2a
+             -- z3a{ne}
+             .. {left}z3b
+             -- z4b{left}
+             .. {-ne}z4a
+             -- cycle;
+
+       fill pat;
+       fill pat shifted (space_between, 0);
+
+       labels(range 1 thru 4);
+       labels(1a, 1b, 2a, 2b, 3a, 3b, 4a, 4b);
+fet_endchar;
+
 fet_endgroup ("scripts");