]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue #830: renaming mf files
authorMarc Hohl <marc@hohlart.de>
Sat, 19 Dec 2009 20:03:57 +0000 (21:03 +0100)
committerCarl Sorensen <c_sorensen@byu.edu>
Wed, 23 Dec 2009 15:36:53 +0000 (08:36 -0700)
48 files changed:
mf/README
mf/feta-accidentals.mf [new file with mode: 0644]
mf/feta-alphabet.mf
mf/feta-arrow.mf [deleted file]
mf/feta-arrowheads.mf [new file with mode: 0644]
mf/feta-banier.mf [deleted file]
mf/feta-beugel.mf [deleted file]
mf/feta-bolletjes.mf [deleted file]
mf/feta-braces-a.mf
mf/feta-braces-b.mf
mf/feta-braces-c.mf
mf/feta-braces-d.mf
mf/feta-braces-e.mf
mf/feta-braces-f.mf
mf/feta-braces-g.mf
mf/feta-braces-h.mf
mf/feta-braces-i.mf
mf/feta-braces.mf [new file with mode: 0644]
mf/feta-brackettips.mf [new file with mode: 0644]
mf/feta-clefs.mf [new file with mode: 0644]
mf/feta-din-code.mf [deleted file]
mf/feta-dots.mf [new file with mode: 0644]
mf/feta-dynamics.mf [new file with mode: 0644]
mf/feta-eindelijk.mf [deleted file]
mf/feta-flags.mf [new file with mode: 0644]
mf/feta-generic.mf
mf/feta-haak.mf [deleted file]
mf/feta-klef.mf [deleted file]
mf/feta-noteheads.mf [new file with mode: 0644]
mf/feta-numbers.mf [new file with mode: 0644]
mf/feta-nummer-code.mf [deleted file]
mf/feta-pedals.mf [new file with mode: 0644]
mf/feta-pendaal.mf [deleted file]
mf/feta-puntje.mf [deleted file]
mf/feta-rests.mf [new file with mode: 0644]
mf/feta-schrift.mf [deleted file]
mf/feta-scripts.mf [new file with mode: 0644]
mf/feta-slag.mf [deleted file]
mf/feta-test-generic.mf
mf/feta-timesig.mf [deleted file]
mf/feta-timesignatures.mf [new file with mode: 0644]
mf/feta-toevallig.mf [deleted file]
mf/feta-trills.mf [new file with mode: 0644]
mf/parmesan-generic.mf
mf/parmesan-heads.mf [deleted file]
mf/parmesan-noteheads.mf [new file with mode: 0644]
mf/parmesan-timesig.mf [deleted file]
mf/parmesan-timesignatures.mf [new file with mode: 0644]

index 9d52194bc81b70f2a5045f1f853c473a05c87776..adf02251458d7da4fc5a1de0a8a63c14a2cc4bae 100644 (file)
--- a/mf/README
+++ b/mf/README
@@ -103,7 +103,7 @@ Hints for stem attachment:
   abovementioned horizontal reflection taken into account), then the prefix
   `s' (for `symmetric') should be used.  See the existing files for
   examples.  The numbers in the glyph names refer to the duration of the
-  note; e.g., `s0cross' in feta-bolletjes.mf defines the notehead for a
+  note; e.g., `s0cross' in feta-noteheads.mf defines the notehead for a
   whole cross-shaped note (similarly, `s1cross' and `s2cross' are for half
   and quarter notes, respectively).
 
diff --git a/mf/feta-accidentals.mf b/mf/feta-accidentals.mf
new file mode 100644 (file)
index 0000000..0c2efea
--- /dev/null
@@ -0,0 +1,1321 @@
+% Feta (not the Font-En-Tja) music font --  Accidentals
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+%
+% LilyPond 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.
+%
+% 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/>.
+
+
+%
+% also show in other configuration wrt staff lines.
+%
+def draw_shifted_too =
+if test > 0:
+       fet_beginchar ("shifted too", "");
+               set_char_box (0, 0, 0, 0);
+               currentpicture := remember_pic;
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+enddef;
+
+
+%
+% Accidentals from various sources, notably
+%
+%   Baerenreiter edition of Schuberts `Auf dem Strom' (sharp, natural)
+%   F Hofmeister edition of Muellers `Etueden fuer Horn' (double sharp, flat)
+%
+
+
+%
+% Naming for accidentals (including microtonal variants):
+%
+%   SHARPBASE[.SLASHES.STEMS]
+%   FLATBASE[.MODIFIER]
+%
+% Examples:
+%
+%   sharp.slashslash.stem
+%   mirroredflat.flat
+%
+%
+
+
+fet_begingroup ("accidentals");
+
+%
+% Draw an arrow
+%
+% * `stemslant' gives the direction of the stem's left boundary
+%   (needed for brushed stems, equals "up" for straight stems)
+% * `extend' is used to make the stem longer or shorter (if negative);
+%   different kinds of accidentals need different values here
+%
+def draw_arrow (expr attach, stemwidth, stemslant, extend, pointingdown) =
+begingroup;
+       save htip;  % tip height
+       save wwing; % wing `radius'
+       save angle_wing_bot, angle_wing_top, angle_tip;
+       save upshift;
+       clearxy;
+
+       wwing := 0.26 stemwidth;
+       htip := staff_space * 0.85 + stafflinethickness - wwing;
+
+       % `flip' is used to reflect the arrow vertically
+       % if arrow points downward
+       transform flip;
+       if pointingdown:
+               flip = identity reflectedabout (origin, right);
+       else:
+               flip = identity;
+       fi;
+
+       z1 = attach shifted (-stemwidth / 2, 0);
+       upshift := max (0, wwing + 0.1 staff_space + extend);
+       z2 = z1 shifted (((unitvector stemslant)
+                         scaled upshift) transformed flip);
+
+       z7 = attach shifted ((stemwidth/2),0);
+       z6 = z7 shifted (((unitvector (-xpart stemslant, ypart stemslant))
+                         scaled upshift) transformed flip);
+       z2 - z3 = ( 0.38 staff_space, 0.05 htip) transformed flip;
+       z6 - z5 = (-0.38 staff_space, 0.05 htip) transformed flip;
+
+       z4 = attach shifted ((-0.2 stemwidth, upshift + htip)
+                            transformed flip);
+       z4'= attach shifted (( 0.2 stemwidth, upshift + htip)
+                            transformed flip);
+
+       % `angle_wing_bot' is the angle at which the arc
+       % from z2 to z3a enters z3a
+       % `angle_wing_top' is the angle at which the arc
+       % from z3b to z4 leaves z3b
+       % `angle_tip' is the angle at which the arc
+       % from z4 to z4' leaves z4
+       angle_wing_bot = 30;
+       angle_wing_top = 55;
+       angle_tip = 68;
+
+       z3a = z3 shifted ((((dir angle_wing_bot) rotated -90)
+                          scaled wwing) transformed flip);
+       z3b = z3 shifted ((((dir angle_wing_top) rotated 90)
+                          scaled wwing) transformed flip);
+
+       z5a = z5 shifted ((((dir (180 - angle_wing_bot)) rotated 90)
+                          scaled wwing) transformed flip);
+       z5b = z5 shifted ((((dir (180 - angle_wing_top)) rotated -90)
+                          scaled wwing) transformed flip);
+
+       % Draw the arrow
+       pickup pencircle scaled 1;
+       fill z1
+            -- z2{stemslant transformed flip}
+            .. {(-dir angle_wing_bot) transformed flip}z3a
+            .. z3b{(dir angle_wing_top) transformed flip}
+            .. z4{(dir angle_tip) transformed flip}
+            .. z4'{(dir (-angle_tip)) transformed flip}
+            .. {(dir (-angle_wing_top)) transformed flip}z5b
+            .. z5a{(-dir (-angle_wing_bot)) transformed flip}
+            .. z6{((-stemslant) reflectedabout (origin, up)) transformed flip}
+            -- z7
+            -- cycle;
+
+       labels (range 0 thru 7, 4', 3a, 3b, 5a, 5b);
+endgroup;
+enddef;
+
+save remember_pic;
+picture remember_pic;
+
+save sharp_beamheight;
+sharp_beamheight# := 0.3 staff_space# + stafflinethickness#;
+
+%
+% The beams of most sharps have horizontal endings (as if drawn with
+% a square pen).  [Wanske] does not mention this, so we'll just ignore
+% this fact.
+%
+
+def draw_meta_sharp (expr width, offset) =
+       save beamwidth, beamslope;
+       save ne, nw_dist;
+       pair ne, nw_dist;
+
+       beamwidth := width;
+
+       define_whole_vertical_blacker_pixels (sharp_beamheight);
+
+       clearxy;
+
+       beamslope = sharp_beamheight / beamwidth;
+
+       pickup pencircle scaled 2 blot_diameter;
+
+       rt x2 - lft x1 = beamwidth;
+       z2 = z1 + whatever * (beamwidth, sharp_beamheight);
+       .5 [z1, z3] = (.5 w, offset);
+       x3 = x2;
+       top y2 - bot y3 = sharp_beamheight;
+       x4 = x1;
+       top y1 - bot y4 = sharp_beamheight;
+
+       ne = unitvector (z2 - z1);
+       nw_dist = (ne rotated 90) * blot_diameter;
+
+       fill lft z1{up}
+            ... (z1 + nw_dist){ne}
+            -- (z2 + nw_dist){ne}
+            ... rt z2{down}
+            -- rt z3{down}
+            ... (z3 - nw_dist){-ne}
+            -- (z4 - nw_dist){-ne}
+            ... lft z4{up}
+            -- cycle;
+
+       labels (1, 2, 3, 4);
+enddef;
+
+
+def draw_sharp(expr arrowup, arrowdown) =
+       save stem, stemx, stemwidth;
+       save outer_space, interbeam;
+       save stemlength, extendleft, extendright, height, depth;
+
+       stemwidth# := stafflinethickness# + .05 staff_space#;
+       define_whole_blacker_pixels (stemwidth);
+
+       interbeam := 1.05 staff_space_rounded;
+
+       stemlength# := 1.5 staff_space#;
+       define_pixels (stemlength);
+
+       height# = stemlength#;
+       depth# = stemlength#;
+       extendright# = 0;
+       extendleft# = 0;
+       if arrowup:
+               height# := height# + 1.2 staff_space#;
+               extendright# := extendright# + 1.5 stafflinethickness#;
+       fi;
+       if arrowdown:
+               depth# := depth# + 1.2 staff_space#;
+               extendleft# := extendleft# + 1.5 stafflinethickness#;
+       fi;
+       define_pixels (extendleft, extendright);
+       set_char_box (extendleft#, 1.1 staff_space#, depth#, height#);
+
+       stem := 7 / 16 * w;
+       stemx := hround stem;
+       outer_space := hround ((w - stemx - stemwidth) / 2);
+
+       w := 2 outer_space + stemx + stemwidth;
+       d := d - feta_space_shift;
+
+       draw_meta_sharp (w, -.5 interbeam);
+       draw_meta_sharp (w, -.5 interbeam + vround interbeam);
+
+       % expand the charbox so that it encloses the whole arrow;
+       % this must not happen earlier because some commands above
+       % still rely on the old width
+       w := w + extendright;
+
+       pickup pencircle scaled stemwidth;
+
+       lft x5 = lft x6 = outer_space;
+       lft x7 = lft x8 = outer_space + stemx;
+       bot y5 = -stemlength;
+       top y6 = vround (1.5 staff_space - stem * beamslope);
+       bot y7 = -top y6 + feta_space_shift;
+       top y8 = stemlength;
+
+       labels (5, 6, 7, 8);
+
+       draw_gridline (z5, z6, stemwidth);
+       draw_gridline (z7, z8, stemwidth);
+
+       if arrowup:
+               draw_arrow (z8, stemwidth, up,
+                           stafflinethickness / 2 + stemwidth / 2, false);
+       fi;
+       if arrowdown:
+               draw_arrow (z5, stemwidth, up,
+                           stafflinethickness / 2 + stemwidth / 2, true);
+       fi;
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("Sharp", "sharp");
+       draw_sharp (false, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup");
+       draw_sharp (true, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown");
+       draw_sharp (false, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth");
+       draw_sharp (true, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem");
+       save stem, stemwidth;
+       save outer_space, interbeam;
+
+       stemwidth# := stafflinethickness# + .05 staff_space#;
+       define_whole_blacker_pixels (stemwidth);
+
+       interbeam := 1.05 staff_space_rounded;
+
+       set_char_box (0, 0.7 staff_space#,
+                     1.5 staff_space#, 1.5 staff_space#);
+
+       stem := 7 / 16 * w;
+       outer_space := hround ((w - stemwidth) / 2);
+
+       w := 2 outer_space + stemwidth;
+       d := d - feta_space_shift;
+
+       draw_meta_sharp (w, -.5 interbeam);
+       draw_meta_sharp (w, -.5 interbeam + vround interbeam);
+
+       pickup pencircle scaled stemwidth;
+
+       lft x5 = lft x6 = outer_space;
+       top y6 = vround (1.5 staff_space - .5 stem);
+       bot y5 = -top y6 + feta_space_shift;
+
+       labels (5, 6);
+
+       draw_gridline (z5, z6, stemwidth);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem");
+       save stem, stemx, stemwidth;
+       save outer_space, interbeam;
+       save sharp_beamheight;
+
+       sharp_beamheight# := 0.22 staff_space# + stafflinethickness#;
+
+       stemwidth# := stafflinethickness# + .05 staff_space#;
+       define_whole_blacker_pixels (stemwidth);
+
+       interbeam := 1.2 staff_space_rounded;
+
+       set_char_box (0, 1.1 staff_space#,
+                     1.5 staff_space#, 1.5 staff_space#);
+
+       stem := 7 / 16 * w;
+       stemx := hround stem;
+       outer_space := hround ((w - stemx - stemwidth) / 2);
+
+       w := 2 outer_space + stemx + stemwidth;
+       d := d - feta_space_shift;
+
+       draw_meta_sharp (.88 w, -.5 interbeam);
+       draw_meta_sharp (.88 w, -.5 interbeam + vround interbeam);
+       sharp_beamheight# := 1/.88 sharp_beamheight#;
+       draw_meta_sharp (w, 0);
+
+       pickup pencircle scaled stemwidth;
+
+       lft x5 = lft x6 = outer_space;
+       lft x7 = lft x8 = outer_space + stemx;
+       bot y5 = -d;
+       top y6 = vround (1.5 staff_space - stem * beamslope);
+       bot y7 = -top y6 + feta_space_shift;
+       top y8 = h;
+
+       labels (5, 6, 7, 8);
+
+       draw_gridline (z5, z6, stemwidth);
+       draw_gridline (z7, z8, stemwidth);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem");
+       save stem, stemx, stemwidth;
+       save outer_space, interbeam;
+       save sharp_beamheight;
+
+       sharp_beamheight# := 0.22 staff_space# + stafflinethickness#;
+
+       stemwidth# := stafflinethickness# + .05 staff_space#;
+       define_whole_blacker_pixels (stemwidth);
+
+       interbeam := 1.2 staff_space_rounded;
+
+       set_char_box (0, 0.95 staff_space#,
+                     1.3 staff_space#, 1.3 staff_space#);
+
+       stem := 7 / 16 * w;
+       outer_space := hround ((w - stemwidth) / 2);
+
+       w := 2 outer_space + stemwidth;
+       d := d - feta_space_shift;
+
+       draw_meta_sharp (.8 w, -.5 interbeam);
+       draw_meta_sharp (.8 w, -.5 interbeam + vround interbeam);
+       sharp_beamheight# := 1/.8 sharp_beamheight#;
+       draw_meta_sharp (w, 0);
+
+       pickup pencircle scaled stemwidth;
+
+       lft x5 = lft x6 = outer_space;
+       top y6 = vround (1.5 staff_space - .5 stem);
+       bot y5 = -top y6 + feta_space_shift;
+       labels (5, 6);
+
+       draw_gridline (z5, z6, stemwidth);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem");
+       save stem, stemx, stemwidth;
+       save outer_space, interbeam;
+
+       stemwidth# := stafflinethickness# + .05 staff_space#;
+       define_whole_blacker_pixels (stemwidth);
+
+       interbeam := 1.05 staff_space_rounded;
+
+       set_char_box (0, 1.6 staff_space#,
+                     1.5 staff_space#, 1.5 staff_space#);
+
+       stem := 9 / 32 * w;
+       stemx := hround stem;
+       outer_space := hround ((w - 2 stemx - stemwidth) / 2);
+
+       w := 2 outer_space + 2 stemx + stemwidth;
+       d := d - feta_space_shift;
+
+       draw_meta_sharp (w, -.5 interbeam);
+       draw_meta_sharp (w, -.5 interbeam + vround interbeam);
+
+       pickup pencircle scaled stemwidth;
+
+       lft x5 = lft x6 = outer_space;
+       lft x7 = lft x8 = outer_space + stemx;
+       lft x9 = lft x10 = outer_space + 2 stemx;
+       bot y5 = -d;
+       top y6 = vround (1.5 staff_space - 2 stem * beamslope);
+       bot y9 = -top y6 + feta_space_shift;
+       top y10 = h;
+       y7 = .5 [y5, y9];
+       y8 = .5 [y6, y10];
+
+       labels (5, 6, 7, 8, 9, 10);
+
+       draw_gridline (z5, z6, stemwidth);
+       draw_gridline (z7, z8, stemwidth);
+       draw_gridline (z9, z10, stemwidth);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+%
+% The stems of the natural are brushed (at least, in Barenreiter SCS)
+%
+
+def draw_natural (expr arrowup, arrowdown) =
+       save stemwidth, top_stem_thick;
+       save ne, pat_top, pat_bottom;
+       save depth, height, extendleft, extendright, stemlength;
+       save brush_scale_up, brush_scale_down;
+       pair ne;
+       path pat_top, pat_bottom;
+
+       top_stem_thick# = stafflinethickness# + .10 staff_space#;
+       stemwidth# = 0.09 staff_space# + .5 stafflinethickness#;
+       define_whole_blacker_pixels (top_stem_thick, stemwidth);
+
+       stemlength# = 1.5 staff_space#;
+       define_pixels (stemlength);
+
+       height# = stemlength#;
+       depth# = stemlength#;
+       extendleft# = 0;
+       extendright# = 0;
+       if arrowup:
+               extendleft# := 3 stafflinethickness#;
+               height# := height# + 1.2 staff_space#;
+       fi;
+       if arrowdown:
+               extendright# := 3.15 stafflinethickness#;
+               depth# := depth# + 1.2 staff_space#;
+       fi;
+       define_pixels (extendright);
+
+       set_char_box (extendleft#, 2/3 staff_space#, depth#, height#);
+
+       d := d - feta_space_shift;
+
+       pickup pencircle scaled stemwidth;
+
+       brush_scale_up := 1.0;
+       brush_scale_down := 1.0;
+       % to look nice, arrowed stems must be less brushed
+       if arrowup:
+               brush_scale_up := 0.85;
+       fi;
+       if arrowdown:
+               brush_scale_down := 0.85;
+       fi;
+
+       penpos1 (top_stem_thick, 0);
+       penpos3 (top_stem_thick, 0);
+       penpos2 (stemwidth, 0);
+       penpos4 (stemwidth, 0);
+       % z1' and z3' are needed for the arrowed accidentals
+       penpos1' (top_stem_thick * brush_scale_up, 0);
+       penpos3' (top_stem_thick * brush_scale_down, 0);
+
+       x2r = w;
+       x4l = 0;
+       x3 = x3' = x2;
+       x1 = x1' = x4;
+
+       y1 = y1' = stemlength;
+       y3 = y3' = -stemlength;
+       top y2 = vround (staff_space - 3/2 stafflinethickness);
+       y4 = -y2 + feta_space_shift;
+
+       pat_bottom := z4r{z4r - z1r}
+                     .. bot z4
+                     .. z4l{z1l - z4l};
+       fill simple_serif (z1'l, z1'r, -30)
+            -- pat_bottom
+            -- cycle;
+
+       pat_top := z2r{z2r - z3r}
+                  .. top z2
+                  .. z2l{z3l - z2l};
+       fill simple_serif (z3'l, z3'r, 30)
+            -- pat_top
+            -- cycle;
+
+       ne = (x2 - x4, stafflinethickness);
+
+       z11' = z3l + whatever * (z2l - z3l);
+       y11' = vround (.5 (staff_space - stafflinethickness));
+       z11 = z11' + whatever * ne;
+       x11 = x12;
+       z12 = directionpoint -ne of pat_top;
+       z13 = z12 + whatever * ne;
+       x13 = x1;
+       z14 = z11 + whatever * ne;
+       x14 = x1;
+
+       z21' = z4r + whatever * (z1r - z4r);
+       y21' = -y11' + feta_space_shift;
+       z21 = z21' + whatever * ne;
+       x21 = x22;
+       z22 = directionpoint -ne of pat_bottom;
+       z23 = z22 + whatever * ne;
+       x23 = x3;
+       z24 = z21 + whatever * ne;
+       x24 = x3;
+
+       fill z11
+            -- z12
+            -- z13
+            -- z14
+            -- cycle;
+       fill z21
+            -- z22
+            -- z23
+            -- z24
+            -- cycle;
+
+       penlabels (1, 1', 2, 3, 3', 4);
+       labels (11, 11', 12, 13, 14, 21, 21', 22, 23, 24);
+
+       if arrowup:
+               draw_arrow (z1, top_stem_thick * brush_scale_up,
+                           z1'l - z4l, stafflinethickness / 2, false);
+       fi;
+       if arrowdown:
+               draw_arrow (z3, top_stem_thick * brush_scale_down,
+                           z2r - z3'r, stafflinethickness / 2, true);
+               w := w + extendright;
+       fi;
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("Natural", "natural");
+       draw_natural (false, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Natural (arrow up)", "natural.arrowup");
+       draw_natural (true, false);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Natural (arrow down)", "natural.arrowdown");
+       draw_natural (false, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Natural (arrows up and down)", "natural.arrowboth");
+       draw_natural (true, true);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+%
+% Dedicated to my mom.    (3/10/97)
+%
+% Mamma, ik hou van je; kom je alsjeblieft terug?
+%    -- HW
+%
+%
+% TODO: remove crook_fatness
+% TODO: document, simplify!
+%
+
+def draw_meta_flat (expr xcenter, w, crook_fatness, arrowup, arrowdown) =
+       save crook_thinness;
+       save bottom_overshoot, bot_crook_dir;
+       save top_stem_thick, top_stem_thick_orig;
+       save bottom_stem_thick, hair, smaller_hole;
+       save top_crook_thinness;
+       save zwiep;
+       save center;
+       pair center, bot_crook_dir;
+       save clearing, clearing_orig;
+
+       clearxy;
+
+       % the stem shouldn't reach the top staff line.
+       %% TODO: should take from height.
+       %
+       % TODO: parameterize this
+       %
+       if w >= 0.75 staff_space:
+               smaller_hole = 0.35 stafflinethickness;
+       else:
+               smaller_hole = 0;
+       fi;
+       crook_thinness = .7 stafflinethickness + .06 staff_space;
+       top_crook_thinness = 1 stafflinethickness + .065 staff_space;
+       clearing = 1.7 stafflinethickness;
+       clearing_orig = clearing;
+       if arrowup:
+               clearing := 0.5 staff_space;
+       fi;
+       bottom_overshoot = stafflinethickness;
+
+       bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#;
+       top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#;
+       top_stem_thick_orig# = top_stem_thick#;
+       if arrowup:
+               % to look nice, arrowed stems should be less brushed
+               top_stem_thick# := top_stem_thick# * 0.8;
+       fi;
+       define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick,
+                                    top_stem_thick_orig);
+
+       if odd (top_stem_thick - bottom_stem_thick):
+               top_stem_thick := top_stem_thick - 1;
+       fi;
+       if odd (top_stem_thick_orig - bottom_stem_thick):
+               top_stem_thick_orig := top_stem_thick_orig - 1;
+       fi;
+
+       center = (xcenter, 0);
+
+       x1l = hround (xcenter - .5 top_stem_thick);
+       y1 = vround (2 staff_space - clearing);
+       x2l = hround (xcenter - .5 bottom_stem_thick);
+       y2 = -.5 staff_space - .5 stafflinethickness;
+       % z16 and the `*_orig' variables are needed for arrowed accidentals
+       % because their inner part should be unchanged from plain ones but
+       % the points z3l, z3r, and z10 depend on values that are different
+       % for arrowed accidentals
+       x16l = hround (xcenter -.5 top_stem_thick_orig);
+       y16 = vround (2 staff_space - clearing_orig);
+
+       penpos1 (top_stem_thick, 0);
+       penpos16 (top_stem_thick_orig, 0);
+       penpos2 (bottom_stem_thick, 0);
+
+       y3l = vfloor ((staff_space - stafflinethickness) / 2);
+       z3l = whatever [z2r, z1r];
+       z3r = .3 [z2r,
+                 (z16r shifted (0, clearing_orig - 1.7 stafflinethickness))]
+             + (smaller_hole, 0);
+       x3r := hceiling x3r;
+
+       % we insert z3l to get better conversion with mf2pt1
+       fill simple_serif (z1r, z1l, 30)
+            -- z2l
+            -- z2r
+            -- z3l
+            -- cycle;
+
+       z10 = whatever [z2r, z16r] + (smaller_hole, 0);
+       y10 = -1/10 staff_space;
+       x10 := hceiling x10;
+
+       x11 = xcenter + bottom_overshoot / 3;
+       y11 = -vround (.5 (staff_space + stafflinethickness)
+                      + bottom_overshoot);
+
+       x2a = 0.2[x2r, x7];
+       y2a = 1.5[y2, y11];
+
+       penpos4 (whatever, 53);
+
+       y4l - y4r = top_crook_thinness;
+       y5r = .15 staff_space;
+       x5l = hround (w + xcenter);
+       y4 = staff_space / 2;
+       x4r = .45 [x5r, x3r];
+       y4l := vround y4l;
+
+       penpos5 (crook_fatness, -175);
+
+       bot_crook_dir = unitvector ((x5l, 0) - z11);
+       z8 = z11 + whatever * bot_crook_dir;
+       y8 = -staff_space / 2;
+
+       z7 = z8
+            + whatever * bot_crook_dir
+            + crook_thinness * (bot_crook_dir rotated 90);
+       x7 = .1 [x3r, x8];
+
+       unfill z3r{z3r - z10}
+              .. z4r{right}
+              .. z5r{down}
+              .. z7{-bot_crook_dir}
+              & z7
+              .. z10{z3r - z10}
+              -- cycle;
+
+       if arrowdown:
+               fill z2l{down}
+                    .. z2a{up}
+                    .. z8{bot_crook_dir}
+                    .. z5l{up}
+                    .. z4l{left}
+                    .. z3l
+                    -- cycle;
+       else:
+               fill z2l{down}
+                    .. z11{right}
+                    .. z8{bot_crook_dir}
+                    .. z5l{up}
+                    .. z4l{left}
+                    .. z3l
+                    -- cycle;
+       fi;
+
+       if arrowup:
+               draw_arrow (z1, top_stem_thick, z1l - z2l,
+                           0.5 stafflinethickness, false);
+       fi;
+       if arrowdown:
+               draw_arrow ((0.5 [x2l, x2a], y2), x2a - x2l, up,
+                           staff_space / 2, true);
+       fi;
+enddef;
+
+
+def draw_arrowed_meta_flat (expr xcenter, width, crook_fatness,
+                                arrowup, arrowdown) =
+       save depth, height, extendleft;
+
+       depth# = 0.6 staff_space#;
+       height# = 1.9 staff_space#;
+       extendleft# := 1.2 stafflinethickness#;
+       if arrowup:
+               extendleft# := 3.45 stafflinethickness#;
+               height# := height# + 0.8 staff_space#;
+       fi;
+       if arrowdown:
+               extendleft# := 3.45 stafflinethickness#;
+               depth# := depth# + 1.6 staff_space#;
+       fi;
+
+       set_char_box (extendleft#, width, depth#, height#);
+       draw_meta_flat(xcenter, w, crook_fatness, arrowup, arrowdown);
+enddef;
+
+%
+% unfortunately, 600dpi is not enough to show the brush of the stem.
+%
+
+fet_beginchar ("Flat", "flat");
+       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+                               false, false);
+       penlabels (range 0 thru 11);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Flat (arrow up)", "flat.arrowup");
+       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+                               true, false);
+       penlabels (range 0 thru 23);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Flat (arrow down)", "flat.arrowdown");
+       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+                               false, true);
+       penlabels (range 0 thru 23);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Arrowed Flat (arrow up and down)", "flat.arrowboth");
+       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
+                               true, true);
+       penlabels (range 0 thru 23);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Flat (slashed)", "flat.slash");
+       set_char_box (.4 staff_space#, .8 staff_space#,
+                     0.6 staff_space#, 1.9 staff_space#);
+
+       draw_meta_flat (0, w, 0.31 staff_space, false, false);
+
+       clearxy;
+
+       save slope, slash_width;
+       slope = 0.5;
+       slash_width = w;
+
+       z11 = (0, h / 2);
+       z12 = z11 - (slash_width, slash_width * slope) / 2;
+       z13 = z11 + (slash_width, slash_width * slope) / 2;
+       penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+       penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+
+       z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
+       z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
+
+       fill z13r
+            .. z15
+            .. z13l
+            -- z12l
+            .. z14
+            .. z12r
+            -- z13r
+            .. cycle;
+
+       penlabels (12, 13);
+       labels (14, 15);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Flat (slashed twice)", "flat.slashslash");
+       set_char_box (.4 staff_space#, .8 staff_space#,
+                     0.6 staff_space#, 1.9 staff_space#);
+
+       draw_meta_flat (0, w, 0.31 staff_space, false, false);
+
+       clearxy;
+
+       save slope, slash_width;
+       slope = 0.5;
+       slash_width = w;
+
+       z11 = (0, 5/12 h);
+       z12 = z11 - (slash_width, slash_width * slope) / 2;
+       z13 = z11 + (slash_width, slash_width * slope) / 2;
+       penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+       penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+
+       z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
+       z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
+
+       fill z13r
+            .. z15
+            .. z13l
+            -- z12l
+            .. z14
+            .. z12r
+            -- z13r
+            .. cycle;
+
+       penlabels (12, 13);
+       labels (14, 15);
+
+       z21 = (0, 2/3 h);
+       z22 = z21 - (slash_width, slash_width * slope) / 2;
+       z23 = z21 + (slash_width, slash_width * slope) / 2;
+       penpos22 (1.5 stafflinethickness, angle (z23 - z22) - 90);
+       penpos23 (1.5 stafflinethickness, angle (z23 - z22) - 90);
+
+       z24 = z22 - .75 stafflinethickness * unitvector (z23 - z22);
+       z25 = z23 + .75 stafflinethickness * unitvector (z23 - z22);
+
+       fill z23r
+            .. z25
+            .. z23l
+            -- z22l
+            .. z24
+            .. z22r
+            -- z23r
+            .. cycle;
+
+       penlabels (22, 23);
+       labels (24, 25);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat");
+       set_char_box (0, 1.6 staff_space#,
+                     0.6 staff_space#, 1.9 staff_space#);
+
+       % This is a modified version of `draw_meta_flat'.
+
+       save crook_thinness, crook_fatness;
+       save bottom_overshoot, bot_crook_dir;
+       save top_stem_thick, bottom_stem_thick, hair, smaller_hole;
+       save top_crook_thinness;
+       save zwiep;
+       save center;
+       pair center, bot_crook_dir;
+       save clearing, wid;
+       save pat;
+       path pat;
+
+       clearxy;
+
+       wid = w / 2;
+
+       % the stem shouldn't reach the top staff line.
+       %% TODO: should take from height.
+       %
+       % TODO: parameterize this
+       %
+       if wid >= 0.75 staff_space:
+               smaller_hole = 0.35 stafflinethickness;
+       else:
+               smaller_hole = 0;
+       fi;
+       clearing = 1.7 stafflinethickness;
+       crook_thinness = .7 stafflinethickness + .06 staff_space;
+       crook_fatness = 0.31 staff_space;
+       top_crook_thinness = 1 stafflinethickness + .065 staff_space;
+       bottom_overshoot = stafflinethickness;
+
+       bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#;
+       top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#;
+       define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick);
+
+       if odd (top_stem_thick - bottom_stem_thick):
+               top_stem_thick := top_stem_thick - 1;
+       fi;
+
+       center = (0, 0);
+
+       x1l = hround (-.5 top_stem_thick);
+       y1 = vround (2 staff_space - clearing);
+       x2l = hround (-.5 bottom_stem_thick);
+       y2 = -.5 staff_space - .5 stafflinethickness;
+
+       penpos1 (top_stem_thick, 0);
+       penpos2 (bottom_stem_thick, 0);
+
+       y3l = vfloor ((staff_space - stafflinethickness) / 2);
+       z3l = whatever [z2r, z1r];
+       z3r = .3 [z2r, z1r] + (smaller_hole, 0);
+       x3r := hceiling x3r;
+
+       z10 = whatever [z2r, z1r] + (smaller_hole, 0);
+       y10 = -1/10 staff_space;
+       x10 := hceiling x10;
+
+       x11 = bottom_overshoot / 3;
+       y11 = -vround (.5 (staff_space + stafflinethickness)
+                      + bottom_overshoot);
+
+       penpos4 (whatever, 53);
+
+       y4l - y4r = top_crook_thinness;
+       y5r = .15 staff_space;
+       x5l = hround (wid);
+       y4 = staff_space / 2;
+       x4r = .45 [x5r, x3r];
+       y4l := vround y4l;
+
+       penpos5 (crook_fatness, -175);
+
+       bot_crook_dir = unitvector ((x5l, 0) - z11);
+       z8 = z11 + whatever * bot_crook_dir;
+       y8 = -staff_space / 2;
+
+       z7 = z8
+            + whatever * bot_crook_dir
+            + crook_thinness * (bot_crook_dir rotated 90);
+       x7 = .1 [x3r, x8];
+
+       pat := z3r{z3r - z10}
+              .. z4r{right}
+              .. z5r{down}
+              .. z7{-bot_crook_dir}
+              & z7
+              .. z10{z3r - z10}
+              -- cycle;
+       unfill pat;
+       unfill pat xscaled -1;
+
+       pat := z11{right}
+              .. z8{bot_crook_dir}
+              .. z5l{up}
+              .. z4l{left}
+              .. z3l;
+       fill pat
+            -- simple_serif (z1r, z1l, 30)
+            -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+            -- cycle;
+
+       currentpicture := currentpicture shifted (w/2, 0);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Semi flat", "mirroredflat");
+       set_char_box (1.2 stafflinethickness#, .8 staff_space#,
+                     0.6 staff_space#, 1.9 staff_space#);
+
+       draw_meta_flat (0, w, 0.31 staff_space, false, false);
+       currentpicture := currentpicture xscaled -1 shifted (w - b, 0);
+fet_endchar;
+
+
+fet_beginchar ("Semi flat", "mirroredflat.backslash");
+       set_char_box (.4 staff_space#, .8 staff_space#,
+                     0.6 staff_space#, 1.9 staff_space#);
+
+       draw_meta_flat (0, w, 0.31 staff_space, false, false);
+
+       clearxy;
+
+       save slope, slash_width;
+       slope = 0.5;
+       slash_width = w;
+
+       z11 = (0, h / 2);
+       z12 = z11 - (slash_width, slash_width * slope) / 2;
+       z13 = z11 + (slash_width, slash_width * slope) / 2;
+       penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+       penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
+
+       z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
+       z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
+
+       fill z13r
+            .. z15
+            .. z13l
+            -- z12l
+            .. z14
+            .. z12r
+            -- z13r
+            .. cycle;
+
+       currentpicture := currentpicture xscaled -1 shifted (w - b, 0);
+
+       labels (1, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("Double Flat", "flatflat");
+       save left_wid, overlap, right_wid;
+
+       left_wid = .7;
+       right_wid = .8;
+       overlap = .05;
+
+       set_char_box (1.2 stafflinethickness#,
+                     (left_wid + right_wid - overlap) * staff_space#,
+                     .6 staff_space#, 1.9 staff_space#);
+       draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space,
+                       false, false);
+       draw_meta_flat (hround ((left_wid - overlap) * staff_space),
+                       right_wid * staff_space, 1/3 staff_space,
+                       false, false);
+fet_endchar;
+
+
+fet_beginchar ("3/4 Flat", "flatflat.slash");
+       save left_wid, overlap, right_wid;
+
+       left_wid = .7;
+       right_wid = .8;
+       overlap = .05;
+
+       set_char_box (1.2 stafflinethickness#,
+                     (left_wid + right_wid - overlap) * staff_space#,
+                     .6 staff_space#, 1.9 staff_space#);
+       draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space,
+                       false, false);
+       draw_meta_flat (hround ((left_wid - overlap) * staff_space),
+                       right_wid * staff_space, 1/3 staff_space,
+                       false, false);
+
+       %% maybe we should clip part of the stems?
+       %% or make the 1st flat smaller?
+       %% or reverse it?
+       pickup pencircle scaled 2 stafflinethickness;
+
+       z12 = round (-.25 w - b, .55 staff_space) + feta_offset;
+       z13 = round (.75 w, 1.45 staff_space) + feta_offset;
+       penpos12 (2 stafflinethickness, angle (z13 - z12) - 90);
+       penpos13 (2 stafflinethickness, angle (z13 - z12) - 90);
+
+       z14 = z12 - stafflinethickness * unitvector (z13 - z12);
+       z15 = z13 + stafflinethickness * unitvector (z13 - z12);
+
+       fill z13r
+            .. z15
+            .. z13l
+            -- z12l
+            .. z14
+            .. z12r
+            -- z13r
+            .. cycle;
+
+       penlabels (12, 13);
+       labels (14, 15);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Double Sharp", "doublesharp");
+       save klaverblad, klaversteel;
+       save pat;
+       path pat;
+
+       klaversteel = 1/15 staff_space;
+       klaverblad = .4 staff_space - .5 stafflinethickness;
+
+       set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#);
+
+       z1 = (klaversteel, 0);
+       z2 = (w / 2 - klaverblad / 10, h - klaverblad);
+       z3 = (w / 2, h);
+       z4 = z2 reflectedabout ((0, 0), (1, 1));
+       z5 = z1 reflectedabout ((0, 0), (1, 1));
+
+       labels (1, 2, 3, 4, 5);
+
+       pickup pencircle scaled blot_diameter;
+
+       x2 := hfloor (rt x2) - blot_diameter / 2;
+       x3 := hfloor (rt x3) - blot_diameter / 2;
+       y3 := vfloor (top y3) - blot_diameter / 2;
+       y4 := vfloor (top y4) - blot_diameter / 2;
+
+       pat = (rt z1){dir45}
+             .. {right}(bot z2)
+             .. rt z2
+             -- rt z3{z3 - z2}
+             .. top z3{z4 - z3}
+             -- top z4{z4 - z3}
+             .. (lft z4){down}
+             .. {dir 225}(top z5);
+       pat := pat
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0);
+
+       % assure symmetry -- it's more important to center the glyph on the
+       % staff line than centering it between staff lines, so we use
+       % feta_shift, not feta_space_shift.
+       h := h + feta_shift;
+
+       fill pat shifted (0, feta_shift)
+            -- reverse pat yscaled -1 shifted (0, -feta_eps)
+            -- cycle;
+
+       % ugh
+       currentpicture := currentpicture shifted (hround (w / 2), 0);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+def draw_paren =
+       save leftindent;
+
+       leftindent := .2 staff_space;
+
+       set_char_box (0, .5 staff_space# + stafflinethickness#,
+                     staff_space#, staff_space#);
+
+       d := d - feta_shift;
+
+       z1 = (leftindent, h);
+       z2 = (w - stafflinethickness, .5 (h - d));
+       z3 = (leftindent, -d);
+
+       penpos1 (stafflinethickness, 35);
+       penpos2 (.1 staff_space + stafflinethickness, 0);
+       penpos3 (stafflinethickness, -35);
+
+       fill z2l{down}
+            .. simple_serif (z3l, z3r, 90)
+            .. z2r{up}
+            .. simple_serif (z1r, z1l, 90)
+            .. z2l{down}
+            -- cycle;
+enddef;
+
+
+fet_beginchar ("Right Parenthesis", "rightparen");
+       draw_paren;
+       penlabels (1, 2, 3);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+draw_shifted_too;
+
+
+fet_beginchar ("Left Parenthesis", "leftparen");
+       draw_paren;
+
+       currentpicture := currentpicture xscaled -1;
+
+       set_char_box (charwd, charbp, chardp, charht);
+fet_endchar;
+
+fet_endgroup ("accidentals");
index c3d1f09f97bf545bbc911286dfc024abbe3eb387..5663a791b7b0792d815441adefc37f19613c844d 100644 (file)
@@ -13,7 +13,7 @@ mode_setup;
 number_design_size := design_size / 2;
 dynamic_design_size := 14 design_size / 20;
 
-input feta-nummer-code;
-input feta-din-code;
+input feta-numbers;
+input feta-dynamics;
 
-fet_endfont ("feta-nummer");
+fet_endfont ("feta-numbers");
diff --git a/mf/feta-arrow.mf b/mf/feta-arrow.mf
deleted file mode 100644 (file)
index e5a720c..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-% Feta (not the Font-En-Tja) music font -- draw arrow heads
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%
-% LilyPond 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.
-%
-% 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 ("arrowheads");
-
-%
-% To consider: we could put arrow heads at their real Unicode locations.
-%
-
-%
-% Set up paths for upper half of arrow head pointing right.
-% CLOSE_PATH is for a closed arrow, OPEN_PATH is for the open arrow.
-% OPEN_TENSION sets the tension for the part which forms the path in
-% OPEN_PATH.
-%
-
-def set_arrow_paths (expr width, height, open_tension, arrowlinethickness) =
-       save pat, finalpath;
-       save tip_angle_o, tip_angle_c, tip_dir_c, tip_dir_o;
-       save indent;
-       path pat, open_path, close_path;
-       pair tip_dir_o, tip_dir_c;
-
-       pickup pencircle scaled arrowlinethickness;
-
-       indent = linethickness / 2;
-
-       lft x1 = -width;
-       x2 = 0;
-       top y1 = height;
-       y2 = 0;
-
-       z4 = z3;
-       y5 = 0;
-       x5 = x4 + indent;
-
-       pat := z1
-              ..tension open_tension.. z2{right};
-       penpos2 (arrowlinethickness, 90);
-       tip_dir_o := direction 0.0 of pat;
-       tip_angle_o := angle (tip_dir_o);
-       penpos1 (arrowlinethickness, 90 + tip_angle_o);
-       z3 = z1;
-       penpos3 (arrowlinethickness, tip_angle_o);
-
-       open_path := z1r{tip_dir_o}
-                    .. z2r{right}
-                    .. z2l{left}
-                    .. z1l{-tip_dir_o}
-                    .. z3l
-                    .. cycle;
-
-       pat := z4
-              .. z5{down};
-       tip_dir_c := direction 0.0 of pat;
-       tip_angle_c := angle (tip_dir_c);
-       penpos4 (arrowlinethickness, 90+ tip_angle_c);
-       penpos5 (arrowlinethickness, 0);
-       z6 = z5;
-       penpos6 (arrowlinethickness, 90);
-
-       close_path := z4l{tip_dir_c}
-                     .. z5l{down}
-                     .. z6l{right}
-                     .. z2l{right}
-                     .. z2r{left}
-                     ..tension open_tension.. z1r{-tip_dir_o}
-                     .. z3l
-                     .. cycle;
-enddef;
-
-
-fet_beginchar ("open", "open.01");
-       set_char_box (staff_space#, 1.6 linethickness# / 2,
-                     0.5 staff_space#, 0.5 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space,
-                        1.0, 1.6 linethickness);
-       fill open_path;
-       open_path := open_path yscaled -1;
-       fill open_path;
-
-       penlabels (1, 2, 3);
-       penlabels (4, 5, 6);
-fet_endchar;
-
-
-fet_beginchar ("open", "open.0M1");
-       set_char_box (1.6 linethickness# / 2, staff_space#,
-                     0.5 staff_space#, 0.5 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space,
-                        1.0, 1.6 linethickness);
-       fill open_path;
-       open_path := open_path yscaled -1;
-       fill open_path;
-       currentpicture := currentpicture xscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("open", "open.11");
-       set_char_box (.5 staff_space#, .5 staff_space#,
-                     1.0 staff_space#, 1.6 linethickness# / 2);
-       set_arrow_paths (staff_space, 0.5 staff_space,
-                        1.0, 1.6 linethickness);
-       fill open_path;
-       open_path := open_path yscaled -1;
-       fill open_path;
-       currentpicture := currentpicture rotated 90;
-fet_endchar;
-
-
-fet_beginchar ("open", "open.1M1");
-       set_char_box (.5 staff_space#, .5 staff_space#,
-                     1.6 linethickness# / 2, 1.0 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space,
-                        1.0, 1.6 linethickness);
-       fill open_path;
-       open_path := open_path yscaled -1;
-       fill open_path;
-       currentpicture := currentpicture rotated 90;
-       currentpicture := currentpicture yscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("close", "close.01");
-       set_char_box (staff_space#, 0, 0.5 staff_space#, 0.5 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
-       fill close_path;
-       close_path := close_path yscaled -1;
-       fill close_path;
-fet_endchar;
-
-
-fet_beginchar ("close", "close.0M1");
-       set_char_box (0, staff_space#,  0.5 staff_space#, 0.5 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
-       fill close_path;
-       close_path := close_path yscaled -1;
-       fill close_path;
-       currentpicture := currentpicture xscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("close", "close.11");
-       set_char_box (.5 staff_space#, .5 staff_space#,
-                     1.0 staff_space#, 0.0 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
-       fill close_path;
-       close_path := close_path yscaled -1;
-       fill close_path;
-       currentpicture := currentpicture rotated 90;
-fet_endchar;
-
-
-fet_beginchar ("close", "close.1M1");
-       set_char_box (.5 staff_space#, .5 staff_space#,
-                     0.0 staff_space#, 1.0 staff_space#);
-       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
-       fill close_path;
-       close_path := close_path yscaled -1;
-       fill close_path;
-       currentpicture := currentpicture rotated -90;
-fet_endchar;
-
-
-fet_endgroup ("arrowheads");
diff --git a/mf/feta-arrowheads.mf b/mf/feta-arrowheads.mf
new file mode 100644 (file)
index 0000000..e5a720c
--- /dev/null
@@ -0,0 +1,180 @@
+% Feta (not the Font-En-Tja) music font -- draw arrow heads
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+% LilyPond 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.
+%
+% 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 ("arrowheads");
+
+%
+% To consider: we could put arrow heads at their real Unicode locations.
+%
+
+%
+% Set up paths for upper half of arrow head pointing right.
+% CLOSE_PATH is for a closed arrow, OPEN_PATH is for the open arrow.
+% OPEN_TENSION sets the tension for the part which forms the path in
+% OPEN_PATH.
+%
+
+def set_arrow_paths (expr width, height, open_tension, arrowlinethickness) =
+       save pat, finalpath;
+       save tip_angle_o, tip_angle_c, tip_dir_c, tip_dir_o;
+       save indent;
+       path pat, open_path, close_path;
+       pair tip_dir_o, tip_dir_c;
+
+       pickup pencircle scaled arrowlinethickness;
+
+       indent = linethickness / 2;
+
+       lft x1 = -width;
+       x2 = 0;
+       top y1 = height;
+       y2 = 0;
+
+       z4 = z3;
+       y5 = 0;
+       x5 = x4 + indent;
+
+       pat := z1
+              ..tension open_tension.. z2{right};
+       penpos2 (arrowlinethickness, 90);
+       tip_dir_o := direction 0.0 of pat;
+       tip_angle_o := angle (tip_dir_o);
+       penpos1 (arrowlinethickness, 90 + tip_angle_o);
+       z3 = z1;
+       penpos3 (arrowlinethickness, tip_angle_o);
+
+       open_path := z1r{tip_dir_o}
+                    .. z2r{right}
+                    .. z2l{left}
+                    .. z1l{-tip_dir_o}
+                    .. z3l
+                    .. cycle;
+
+       pat := z4
+              .. z5{down};
+       tip_dir_c := direction 0.0 of pat;
+       tip_angle_c := angle (tip_dir_c);
+       penpos4 (arrowlinethickness, 90+ tip_angle_c);
+       penpos5 (arrowlinethickness, 0);
+       z6 = z5;
+       penpos6 (arrowlinethickness, 90);
+
+       close_path := z4l{tip_dir_c}
+                     .. z5l{down}
+                     .. z6l{right}
+                     .. z2l{right}
+                     .. z2r{left}
+                     ..tension open_tension.. z1r{-tip_dir_o}
+                     .. z3l
+                     .. cycle;
+enddef;
+
+
+fet_beginchar ("open", "open.01");
+       set_char_box (staff_space#, 1.6 linethickness# / 2,
+                     0.5 staff_space#, 0.5 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space,
+                        1.0, 1.6 linethickness);
+       fill open_path;
+       open_path := open_path yscaled -1;
+       fill open_path;
+
+       penlabels (1, 2, 3);
+       penlabels (4, 5, 6);
+fet_endchar;
+
+
+fet_beginchar ("open", "open.0M1");
+       set_char_box (1.6 linethickness# / 2, staff_space#,
+                     0.5 staff_space#, 0.5 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space,
+                        1.0, 1.6 linethickness);
+       fill open_path;
+       open_path := open_path yscaled -1;
+       fill open_path;
+       currentpicture := currentpicture xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("open", "open.11");
+       set_char_box (.5 staff_space#, .5 staff_space#,
+                     1.0 staff_space#, 1.6 linethickness# / 2);
+       set_arrow_paths (staff_space, 0.5 staff_space,
+                        1.0, 1.6 linethickness);
+       fill open_path;
+       open_path := open_path yscaled -1;
+       fill open_path;
+       currentpicture := currentpicture rotated 90;
+fet_endchar;
+
+
+fet_beginchar ("open", "open.1M1");
+       set_char_box (.5 staff_space#, .5 staff_space#,
+                     1.6 linethickness# / 2, 1.0 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space,
+                        1.0, 1.6 linethickness);
+       fill open_path;
+       open_path := open_path yscaled -1;
+       fill open_path;
+       currentpicture := currentpicture rotated 90;
+       currentpicture := currentpicture yscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.01");
+       set_char_box (staff_space#, 0, 0.5 staff_space#, 0.5 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+       fill close_path;
+       close_path := close_path yscaled -1;
+       fill close_path;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.0M1");
+       set_char_box (0, staff_space#,  0.5 staff_space#, 0.5 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+       fill close_path;
+       close_path := close_path yscaled -1;
+       fill close_path;
+       currentpicture := currentpicture xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.11");
+       set_char_box (.5 staff_space#, .5 staff_space#,
+                     1.0 staff_space#, 0.0 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+       fill close_path;
+       close_path := close_path yscaled -1;
+       fill close_path;
+       currentpicture := currentpicture rotated 90;
+fet_endchar;
+
+
+fet_beginchar ("close", "close.1M1");
+       set_char_box (.5 staff_space#, .5 staff_space#,
+                     0.0 staff_space#, 1.0 staff_space#);
+       set_arrow_paths (staff_space, 0.5 staff_space, 1.5, blot_diameter);
+       fill close_path;
+       close_path := close_path yscaled -1;
+       fill close_path;
+       currentpicture := currentpicture rotated -90;
+fet_endchar;
+
+
+fet_endgroup ("arrowheads");
diff --git a/mf/feta-banier.mf b/mf/feta-banier.mf
deleted file mode 100644 (file)
index 499fcfe..0000000
+++ /dev/null
@@ -1,561 +0,0 @@
-% Feta (not the Font-En-Tja) music font -- draw flags
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%
-% LilyPond 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.
-%
-% 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 ("flags");
-
-save outer_path;
-path outer_path;
-
-%
-% Flags pointing down overlap with the notehead (in x-direction), so
-% the down-flag can be bigger.
-%
-
-upflag_width# = .65 black_notehead_width# + stemthickness# / 2;
-downflag_width# = .833 black_notehead_width# + stemthickness# / 2;
-
-right_upflag_space# = .0 upflag_width#;
-right_downflag_space# = .0 downflag_width#;
-
-%
-% Flags pointing down cannot overlap with the notehead in y-direction,
-% so they have less slant.
-%
-% Because of optical illusion, the utmost flag (bottom for
-% down-pointing, top for up-pointing) should be smaller than the other
-% flags.  Adobe Sonata doesn't do this correctly.  (Instead they have
-% an extension flag, which looks less elegant.)
-%
-
-save hip_thickness, foot_thickness;
-
-hip_thickness# = 1.0 linethickness# + 0.069 staff_space#;
-foot_thickness# = 1.2055 linethickness# + 0.06 staff_space#;
-
-define_pixels (hip_thickness, foot_thickness);
-
-%
-% Inspired by Adobe Sonata and [Wanske].
-% For example, see POSTSCRIPT Language -- program design,
-% page 119, and [Wanske], p 41, 42.
-%
-
-def draw_flag (expr center, flare, dims, hip_depth, foot_wid,
-              hip_thickness, foot_thickness, show_labels) =
-       save c;
-
-       clearxy;
-
-       c = 0.7;
-
-       penpos1 (flare, 90);
-       penpos2 (whatever, 0);
-
-       x2r - x2l = hround (hip_thickness);
-
-       penpos3 (foot_thickness, -20.0);
-
-       z1r = center;
-       z2r = center + (xpart (dims), -ypart (dims) * hip_depth);
-       z3r = center + (xpart (dims) * foot_wid, -ypart (dims));
-
-       x2r := hround x2r;
-       y2r := vround y2r;
-
-       outer_path := z3r{curl c}
-                     .. z2r{up}
-                     .. {up}z1r;
-
-       if show_labels = 1:
-               penlabels (1, 2, 3);
-       fi;
-
-       fill z1l{curl 0}
-            ..tension 1.1.. z2l{down}
-            .. {curl c}simple_serif (z3l, z3r, 80)
-            & outer_path
-            & z1r
-            -- cycle;
-enddef;
-
-%
-% TODO: calculate intersectpoint (see TeX book, p. 137)
-% TODO: calculate incision_depth
-%
-
-def add_flag (expr yoff, flare, hip_wid_multiplier, hip_dep_multiplier,
-             intersectpoint, hip_thickness, foot_thickness) =
-begingroup
-       save prev_center, prev_xextreme, prev_yextreme;
-       save rel_foot, ip, center, incision_depth;
-       save prev_hipwid, prev_footdep, prev_hipdep, wid, dep, hip_dep;
-       save hip_dep_ratio, foot_wid_ratio;
-       pair prev_center, center, foot, prev_xextreme, prev_yextreme;
-       pair ip, rel_foot;
-
-       incision_depth = 1.013;
-       prev_center = point 2 of outer_path;
-       prev_xextreme = point 1 of outer_path;
-       prev_yextreme = point 0 of outer_path;
-       prev_hipwid = xpart (prev_xextreme - prev_center);
-       prev_footdep = -ypart (prev_yextreme - prev_center);
-       prev_hipdep = -ypart (prev_xextreme - prev_center);
-       ip = point intersectpoint of outer_path;
-
-       wid = prev_hipwid * hip_wid_multiplier;
-       hip_dep = prev_hipdep * hip_dep_multiplier;
-
-       center = prev_center + (0, yoff);
-       rel_foot = incision_depth [(wid, hip_dep), ip - center];
-       dep = -ypart (rel_foot);
-       foot_wid_ratio = xpart (rel_foot) / wid;
-       hip_dep_ratio = hip_dep / dep;
-
-       draw_flag (center, flare, (wid, dep),
-                  hip_dep_ratio, foot_wid_ratio,
-                  hip_thickness, foot_thickness, 0);
-endgroup
-enddef;
-
-
-fet_beginchar ("8th Flag (up)", "u3");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-
-       flare = staff_space;
-       hip_depth_ratio = .72;
-       foot_width_ratio = .8;
-       hip_width# = upflag_width# - hip_thickness# / 2;
-       foot_depth# = 3 staff_space# - blot_diameter# / 2;
-       define_pixels (hip_width, foot_depth);
-
-       set_char_box (0,
-                     hip_width# + stemthickness# / 2 + right_upflag_space#,
-                     foot_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0,0), flare, (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 1);
-
-       draw_square_block ((-0.5 stemthickness_rounded, -staff_space_rounded),
-                          (0, 0));
-fet_endchar;
-
-
-fet_beginchar ("16th Flag (up)", "u4");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       total_depth# = 3.5 staff_space# - blot_diameter# / 2;
-       flag_count = 2;
-       flare = .85 staff_space;
-       flagspace# = .85 staff_space#;
-       hip_depth_ratio = .72;
-       hip_width# = upflag_width# - hip_thickness# / 2;
-       flagspace# + foot_depth# = total_depth#;
-       foot_width_ratio = .8;
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0,
-                     hip_width# + stemthickness# / 2 + right_upflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -flagspace), flare, (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 1);
-
-       add_flag (flagspace, flare, .97, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -2 staff_space_rounded));
-fet_endchar;
-
-
-fet_beginchar ("32nd Flag (up)", "u5");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 3;
-       total_depth# = 4.25 staff_space#;
-       flare = .85 staff_space;
-       flagspace# = .87 staff_space#;
-       hip_depth_ratio = .72;
-       hip_width# = upflag_width# - hip_thickness# / 2;
-       foot_width_ratio = .8;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0, hip_width# + right_upflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -2 flagspace), flare, (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 1);
-
-       add_flag (flagspace, flare, .97, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, .95, 1.05, 1.25,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -3 staff_space_rounded));
-fet_endchar;
-
-
-fet_beginchar ("64th Flag (up)", "u6");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 4;
-       flare = .85 staff_space;
-       flagspace# = .9 staff_space#;
-       hip_depth_ratio = .72;
-       hip_width# = upflag_width# - hip_thickness# / 2;
-       total_depth# = 5.25 staff_space#;
-       foot_width_ratio = .8;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0, hip_width# + right_upflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 1);
-
-       add_flag (flagspace, flare, .97, 1.00, 1.3,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, 1.00, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, .95, 1.05, 1.25,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -4 staff_space_rounded));
-fet_endchar;
-
-
-fet_beginchar ("128th Flag (up)", "u7");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 5;
-       flare = .85 staff_space;
-       flagspace# = .93 staff_space#;
-       hip_depth_ratio = .72;
-       hip_width# = upflag_width# - hip_thickness# / 2;
-       total_depth# = 6.25 staff_space#;
-       foot_width_ratio = .8;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0, hip_width# + right_upflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 1);
-
-       add_flag (flagspace, flare, .97, 1.00, 1.3,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, 1.00, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, 1.00, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, 0.95, 1.05, 1.25,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -5 staff_space_rounded));
-fet_endchar;
-
-
-fet_beginchar ("8th (down)", "d3");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 1;
-       flare = staff_space;
-       flagspace# = .9 staff_space#;
-       hip_depth_ratio = .72;
-       hip_width# = downflag_width# - hip_thickness# / 2;
-       total_depth# = 2.85 staff_space#;
-       foot_width_ratio = .8;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       define_pixels (hip_width, flagspace, foot_depth);
-
-       set_char_box (0, hip_width# + right_downflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2)
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 0);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -staff_space_rounded));
-
-       y_mirror_char;
-fet_endchar;
-
-
-%%%%%%%%
-%
-% Single Stroke for Short Appogiatura
-%
-
-fet_beginchar ("grace dash (up)", "ugrace");
-       save flare, hip_depth_ratio, hip_width, foot_depth;
-
-       hip_depth_ratio = .72;
-       flare# = staff_space#;
-       hip_width# = upflag_width# - hip_thickness# / 2;
-       foot_depth# = 3 staff_space#;
-
-       define_pixels (hip_width, foot_depth);
-
-       set_char_box (hip_width# * hip_depth_ratio,
-                     hip_width# + right_upflag_space#,
-                     foot_depth# * hip_depth_ratio, -flare#)
-
-       pickup pencircle scaled 1.5 stemthickness;
-
-       z1 = (-b, -d);
-       z2 = (w, h);
-
-       penpos1 (1.5 stemthickness, angle (z2 - z1) - 90);
-       penpos2 (1.5 stemthickness, angle (z2 - z1) - 90);
-
-       fill z1l
-            -- z2l
-            .. top z2
-            .. rt z2
-            .. z2r
-            -- z1r
-            .. bot z1
-            .. lft z1
-            .. cycle;
-
-       penlabels (1, 2);
-fet_endchar;
-
-
-fet_beginchar ("grace dash (down)", "dgrace");
-       save flare, hip_depth_ratio, hip_width, foot_depth;
-       save total_depth;
-
-       hip_depth_ratio = .72 ;
-       flare# = .99 staff_space#;
-       hip_width# = downflag_width# - hip_thickness# / 2;
-       total_depth# = 2.85 staff_space#;
-       foot_depth# = total_depth#;
-       foot_width_ratio = .8;
-
-       define_pixels (hip_width, foot_depth);
-
-       set_char_box (hip_width# * hip_depth_ratio,
-                     hip_width# + right_downflag_space#,
-                     foot_depth# * hip_depth_ratio, -flare#)
-
-       pickup pencircle scaled 1.5 stemthickness;
-
-       z1 = (-b, -d);
-       z2 = (w, h);
-
-       penpos1 (1.5 stemthickness, angle (z2 - z1) - 90);
-       penpos2 (1.5 stemthickness, angle (z2 - z1) - 90);
-
-       fill z1l
-            -- z2l
-            .. top z2
-            .. rt z2
-            .. z2r
-            -- z1r
-            .. bot z1
-            .. lft z1
-            .. cycle;
-
-       y_mirror_char;
-fet_endchar;
-
-
-fet_beginchar ("16th (down)", "d4");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 2;
-       flare = .8 staff_space;
-       flagspace# = .9 staff_space#;
-       hip_depth_ratio = .85;
-       hip_width# = downflag_width# - hip_thickness# / 2;
-       total_depth# = 3.0 staff_space# - blot_diameter# / 2;
-       foot_width_ratio = .95;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       set_char_box (0, hip_width# + right_downflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 0);
-
-       add_flag (flagspace, flare, .95, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -2 staff_space_rounded));
-
-       y_mirror_char;
-fet_endchar;
-
-
-fet_beginchar ("32nd (down)", "d5");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 3;
-       flare = .84 staff_space;
-       flagspace# = .9 staff_space#;
-       hip_depth_ratio = .85;
-       hip_width# = downflag_width# - hip_thickness# / 2;
-       total_depth# = 3.85 staff_space#;
-       foot_width_ratio = .95;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0, hip_width# + right_downflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 0);
-
-       add_flag (flagspace, flare, .97, 1.00, 1.25,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, .95, 1.05, 1.25,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -3 staff_space_rounded));
-
-       y_mirror_char;
-fet_endchar;
-
-
-fet_beginchar ("64th (down)", "d6");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 4;
-       flare = .8 staff_space;
-       flagspace# = .9 staff_space#;
-       hip_depth_ratio = .85;
-       hip_width# = downflag_width# - hip_thickness# / 2;
-       total_depth# = 4.35 staff_space#;
-       foot_width_ratio = .98;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0, hip_width# + right_downflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 0);
-
-       add_flag (flagspace, flare, .97, 1.20, 1.175,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, .97, 1.10, 1.175,
-                 hip_thickness, foot_thickness);
-       add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -4 staff_space_rounded));
-
-       y_mirror_char;
-fet_endchar;
-
-
-fet_beginchar ("128th (down)", "d7");
-       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
-       save flagspace, total_depth, flag_count;
-
-       flag_count = 5;
-       flare = .8 staff_space;
-       flagspace# = .9 staff_space#;
-       hip_depth_ratio = .85;
-       hip_width# = downflag_width# - hip_thickness# / 2;
-       total_depth# = 5.25 staff_space#;
-       foot_width_ratio = .98;
-
-       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
-       define_pixels (hip_width, foot_depth);
-       define_whole_vertical_pixels (flagspace);
-
-       set_char_box (0, hip_width# + right_downflag_space#,
-                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
-
-       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
-                  (hip_width, foot_depth),
-                  hip_depth_ratio, foot_width_ratio,
-                  hip_thickness, foot_thickness, 0);
-
-       add_flag (flagspace, flare, .97, 1.20, 1.175,
-                 hip_thickness, foot_thickness);
-       add_flag (flagspace, flare, .97, 1.10, 1.175,
-                 hip_thickness, foot_thickness);
-       add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
-                 hip_thickness, foot_thickness);
-       add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
-                 hip_thickness, foot_thickness);
-
-       draw_square_block ((-0.5 stemthickness_rounded, 0),
-                          (0, -5 staff_space_rounded));
-
-       y_mirror_char;
-fet_endchar;
-
-fet_endgroup ("flags");
diff --git a/mf/feta-beugel.mf b/mf/feta-beugel.mf
deleted file mode 100644 (file)
index 47b6d89..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-% Feta (not the Font-En-Tja) music font -- Staff braces
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%                Jan Nieuwenhuizen <janneke@gnu.org>
-%
-% LilyPond 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.
-%
-% 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/>.
-
-
-% We have to reduce the pixel-per-point value to
-% support large brace glyphs in case we are using MetaPost
-% (which by default sets `hppp' to 49.80244, regardless of
-% the used `mag' value)
-
-if known miterlimit:
-       bpppix_ := 0.2;         % ten times larger than original
-
-       numeric mm, pt, dd, bp, cm, pc, cc, in;
-
-       mm * bpppix_ = 2.83464;
-       pt * bpppix_ = 0.99626;
-       dd * bpppix_ = 1.06601;
-       bp * bpppix_ = 1;
-       cm * bpppix_ = 28.34645;
-       pc * bpppix_ = 11.95517;
-       cc * bpppix_ = 12.79213;
-       in * bpppix_ = 72;
-
-       hppp := pt;
-       vppp := pt;
-fi;
-
-
-input feta-autometric;
-input feta-macros;
-
-staffsize# := 20 pt#;   %% arbitrary
-
-input feta-params;
-
-%
-% We must let the design increase for each font to make sure that mftrace
-% doesn't jack up the resolution too highly for the longer braces.
-%
-
-fet_beginfont ("feta-braces-" & char (97 + font_count),
-              (font_count + 1) * 20, "fetaBraces");
-
-mode_setup;
-
-
-save code, braces_per_font;
-code := 64;
-braces_per_font := 64;
-
-def draw_brace (expr height_sharp, width_sharp, slt_sharp, brace_number) =
-       save pendir, height, width, thin, thick, slt, pat;
-       save penangle;
-       pair pendir;
-       path pat;
-
-       height# := height_sharp;
-       width# := width_sharp;
-       slt# := slt_sharp;
-
-       fet_beginchar ("brace number " & decimal (brace_number),
-                      "brace" & decimal (brace_number))
-               set_char_box (width#, 0, height# / 2, height# / 2);
-
-               define_pixels (height, width, slt);
-               thin = 2 slt;
-               thick = .5 width;
-       
-               z2 = .5 [z1, z3];
-               y3l = y1 + height / 2;
-               x3 = x1 + width;
-               y1 = 0;
-               x1 = -b;
-               y0 = y1;
-               x0 = x1 - 2/6 thin;
-
-               pendir = unitvector (x3 - x1, y3l / 6 - y1);
-               penangle = angle pendir - 90;
-               penpos3 (thin, penangle);
-               penpos2 (thick, angle (z3 - z1) - 90);
-               penpos1 (2/3 thin, penangle);
-       
-               penlabels (1, 2, 3);
-               labels (0);
-
-               pat := z2r
-                      .. simple_serif (z3r, z3l, 90)
-                      .. z2l
-                      .. z1l{dir (angle (z1r - z1l) - 90)}
-                      .. z0{down}
-                      .. z1r{-dir (angle (z1l - z1r) + 90)}
-                      .. cycle;
-               pat := subpath (0, 5) of pat
-                      -- subpath (6, 7) of pat
-                      .. cycle;
-
-               fill pat;
-               fill pat yscaled -1;
-       fet_endchar;
-enddef;
-
-
-save stafflinethickness;
-save increment;
-
-linethickness := 0.5 pt#;
-increment := 0.5 pt#;
-y := 10 pt#;
-
-for i := 0 step 1 until font_count:
-       save number;
-
-       number := braces_per_font * i;
-
-       for j := 0 step 1 until (braces_per_font - 1):
-               % message "l: "&decimal l;
-               % note: define_pixels (x) multiplies x by hppp,
-               % must never get bigger than infinity
-               y := y + increment;
-               if y > infinity / hppp:
-                       message "Resolution and/or magnification is too high";
-                       message "HPPP: "& decimal hppp &" Y: " & decimal y;
-                       errmessage "please report to <bug-lilypond@gnu.org>";
-               fi;
-
-               % x should be about one staff space, taking brace to have
-               % default height of 3 staffs, this yields height / 3 / 4 = 12
-               % but 15 looks better
-               x := y / 15;
-
-               increment := x / 10;
-               linethickness :=  min (0.5 pt#, y / 150);
-               if i = font_count:
-                       draw_brace (y, x, linethickness, number);
-               fi;
-
-               number := number + 1;
-       endfor;
-endfor;
-
-fet_endfont ("feta-braces");
diff --git a/mf/feta-bolletjes.mf b/mf/feta-bolletjes.mf
deleted file mode 100644 (file)
index cf0659a..0000000
+++ /dev/null
@@ -1,1528 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  implement noteheads
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
-% & Han-Wen Nienhuys <hanwen@xs4all.nl>
-% & Juergen Reuter <reuter@ipd.uka.de>
-%
-%
-% LilyPond 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.
-%
-% 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/>.
-
-test_outlines := 0;
-
-
-save remember_pic;
-picture remember_pic;
-
-
-% Most beautiful noteheads are pronounced, not circular,
-% and not even symmetric.
-% These examples are inspired by [Wanske]; see literature list.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% NOTE HEAD VARIABLES
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-save black_notehead_width, noteheight;
-save half_notehead_width, whole_notehead_width, slash_thick;
-save slash_slope, overdone_heads, solfa_noteheight;
-
-numeric noteheight;
-numeric slash_thick;
-numeric black_notehead_width;
-numeric whole_notehead_width;
-numeric half_notehead_width;
-
-
-fet_begingroup ("noteheads");
-
-
-% Slope of slash.  From scm/grob-description.scm.  How to auto-copy?
-slash_slope := 1.7;
-
-% Thickness of slash lines.  Quarter notes get 1.5slt width.
-slash_thick# := 2/3 * 0.48 staff_space#;
-
-
-%
-% Hand-engraved music often has balls extending above and below
-% the lines.  If you like that, modify overdone heads (unit:
-% stafflinethickness).
-%
-overdone_heads = 0.0;
-noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
-
-
-%
-% solfa heads should not overlap on chords.
-%
-solfa_noteheight# := staff_space# - stafflinethickness#;
-
-define_pixels (slash_thick);
-define_whole_vertical_pixels (noteheight);
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% SLANT moves both extrema on the long axis (by SLANT * ELLIPTICITY,
-% so SLANT = -1, puts the extreme on the long axis next to the short
-% axis one).
-%
-
-def draw_outside_ellipse (expr ellipticity, tilt, superness, slant) =
-       save attachment_y;
-       save pat;
-       path pat;
-
-       pat := superellipse ((ellipticity, 0), (-slant * ellipticity, 1.0),
-                            (-ellipticity, 0), (slant * ellipticity, -1.0),
-                            superness);
-       pat := pat rotated tilt;
-
-       save top_point, right_point;
-       pair top_point, right_point;
-
-       top_point := directionpoint left of pat;
-       right_point := directionpoint up of pat;
-
-       save scaling, width;
-
-       scaling# = noteheight# / (2 ypart (top_point));
-       width# := 2 xpart (right_point) * scaling#;
-       define_pixels (scaling, width);
-
-       set_char_box (0, width#, noteheight# / 2, noteheight# / 2);
-
-       d := d - feta_space_shift;
-
-       % attachment Y
-       charwy := ypart (right_point) * scaling#;
-       charwx := width#;
-
-       pat := pat scaled scaling shifted (w / 2, .5 (h - d));
-
-       width := hround width;
-
-       if test_outlines = 1:
-               draw pat;
-       else:
-               fill pat;
-       fi;
-enddef;
-
-
-def undraw_inside_ellipse (expr ellipticity, tilt, superness, clearance) =
-begingroup
-       save pat;
-       path pat;
-
-       pat := superellipse ((ellipticity, 0), (0, 1.0),
-                            (-ellipticity, 0), (0, -1.0),
-                            superness);
-       pat := pat rotated tilt;
-
-       save top_point, right_point;
-       pair top_point, right_point;
-
-       top_point := directionpoint left of pat;
-       right_point := directionpoint up of pat;
-
-       save height, scaling;
-
-       height# = staff_space# + stafflinethickness# - clearance;
-       scaling# = height# / (2 ypart (top_point));
-       define_pixels (scaling);
-       pat := pat scaled scaling shifted (w / 2, .5 (h - d));
-
-       if test_outlines = 1:
-               draw pat;
-       else:
-               unfill pat;
-       fi
-endgroup;
-enddef;
-
-
-%
-% dimensions aren't entirely right.
-%
-def draw_longa (expr up) =
-       save stemthick, fudge;
-
-       stemthick# = 2 stafflinethickness#;
-       define_whole_blacker_pixels (stemthick);
-
-       fudge = hround (blot_diameter / 2);
-
-       draw_outside_ellipse (1.80, 0, 0.707, 0);
-       undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#);
-
-       pickup pencircle scaled stemthick;
-
-       if up:
-               bot y1 = -d;
-               top y2 = h;
-               rt x1 - fudge = 0;
-               x1 = x2;
-
-               fudge + lft x3 = w;
-               x4 = x3;
-               top y4 = h + 3.0 staff_space;
-               y3 = y1;
-       else:
-               bot y1 = -d - 3.0 staff_space;
-               top y2 = h;
-               rt x1 - fudge = 0;
-               x1 = x2;
-
-               fudge + lft x3 = w;
-               x4 = x3;
-               y4 = y2;
-               bot y3 = -d;
-       fi;
-
-       draw_gridline (z1, z2, stemthick);
-       draw_gridline (z3, z4, stemthick);
-
-       labels (1, 2, 3, 4);
-enddef;
-
-
-fet_beginchar ("Longa notehead", "uM2");
-       draw_longa (true);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-fet_beginchar ("Longa notehead", "dM2");
-       draw_longa (false);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Longa notehead", "uM2");
-               draw_longa (true);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-
-       fet_beginchar ("Longa notehead", "dM2");
-               draw_longa (false);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-%
-% dimensions aren't entirely right.
-%
-def draw_brevis (expr linecount) =
-       save stemthick, fudge;
-
-       stemthick# = 2 stafflinethickness#;
-       define_whole_blacker_pixels (stemthick);
-
-       fudge = hround (blot_diameter / 2);
-
-       draw_outside_ellipse (1.80, 0, 0.707, 0);
-       undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#);
-
-       pickup pencircle scaled stemthick;
-
-       bot y1 = -d;
-       top y2 = h;
-       rt x1 - fudge = 0;
-       x1 = x2;
-
-       fudge + lft x3 = w;
-       x4 = x3;
-       y4 = y2;
-       y3 = y1;
-
-       for i := 0 step 1 until linecount - 1:
-               draw_gridline (z1 - (1.5 * i * stemthick, 0),
-                              z2 - (1.5 * i * stemthick, 0), stemthick);
-               draw_gridline (z3 + (1.5 * i * stemthick, 0),
-                              z4 + (1.5 * i * stemthick, 0), stemthick);
-       endfor;
-enddef;
-
-
-fet_beginchar ("Brevis notehead", "sM1");
-       draw_brevis (1);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Brevis notehead", "sM1");
-               draw_brevis(1);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Double-lined brevis notehead", "sM1double");
-       draw_brevis (2);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Double-lined brevis notehead", "sM1double");
-               draw_brevis (2);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Whole notehead", "s0");
-       draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0, 0.707, 0);
-       undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10,
-                              0.68, 2 stafflinethickness#);
-
-       whole_notehead_width# := charwd;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Whole notehead", "s0");
-               draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0,
-                                     0.707, 0);
-               undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10,
-                                      0.68, 2 stafflinethickness#);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Half notehead", "s1");
-       draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, 0.66, 0.17);
-       undraw_inside_ellipse (3.25, 33, 0.81, 2.5 stafflinethickness#);
-
-       half_notehead_width# := charwd;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Half notehead", "s1");
-               draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34,
-                                     0.66, 0.17);
-               undraw_inside_ellipse (3.25, 33, 0.81,
-                                      2.5 stafflinethickness#);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Quart notehead", "s2");
-       % used to have 32. With 31, they are slightly bolder.
-       draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0);
-       black_notehead_width# := charwd;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Quart notehead", "s2");
-               draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31,
-                                     0.707, 0);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-fet_beginchar ("Whole diamondhead", "s0diamond");
-       draw_outside_ellipse (1.80, 0, 0.495, 0);
-       undraw_inside_ellipse (1.30, 125, 0.6,
-                              .4 staff_space# + stafflinethickness#);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Whole diamondhead", "s0diamond");
-               draw_outside_ellipse (1.80, 0, 0.495, 0);
-               undraw_inside_ellipse (1.30, 125, 0.6,
-                                      .4 staff_space# + stafflinethickness#);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Half diamondhead", "s1diamond");
-       draw_outside_ellipse (1.50, 34, 0.49, 0.17);
-       undraw_inside_ellipse (3.5, 33, 0.80,
-                              .3 staff_space# + 1.5 stafflinethickness#);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Half diamondhead", "s1diamond");
-               draw_outside_ellipse (1.50, 34, 0.49, 0.17);
-               undraw_inside_ellipse (3.5, 33, 0.80,
-                                      .3 staff_space#
-                                      + 1.5 stafflinethickness#);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Quart diamondhead", "s2diamond");
-       draw_outside_ellipse (1.80, 35, 0.495, -0.25);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Quart diamondhead", "s2diamond");
-               draw_outside_ellipse (1.80, 35, 0.495, -0.25);
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-vardef penposx@# (expr d) = 
-begingroup;
-       save pat;
-       path pat;
-
-       pat = top z@#
-             .. lft z@#
-             .. bot z@#
-             .. rt z@#
-             .. cycle;
-       z@#l = pat intersectionpoint (z@# -- infinity * dir (d + 180));
-       z@#r = pat intersectionpoint (z@# -- infinity * dir (d));
-endgroup
-enddef;
-
-
-%
-% UGH: xs not declared as argument.
-%
-def define_triangle_shape (expr stemdir) =
-       save triangle_a, triangle_b, triangle_c;
-       save triangle_out_a, triangle_out_b, triangle_out_c;
-       save triangle_in, triangle_out;
-       save width, depth, height;
-       save origin, left_up_dir;
-       save exact_left_point, exact_right_point, exact_down_point;
-
-       path triangle_a, triangle_b, triangle_c;
-       path triangle_out_a, triangle_out_b, triangle_out_c;
-       path triangle_in, triangle_out;
-       pair origin, left_up_dir;
-       pair exact_down_point, exact_left_point, exact_right_point;
-
-       save pen_thick;
-       pen_thick# = stafflinethickness# + .1 staff_space#;
-       define_pixels (llap);
-       define_blacker_pixels (pen_thick);
-
-       left_up_dir = llap# * dir (90 + tilt);
-
-       xpart (left_up_dir) * xs - (pen_thick# * xs) / 2 + xpart origin = 0;
-       ypart origin = 0;
-
-       exact_left_point := origin + (left_up_dir xscaled xs);
-       exact_down_point := origin + (left_up_dir rotated 120 xscaled xs);
-       exact_right_point := origin + (left_up_dir rotated 240 xscaled xs);
-
-       height# = ypart (exact_left_point + origin) + pen_thick# / 2;
-       depth# = -ypart (exact_down_point + origin) + pen_thick# / 2;
-       width# = xpart (exact_right_point - exact_left_point)
-                + pen_thick# * xs;
-
-       set_char_box (0, width#, depth#, height#);
-
-       % Formerly, the shape has simply been drawn with an elliptical pen
-       % (`scaled pen_thick xscaled xs'), but the envelope of such a curve
-       % is of 6th degree.  For the sake of mf2pt1, we approximate it.
-
-       pickup pencircle scaled pen_thick xscaled xs;
-
-       z0 = (hround_pixels (xpart origin), 0);
-
-       z1 = z1' = z0 + llap * dir (90 + tilt) xscaled xs;
-       z2 = z2' = z0 + llap * dir (90 + tilt + 120) xscaled xs;
-       z3 = z3' = z0 + llap * dir (90 + tilt + 240) xscaled xs;
-
-       z12 = caveness [.5[z1, z2], z3];
-       z23 = caveness [.5[z2, z3], z1];
-       z31 = caveness [.5[z3, z1], z2];
-
-       triangle_a = z1 .. z12 .. z2;
-       triangle_b = z2 .. z23 .. z3;
-       triangle_c = z3 .. z31 .. z1;
-
-       penposx1 (angle (direction 0 of triangle_a) - 90);
-       penposx2 (angle (direction 0 of triangle_b) - 90);
-       penposx3 (angle (direction 0 of triangle_c) - 90);
-
-       penposx1' (angle (direction infinity of triangle_c) + 90);
-       penposx2' (angle (direction infinity of triangle_a) + 90);
-       penposx3' (angle (direction infinity of triangle_b) + 90);
-
-       penposx12 (angle (z12 - z0));
-       penposx23 (angle (z23 - z0));
-       penposx31 (angle (z31 - z0));
-
-       z10 = (z0 -- z1) intersectionpoint (z1l .. z12l .. z2'r);
-       z20 = (z0 -- z2) intersectionpoint (z2l .. z23l .. z3'r);
-       z30 = (z0 -- z3) intersectionpoint (z3l .. z31l .. z1'r);
-
-       triangle_in = z10
-                     .. z12l
-                     .. z20
-                     & z20
-                     .. z23l
-                     .. z30
-                     & z30
-                     .. z31l
-                     .. z10
-                     & cycle;
-
-       triangle_out_a = z1r .. z12r .. z2'l;
-       triangle_out_b = z2r .. z23r .. z3'l;
-       triangle_out_c = z3r .. z31r .. z1'l;
-
-       triangle_out = top z1
-                      .. lft z1
-                      .. z1r{direction 0 of triangle_out_a}
-                      & triangle_out_a
-                      & {direction infinity of triangle_out_a}z2'l
-                      .. lft z2
-                      .. bot z2
-                      .. z2r{direction 0 of triangle_out_b}
-                      & triangle_out_b
-                      & {direction infinity of triangle_out_b}z3'l
-                      .. rt z3
-                      .. top z3
-                      .. z3r{direction 0 of triangle_out_c}
-                      & triangle_out_c
-                      & {direction infinity of triangle_out_c}z1'l
-                      .. cycle;
-
-       labels (0, 10, 20, 30);
-       penlabels (1, 1', 2, 2', 3, 3', 12, 23, 31);
-
-       % attachment Y
-       if stemdir = 1:
-               charwy := ypart exact_right_point;
-               charwx := xpart exact_right_point + .5 pen_thick# * xs;
-       else:
-               charwy := -ypart exact_down_point;
-               charwx := width# - (xpart exact_down_point - .5 pen_thick# * xs);
-       fi
-enddef;
-
-
-def draw_whole_triangle_head =
-       save hei, xs;
-       save llap;
-       save tilt;
-
-       tilt = 40;
-       llap# = 3/4 noteheight#;
-
-       xs = 1.5;
-       caveness := 0.1;
-       define_triangle_shape (1);
-       fill triangle_out;
-       unfill triangle_in;
-enddef;
-
-
-fet_beginchar ("Whole trianglehead", "s0triangle");
-       draw_whole_triangle_head;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Whole trianglehead", "s0triangle");
-               draw_whole_triangle_head;
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-def draw_small_triangle_head (expr dir) =
-       save hei, xs;
-       save llap;
-       save tilt;
-
-       tilt = 40;
-       llap# = 2/3 noteheight#;
-       xs = 1.2;
-       caveness := 0.1;
-       define_triangle_shape (dir);
-
-       pickup feta_fillpen;
-
-       filldraw triangle_out;
-       unfilldraw triangle_in;
-enddef;
-
-
-fet_beginchar ("Half trianglehead (downstem)", "d1triangle");
-       draw_small_triangle_head (-1);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Half trianglehead (upstem)", "u1triangle");
-       draw_small_triangle_head (1);
-
-       draw_staff (-2, 2, 0.5);
-fet_endchar;
-
-
-def draw_closed_triangle_head (expr dir) =
-       save hei, xs;
-       save llap;
-       save tilt;
-
-       tilt = 40;
-       llap# = 2/3 noteheight#;
-       xs = 1.0;
-       caveness := 0.1;
-       define_triangle_shape (dir);
-       fill triangle_out;
-enddef;
-
-
-fet_beginchar ("Quart trianglehead (upstem)", "u2triangle");
-       draw_closed_triangle_head (1);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Quart trianglehead (downstem)", "d2triangle");
-       draw_closed_triangle_head (-1);
-
-       draw_staff (-2, 2, 0.5);
-fet_endchar;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Slash heads are for indicating improvisation.  They are
-% twice as high as normal heads.
-%
-def draw_slash (expr hwid_hash) =
-       save exact_height;
-       save ne, nw_dist;
-       pair ne, nw_dist;
-       exact_height = staff_space# + stafflinethickness# / 2;
-
-       set_char_box (0, 2 exact_height / slash_slope + hwid_hash,
-                     exact_height, exact_height);
-
-       charwx := charwd;
-       charwy := charht;
-
-       clearxy;
-
-       d := d - feta_shift;
-
-       pickup pencircle scaled blot_diameter;
-
-       bot y1 = -d;
-       top y2 = h;
-       lft x1 = 0;
-       lft x2 = 2 h / slash_slope;
-
-       rt x3 = w;
-       y3 = y2;
-       y4 = y1;
-       x3 - x2 = x4 - x1;
-
-       ne = unitvector (z3 - z4);
-       nw_dist = (ne rotated 90) * 0.5 blot_diameter;
-
-       fill bot z1{left}
-            .. (z1 + nw_dist){ne}
-            -- (z2 + nw_dist){ne}
-            .. top z2{right}
-            -- top z3{right}
-            .. (z3 - nw_dist){-ne}
-            -- (z4 - nw_dist){-ne}
-            .. bot z4{left}
-            -- cycle;
-
-       if hwid_hash > 2 slash_thick#:
-               save th;
-
-               th = slash_thick - blot_diameter;
-               y6 = y7;
-               y5 = y8;
-               y3 - y7 = th;
-               y5 - y1 = th;
-               z6 - z5 = whatever * ne;
-               z8 - z7 = whatever * ne;
-
-               z5 = z1 + whatever * ne + th * (ne rotated -90);
-               z8 = z4 + whatever * ne + th * (ne rotated 90);
-
-               unfill z5
-                      -- z6
-                      -- z7
-                      -- z8
-                      -- cycle;
-       fi
-       labels (range 1 thru 10);
-enddef;
-
-
-fet_beginchar ("Whole slashhead", "s0slash");
-       draw_slash (4 slash_thick# + 0.5 staff_space#);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Half slashhead", "s1slash");
-       draw_slash (3.0 slash_thick# + 0.15 staff_space#);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Quart slashhead", "s2slash");
-       draw_slash (1.5 slash_thick#);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% `thick' is the distance between the NE/SW parallel lines in the cross
-% (distance between centres of lines) in multiples of stafflinethickness
-%
-def draw_cross (expr thick) =
-       save ne, nw;
-       save ne_dist, nw_dist, rt_dist, up_dist;
-       save crz_in, crz_out;
-       save thickness;
-       pair ne, nw;
-       pair ne_dist, nw_dist, rt_dist, up_dist;
-       path crz_in, crz_out;
-
-       pen_thick# := 1.2 stafflinethickness#;
-       thickness# := thick * stafflinethickness#;
-       define_pixels (thickness);
-       define_blacker_pixels (pen_thick);
-
-       pickup pencircle scaled pen_thick;
-
-       h := h - feta_shift;
-
-       top y3 = h;
-       ne = unitvector ((1, (2 h - pen_thick) / (w - pen_thick)));
-       rt x4 = w / 2;
-       y5 = 0;
-       z4 - z5 = whatever * ne;
-       x6 = 0;
-       z6 - z3 = whatever * ne;
-       z3 - z4 = whatever * (ne yscaled -1);
-
-       z4 - z3 = whatever * (ne) + (ne rotated -90) * thickness;
-
-
-       x1 = charwd / 2 - .5 pen_thick#;
-       z1 = whatever * ne
-            + thick / 2 * stafflinethickness# * (ne rotated -90);
-
-       % labels (1, 2, 3, 4, 5, 6);
-
-       nw = unitvector (z3 - z4);
-
-       up_dist = up * 0.5 pen_thick / cosd (angle (ne));
-       rt_dist = right * 0.5 pen_thick / sind (angle (ne));
-       nw_dist = (ne rotated 90) * 0.5 pen_thick;
-       ne_dist = (nw rotated -90) * 0.5 pen_thick;
-
-       x4' := x4;
-       x5' := x5;
-       y6' := y6;
-
-       x4 := hround (x4' + .5 pen_thick) - .5 pen_thick;
-       x5 := hfloor (x5' + xpart rt_dist) - xpart rt_dist;
-       y6 := vfloor (y6' + ypart up_dist) - ypart up_dist;
-
-       crz_out = (z6 + up_dist)
-                 -- (z3 + nw_dist){ne}
-                 .. (top z3)
-                 .. (z3 + ne_dist){-nw}
-                 -- (z4 + ne_dist){-nw}
-                 .. (rt z4)
-                 .. (z4 - nw_dist){-ne}
-                 -- (z5 + rt_dist);
-       crz_out := crz_out shifted (0, feta_shift)
-                  -- reverse crz_out yscaled -1 shifted (0, -feta_eps);
-       fill crz_out
-            -- reverse crz_out xscaled -1 shifted (-feta_eps, 0)
-            -- cycle;
-
-       if (thick > 1):
-               x4 := hround (x4' - xpart rt_dist) + xpart rt_dist;
-               x5 := hceiling (x5' - .5 pen_thick) + .5 pen_thick;
-               y6 := vfloor (y6' - .5 pen_thick) + .5 pen_thick;
-
-               crz_in = (bot z6){right}
-                        .. (z6 - nw_dist){ne}
-                        -- (z3 - up_dist)
-                        -- (z4 - rt_dist)
-                        -- (z5 + nw_dist){-ne}
-                        .. {down}(lft z5);
-               crz_in := crz_in shifted (0, feta_shift)
-                         -- reverse crz_in yscaled -1 shifted (0, -feta_eps);
-               unfill crz_in
-                      -- reverse crz_in xscaled -1 shifted (-feta_eps, 0)
-                      -- cycle;
-       fi
-
-       % ugh
-       currentpicture := currentpicture shifted (hround (w / 2), 0);
-
-       charwx := charwd;
-       charwy := y1 + feta_shift;
-
-       z12 = (charwx * hppp, y1 * vppp);
-
-       labels (12);
-enddef;
-
-
-fet_beginchar ("Whole Crossed notehead", "s0cross");
-       save wid, hei;
-
-       wid# := black_notehead_width# + 4 stafflinethickness#;
-       hei# := noteheight# + stafflinethickness#;
-
-       set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-       draw_cross (3.75);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Whole Crossed notehead", "s0cross");
-               save wid, hei;
-
-               wid# := black_notehead_width# + 4 stafflinethickness#;
-               hei# := noteheight# + stafflinethickness#;
-
-               set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-               currentpicture := remember_pic;
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Half Crossed notehead", "s1cross");
-       save wid, hei;
-
-       wid# := black_notehead_width# + 2 stafflinethickness#;
-       hei# := noteheight# + stafflinethickness# / 2;
-
-       set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-       draw_cross (3.0);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Half Crossed notehead", "s1cross");
-               save wid, hei;
-
-               wid# := black_notehead_width# + 2 stafflinethickness#;
-               hei# := noteheight# + stafflinethickness# / 2;
-
-               set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-               currentpicture := remember_pic;
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("Crossed notehead", "s2cross");
-       wid# := black_notehead_width#;
-       hei# := noteheight#;
-       set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-       draw_cross (1.0);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("Crossed notehead", "s2cross");
-               wid# := black_notehead_width#;
-               hei# := noteheight#;
-               set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-               currentpicture := remember_pic;
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-fet_beginchar ("X-Circled notehead", "s2xcircle");
-       save wid, hei;
-       save cthick, cxd, cyd, dy;
-
-       wid# := black_notehead_width# * sqrt (sqrt2);
-       hei# := noteheight# * sqrt (sqrt2);
-
-       set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-       d := d - feta_space_shift;
-
-       cthick# := (1.2 + 1/4) * stafflinethickness#;
-       define_blacker_pixels (cthick);
-
-       cxd := w - cthick;
-       cyd := h + d - cthick / 2;
-
-       dy = .5 (h - d);
-
-       pickup pencircle scaled cthick;
-
-       fill fullcircle xscaled (cxd + cthick)
-                       yscaled (cyd + cthick)
-                       shifted (w / 2, dy);
-       unfill fullcircle xscaled (cxd - cthick)
-                         yscaled (cyd - cthick)
-                         shifted (w / 2, dy);
-
-       xpos := .5 cxd / sqrt2;
-       ypos := .5 cyd / sqrt2;
-
-       pickup penrazor scaled cthick rotated (angle (xpos, ypos) + 90);
-       draw (-xpos + w / 2, -ypos + dy) -- (xpos + w / 2, ypos + dy);
-
-       pickup penrazor scaled cthick rotated (angle (xpos, -ypos) + 90);
-       draw (-xpos + w / 2, ypos + dy) -- (xpos + w / 2, -ypos + dy);
-
-       charwx := charwd;
-       charwy := 0;
-
-       z12 = (charwx * hppp, charwy * vppp);
-       labels (12);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-if test > 0:
-       fet_beginchar ("X-Circled notehead", "s2xcircle");
-               save wid, hei;
-               save cthick, cxr, cyr;
-
-               wid# := black_notehead_width# * sqrt (sqrt2);
-               hei# := noteheight# * sqrt (sqrt2);
-
-               set_char_box (0, wid#, hei# / 2, hei# / 2);
-
-               currentpicture := remember_pic;
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-
-
-%%%%%%%%
-%
-% SOLFA SHAPED NOTES
-%
-
-save solfa_pen_thick;
-solfa_pen_thick# = 1.75 stafflinethickness#;
-define_blacker_pixels (solfa_pen_thick);
-
-
-save solfa_base_notewidth;
-solfa_base_notewidth# := black_notehead_width#;
-
-solfa_whole_width := whole_notehead_width# / black_notehead_width#;
-solfa_half_width := half_notehead_width# / black_notehead_width#;
-solfa_quarter_width := 1.0;
-
-def draw_do_head (expr width_factor, dir) =
-       save p_in, p_out;
-       save left_dist, right_dist;
-       path p_in, p_out;
-       pair left_dist, right_dist;
-
-       set_char_box (0, width_factor * solfa_base_notewidth#,
-                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
-
-       pickup pencircle scaled solfa_pen_thick;
-
-       bot y1 = -d;
-       y1 = y2;
-       lft x1 = 0;
-       rt x2 = w;
-       top y3 = h;
-       x3 =.5 [x1, x2];
-
-       left_dist = (unitvector (z3 - z1) rotated 90) * 0.5 solfa_pen_thick;
-       right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 solfa_pen_thick;
-
-       p_in := (((z1 - left_dist) -- (z3 - left_dist)) intersectionpoint
-                 (top z1 -- top z2))
-               -- ((top z1 -- top z2) intersectionpoint
-                   ((z2 - right_dist) -- (z3 - right_dist)))
-               -- (((z2 - right_dist) -- (z3 - right_dist)) intersectionpoint
-                   ((z1 - left_dist) -- (z3 - left_dist)))
-               -- cycle;
-
-       p_out := bot z1
-                -- bot z2{right}
-                .. rt z2{up}
-                .. (z2 + right_dist){z3 - z2}
-                -- (z3 + right_dist){z3 - z2}
-                .. top z3{left}
-                .. (z3 + left_dist){z1 - z3}
-                -- (z1 + left_dist){z1 - z3}
-                .. lft z1{down}
-                .. {right}cycle;
-                
-
-       labels (1, 2, 3);
-
-       charwx := charwd;
-       charwy := -chardp + 0.5 stafflinethickness#;
-       if dir = -1:
-               charwy := -charwy;
-       fi;
-enddef;
-
-
-fet_beginchar ("Whole dohead", "s0do");
-       draw_do_head (solfa_whole_width, 1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half dohead", "d1do");
-       draw_do_head (solfa_half_width, -1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half dohead", "u1do");
-       draw_do_head (solfa_half_width, 1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Quart dohead", "d2do");
-       draw_do_head (solfa_quarter_width, -1);
-       fill p_out;
-fet_endchar;
-
-
-fet_beginchar ("Quart dohead", "u2do");
-       draw_do_head (solfa_quarter_width, 1);
-       fill p_out;
-fet_endchar;
-
-
-%
-% re - flat top, curved bottom:
-%                (0,h/2) {dir -90} .. (w/2,-h/2) .. {dir 90} (w,h/2) -- cycle;
-% (broader along the base and with more vertical sides for half and
-% whole notes)
-% stem attachment: h/2
-%
-
-def draw_re_head (expr width_factor, dir) =
-       save p_in, p_out;
-       path p_in, p_out;
-
-       set_char_box (0, width_factor * solfa_base_notewidth#,
-                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
-
-       pickup pencircle scaled solfa_pen_thick;
-
-       save curve_start;
-       curve_start = 0.7;
-       lft x1 = 0;
-       y1 = y5;
-       x1 = x2;
-       y2 = curve_start [y3, y1];
-       bot y3 = -d;
-       x3 = .5 [x2, x4];
-       rt x4 = w;
-       y4 = y2;
-       top y5 = h;
-       x5 = x4;
-
-       labels (range 1 thru 5);
-
-       p_in := (z1 + 0.5 solfa_pen_thick * (1, -1))
-               -- rt z2{down}
-               .. top z3
-               .. lft z4{up}
-               -- (z5 + 0.5 solfa_pen_thick * (-1, -1))
-               -- cycle;
-
-       p_out := lft z1
-                -- lft z2{down}
-                .. bot z3
-                .. rt z4{up}
-                -- rt z5{up}
-                .. top z5{left}
-                -- top z1{left}
-                .. {down}cycle;
-
-       charwx := charwd;
-       charwy := curve_start [-chardp, charht];
-
-       if dir = -1:
-               charwy := -charwy;
-       fi;
-enddef;
-
-
-fet_beginchar ("Whole rehead", "s0re");
-       draw_re_head (solfa_whole_width, 1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half up rehead", "u1re");
-       draw_re_head (solfa_half_width, 1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half down rehead", "d1re");
-       draw_re_head (solfa_half_width, -1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Quart rehead", "u2re");
-       draw_re_head (solfa_quarter_width, 1);
-       fill p_out;
-fet_endchar;
-
-
-fet_beginchar ("Quart rehead", "d2re");
-       draw_re_head (solfa_quarter_width, -1);
-       fill p_out;
-fet_endchar;
-
-
-def draw_mi_head (expr width_factor) =
-       save path_out, path_in;
-       save ne_dist, se_dist, ne, se;
-       path path_out, path_in;
-       pair ne_dist, se_dist, ne, se;
-
-       set_char_box (0, width_factor * solfa_base_notewidth#,
-                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
-
-       pickup pencircle scaled solfa_pen_thick;
-
-       lft x1 = 0;
-       y1 = 0;
-       bot y2 = -d;
-       x2 = .5 [x1, x3];
-       rt x3 = w;
-       x4 = x2;
-       y3 = y1;
-       top y4 = h;
-
-       z6 - z5 = whatever * (z2 - z1);
-       z8 - z7 = whatever * (z2 - z1);
-       z8 - z5 = whatever * (z4 - z1);
-       z6 - z7 = whatever * (z4 - z1);
-
-       ne = unitvector (z4 - z1);
-       se = unitvector (z1 - z2);
-
-       ne_dist = (ne rotated 90) * 0.5 solfa_pen_thick;
-       se_dist = (se rotated 90) * 0.5 solfa_pen_thick;
-
-       z5 = whatever [z1, z4] - ne_dist;
-       z5 = whatever [z1, z2] - 1.5 se_dist;
-
-       z5 - z1 = -(z7 - z3);
-
-       labels (range 1 thru 8);
-
-       path_in := z5
-                  -- z6
-                  -- z7
-                  -- z8
-                  -- cycle;
-
-       path_out := lft z1
-                   .. (z1 + se_dist){-se}
-                   -- (z2 + se_dist){-se}
-                   .. bot z2
-                   .. (z2 - ne_dist){ne}
-                   -- (z3 - ne_dist){ne}
-                   .. rt z3
-                   .. (z3 - se_dist){se}
-                   -- (z4 - se_dist){se}
-                   .. top z4
-                   .. (z4 + ne_dist){-ne}
-                   -- (z1 + ne_dist){-ne}
-                   .. cycle;
-enddef;
-
-
-fet_beginchar ("Whole mihead", "s0mi");
-       draw_mi_head (solfa_whole_width);
-       fill path_out;
-       unfill path_in;
-fet_endchar;
-
-
-fet_beginchar ("Half mihead", "s1mi");
-       draw_mi_head (solfa_quarter_width);
-       fill path_out;
-       unfill path_in;
-fet_endchar;
-
-
-fet_beginchar ("Quart mihead", "s2mi");
-       draw_mi_head (solfa_quarter_width);
-       fill path_out;
-fet_endchar;
-
-
-def draw_fa_head (expr width_factor) =
-       set_char_box (0, width_factor * solfa_base_notewidth#,
-                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
-
-       save p_down_in, p_down_out, p_up_in, p_up_out, nw_dist, nw;
-       path p_down_in, p_down_out, p_up_in, p_up_out;
-       pair nw_dist, nw;
-
-       pickup pencircle scaled solfa_pen_thick;
-
-       lft x1 = 0;
-       top y1 = h;
-
-       rt x2 = w;
-       y2 = y1;
-       bot y3 = -d;
-       x3 = x2;
-
-       y4 = y3;
-       x4 = x1;
-
-       labels (1, 2, 3, 4);
-
-       nw = unitvector (z1 - z3);
-       nw_dist = (nw rotated 90) * 0.5 solfa_pen_thick;
-
-       p_up_in := (((z1 - nw_dist) -- (z3 - nw_dist)) intersectionpoint
-                    (bot z1 -- bot z2))
-                  -- (((z1 - nw_dist) -- (z3 - nw_dist)) intersectionpoint
-                       (lft z3 -- lft z2))
-                  -- (z2 + 0.5 solfa_pen_thick * (-1, -1))
-                  -- cycle;
-
-       p_up_out := lft z1{down}
-                   .. (z1 + nw_dist){-nw}
-                   -- (z3 + nw_dist){-nw}
-                   .. bot z3{right}
-                   .. rt z3{up}
-                   -- rt z2{up}
-                   .. top z2{left}
-                   -- top z1{left}
-                   .. {down}cycle;
-
-       p_down_in := p_up_in rotated 180 shifted (w, 0);
-       p_down_out := p_up_out rotated 180 shifted (w, 0);
-
-       charwy := 0.0;
-       charwx := charwd;
-enddef;
-
-
-fet_beginchar ("Whole fa up head", "u0fa");
-       draw_fa_head (solfa_whole_width);
-       fill p_up_out;
-       unfill p_up_in;
-fet_endchar;
-
-
-fet_beginchar ("Whole fa down head", "d0fa");
-       draw_fa_head (solfa_whole_width);
-       fill p_down_out;
-       unfill p_down_in;
-fet_endchar;
-
-
-fet_beginchar ("half fa up head", "u1fa");
-       draw_fa_head (solfa_half_width);
-       fill p_up_out;
-       unfill p_up_in;
-fet_endchar;
-
-
-fet_beginchar ("Half fa down head", "d1fa");
-       draw_fa_head (solfa_half_width);
-       fill p_down_out;
-       unfill p_down_in;
-fet_endchar;
-
-
-fet_beginchar ("Quarter fa up head", "u2fa");
-       draw_fa_head (solfa_quarter_width);
-       fill p_up_out;
-fet_endchar;
-
-
-fet_beginchar ("Quarter fa down head", "d2fa");
-       draw_fa_head (solfa_quarter_width);
-       fill p_down_out;
-fet_endchar;
-
-
-def draw_la_head (expr width_factor) =
-       set_char_box (0, width_factor * solfa_base_notewidth#,
-                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
-       save p_in, p_out;
-       path p_in, p_out;
-
-       pickup pencircle scaled solfa_pen_thick;
-
-       lft x1 = 0;
-       top y1 = h;
-
-       rt x2 = w;
-       y2 = y1;
-       bot y3 = -d;
-       x3 = x2;
-
-       y4 = y3;
-       x4 = x1;
-
-       labels (range 1 thru 4);
-
-       p_in := (z1 + 0.5 solfa_pen_thick * (1, -1))
-               -- (z2 + 0.5 solfa_pen_thick * (-1, -1))
-               -- (z3 + 0.5 solfa_pen_thick * (-1, 1))
-               -- (z4 + 0.5 solfa_pen_thick * (1, 1))
-               -- cycle;
-
-       p_out := top z1
-                -- top z2{right}
-                .. rt z2{down}
-                -- rt z3{down}
-                .. bot z3{left}
-                -- bot z4{left}
-                .. lft z4{up}
-                -- lft z1{up}
-                .. cycle;
-enddef;
-
-
-fet_beginchar ("Whole lahead", "s0la");
-       draw_la_head (solfa_whole_width);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half lahead", "s1la");
-       draw_la_head (solfa_half_width);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Quart lahead", "s2la");
-       draw_la_head (solfa_quarter_width);
-       fill p_out;
-fet_endchar;
-
-
-def draw_ti_head (expr width_factor, dir) =
-       set_char_box (0, width_factor * solfa_base_notewidth#,
-                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
-       save p_in, p_out, p_top;
-       save nw_dist, sw_dist, nw, sw;
-       path p_in, p_out, p_top;
-       pair nw_dist, sw_dist, nw, sw;
-       save cone_height;
-       cone_height = 0.64;
-
-       pickup pencircle scaled solfa_pen_thick;
-
-       x1 = .5 [x2, x4];
-       bot y1 = -d;
-       lft x2 = 0;
-       y2 = cone_height [y1, y3];
-       rt x4 = w;
-       y4 = y2;
-       x3 = x1;
-       top y3 = h;
-
-       labels (range 1 thru 4);
-
-       nw = unitvector (z2 - z1);
-       sw = unitvector (z1 - z4);
-
-       nw_dist = (nw rotated 90) * 0.5 solfa_pen_thick;
-       sw_dist = (sw rotated 90) * 0.5 solfa_pen_thick;
-
-       p_top := (z2 - sw_dist)
-                .. (top z3){right}
-                .. (z4 - nw_dist);
-
-       p_in := (((z1 - nw_dist) -- (z2 - nw_dist)) intersectionpoint
-                 ((z1 - sw_dist) -- (z4 - sw_dist)))
-               -- (((z1 - nw_dist) -- (z2 - nw_dist)) intersectionpoint
-                    ((z2 + sw_dist) .. {right}(bot z3)))
-               .. bot z3
-               .. (((bot z3){right} .. (z4 + nw_dist)) intersectionpoint
-                    ((z1 - sw_dist) -- (z4 - sw_dist)))
-               -- cycle;
-
-       p_out := bot z1
-                .. (z1 + nw_dist)
-                -- (z2 + nw_dist)
-                .. lft z2
-                .. (z2 - sw_dist){direction 0 of p_top}
-                & p_top
-                & {direction infinity of p_top}(z4 - nw_dist)
-                .. rt z4
-                .. (z4 + sw_dist)
-                -- (z1 + sw_dist)
-                .. cycle;
-
-       charwx := charwd;
-       charwy := cone_height [-chardp, charht];
-       if dir = -1:
-               charwy := -charwy;
-       fi;
-enddef;
-
-
-fet_beginchar ("Whole up tihead", "s0ti");
-       draw_ti_head (solfa_whole_width, 1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half up tihead", "u1ti");
-       draw_ti_head (solfa_half_width, 1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Half down tihead", "d1ti");
-       draw_ti_head (solfa_half_width, -1);
-       fill p_out;
-       unfill p_in;
-fet_endchar;
-
-
-fet_beginchar ("Quart up tihead", "u2ti");
-       draw_ti_head (solfa_quarter_width, 1);
-       fill p_out;
-fet_endchar;
-
-
-fet_beginchar ("Quart down tihead", "d2ti");
-       draw_ti_head (solfa_quarter_width, -1);
-       fill p_out;
-fet_endchar;
-
-
-fet_endgroup ("noteheads");
-
-
-%
-% we derive black_notehead_width# from the quarter head,
-% so we have to define black_notehead_width (pixel qty)
-% after the black_notehead_width# itself.
-%
-% Let's keep it outside the group as well.
-%
-
-define_pixels (black_notehead_width);
index e76dde677ef19d2a1b76ad01acf34d9c35ca824e..a0d751e4bdb6822efd126ec8387252672b96920a 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 0;
-input feta-beugel;
+input feta-braces;
 end.
index f75cad1efd1880e582f795c126e546131d73f718..592aa8d17ac43a6c46fa4b73c557d7e6470d5955 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 1;
-input feta-beugel;
+input feta-braces;
 end.
index b9fc2e6ef1a4cacd859c929ba00b19ec496f1dd5..3593501b2470c34de0f2ec2aaa83fe5f737edf4c 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 2;
-input feta-beugel;
+input feta-braces;
 end.
index 91d09df0cdcdd4b18004a3f21307129fece07b1a..ba6d6d2e4ff5a71f4e4ce3d74d9fa598b1c8daa8 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 3;
-input feta-beugel;
+input feta-braces;
 end.
index d8dc91146038b41cd238502b9de832ecbc7ccf01..ed7ec9ca5f16adb08317f18ea7a271c6782d9be6 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 4;
-input feta-beugel;
+input feta-braces;
 end.
index acfc706224d4927648e47ac7e990e8d1d18cff9a..7921b0d956810e7843e44db2673533bd7920902a 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 5;
-input feta-beugel;
+input feta-braces;
 end.
index ce5396e965629f9902864ebd3290363fc5ba18b4..98858884d3e1436bd08d4d056c2256617e912682 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 6;
-input feta-beugel;
+input feta-braces;
 end.
index d7b49e5d70f65d3a70e45a4e5e37b6ba61e62bed..eee219a0deabd4ecb274c071b6817f37de8f0fe6 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 7;
-input feta-beugel;
+input feta-braces;
 end.
index 6f3eba10c5c433837e816c2ff77eef50962decb1..c362853ba9e28658c76b67f8a9b3c655b32dc4a8 100644 (file)
@@ -18,5 +18,5 @@
 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 font_count := 8;
-input feta-beugel;
+input feta-braces;
 end.
diff --git a/mf/feta-braces.mf b/mf/feta-braces.mf
new file mode 100644 (file)
index 0000000..c486081
--- /dev/null
@@ -0,0 +1,157 @@
+% Feta (not the Font-En-Tja) music font -- Staff braces
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%                Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% LilyPond 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.
+%
+% 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/>.
+
+
+% We have to reduce the pixel-per-point value to
+% support large brace glyphs in case we are using MetaPost
+% (which by default sets `hppp' to 49.80244, regardless of
+% the used `mag' value)
+
+if known miterlimit:
+       bpppix_ := 0.2;         % ten times larger than original
+
+       numeric mm, pt, dd, bp, cm, pc, cc, in;
+
+       mm * bpppix_ = 2.83464;
+       pt * bpppix_ = 0.99626;
+       dd * bpppix_ = 1.06601;
+       bp * bpppix_ = 1;
+       cm * bpppix_ = 28.34645;
+       pc * bpppix_ = 11.95517;
+       cc * bpppix_ = 12.79213;
+       in * bpppix_ = 72;
+
+       hppp := pt;
+       vppp := pt;
+fi;
+
+
+input feta-autometric;
+input feta-macros;
+
+staffsize# := 20 pt#;   %% arbitrary
+
+input feta-params;
+
+%
+% We must let the design increase for each font to make sure that mftrace
+% doesn't jack up the resolution too highly for the longer braces.
+%
+
+fet_beginfont ("feta-braces-" & char (97 + font_count),
+              (font_count + 1) * 20, "fetaBraces");
+
+mode_setup;
+
+
+save code, braces_per_font;
+code := 64;
+braces_per_font := 64;
+
+def draw_brace (expr height_sharp, width_sharp, slt_sharp, brace_number) =
+       save pendir, height, width, thin, thick, slt, pat;
+       save penangle;
+       pair pendir;
+       path pat;
+
+       height# := height_sharp;
+       width# := width_sharp;
+       slt# := slt_sharp;
+
+       fet_beginchar ("brace number " & decimal (brace_number),
+                      "brace" & decimal (brace_number))
+               set_char_box (width#, 0, height# / 2, height# / 2);
+
+               define_pixels (height, width, slt);
+               thin = 2 slt;
+               thick = .5 width;
+
+               z2 = .5 [z1, z3];
+               y3l = y1 + height / 2;
+               x3 = x1 + width;
+               y1 = 0;
+               x1 = -b;
+               y0 = y1;
+               x0 = x1 - 2/6 thin;
+
+               pendir = unitvector (x3 - x1, y3l / 6 - y1);
+               penangle = angle pendir - 90;
+               penpos3 (thin, penangle);
+               penpos2 (thick, angle (z3 - z1) - 90);
+               penpos1 (2/3 thin, penangle);
+
+               penlabels (1, 2, 3);
+               labels (0);
+
+               pat := z2r
+                      .. simple_serif (z3r, z3l, 90)
+                      .. z2l
+                      .. z1l{dir (angle (z1r - z1l) - 90)}
+                      .. z0{down}
+                      .. z1r{-dir (angle (z1l - z1r) + 90)}
+                      .. cycle;
+               pat := subpath (0, 5) of pat
+                      -- subpath (6, 7) of pat
+                      .. cycle;
+
+               fill pat;
+               fill pat yscaled -1;
+       fet_endchar;
+enddef;
+
+
+save stafflinethickness;
+save increment;
+
+linethickness := 0.5 pt#;
+increment := 0.5 pt#;
+y := 10 pt#;
+
+for i := 0 step 1 until font_count:
+       save number;
+
+       number := braces_per_font * i;
+
+       for j := 0 step 1 until (braces_per_font - 1):
+               % message "l: "&decimal l;
+               % note: define_pixels (x) multiplies x by hppp,
+               % must never get bigger than infinity
+               y := y + increment;
+               if y > infinity / hppp:
+                       message "Resolution and/or magnification is too high";
+                       message "HPPP: "& decimal hppp &" Y: " & decimal y;
+                       errmessage "please report to <bug-lilypond@gnu.org>";
+               fi;
+
+               % x should be about one staff space, taking brace to have
+               % default height of 3 staffs, this yields height / 3 / 4 = 12
+               % but 15 looks better
+               x := y / 15;
+
+               increment := x / 10;
+               linethickness :=  min (0.5 pt#, y / 150);
+               if i = font_count:
+                       draw_brace (y, x, linethickness, number);
+               fi;
+
+               number := number + 1;
+       endfor;
+endfor;
+
+fet_endfont ("feta-braces");
diff --git a/mf/feta-brackettips.mf b/mf/feta-brackettips.mf
new file mode 100644 (file)
index 0000000..458c1d0
--- /dev/null
@@ -0,0 +1,102 @@
+% Feta (not the Font-En-Tja) music font --  bracket tips -*-Fundamental-*-
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+% LilyPond 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.
+%
+% 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 ("brackettips");
+
+def draw_bracket (expr thick_sharp, width_sharp, updown) =
+begingroup;
+       save p, thin, thick, flattening, width, hair, flare;
+       path p;
+       pair tipdir;
+
+       flattening = 0.72;
+       thick# = thick_sharp;
+       flare# = flattening * width#;
+       width# = width_sharp;
+
+       define_pixels (thick, width, flare);
+       if updown = 1:
+               set_char_box (0, width#,
+                             .5 thick#, flare#);
+       else:
+               set_char_box (0, width#,
+                             flare#, .5 thick#);
+       fi;
+
+       thin = 2 linethickness;
+       hair = 1.25 linethickness;
+
+       pickup pencircle scaled thin;
+       y7 = y1;
+       x7 = x2;
+       z2 = z4r + (thin, 0);
+
+       penpos3 (thin, 0);
+       penpos4 (thin, 90);
+
+       z3 = z4;
+
+       top y3 = 0.5 thick;
+       lft x3 = 0.0;
+       x1 = x3l;
+       y1 = -0.5 thick;
+
+       z8 = .5 [z2, z7];
+       top y5 = flare;
+       rt x5 = width;
+
+       p := z8{right}
+            ..tension 1.2.. z5{curl 0};
+       tipdir := direction 1 of p;
+
+       penpos5 (hair, angle tipdir);
+       penpos6 (hair, 90 + angle tipdir);
+
+       z5 = z6;
+
+       pickup pencircle scaled 1;
+
+       fill (z1
+             -- z3l{up}
+             .. z4r{right}
+             -- z2{right}
+             .. z6r{tipdir}
+             .. z5r
+             .. z6l{-tipdir}
+             ..tension 1.1.. z7{left}
+             & z7
+             -- z1
+             & cycle) yscaled updown;
+
+       if updown = 1:
+               penlabels (1, 2, 3, 4, 5, 6, 7, 8);
+       fi;
+endgroup;
+enddef;
+
+
+fet_beginchar ("bracket tip up", "up");
+       draw_bracket (0.45 staff_space#, 1.9 staff_space#, 1);
+fet_endchar;
+
+
+fet_beginchar ("bracket tip down", "down");
+       draw_bracket (0.45 staff_space#, 1.9 staff_space#, -1);
+fet_endchar;
+
+fet_endgroup ("brackettips");
diff --git a/mf/feta-clefs.mf b/mf/feta-clefs.mf
new file mode 100644 (file)
index 0000000..de4e83c
--- /dev/null
@@ -0,0 +1,708 @@
+% Feta (not the Font-En-Tja) music font --  implement Clefs -*-Fundamental-*-
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+% Jan Nieuwenhuizen <janneke@gnu.org>,
+% Juergen Reuter <reuter@ipd.uka.de>
+%
+% LilyPond 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.
+%
+% 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 ("clefs");
+
+%
+% [Wanske] says the bulbs should be positioned about 1/4 right of the
+% `arrow'.
+%
+% TODO: The hair-curve at z6r looks a little awkward.
+%
+
+def draw_c_clef (expr reduction) =
+       save hair, norm, reduced_ss, right_edge;
+       save xoff;
+
+       reduced_ss# = staff_space# * reduction;
+       norm# := 2/3 reduced_ss#;
+       hair# := 0.06 reduced_ss# + 0.5 linethickness#;
+       right_edge# = 15/4 norm# + 2 hair#;
+       define_pixels (norm, reduced_ss, right_edge);
+       define_whole_vertical_blacker_pixels (hair);
+
+       set_char_box (0, right_edge#, 2 reduced_ss#, 2 reduced_ss#);
+
+       % make unreduced glyph fit exactly into five staff lines
+       if reduction = 1:
+               h := d := 2 staff_space_rounded;
+       fi;
+
+       % assure that the gap between the left and right stem
+       % has the same number of pixels as the thickness of the right
+       % stem
+       draw_block ((0, -d + feta_shift),
+                   (3/4 norm + 1/2 hair, h));
+       draw_block ((3/4 norm + 1/2 hair + hround (3/2 hair), -d + feta_shift),
+                   (3/4 norm + 1/2 hair + 2 hround (3/2 hair), h));
+
+       % assure symmetry
+       h := h - feta_shift;
+
+       pickup feta_fillpen;
+
+       xoff = 3/4 norm + 1/2 hair + 2 hround (3/2 hair);
+       z5l = (xoff - 3/4 hair, 0);
+       z5r = (x4, 0);
+
+       penpos1 (hair - pen_top - pen_bot, -90);
+       top z1l = (xoff + norm + hair, h);
+
+       penpos2 (hround (norm - 3/2 hair) - pen_lft - pen_rt, 180);
+       rt z2l = (w, h / 2);
+
+       penpos3 (hair - pen_top - pen_bot, 90);
+       bot z3l = ((right_edge - xoff) / 2 + xoff,
+                  vround (.5 norm - 1.5 hair));
+
+       penpos4 (hair - pen_lft - pen_rt, 0);
+       top z4 = (xoff + 1/2 norm + 1/2 hair,
+                 vfloor (reduced_ss - linethickness - .2 hair));
+
+       bot z6 = (xoff + 3/4 norm, vround (.5 norm - .5 hair));
+
+       save t;
+       t = 0.833;
+
+       save pat;
+       path pat;
+
+       pat = z5l{curl 1}
+             .. z4l{up}
+             .. z4r{down}
+             .. z3r{right}
+             ..tension t.. z2r{up}
+             ..tension t.. flare_path (top z1l, 180, 90,
+                                       hair, hfloor (norm - 1/2 hair), -1)
+             ..tension t.. z2l{down}
+             .. z3l{left}
+             .. z6
+             .. z5r{down};
+
+       filldraw pat shifted (0, feta_shift)
+                -- reverse pat yscaled -1 shifted (0, -feta_eps)
+                -- cycle;
+
+       penlabels (1, 2, 3, 4, 5, 6);
+
+       % ugh, should be bulb, not flare?
+
+       draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("C clef", "C");
+       draw_c_clef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("C clef", "C_change");
+       draw_c_clef (.8);
+fet_endchar;
+
+
+%
+% New bulb routine:
+%
+% Insert a brushed piece of the path, and draw the rest of the bulb
+% separately.
+%
+% The bulb has circular form.  Neat merging of the bulb and brushed path
+% is done by playing with tension.
+%
+
+def new_bulb (expr start_point, start_angle,
+             outer_tangent_point,
+             end_point, end_angle,
+             big_radius, bulb_radius, flare,
+             direction, turning_dir) =
+begingroup;
+       save pat, before, after;
+       save center;
+       save u, v;
+       path pat, before, after;
+       pair center;
+
+       clearxy;
+
+       center = outer_tangent_point
+                + big_radius * dir (0);
+%               + (big_radius - bulb_radius) * dir (-turning_dir * 90)
+
+       z1' = center + bulb_radius * dir (turning_dir * 180);
+       z2' = outer_tangent_point + flare * dir (0);
+       z3' = center + bulb_radius * dir (0);
+       z4' = center + bulb_radius * dir (turning_dir * 90);
+       z5' = center - 0.5 [big_radius, bulb_radius] * dir (turning_dir * 90);
+
+       labels (1', 2', 3', 4', 5');
+
+       before := z3'{dir (turning_dir * 90)}
+                 .. z4'{-dir (0)}
+                 ..tension 1.1.. z1'{-dir (turning_dir* 90)};
+       after := z2'{dir (turning_dir * 90)}
+                .. end_point{dir (end_angle)};
+       (u, v) = before intersectiontimes after;
+
+       pat := start_point{dir (start_angle)}
+              .. outer_tangent_point{dir (-turning_dir * 90)}
+              ..tension 1.02.. z5'{dir (0)}
+              .. subpath (0, u) of before
+              .. subpath (v, infinity) of after;
+
+       if direction = 0:
+               pat := reverse pat;
+       fi
+
+pat
+endgroup
+enddef;
+
+
+%
+% There is some variation in the shape of bass clefs.
+%
+% * In some clefs the size of the swoosh tip almost reaches the
+%   bottom staff line; in some it crosses the 2nd line from the bottom
+%   with a small overshoot.
+%
+%   The most popular design is where the X part of the tip is aligned
+%   with the left bulb boundary, and the Y part ends on the 2nd
+%   staffline exactly.  This is what we do.
+%
+% * The diameter of the bulb is the width of the open space.
+%
+% * The vertical center of the bulb can be on or slightly above the
+%   staff line.
+%
+% * The vertical position of the dots can be symmetrical around the
+%   staffline, centered in the staff space.  The Baerenreiter SCS has
+%   the bottom dot raised by approximately 0.1 staff space.
+%
+% * Uncarefully set music may have overshoots at the top.  We have none.
+%
+% * It is not exactly clear where the vertical tangent at the right
+%   of the swoosh should be.
+%
+
+def draw_bass_clef (expr exact_center, reduction) =
+       save reduced_ss, swoosh_width;
+       save right_thickness, right_offset, tip_protrude;
+       save dot_diam, bulb_y_offset, bulb_flare;
+       pair tip_protrude;
+
+       reduced_ss# = staff_space# * reduction;
+       2.2 dot_diam# = reduction * (staff_space# - stafflinethickness#);
+       right_thickness# = 0.37 staff_space# + 1.2 linethickness#;
+       swoosh_width# = 2.1 reduced_ss#;
+       define_pixels (swoosh_width);
+       define_whole_pixels (reduced_ss);
+       define_whole_blacker_pixels (dot_diam, right_thickness);
+
+       right_offset = 0.05 staff_space;
+       bulb_y_offset := 0.075 staff_space;
+       bulb_flare := 2.5 linethickness;
+%      tip_protrude := (-linethickness, -.2 staff_space);
+       tip_protrude := (0, 0);
+
+       set_char_box (-xpart exact_center,
+                     xpart exact_center + swoosh_width# + 7/12 reduced_ss#,
+                     -ypart exact_center + 2.5 reduced_ss#,
+                     ypart exact_center + reduced_ss#);
+
+       y1 = bulb_y_offset;
+       x1 = 0;
+
+       x2 = .5 [x1, x3];
+       x2l = x2r = x2;
+
+       y2l := vround_pixels (reduced_ss# + 0.5 linethickness#);
+       y2l - y2r = linethickness;
+
+       x3l - x1 = swoosh_width;
+       x3l - x3r = right_thickness;
+
+       % optical correction: the top dot seems farther away if y3l = 0.
+       y3l = right_offset;
+
+       z4 = -(0, 2.0 reduced_ss) + tip_protrude;
+
+       penpos3 (whatever, 185);
+       penpos4 (linethickness, 135);
+
+       fill new_bulb (z2l, 180, z1, z2r, 0,
+                      0.45 reduced_ss, 0.4 reduced_ss,
+                      bulb_flare, 1, 1)
+            .. z3r{down}
+            .. {curl 0}simple_serif (z4r, z4l, 90){curl 0}
+            .. z3l{up}
+            ..tension 0.9.. cycle;
+
+       pickup pencircle scaled dot_diam;
+
+       lft x5 = hround (x3l + 1/3 reduced_ss - dot_diam / 2);
+       bot y5 = vfloor (.5 reduced_ss - dot_diam / 2);
+       z6 = z5 yscaled -1;
+
+       % for symmetry
+       y5 := y5 + feta_shift;
+
+       drawdot z5;
+       drawdot z6;
+
+       penlabels (1, 2, 3, 4, 5, 6);
+
+       draw_staff (-3, 1, 0);
+enddef;
+
+
+fet_beginchar ("F clef ", "F");
+       draw_bass_clef ((0, 0), 1.0);
+fet_endchar;
+
+
+fet_beginchar ("F clef (reduced)", "F_change");
+       draw_bass_clef ((0, 0), 0.8);
+fet_endchar;
+
+
+
+%
+% Inspired by Baerenreiter
+%
+%
+% Beste lezers, kijk,
+%
+% Een bolletje hebben we bij toeval allemaal wel eens getekend, maar begint u
+% toch eenvoudig.  Eerst een eenvoudig kruis of herstellingsteken
+% en via de dubbelslag naar een voorzichtig vlaggetje, en heb geduld!
+% Ikzelf heb bijvoorbeeld over mijn eerste gave G-sleutel
+% 35 kilobyte metafont, 12 patchlevels, 0 vriendinnen en 45 dagen gedaan
+%
+%  -- vrij naar Van Kooten & De Bie
+%
+
+def debugfill = fill enddef;
+
+def draw_gclef (expr reduction) =
+       save reduced_ss, downstroke_dir, downstroke_angle, center;
+       save breapth_factor, inner_thick_end, thinness, thickness, thinnib;
+       save start_angle, inner_start_angle, thinness;
+       save upward_swoosh_angle, bot_angle;
+       save pat;
+       path pat;
+       pair downstroke_dir, center;
+
+       reduced_ss# = staff_space# * reduction;
+       define_pixels (reduced_ss);
+
+       thinness = 0.095 staff_space + 0.75 linethickness;
+       downstroke_dir = unitvector (14, -75);
+       downstroke_angle = angle downstroke_dir;
+       bot_angle = -180;               % downstroke_angle - 87
+
+       upward_swoosh_angle = 132;
+       start_angle = -97;
+
+       breapth_factor = 21/14;
+       inner_thick_end = 45;
+       inner_start_angle = downstroke_angle - 43;
+       thickness = .32 reduced_ss + 1.1 linethickness;
+
+       thinnib = thinness;
+
+       set_char_box (0, 1.71 * breapth_factor * reduced_ss#,
+                     2.6 * reduced_ss#, 5 * reduced_ss#);
+
+       center := (breapth_factor * reduced_ss, 0);
+
+       z1 = center + whatever * dir (inner_start_angle);
+       x1 = xpart center - .28 reduced_ss;
+       penpos1 (thinnib, inner_start_angle);
+
+       x2r = xpart center;
+       y2r = vround_pixels (reduced_ss# + .5 stafflinethickness#);
+       penpos2 (thickness, 90);
+
+       z3 = (z4 - center) rotated inner_thick_end + center;
+       penpos3 (thinnib, -90 + inner_thick_end);
+
+       x4 = xpart center - .1 reduced_ss;
+       y4r = -y2r + feta_shift;
+       penpos4 (thinnib, -90);
+
+       x5r = -breapth_factor * reduced_ss + xpart center;
+       y5r = .37 reduced_ss + ypart center;
+       penpos5 (thickness, upward_swoosh_angle);
+
+       z6 = center + whatever * downstroke_dir;
+       y6 = ypart center + 2 reduced_ss;
+       % penpos6 is computed later
+
+       z7l - z6 = whatever * (z5 - z6) ;
+       y7l = 3.5 reduced_ss;
+       penpos7 (thickness, upward_swoosh_angle);
+
+       x9 = .7 [x10, x7r];
+       top y9l = 5 reduced_ss;
+       penpos9 (1.45 thickness, -70);
+
+       x11 - x13r = 1.5 reduced_ss + 0.5 thinnib;
+       y11 = ypart center - 47/28 reduced_ss;
+       y12 = ypart center - 71/28 reduced_ss;
+       y13 = .48 [y12, y4r];
+       x12r = xpart (.45 [z13r, z11] + .75 reduced_ss * downstroke_dir);
+
+%      z10 = center + whatever * dir (downstroke_angle - 1.5);
+       x10 = x6 - 2 thinnib;
+       y10 = ypart center + 3.5 reduced_ss;
+       y10l - y10r = 1.0 thickness;
+       z10r - z10l = .7 thinnib * dir (downstroke_angle + 90)
+                     + whatever * downstroke_dir;
+       z10 = .5 [z10l, z10r];
+       z11 = center + whatever * downstroke_dir + (-0.05 reduced_ss, 0);
+
+       penpos11 (thinnib, start_angle + 90);
+       penpos12 (thinnib, bot_angle + 90);
+       penpos13 (thinnib + 0.14 staff_space, 180);
+
+       % this auxiliary point ensures good contour overlapping
+       z8 = .5 [z9l, z9r] + .25 ((z9r - z9l) rotated -90);
+
+       z20 = z9l - (0, .25 blot_diameter);
+       penpos20 (blot_diameter, 0);
+
+       pat := z10{down}
+              .. z6
+              ..tension 1.1.. z11{dir (start_angle)};
+
+       penpos6 (thinnib, angle (direction 1 of pat) + 90);
+
+       % two auxiliary points to simulate `draw' with `penstroke'
+       z10' = point 0.3 of pat;
+       penpos10' (1.3 thinnib, angle (direction 0.3 of pat) + 50);
+
+       z11' = point 1.5 of pat;
+       penpos11' (thinnib, angle (direction 1.5 of pat) + 90);
+
+       z21l = z20l;
+       z21r = z9r;
+
+       pat := z21l
+              .. z10l{down}
+              .. z10'l;
+
+       fill z2l{right}
+            .. z3l
+            .. z4l{left}
+            ..tension 1.07.. z5l{up}  % inside curve
+            .. z7l{up}
+            ..tension 1.2.. z20r{curl 1}
+            .. {direction 0 of pat}z20l
+            -- z8
+            -- z9r                     % {dir (downstroke_angle + 0)}
+            ..tension 0.8.. z7r{down}
+            .. z5r{down}
+            .. z4r{right}
+            .. z3r
+            .. z2r{left}
+            ..tension .95.. z1r
+            -- simple_serif (z1r, z1l, 80)
+            -- z1l
+            ..tension 0.85.. cycle;
+
+       penstroke z21e
+                 .. z10e{down}
+                 .. z10'e
+                 .. z6e
+                 .. z11'e
+                 .. z11e{dir (-95)}
+                 .. z12e{dir (bot_angle)};
+
+       fill new_bulb (z12r, bot_angle, z13r, z12l, bot_angle + 180,
+                      0.45 reduced_ss, 0.38 reduced_ss,
+                      thinnib + .05 staff_space, 1, -1)
+            -- cycle;
+
+       penlabels (range 1 thru 21);
+       penlabels (10', 11');
+
+       draw_staff (-1, 3, 0);
+enddef;
+
+
+fet_beginchar ("G clef", "G");
+       draw_gclef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("G clef", "G_change");
+       draw_gclef (0.8);
+fet_endchar;
+
+
+%%%%
+%
+% PERCUSSION
+%
+
+%
+% The percussion clef extent is not coincident with its bbox, since
+% the percussion clef needs more space in front than a normal clef.
+%
+
+def draw_percussion_clef (expr reduction) =
+       save reduced_ss, razt;
+
+       reduced_ss# = staff_space# * reduction;
+       define_pixels (reduced_ss);
+
+       set_char_box (-.67 reduced_ss#, 2.0 reduced_ss#,
+                     reduced_ss#, reduced_ss#);
+
+       razt := hround (0.45 reduced_ss);
+
+       d := d - feta_shift;
+
+       draw_block ((-b, -d), (-b + razt, h));
+       draw_block ((w - razt, -d), (w, h));
+
+       draw_staff (-3, 1, 1);
+enddef;
+
+
+fet_beginchar ("percussion clef", "percussion");
+       draw_percussion_clef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("percussion clef (reduced)", "percussion_change");
+       draw_percussion_clef (.8);
+fet_endchar;
+
+
+def draw_tab_T (expr pos, siz, slant) =
+begingroup;
+       save vx, vy;
+       pair vx, vy;
+
+       clearxy;
+
+       vx = (xpart siz) * dir 0;
+       vy = (ypart siz) * dir 90;
+
+       penpos1 (.75 penh, 100);
+       z1 = z2 + (1/6 * vx - .15 * vy);
+       penpos2 (hround (.9 penw), 0);
+       x2l = hround xpart (pos + .75 vy);
+       y2l = ypart (pos + .75 vy);
+       penpos3 (penh, -100);
+       z3l = pos + .4 vx + vy;
+       penpos4 (penh, -90);
+       z4 = -.1 vy + .5 [z3, z5];
+       penpos5 (.8 penh, -30);
+       x5r = xpart (pos + siz);
+       y5l = ypart (pos + siz);
+
+       penpos10 (penw, 170);
+       z10 = pos + .55 vx + .9 vy;
+       penpos11 (.75 [penh, penw], 170);
+       z11 = z10 - .5 vy + .025 vx;
+       penpos12 (penh, 100);
+       z12l = (xpart .5 [z13, z11], ypart (pos - .025 * siz));
+       penpos13 (.75 penh, 60);
+       z13 = pos + .2 vx + .15 vy;
+
+       % penlabels (range 1 thru 13);
+
+       soft_penstroke (z1e
+                       ..tension 1.1.. z2e
+                       .. z3e{right}
+                       ..tension 1.5.. z4e
+                       ..z5e)
+         slanted slant shifted (slant * -ypart pos, 0);
+
+       soft_end_penstroke (z10e
+                           ..tension 1.5.. z11e
+                           .. z12e
+                           ..tension 1.1.. z13e{(z13r - z13l) rotated 90})
+         slanted slant shifted (slant * -ypart pos, 0);
+endgroup;
+enddef;
+
+
+def draw_tab_A (expr pos, siz, slant) =
+begingroup;
+       save vx, vy, pat;
+       pair vx, vy;
+       path pat;
+
+       clearxy;
+
+       vx = (xpart siz) * dir 0;
+       vy = (ypart siz) * dir 90;
+
+       penpos1 (.75 penh, -110);
+       z1r = pos + .07 vy;
+       penpos2 (penh, -75);
+       z2r = (.5 [x1, x3], ypart pos);
+       penpos3 (.25 [penh, penw], -30);
+       z3 = (.45 [x2, x4], .15 [y2, y4]);
+       penpos4 (1 [penh, penw], 0);
+       z4 = pos + .5 vx + .975 vy;
+
+       penpos5 (1 [penh, penw], -180);
+       z5 = z4;
+       penpos6 (.2 [penh, penw], -150);
+       z6l = (.8 [x5l, x7l], .9 [y5l, y7l]);
+       penpos7 (penh,-90);
+       z7r = (.5 [x6, x8], ypart pos);
+       penpos8 (.75 penh, -70);
+       z8r = (xpart (pos + siz), y7r + .075 ypart (siz));
+
+       pat := z2
+              .. z3
+              .. z4;
+
+       penpos10 (penh, angle (direction 1.2 of pat) - 180);
+       z10 = point 1.2 of pat;
+       penpos11 (.9 penh, -90);
+       z11 = .4 [z10, z6] - 0.05 vy;
+       penpos12 (.75 penh, -75);
+       z12 = .3 [z11, z6] + 0.02 vy;
+
+       % penlabels (range 1 thru 12);
+
+       soft_penstroke (z1e{(z1r - z1l) rotated 90}
+                       .. z2e
+                       .. z3e
+                       .. z4e)
+         slanted slant shifted (slant * -ypart pos, 0);
+
+       soft_end_penstroke (z5e
+                           .. z6e
+                           .. z7e
+                           .. z8e{(z8r - z8l) rotated 90})
+         slanted slant shifted (slant * -ypart pos, 0);
+
+       soft_end_penstroke (z10e
+                           .. z11e
+                           .. z12e)
+         slanted slant shifted (slant * -ypart pos, 0);
+endgroup;
+enddef;
+
+
+def draw_tab_B (expr pos, siz, slant) =
+begingroup;
+       save vx, vy;
+       pair vx, vy;
+
+       clearxy;
+
+       vx = (xpart siz) * dir 0;
+       vy = (ypart siz) * dir 90;
+
+       penpos1 (.75 penh, 100);
+       z1 = z2 + (.15 * vx - .1 * vy);
+       penpos2 (hround (.9 penw), 0);
+       x2l = hround xpart (pos + .75 vy);
+       y2l = ypart (pos + .75 vy);
+       penpos3 (penh, -100);
+       z3l = pos + .4 vx + 1.05 vy;
+       penpos4 (.8 [penh, penw], -180);
+       z4 = (xpart (pos + .75 siz), .5 [y3, y5]);
+       penpos5 (.8 penh, 90);
+       z5 = (.5 [x10, x4], ypart (pos + .55 siz));
+
+       penpos6 (.8 penh, 270);
+       z6 = z5;
+       penpos7 (penw, 180);
+       z7l = (xpart (pos + siz), .5 [y6, y8]);
+       penpos8 (.8 penh, 45);
+       z8 = .5 [z12l, z11l] + .15 vx - .05 vy;
+
+       penpos10 (.75 [penh, penw], 170);
+       z10 = pos + .375 vx + vy;
+       penpos11 (.8 [penh, penw], 150);
+       z11 = z10 - .5 vy + .04 vx;
+       penpos12 (penh, 100);
+       z12l = (xpart .5 [z13, z11], ypart pos);
+       penpos13 (.75 penh, 60);
+       z13 = pos + .1 vx + .15 vy;
+
+       % penlabels (range 1 thru 13);
+
+       soft_penstroke (z1e
+                       ..tension 1.1.. z2e
+                       .. z3e
+                       .. z4e
+                       ..z5e {left})
+         slanted slant shifted (slant * -ypart pos, 0);
+
+       soft_end_penstroke (z6e{right}
+                           .. z7e
+                           .. z8e{(z8r - z8l) rotated 90})
+         slanted slant shifted (slant * -ypart pos, 0);
+
+       soft_end_penstroke (z10e
+                           ..tension 1.5.. z11e
+                           .. z12e
+                           ..tension 1.1.. z13e{(z13r - z13l) rotated 90})
+         slanted slant shifted (slant * -ypart pos, 0);
+endgroup;
+enddef;
+
+
+def draw_tab_clef (expr reduction) =
+       save reduced_ss, letterheight, penw, penh;
+
+       reduced_ss# = staff_space# * reduction;
+       letterheight# = 1.8 reduced_ss#;
+       define_pixels (reduced_ss, letterheight);
+
+       set_char_box (-.2 reduced_ss#, 2.8 reduced_ss#,
+                     1.6 letterheight#, 1.6 letterheight#);
+
+       penw = .45 reduced_ss;
+       penh = .2 reduced_ss;
+
+       draw_tab_T ((-b + .15 reduced_ss, h - letterheight),
+                   (2.1 reduced_ss, letterheight), 0.2);
+       draw_tab_A ((-b - .05 reduced_ss, -.5 letterheight +.15 reduced_ss),
+                   (2.2 reduced_ss, letterheight), 0.4);
+       draw_tab_B ((-b + .025 reduced_ss, -d),
+                   (2.1 reduced_ss, letterheight), 0.25);
+
+       draw_staff (-3, 2, 0.5);
+enddef;
+
+
+fet_beginchar ("tab clef", "tab");
+       draw_tab_clef (1.0);
+fet_endchar;
+
+
+fet_beginchar ("tab clef (reduced)", "tab_change");
+       draw_tab_clef (.8);
+fet_endchar;
+
+fet_endgroup ("clefs");
diff --git a/mf/feta-din-code.mf b/mf/feta-din-code.mf
deleted file mode 100644 (file)
index d8d0c01..0000000
+++ /dev/null
@@ -1,801 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  dynamic signs
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
-%
-% LilyPond 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.
-%
-% 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/>.
-
-
-ex# := (dynamic_design_size / 2.4) * pt#;
-descender# := 0.5 ex#;
-ascender# := 0.72 ex#;
-staffspace# := 1.75 / 2.0 * ex#;
-horizontal_space# := .66 ex#;
-
-font_x_height ex#;
-font_normal_space horizontal_space#;
-
-define_pixels (staffspace, linethickness, ex, descender, ascender);
-
-
-%
-% TODO: blot diameter should be fixed, not scalable.
-%
-
-save serif_thick, med_thick, bottom_blot;
-
-serif_thick# = 1.1 linethickness#;
-define_blacker_pixels (serif_thick);
-
-med_thick = round (1.5 linethickness);
-bottom_blot = 1.3 serif_thick;
-
-
-code := 32;
-
-fet_beginchar ("Space", "space");
-       set_char_box (0, horizontal_space#, 0, ex#);
-fet_endchar;
-
-
-%
-% Couldn't find many z examples.  This one is losely inspired
-% by a sfz from Mueller Etuden fuer Horn (Edition Hofmeister).
-%
-
-code := 121;
-
-fet_beginchar ("dynamic z", "z");
-       save thin_thick, top_narrow, over_shoot;
-       save bot_thick;
-
-       set_char_box (0, .98 ex#, 0, 0.9 ex#);
-
-       thin_thick = serif_thick;
-       top_narrow = thin_thick;
-       top_overshoot = .8 serif_thick;
-       top_thick = .3 h;
-       bot_thick = .2 ex;
-       bot_overshoot = serif_thick;
-
-       x0 = top_narrow;
-       y0 = .9 [y1r, y1l];
-
-       penpos1 (top_thick, 80);
-       y1l = .72 h;
-       x1r = .34 ex;
-
-       x2 = .66 ex;
-       y2 = y1r - top_overshoot;
-
-       y3 = h - .7 thin_thick;
-       x3 = w - .6 top_narrow - .5 thin_thick;
-       y4 = .5 thin_thick;
-       x4 = .5 thin_thick;
-
-       penpos3 (thin_thick, angle (z3 - z4) + 90);
-       penpos4 (thin_thick, angle (z3 - z4) + 90);
-
-       penpos5 (bot_thick, 70);
-       x5l =.25 ex;
-       y5l = .4 bot_overshoot;
-
-       penpos6 (3/2 bot_thick, 70);
-       y6l = -bot_overshoot;
-       x6 = w - 3 top_narrow;
-
-       x7 = w;
-       y7 = .82 [y8r, y6r];
-
-       penpos8 (thin_thick, 20);
-       x8r = w - .35 top_narrow;
-       y8r = .45 h;
-
-       penlabels (range 0 thru 8);
-
-%      pickup pencircle scaled 1;
-
-%      draw
-       fill z0{down}
-            .. z1l{dir (10)}
-            .. simple_serif (z3l, z3r, 90)
-            .. z2{left}
-            .. z1r{left}
-            ..tension 1.2.. cycle;
-
-%      draw
-       fill z3l
-            -- z3r
-            -- z4r
-            -- z4l
-            -- cycle;
-
-%      draw
-       fill simple_serif (z4r, z4l, 90)
-            .. z5l{right}
-            .. z6l{right}
-            .. z7{up}
-            .. simple_serif (z8r, z8l, 90)
-            .. z6r{left}
-            .. z5r{left}
-            .. cycle;
-fet_endchar;
-
-
-% forte f, grabbed from Ed Breitkopf Mozart horn concerto 3.
-%
-% NOTES:
-%
-% * the bulbs are open
-%
-% * blotting around the serif
-%
-% TODO: insert blots around the serif
-%
-
-slant_angle = 20;
-code := 101;
-
-fet_beginchar ("dynamic f", "f");
-       save left_angle, right_angle;
-       save serif_length, serif_eccentricity;
-       save f_thick;
-       save bulb_thick, bulb_diam, fill_up;
-       save slant;
-       save p;
-       path p;
-
-       set_char_box (0, 1.1 ex#, descender#, ex# + ascender#);
-
-       bulb_diam = 7.5 / 40 ex;
-       bulb_thick = 8.5 / 40 ex;
-       fill_up = 1.5 serif_thick;
-       left_angle = slant_angle - 6;
-       right_angle = slant_angle - 3;
-       f_thick = 7/16 ex;
-       serif_length = 0.96 ex;
-       serif_eccentricity = 0.01 ex;
-
-       % z1 is the `base point'
-       z1 = (0.2 ex, -serif_thick);
-
-       penpos2 (f_thick, 0);
-       y2 = y1 + ex;
-       z2l = z1 + whatever * dir (90 - left_angle);
-
-       penpos3 (med_thick, -90);
-       y3l = y1 + ex + ascender;
-       x3l = x1 + ex;
-
-       penpos4 (bulb_thick, -20);
-       z3r = whatever [z4r, z4l];
-
-       x4l - x3l = 1/10 ex;
-
-       penpos5 (bulb_thick, -45);
-       x5r = 0.1 [x4l, x4r];
-       y5l = y4l - bulb_diam;
-
-       z6 = z2r + whatever * dir (90 - right_angle);
-       y6 = y1 + 3/8 ex;
-
-       penpos7 (med_thick, -90);
-       x7 = x1 - 1/4 ex;
-       y7r = y1 -descender;
-
-       penpos8 (bulb_thick, 160);
-       x8l = x7l - 1/10 ex;
-
-       z7l = whatever [z8r, z8l];
-
-       penpos9 (bulb_thick, 135);
-       x9r = 0.1 [x8l, x8r];
-       y9l = y8l + bulb_diam;
-
-       labels (1, 6, 9);
-       penlabels (2, 3, 4, 5, 7, 8, 9);
-
-%      pickup pencircle scaled 1;
-
-%      draw
-       fill z1
-            -- z2l{z2l - z1}
-            ..tension 1.1.. z3l{right}
-            .. z4r{down}
-            .. z5r{left}
-            .. z5l{up}
-            ..tension 0.8.. z4l{up}
-            .. z3r{left}
-            ..tension 1.1.. z2r{z6 - z2r}
-            -- z6{z6 - z2r}
-            ..tension 1.25.. z7r{left}
-            .. z8r{up}
-            .. z9r{right}
-            .. z9l{down}
-            ..tension 0.8.. z8l{down}
-            .. z7l{right}
-            .. {z2l - z1}cycle;
-
-       x13 - x14 = serif_length;
-       y13 = y14;
-       y14 = y2;
-       0.5 [x13, x14] = x2 + serif_eccentricity;
-
-       draw_rounded_block (z14 - (0, 0.7 serif_thick),
-                           z13 + (0, 0.7 serif_thick),
-                           1.4 serif_thick);
-
-       labels (13, 14);
-fet_endchar;
-
-
-%
-% Notes:
-%
-% - The `s' is trapezoidal (i.e., narrower at the top).
-%
-% - The white space is differently shaped at the top (the bulb's inner
-%   curve is filled up).
-%
-% - Less heavy than the `f' and `p' signs.
-%
-
-code := 114;
-
-fet_beginchar ("dynamic s", "s");
-       save left_angle, right_angle;
-       save s_thick, s_thin;
-       save bulb_diam, bulb_len;
-       save over_shoot;
-       save base_point;
-       pair base_point;
-
-       set_char_box (0, 17/24 ex#, 0, ex#);
-
-       over_shoot = 0;                 % .2 serif_thick;
-       bulb_diam = 11/70 ex;
-       bulb_len = 1.0 bulb_diam;
-       left_angle = slant_angle - 2;
-       right_angle = slant_angle - 11;
-       s_thick = 16/70 ex;
-       s_thin = serif_thick;
-
-       base_point = (0, 0);
-
-       penpos1 (bulb_diam, -45);
-       z1 = 0.35 [z2l, z2r] + bulb_len * dir (45);
-
-       penpos2 (bulb_diam, -25);
-       y2l = 0.845 [y7r, y3r];
-       z2l = base_point + whatever * dir (90 - left_angle);
-
-       penpos3 (s_thin, 100);
-       x3l = 1/2 w;
-       y3l = ypart base_point - over_shoot;
-
-       penpos4 (s_thick, 25);
-       y4l = y1r;
-       z4r = base_point + (w, 0) + whatever * dir (90 - right_angle);
-
-       penpos5 (s_thick, 40);
-       z5 = z3l + whatever * dir (90 - right_angle);
-       y5 = 0.48 [y7r, y3r];
-
-       penpos6 (s_thick, 25);
-       z6l = base_point + whatever * dir (90 - left_angle);
-       y6r = y9l;
-
-       penpos7 (.9 s_thin, 110);
-       z7l = 0.45 [z6r, z8l] + whatever * dir (90 - left_angle);
-       y7r = h + over_shoot;
-
-       penpos8 (.9 bulb_diam, -25);
-       z8 = .6 [z4l, z4r] + whatever * dir (90 - right_angle);
-       y8r = 0.23 [y7r, y3r];
-
-       penpos9 (.9 bulb_diam, -45);
-       z9 = .4 [z8r, z8l] + .9 bulb_len * dir (-135);
-
-       penlabels (range 1 thru 9);
-
-%      pickup pencircle scaled 1;
-
-%      draw
-       fill z2l{down}
-            .. z3l{right}
-            .. z4r{up}
-            .. z5r
-            .. z6r{up}
-            .. z7l{right}
-       %    .. z8l{down}
-            .. z9l{dir (-125)}
-            .. z9r{right}
-            .. z7r{left}
-            .. z6l{down}
-            .. z5l
-            .. z4l{down}
-            .. z3r{left}
-            .. z2r{up}
-            .. z1r{up}
-            .. z1l{left}
-            .. cycle;
-fet_endchar;
-
-
-% for `p' and `m'
-
-save slant;
-slant := ypart (dir (slant_angle));
-
-
-%
-% Piano `p', grabbed from Ed Breitkopf Mozart horn concerto 3.
-%
-% Notes:
-%
-% * There is no dishing in the serif (but we do it anyway).
-%
-% * The cheek is a little fatter than the stem.
-%
-% * The slant is extreme: 20 degrees.
-%
-% * The twiddle (what's-it-called) is a slightly darker than the serif.
-%
-% * The hole in the cheek has a straight right side.
-%
-% * Corners are filled up.
-%
-
-code := 111;
-
-fet_beginchar ("dynamic p", "p")
-       % TODO: w really is 13/12 ex
-       %       but should do kerning
-
-       save twiddle_thick, stem_thick, cheek_thick, cheek_width;
-       save fill_up, straigh_len;
-       save serif, dishing_angle, p, tmp;
-       save cheek_medium, left_serif_protrude, right_serif_protrude;
-       save lower_overshoot;
-       save blot_t, corner_t;
-       path serif, p;
-       pair tmp, updir;
-
-       set_char_box (0, 15/12 ex#, descender#, 1.0 ex#);
-
-       twiddle_thick = med_thick;
-       cheek_medium = 1/6 ex;
-
-       dishing_angle = 5;
-       fill_up = 1.5 serif_thick;
-       straigh_len = 0.5 ex;
-       lower_overshoot = .3 serif_thick;
-
-       stem_thick = 2/6 ex;
-       cheek_thick = 13/32 ex;
-       cheek_width = 0.72 ex;
-       left_serif_protrude = 18/60 ex;
-       right_serif_protrude = 15/60 ex;
-
-       currenttransform := currenttransform slanted slant;
-
-       penpos1 (twiddle_thick, -slant - 5);
-       penpos2 (cheek_medium, 90 - slant);
-       penpos3 (cheek_medium, 90 - slant);
-
-       x4r - x4l = cheek_thick;
-
-       penpos4 (whatever, 0);
-       penpos5 (whatever, -38);
-       penpos6 (stem_thick, 0);
-       penpos17 (straigh_len, 90 - slant);
-
-       whatever [z17l, z17r] =  z4l;
-       y17 = 7/16 ex;
-       x6l = 0;
-       y6l = -descender + serif_thick / 2;
-       z1l = z6l - whatever * dir (110);
-       y1r = 0.5 ex;
-       y2r = ex;
-       z7 = whatever * up + z6l;
-       y7 = 43/60 ex;
-       z2l = whatever * up + 0.3 [z7, z1r];
-       y8 = 0.9 [y7, y2l];
-       z8 = 2/3 [z6l, z6r] + whatever * up;
-       y3r = ex;
-       z3l = 0.58 [(stem_thick, -descender),
-                   (stem_thick + cheek_width - cheek_thick, -descender)]
-             + whatever * up;
-       y4r = .38 ex;
-       z4r = whatever * up + (stem_thick + cheek_width, -descender);
-       z5l = whatever * up + z3l;
-       y5r = -lower_overshoot;
-       y5l = y5r + cheek_medium * ypart dir (55);
-       z9 = z6r + whatever * up;
-       y9 = .2 [y5l, y5r];
-
-       p := z2r{right}
-            .. {dir (-60)}z8{dir 60}
-            .. z3r{right}
-            .. z4r{down}
-            ..tension 1.1.. z5r{left}
-            .. {curl 1}z9
-            -- z6r
-            -- z6l
-            -- z7{up}
-            .. z2l{left}
-            ..tension 1.2.. simple_serif (z1r, z1l, -90)
-            .. cycle;
-
-       blot_t := 0.13;
-       corner_t := xpart (p intersectiontimes z9);
-
-%      pickup pencircle scaled 1;
-
-%      draw
-       fill subpath (0, corner_t - 2 blot_t) of p
-            .. subpath (corner_t + blot_t, length p) of p
-            .. cycle;
-
-       y12 = 0.5 ex;
-       z12 = z6r + whatever * up;
-
-       unfill z17l
-              ..tension 1.5.. z17r
-              .. z3l{left}
-              ..tension 1.05.. z12{down}
-              ..tension 1.05.. z5l{right}
-              .. cycle;
-
-       penlabels (1, 2, 3, 4, 5, 6, 17);
-       labels (7, 8, 9);
-
-       pickup pencircle scaled serif_thick;
-
-       lft x11 = -left_serif_protrude;
-       rt x10 = stem_thick + right_serif_protrude;
-       bot y10 = bot y11 = -descender;
-
-       z15 = z6l + up * fill_up;
-       z16 = z6r + up * 1.2 fill_up;
-
-       % Since pens are not affected by currenttransform we directly
-       % transform the necessary points, then simulating the pen with
-       % an outline while using the identity transformation.
-
-       forsuffixes $ = 7, 10, 11, 15, 16:
-               tmp := z$ transformed currenttransform;
-               x$ := xpart tmp;
-               y$ := ypart tmp;
-       endfor;
-
-       currenttransform := identity;
-
-       updir = z7 - z15;
-
-       serif := simple_serif (z10, z11, dishing_angle);
-
-       penpos10 (serif_thick, -dishing_angle - 90);
-       penpos11 (serif_thick, dishing_angle - 90);
-       penpos13 (serif_thick, angle (direction 0.05 of serif) + 90);
-       penpos14 (serif_thick, angle (direction 0.85 of serif) + 90);
-
-       z13 = point 0.05 of serif;
-       z14 = point 0.85 of serif;
-
-       penlabels (10, 11, 13, 14);
-       labels (15, 16);
-
-%      draw
-       fill z15{-updir}
-            .. z14l{direction 0.85 of serif}
-            .. z11l{-dir (dishing_angle)}
-            .. z11r{dir (dishing_angle)}
-            .. z14r{-direction 0.85 of serif}
-            .. z13r{-direction 0.05 of serif}
-            .. z10r{dir (-dishing_angle)}
-            .. z10l{-dir (-dishing_angle)}
-            .. z13l{direction 0.05 of serif}
-            .. z16{updir}
-            -- cycle;
-fet_endchar;
-
-
-%
-% NOTES:
-%
-% * Right stem is fatter and more straight than the left two stems.
-%
-% * The twiddle at the left is similar to the `p' twiddle.
-%
-% * The bottoms of the stems are blotted.
-%
-%
-% This is cut & paste programming.  Somehow three `i' shapes in two
-% characters (`p' and `m') -- doesn't seem worth the trouble of writing
-% a macro.
-%
-
-code := 108;
-
-fet_beginchar ("dynamic m", "m");
-       save i_thick, i_angle, i_twiddle_thick;
-       save i_twiddle_start_angle, i_twiddle_start_y;
-       save i_twiddle_end_angle, i_left_space;
-       save idir, center, right_ending;
-       save overshoot;
-       save p;
-       pair center, idir, right_ending;
-       path p;
-
-       set_char_box (0, 1.5 ex#, 0, 1.0 ex#);
-
-       % should share code with p for twiddle.
-
-       overshoot = .25 serif_thick;
-       i_thick := 21/80 ex;
-       i_twiddle_thick = 1.2 serif_thick;
-       i_twiddle_start_y = 8/16 ex;
-       i_twiddle_start_angle = 0;
-       i_twiddle_end_angle := 35;
-
-       center = (0, 0);
-
-       currenttransform := currenttransform slanted slant;
-
-       i_angle := 0;
-       idir := dir (90 - i_angle);
-       i_left_space = 16/80 ex;
-
-       penpos1 (i_twiddle_thick, -i_twiddle_start_angle);
-       y1 = i_twiddle_start_y;
-       z1r = center - (i_left_space, 0) + whatever * idir;
-
-       y2l = ex + overshoot;
-       z2l = .08 [z3l, z3r] + whatever * idir;
-       z2r = 5/8 [z1r, z3l] + whatever * idir;
-       y2r = y5l + 1/9 ex;
-       z2 = 1/2 [z2l, z2r];
-
-       penpos3 (i_thick, 0);
-       y3 = 0.5 bottom_blot + ypart center;
-       z3l = center + whatever * idir;
-
-       penpos4 (i_thick - bottom_blot, 0);
-       y4 = ypart center;
-       z4 - z3 = whatever * idir;
-
-       penpos5 (i_thick, 0);
-       z5 = z4 + whatever * idir;
-       y5 = 55/80 ex;
-
-       fill simple_serif (z1l, z1r, 90)
-            ..tension 1.2.. z2r{right}
-            .. z5l{z3 - z5}
-            -- z3l{z3 - z5}
-            .. z4l{right}
-            -- z4r{right}
-            .. z3r{z5 - z3}
-            -- z5r{z5 - z3}
-            ..tension 1.2.. z2l{left}
-            .. cycle;
-
-       right_ending := z5r;
-       penlabels (1, 2, 3, 4, 5);
-
-       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-       clearxy;
-
-       i_angle := -3.2;
-       idir := dir (90 - i_angle);
-       i_left_space := 14/80 ex;
-
-       penpos1 (serif_thick, -i_twiddle_start_angle);
-       z1r = right_ending;
-
-       y2l = ex+ overshoot;
-       z2l = .08 [z3l, z3r] + whatever * idir;
-       z2r = 5/8 [z1r, z3l] + whatever * idir;
-       y2r = y5l + 1/9 ex;
-       z2 = 1/2 [z2l, z2r];
-
-       penpos3 (i_thick, 0);
-       y3 = 0.5 bottom_blot + ypart center;
-       z3l = z5l + whatever * idir;
-
-       penpos4 (i_thick - bottom_blot, 0);
-       y4 = ypart center;
-       z4 - z3 = whatever * idir;
-
-       penpos5 (i_thick, 0);
-       z5l = right_ending + (i_left_space, 0);
-
-       fill simple_serif (z1l, z1r, 90)
-            ..tension 1.05.. z2r{right}
-            .. z5l{z3 - z5}
-            -- z3l
-            ..  z4l{right}
-            -- z4r{right}
-            .. z3r{z5 - z3}
-            -- z5r{z5 - z3}
-            ..tension 1.2.. z2l{left}
-            .. cycle;
-
-       right_ending := z5r;
-       penlabels (1, 2, 3, 4, 5);
-
-       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-       clearxy;
-
-       i_thick := 23/80 ex;
-       i_angle := -6;
-       idir := dir (90 - i_angle);
-       i_left_space := 14/80 ex;
-
-       penpos1 (serif_thick, -i_twiddle_start_angle);
-       z1r = right_ending;
-
-       y2l = ex + overshoot;
-       z2l = .08 [z3l, z3r] + whatever * idir;
-       z2r = 5/8 [z1r, z3l] + whatever * idir;
-       y2r = y5l + 1/9 ex;
-       z2 = 1/2 [z2l, z2r];
-
-       penpos3 (whatever, 20);
-       y3l = 1/8 ex + ypart center;
-       z3l = z7l + whatever * idir;
-       z3r = z7r + whatever * idir;
-
-       penpos5 (whatever, 10);
-       z5l = right_ending + (i_left_space, 0);
-       z5r = z7r + whatever * idir;
-
-       penpos6 (serif_thick, -i_twiddle_end_angle);
-       y6l = 23/80 ex + ypart center;
-       z6l = 1.6 [z3l, z3r] + whatever * idir;
-
-       penpos7 (i_thick, 0);
-       y7 = 0;
-       z7l = z5l + whatever * idir;
-
-       z8 = z7 - (0, overshoot);
-
-       fill simple_serif (z1l, z1r, 90)
-            ..tension 1.05.. z2r{right}
-            .. z5l{z3 - z5}
-            -- z3l{z3 - z5}
-            .. z8{right}
-            .. simple_serif (z6r, z6l, 90)
-            ..tension 0.85.. z3r{z5 - z3}
-            -- z5r{z5 - z3}
-            ..tension 1.2.. z2l{left}
-            .. cycle;
-
-       penlabels (range 1 thru 8);
-fet_endchar;
-
-
-code := 113;
-
-fet_beginchar ("dynamic r", "r");
-       save base_point, stem_thick, bulb_diam;
-       save twiddle_thick, attach_len, overshoot, taille;
-       pair base_point;
-
-       set_char_box (0, .75 ex#, 0, ex#);
-
-       stem_thick =.26 ex;
-       bulb_diam = .30 ex;
-       twiddle_thick = 1.1 serif_thick;
-       overshoot = .5 serif_thick;
-       taille = -0.3 serif_thick;
-       attach_len + bulb_diam / 2 + stem_thick = w;
-
-
-       base_point = (0, 0);
-
-       currenttransform := identity slanted ypart (dir (15));
-
-       penpos1 (stem_thick, 0);
-       x1l = 0;
-       y1l = .5 bottom_blot;
-
-       penpos2 (stem_thick, 0);
-       x2l = x1l;
-       y2l - y1l = 36/47 ex;
-
-       penpos3 (twiddle_thick, -20);
-       x3r = x2l - .2 ex;
-       y3 = .77  ex;
-
-       x4l = -0.1 [x1l, x1r];
-       y4l = ex + overshoot;
-       x4r = 0.62 [x3r, x2l];
-       y4r = 0.5 [y4l, y2l];
-
-       penpos5 (whatever, -74);
-       y5l - y5r =  bulb_diam;
-       y5l = ex + overshoot;
-       x5 = x2r + attach_len;
-
-       penpos6 (bulb_diam, 0);
-       z6 = z5;
-
-%      z7 = z6l + taille * dir (180);
-       z7 = z6 + .4 * bulb_diam * dir (-125);
-
-       z8 = 9/10 [z1r, z2r];
-
-       x9 = 0.15 [x1r, x1l];
-       y9 = y4l - .12 ex;
-
-       penpos10 (stem_thick - bottom_blot, 0);
-       x10 = x1;
-       y10 = 0;
-
-%      pickup pencircle scaled 1;
-
-%      draw 
-       fill z1r{down}
-            .. z10r{left}
-            -- z10l{left}
-            .. z1l{up}
-            -- z2l{up}
-            .. z4r{left}
-            ..tension 1.2.. {down}simple_serif (z3r, z3l,-90){up}
-            ..tension 0.95.. z4l
-            .. {curl 1}z9{curl 1}
-            .. z5l
-            .. z6r{dir (-80)}
-            .. z5r{left}
-            .. z7
-            .. z6l
-            ..tension 1.2.. z8{down}
-            -- cycle;
-
-       penlabels (range 1 thru 10);
-fet_endchar;
-
-
-%%% KERNING
-
-ligtable "m":
-       "p" kern 0.2 ex#,
-       "f" kern -0.1 ex#;
-
-ligtable "f":
-       "f" kern -0.13 ex#;
-
-ligtable "r":
-       "f" kern 0.1 ex#;
-
-
-%% notes from old dyn code.
-
-% `f' obviously has a _lot_ bigger slant than `p' (see Wanske p.239).
-% However; perhaps we need two f symbols:
-%  - a super-slanted one used in `f', `mf', `sfz', `sf'
-%  - a more normal-slanted in `ff', `fff', `fp', `fp' (see Wanske p.241)
-%
-% Looking at professionally typeset music reveals that typesetters
-% are somewhat unsure about slanting in `mf', `fp', `sfz'
-%
-% `f' and `p' (in any combination) are a lot (factor two) fatter than
-% `s', `m', and `z'.  Sometimes the `m' and `z' are a bit fatter than
-% `s'.
-%
-% Chester, Breitkopf suggest smaller sizes of these other glyphs,
-% using the x-height as reference point.
diff --git a/mf/feta-dots.mf b/mf/feta-dots.mf
new file mode 100644 (file)
index 0000000..52e4a38
--- /dev/null
@@ -0,0 +1,37 @@
+% Feta (not the Font-En-Tja) music font -- a duration dot
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+% LilyPond 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.
+%
+% 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 ("dots");
+
+save dot_diam;
+
+2 dot_diam# = staff_space# - stafflinethickness#;
+define_whole_blacker_pixels (dot_diam);
+
+fet_beginchar ("duration dot", "dot");
+       pickup pencircle scaled dot_diam;
+
+       lft x0 = 0;
+       top y0 = vround (.5 dot_diam);
+
+       drawdot z0;
+
+       set_char_box (0, dot_diam#, .5 dot_diam#, .5 dot_diam#);
+fet_endchar;
+
+fet_endgroup ("dots");
diff --git a/mf/feta-dynamics.mf b/mf/feta-dynamics.mf
new file mode 100644 (file)
index 0000000..2fe9b3f
--- /dev/null
@@ -0,0 +1,801 @@
+% Feta (not the Font-En-Tja) music font --  dynamic signs
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% LilyPond 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.
+%
+% 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/>.
+
+
+ex# := (dynamic_design_size / 2.4) * pt#;
+descender# := 0.5 ex#;
+ascender# := 0.72 ex#;
+staffspace# := 1.75 / 2.0 * ex#;
+horizontal_space# := .66 ex#;
+
+font_x_height ex#;
+font_normal_space horizontal_space#;
+
+define_pixels (staffspace, linethickness, ex, descender, ascender);
+
+
+%
+% TODO: blot diameter should be fixed, not scalable.
+%
+
+save serif_thick, med_thick, bottom_blot;
+
+serif_thick# = 1.1 linethickness#;
+define_blacker_pixels (serif_thick);
+
+med_thick = round (1.5 linethickness);
+bottom_blot = 1.3 serif_thick;
+
+
+code := 32;
+
+fet_beginchar ("Space", "space");
+       set_char_box (0, horizontal_space#, 0, ex#);
+fet_endchar;
+
+
+%
+% Couldn't find many z examples.  This one is losely inspired
+% by a sfz from Mueller Etuden fuer Horn (Edition Hofmeister).
+%
+
+code := 121;
+
+fet_beginchar ("dynamic z", "z");
+       save thin_thick, top_narrow, over_shoot;
+       save bot_thick;
+
+       set_char_box (0, .98 ex#, 0, 0.9 ex#);
+
+       thin_thick = serif_thick;
+       top_narrow = thin_thick;
+       top_overshoot = .8 serif_thick;
+       top_thick = .3 h;
+       bot_thick = .2 ex;
+       bot_overshoot = serif_thick;
+
+       x0 = top_narrow;
+       y0 = .9 [y1r, y1l];
+
+       penpos1 (top_thick, 80);
+       y1l = .72 h;
+       x1r = .34 ex;
+
+       x2 = .66 ex;
+       y2 = y1r - top_overshoot;
+
+       y3 = h - .7 thin_thick;
+       x3 = w - .6 top_narrow - .5 thin_thick;
+       y4 = .5 thin_thick;
+       x4 = .5 thin_thick;
+
+       penpos3 (thin_thick, angle (z3 - z4) + 90);
+       penpos4 (thin_thick, angle (z3 - z4) + 90);
+
+       penpos5 (bot_thick, 70);
+       x5l =.25 ex;
+       y5l = .4 bot_overshoot;
+
+       penpos6 (3/2 bot_thick, 70);
+       y6l = -bot_overshoot;
+       x6 = w - 3 top_narrow;
+
+       x7 = w;
+       y7 = .82 [y8r, y6r];
+
+       penpos8 (thin_thick, 20);
+       x8r = w - .35 top_narrow;
+       y8r = .45 h;
+
+       penlabels (range 0 thru 8);
+
+%      pickup pencircle scaled 1;
+
+%      draw
+       fill z0{down}
+            .. z1l{dir (10)}
+            .. simple_serif (z3l, z3r, 90)
+            .. z2{left}
+            .. z1r{left}
+            ..tension 1.2.. cycle;
+
+%      draw
+       fill z3l
+            -- z3r
+            -- z4r
+            -- z4l
+            -- cycle;
+
+%      draw
+       fill simple_serif (z4r, z4l, 90)
+            .. z5l{right}
+            .. z6l{right}
+            .. z7{up}
+            .. simple_serif (z8r, z8l, 90)
+            .. z6r{left}
+            .. z5r{left}
+            .. cycle;
+fet_endchar;
+
+
+% forte f, grabbed from Ed Breitkopf Mozart horn concerto 3.
+%
+% NOTES:
+%
+% * the bulbs are open
+%
+% * blotting around the serif
+%
+% TODO: insert blots around the serif
+%
+
+slant_angle = 20;
+code := 101;
+
+fet_beginchar ("dynamic f", "f");
+       save left_angle, right_angle;
+       save serif_length, serif_eccentricity;
+       save f_thick;
+       save bulb_thick, bulb_diam, fill_up;
+       save slant;
+       save p;
+       path p;
+
+       set_char_box (0, 1.1 ex#, descender#, ex# + ascender#);
+
+       bulb_diam = 7.5 / 40 ex;
+       bulb_thick = 8.5 / 40 ex;
+       fill_up = 1.5 serif_thick;
+       left_angle = slant_angle - 6;
+       right_angle = slant_angle - 3;
+       f_thick = 7/16 ex;
+       serif_length = 0.96 ex;
+       serif_eccentricity = 0.01 ex;
+
+       % z1 is the `base point'
+       z1 = (0.2 ex, -serif_thick);
+
+       penpos2 (f_thick, 0);
+       y2 = y1 + ex;
+       z2l = z1 + whatever * dir (90 - left_angle);
+
+       penpos3 (med_thick, -90);
+       y3l = y1 + ex + ascender;
+       x3l = x1 + ex;
+
+       penpos4 (bulb_thick, -20);
+       z3r = whatever [z4r, z4l];
+
+       x4l - x3l = 1/10 ex;
+
+       penpos5 (bulb_thick, -45);
+       x5r = 0.1 [x4l, x4r];
+       y5l = y4l - bulb_diam;
+
+       z6 = z2r + whatever * dir (90 - right_angle);
+       y6 = y1 + 3/8 ex;
+
+       penpos7 (med_thick, -90);
+       x7 = x1 - 1/4 ex;
+       y7r = y1 -descender;
+
+       penpos8 (bulb_thick, 160);
+       x8l = x7l - 1/10 ex;
+
+       z7l = whatever [z8r, z8l];
+
+       penpos9 (bulb_thick, 135);
+       x9r = 0.1 [x8l, x8r];
+       y9l = y8l + bulb_diam;
+
+       labels (1, 6, 9);
+       penlabels (2, 3, 4, 5, 7, 8, 9);
+
+%      pickup pencircle scaled 1;
+
+%      draw
+       fill z1
+            -- z2l{z2l - z1}
+            ..tension 1.1.. z3l{right}
+            .. z4r{down}
+            .. z5r{left}
+            .. z5l{up}
+            ..tension 0.8.. z4l{up}
+            .. z3r{left}
+            ..tension 1.1.. z2r{z6 - z2r}
+            -- z6{z6 - z2r}
+            ..tension 1.25.. z7r{left}
+            .. z8r{up}
+            .. z9r{right}
+            .. z9l{down}
+            ..tension 0.8.. z8l{down}
+            .. z7l{right}
+            .. {z2l - z1}cycle;
+
+       x13 - x14 = serif_length;
+       y13 = y14;
+       y14 = y2;
+       0.5 [x13, x14] = x2 + serif_eccentricity;
+
+       draw_rounded_block (z14 - (0, 0.7 serif_thick),
+                           z13 + (0, 0.7 serif_thick),
+                           1.4 serif_thick);
+
+       labels (13, 14);
+fet_endchar;
+
+
+%
+% Notes:
+%
+% - The `s' is trapezoidal (i.e., narrower at the top).
+%
+% - The white space is differently shaped at the top (the bulb's inner
+%   curve is filled up).
+%
+% - Less heavy than the `f' and `p' signs.
+%
+
+code := 114;
+
+fet_beginchar ("dynamic s", "s");
+       save left_angle, right_angle;
+       save s_thick, s_thin;
+       save bulb_diam, bulb_len;
+       save over_shoot;
+       save base_point;
+       pair base_point;
+
+       set_char_box (0, 17/24 ex#, 0, ex#);
+
+       over_shoot = 0;                 % .2 serif_thick;
+       bulb_diam = 11/70 ex;
+       bulb_len = 1.0 bulb_diam;
+       left_angle = slant_angle - 2;
+       right_angle = slant_angle - 11;
+       s_thick = 16/70 ex;
+       s_thin = serif_thick;
+
+       base_point = (0, 0);
+
+       penpos1 (bulb_diam, -45);
+       z1 = 0.35 [z2l, z2r] + bulb_len * dir (45);
+
+       penpos2 (bulb_diam, -25);
+       y2l = 0.845 [y7r, y3r];
+       z2l = base_point + whatever * dir (90 - left_angle);
+
+       penpos3 (s_thin, 100);
+       x3l = 1/2 w;
+       y3l = ypart base_point - over_shoot;
+
+       penpos4 (s_thick, 25);
+       y4l = y1r;
+       z4r = base_point + (w, 0) + whatever * dir (90 - right_angle);
+
+       penpos5 (s_thick, 40);
+       z5 = z3l + whatever * dir (90 - right_angle);
+       y5 = 0.48 [y7r, y3r];
+
+       penpos6 (s_thick, 25);
+       z6l = base_point + whatever * dir (90 - left_angle);
+       y6r = y9l;
+
+       penpos7 (.9 s_thin, 110);
+       z7l = 0.45 [z6r, z8l] + whatever * dir (90 - left_angle);
+       y7r = h + over_shoot;
+
+       penpos8 (.9 bulb_diam, -25);
+       z8 = .6 [z4l, z4r] + whatever * dir (90 - right_angle);
+       y8r = 0.23 [y7r, y3r];
+
+       penpos9 (.9 bulb_diam, -45);
+       z9 = .4 [z8r, z8l] + .9 bulb_len * dir (-135);
+
+       penlabels (range 1 thru 9);
+
+%      pickup pencircle scaled 1;
+
+%      draw
+       fill z2l{down}
+            .. z3l{right}
+            .. z4r{up}
+            .. z5r
+            .. z6r{up}
+            .. z7l{right}
+       %    .. z8l{down}
+            .. z9l{dir (-125)}
+            .. z9r{right}
+            .. z7r{left}
+            .. z6l{down}
+            .. z5l
+            .. z4l{down}
+            .. z3r{left}
+            .. z2r{up}
+            .. z1r{up}
+            .. z1l{left}
+            .. cycle;
+fet_endchar;
+
+
+% for `p' and `m'
+
+save slant;
+slant := ypart (dir (slant_angle));
+
+
+%
+% Piano `p', grabbed from Ed Breitkopf Mozart horn concerto 3.
+%
+% Notes:
+%
+% * There is no dishing in the serif (but we do it anyway).
+%
+% * The cheek is a little fatter than the stem.
+%
+% * The slant is extreme: 20 degrees.
+%
+% * The twiddle (what's-it-called) is a slightly darker than the serif.
+%
+% * The hole in the cheek has a straight right side.
+%
+% * Corners are filled up.
+%
+
+code := 111;
+
+fet_beginchar ("dynamic p", "p")
+       % TODO: w really is 13/12 ex
+       %       but should do kerning
+
+       save twiddle_thick, stem_thick, cheek_thick, cheek_width;
+       save fill_up, straigh_len;
+       save serif, dishing_angle, p, tmp;
+       save cheek_medium, left_serif_protrude, right_serif_protrude;
+       save lower_overshoot;
+       save blot_t, corner_t;
+       path serif, p;
+       pair tmp, updir;
+
+       set_char_box (0, 15/12 ex#, descender#, 1.0 ex#);
+
+       twiddle_thick = med_thick;
+       cheek_medium = 1/6 ex;
+
+       dishing_angle = 5;
+       fill_up = 1.5 serif_thick;
+       straigh_len = 0.5 ex;
+       lower_overshoot = .3 serif_thick;
+
+       stem_thick = 2/6 ex;
+       cheek_thick = 13/32 ex;
+       cheek_width = 0.72 ex;
+       left_serif_protrude = 18/60 ex;
+       right_serif_protrude = 15/60 ex;
+
+       currenttransform := currenttransform slanted slant;
+
+       penpos1 (twiddle_thick, -slant - 5);
+       penpos2 (cheek_medium, 90 - slant);
+       penpos3 (cheek_medium, 90 - slant);
+
+       x4r - x4l = cheek_thick;
+
+       penpos4 (whatever, 0);
+       penpos5 (whatever, -38);
+       penpos6 (stem_thick, 0);
+       penpos17 (straigh_len, 90 - slant);
+
+       whatever [z17l, z17r] =  z4l;
+       y17 = 7/16 ex;
+       x6l = 0;
+       y6l = -descender + serif_thick / 2;
+       z1l = z6l - whatever * dir (110);
+       y1r = 0.5 ex;
+       y2r = ex;
+       z7 = whatever * up + z6l;
+       y7 = 43/60 ex;
+       z2l = whatever * up + 0.3 [z7, z1r];
+       y8 = 0.9 [y7, y2l];
+       z8 = 2/3 [z6l, z6r] + whatever * up;
+       y3r = ex;
+       z3l = 0.58 [(stem_thick, -descender),
+                   (stem_thick + cheek_width - cheek_thick, -descender)]
+             + whatever * up;
+       y4r = .38 ex;
+       z4r = whatever * up + (stem_thick + cheek_width, -descender);
+       z5l = whatever * up + z3l;
+       y5r = -lower_overshoot;
+       y5l = y5r + cheek_medium * ypart dir (55);
+       z9 = z6r + whatever * up;
+       y9 = .2 [y5l, y5r];
+
+       p := z2r{right}
+            .. {dir (-60)}z8{dir 60}
+            .. z3r{right}
+            .. z4r{down}
+            ..tension 1.1.. z5r{left}
+            .. {curl 1}z9
+            -- z6r
+            -- z6l
+            -- z7{up}
+            .. z2l{left}
+            ..tension 1.2.. simple_serif (z1r, z1l, -90)
+            .. cycle;
+
+       blot_t := 0.13;
+       corner_t := xpart (p intersectiontimes z9);
+
+%      pickup pencircle scaled 1;
+
+%      draw
+       fill subpath (0, corner_t - 2 blot_t) of p
+            .. subpath (corner_t + blot_t, length p) of p
+            .. cycle;
+
+       y12 = 0.5 ex;
+       z12 = z6r + whatever * up;
+
+       unfill z17l
+              ..tension 1.5.. z17r
+              .. z3l{left}
+              ..tension 1.05.. z12{down}
+              ..tension 1.05.. z5l{right}
+              .. cycle;
+
+       penlabels (1, 2, 3, 4, 5, 6, 17);
+       labels (7, 8, 9);
+
+       pickup pencircle scaled serif_thick;
+
+       lft x11 = -left_serif_protrude;
+       rt x10 = stem_thick + right_serif_protrude;
+       bot y10 = bot y11 = -descender;
+
+       z15 = z6l + up * fill_up;
+       z16 = z6r + up * 1.2 fill_up;
+
+       % Since pens are not affected by currenttransform we directly
+       % transform the necessary points, then simulating the pen with
+       % an outline while using the identity transformation.
+
+       forsuffixes $ = 7, 10, 11, 15, 16:
+               tmp := z$ transformed currenttransform;
+               x$ := xpart tmp;
+               y$ := ypart tmp;
+       endfor;
+
+       currenttransform := identity;
+
+       updir = z7 - z15;
+
+       serif := simple_serif (z10, z11, dishing_angle);
+
+       penpos10 (serif_thick, -dishing_angle - 90);
+       penpos11 (serif_thick, dishing_angle - 90);
+       penpos13 (serif_thick, angle (direction 0.05 of serif) + 90);
+       penpos14 (serif_thick, angle (direction 0.85 of serif) + 90);
+
+       z13 = point 0.05 of serif;
+       z14 = point 0.85 of serif;
+
+       penlabels (10, 11, 13, 14);
+       labels (15, 16);
+
+%      draw
+       fill z15{-updir}
+            .. z14l{direction 0.85 of serif}
+            .. z11l{-dir (dishing_angle)}
+            .. z11r{dir (dishing_angle)}
+            .. z14r{-direction 0.85 of serif}
+            .. z13r{-direction 0.05 of serif}
+            .. z10r{dir (-dishing_angle)}
+            .. z10l{-dir (-dishing_angle)}
+            .. z13l{direction 0.05 of serif}
+            .. z16{updir}
+            -- cycle;
+fet_endchar;
+
+
+%
+% NOTES:
+%
+% * Right stem is fatter and more straight than the left two stems.
+%
+% * The twiddle at the left is similar to the `p' twiddle.
+%
+% * The bottoms of the stems are blotted.
+%
+%
+% This is cut & paste programming.  Somehow three `i' shapes in two
+% characters (`p' and `m') -- doesn't seem worth the trouble of writing
+% a macro.
+%
+
+code := 108;
+
+fet_beginchar ("dynamic m", "m");
+       save i_thick, i_angle, i_twiddle_thick;
+       save i_twiddle_start_angle, i_twiddle_start_y;
+       save i_twiddle_end_angle, i_left_space;
+       save idir, center, right_ending;
+       save overshoot;
+       save p;
+       pair center, idir, right_ending;
+       path p;
+
+       set_char_box (0, 1.5 ex#, 0, 1.0 ex#);
+
+       % should share code with p for twiddle.
+
+       overshoot = .25 serif_thick;
+       i_thick := 21/80 ex;
+       i_twiddle_thick = 1.2 serif_thick;
+       i_twiddle_start_y = 8/16 ex;
+       i_twiddle_start_angle = 0;
+       i_twiddle_end_angle := 35;
+
+       center = (0, 0);
+
+       currenttransform := currenttransform slanted slant;
+
+       i_angle := 0;
+       idir := dir (90 - i_angle);
+       i_left_space = 16/80 ex;
+
+       penpos1 (i_twiddle_thick, -i_twiddle_start_angle);
+       y1 = i_twiddle_start_y;
+       z1r = center - (i_left_space, 0) + whatever * idir;
+
+       y2l = ex + overshoot;
+       z2l = .08 [z3l, z3r] + whatever * idir;
+       z2r = 5/8 [z1r, z3l] + whatever * idir;
+       y2r = y5l + 1/9 ex;
+       z2 = 1/2 [z2l, z2r];
+
+       penpos3 (i_thick, 0);
+       y3 = 0.5 bottom_blot + ypart center;
+       z3l = center + whatever * idir;
+
+       penpos4 (i_thick - bottom_blot, 0);
+       y4 = ypart center;
+       z4 - z3 = whatever * idir;
+
+       penpos5 (i_thick, 0);
+       z5 = z4 + whatever * idir;
+       y5 = 55/80 ex;
+
+       fill simple_serif (z1l, z1r, 90)
+            ..tension 1.2.. z2r{right}
+            .. z5l{z3 - z5}
+            -- z3l{z3 - z5}
+            .. z4l{right}
+            -- z4r{right}
+            .. z3r{z5 - z3}
+            -- z5r{z5 - z3}
+            ..tension 1.2.. z2l{left}
+            .. cycle;
+
+       right_ending := z5r;
+       penlabels (1, 2, 3, 4, 5);
+
+       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+       clearxy;
+
+       i_angle := -3.2;
+       idir := dir (90 - i_angle);
+       i_left_space := 14/80 ex;
+
+       penpos1 (serif_thick, -i_twiddle_start_angle);
+       z1r = right_ending;
+
+       y2l = ex+ overshoot;
+       z2l = .08 [z3l, z3r] + whatever * idir;
+       z2r = 5/8 [z1r, z3l] + whatever * idir;
+       y2r = y5l + 1/9 ex;
+       z2 = 1/2 [z2l, z2r];
+
+       penpos3 (i_thick, 0);
+       y3 = 0.5 bottom_blot + ypart center;
+       z3l = z5l + whatever * idir;
+
+       penpos4 (i_thick - bottom_blot, 0);
+       y4 = ypart center;
+       z4 - z3 = whatever * idir;
+
+       penpos5 (i_thick, 0);
+       z5l = right_ending + (i_left_space, 0);
+
+       fill simple_serif (z1l, z1r, 90)
+            ..tension 1.05.. z2r{right}
+            .. z5l{z3 - z5}
+            -- z3l
+            ..  z4l{right}
+            -- z4r{right}
+            .. z3r{z5 - z3}
+            -- z5r{z5 - z3}
+            ..tension 1.2.. z2l{left}
+            .. cycle;
+
+       right_ending := z5r;
+       penlabels (1, 2, 3, 4, 5);
+
+       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+       clearxy;
+
+       i_thick := 23/80 ex;
+       i_angle := -6;
+       idir := dir (90 - i_angle);
+       i_left_space := 14/80 ex;
+
+       penpos1 (serif_thick, -i_twiddle_start_angle);
+       z1r = right_ending;
+
+       y2l = ex + overshoot;
+       z2l = .08 [z3l, z3r] + whatever * idir;
+       z2r = 5/8 [z1r, z3l] + whatever * idir;
+       y2r = y5l + 1/9 ex;
+       z2 = 1/2 [z2l, z2r];
+
+       penpos3 (whatever, 20);
+       y3l = 1/8 ex + ypart center;
+       z3l = z7l + whatever * idir;
+       z3r = z7r + whatever * idir;
+
+       penpos5 (whatever, 10);
+       z5l = right_ending + (i_left_space, 0);
+       z5r = z7r + whatever * idir;
+
+       penpos6 (serif_thick, -i_twiddle_end_angle);
+       y6l = 23/80 ex + ypart center;
+       z6l = 1.6 [z3l, z3r] + whatever * idir;
+
+       penpos7 (i_thick, 0);
+       y7 = 0;
+       z7l = z5l + whatever * idir;
+
+       z8 = z7 - (0, overshoot);
+
+       fill simple_serif (z1l, z1r, 90)
+            ..tension 1.05.. z2r{right}
+            .. z5l{z3 - z5}
+            -- z3l{z3 - z5}
+            .. z8{right}
+            .. simple_serif (z6r, z6l, 90)
+            ..tension 0.85.. z3r{z5 - z3}
+            -- z5r{z5 - z3}
+            ..tension 1.2.. z2l{left}
+            .. cycle;
+
+       penlabels (range 1 thru 8);
+fet_endchar;
+
+
+code := 113;
+
+fet_beginchar ("dynamic r", "r");
+       save base_point, stem_thick, bulb_diam;
+       save twiddle_thick, attach_len, overshoot, taille;
+       pair base_point;
+
+       set_char_box (0, .75 ex#, 0, ex#);
+
+       stem_thick =.26 ex;
+       bulb_diam = .30 ex;
+       twiddle_thick = 1.1 serif_thick;
+       overshoot = .5 serif_thick;
+       taille = -0.3 serif_thick;
+       attach_len + bulb_diam / 2 + stem_thick = w;
+
+
+       base_point = (0, 0);
+
+       currenttransform := identity slanted ypart (dir (15));
+
+       penpos1 (stem_thick, 0);
+       x1l = 0;
+       y1l = .5 bottom_blot;
+
+       penpos2 (stem_thick, 0);
+       x2l = x1l;
+       y2l - y1l = 36/47 ex;
+
+       penpos3 (twiddle_thick, -20);
+       x3r = x2l - .2 ex;
+       y3 = .77  ex;
+
+       x4l = -0.1 [x1l, x1r];
+       y4l = ex + overshoot;
+       x4r = 0.62 [x3r, x2l];
+       y4r = 0.5 [y4l, y2l];
+
+       penpos5 (whatever, -74);
+       y5l - y5r =  bulb_diam;
+       y5l = ex + overshoot;
+       x5 = x2r + attach_len;
+
+       penpos6 (bulb_diam, 0);
+       z6 = z5;
+
+%      z7 = z6l + taille * dir (180);
+       z7 = z6 + .4 * bulb_diam * dir (-125);
+
+       z8 = 9/10 [z1r, z2r];
+
+       x9 = 0.15 [x1r, x1l];
+       y9 = y4l - .12 ex;
+
+       penpos10 (stem_thick - bottom_blot, 0);
+       x10 = x1;
+       y10 = 0;
+
+%      pickup pencircle scaled 1;
+
+%      draw
+       fill z1r{down}
+            .. z10r{left}
+            -- z10l{left}
+            .. z1l{up}
+            -- z2l{up}
+            .. z4r{left}
+            ..tension 1.2.. {down}simple_serif (z3r, z3l,-90){up}
+            ..tension 0.95.. z4l
+            .. {curl 1}z9{curl 1}
+            .. z5l
+            .. z6r{dir (-80)}
+            .. z5r{left}
+            .. z7
+            .. z6l
+            ..tension 1.2.. z8{down}
+            -- cycle;
+
+       penlabels (range 1 thru 10);
+fet_endchar;
+
+
+%%% KERNING
+
+ligtable "m":
+       "p" kern 0.2 ex#,
+       "f" kern -0.1 ex#;
+
+ligtable "f":
+       "f" kern -0.13 ex#;
+
+ligtable "r":
+       "f" kern 0.1 ex#;
+
+
+%% notes from old dyn code.
+
+% `f' obviously has a _lot_ bigger slant than `p' (see Wanske p.239).
+% However; perhaps we need two f symbols:
+%  - a super-slanted one used in `f', `mf', `sfz', `sf'
+%  - a more normal-slanted in `ff', `fff', `fp', `fp' (see Wanske p.241)
+%
+% Looking at professionally typeset music reveals that typesetters
+% are somewhat unsure about slanting in `mf', `fp', `sfz'
+%
+% `f' and `p' (in any combination) are a lot (factor two) fatter than
+% `s', `m', and `z'.  Sometimes the `m' and `z' are a bit fatter than
+% `s'.
+%
+% Chester, Breitkopf suggest smaller sizes of these other glyphs,
+% using the x-height as reference point.
diff --git a/mf/feta-eindelijk.mf b/mf/feta-eindelijk.mf
deleted file mode 100644 (file)
index b57f84c..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  rest symbols -*-Fundamental-*-
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
-%
-% LilyPond 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.
-%
-% 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 ("rests");
-
-save block_rest_y, block_rest_x;
-save breve_rest_y, breve_rest_x;
-
-breve_rest_y# = staff_space#;
-breve_rest_x# = 3/5 staff_space#;
-block_rest_y# = 5/8 staff_space#;
-block_rest_x# = 3/2 staff_space#;
-
-define_whole_pixels (block_rest_y, block_rest_x);
-define_whole_pixels (breve_rest_y, breve_rest_x);
-
-
-def block_rest =
-       draw_block ((0, 0), (block_rest_x, block_rest_y));
-enddef;
-
-
-fet_beginchar ("whole rest", "0");
-       set_char_box (0, block_rest_x#,
-                     block_rest_y#, 0);
-
-       block_rest;
-       currentpicture := currentpicture
-                           shifted (0, -block_rest_y + feta_space_shift);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("half rest", "1");
-       set_char_box (0, block_rest_x#, 0, block_rest_y#);
-
-       block_rest;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-%
-% should use ledgerline thickness?
-%
-fet_beginchar ("whole rest (outside staff)", "0o");
-       set_char_box (0, block_rest_x#,
-                     block_rest_y#, ledgerlinethickness# / 2);
-
-       block_rest;
-       currentpicture := currentpicture shifted (0, -block_rest_y);
-
-       pickup pencircle scaled ledgerlinethickness;
-
-       y5 = y6 = 0;
-       lft x5 = -b - block_rest_y;
-       rt x6 = w + block_rest_y;
-       draw_gridline (z5, z6, ledgerlinethickness_rounded);
-
-       draw_staff (-2, 2, -3);
-fet_endchar;
-
-
-fet_beginchar ("half rest (outside staff)", "1o");
-       set_char_box (0, block_rest_x#,
-                     ledgerlinethickness# / 2, block_rest_y#);
-
-       block_rest;
-
-       pickup pencircle scaled ledgerlinethickness;
-
-       y5 = y6 = 0;
-       lft x5 = -b - block_rest_y;
-       rt x6 = w + block_rest_y;
-
-       draw_gridline (z5, z6, ledgerlinethickness_rounded);
-
-       draw_staff (-2, 2, 3);
-fet_endchar;
-
-
-fet_beginchar ("maxima rest", "M3");
-       set_char_box (0, 3 breve_rest_x#, breve_rest_y#, breve_rest_y#);
-
-       draw_block ((0, -breve_rest_y + feta_shift),
-                   (breve_rest_x, breve_rest_y));
-
-       addto currentpicture also currentpicture shifted (2 breve_rest_x, 0);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("longa rest", "M2");
-       set_char_box (0, breve_rest_x#, breve_rest_y#, breve_rest_y#);
-
-       draw_block ((0, -breve_rest_y + feta_shift),
-                   (breve_rest_x, breve_rest_y));
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("breve rest", "M1");
-       set_char_box (0, breve_rest_x#, 0, breve_rest_y#);
-
-       draw_block ((0, 0), (breve_rest_x, breve_rest_y));
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Quarter rest", "2");
-       save alpha, yshift, height;
-       save xcenter;
-
-       yshift# := -1.25 staff_space#;
-       height# := 2.8125 staff_space#;
-       define_pixels (yshift, height);
-
-       alpha := -50;
-       thick := 1/4 staff_space;
-       rthin := 1.25 linethickness;
-       xcenter := -0.1 staff_space;
-       rthick := 2 thick + rthin;
-
-       set_char_box (0, 0.95 staff_space#, -yshift#, yshift# + height#);
-
-       save ne, nw, se, sw;
-       pair ne, nw, se, sw;
-
-       se = dir alpha;
-       ne = dir (alpha + 90);
-       nw = dir (alpha + 180);
-       sw = dir (alpha + 270);
-
-       penpos1 (rthin, alpha + 90);
-       penpos2 (5/4 rthick, alpha);
-       penpos4 (5/4 rthick, alpha);
-       penpos5 (rthin, alpha + 90);
-       penpos3 (3/4 rthick, alpha);
-%      penpos6 (5/8 rthick, alpha);
-       penpos6 (2/3 rthick, alpha);
-       penpos7 (1/2 rthin, alpha + 90);
-
-       z10 = z2l + 1/2 rthin * sw;
-%      z11 = z4l + 1/2 rthin * sw;
-       z11 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
-       z12 = z4r + 1/2 rthin * ne;
-%      z13 = z2r + 1/2 rthin * ne;
-       z13 = z2r + 1/2 rthin * ne + 1/2 rthin * nw;
-
-       y1r = h;
-       x1l = xcenter + 1/3 staff_space;
-       z2r = z1 + staff_space * se;
-       z3 = 1/2 [z2, z4];
-       x4 = xcenter + 3/8 staff_space;
-       y4 = 0;
-       y4l := vround y4l;
-       z5 = round (z4l + 1.3 staff_space * se) + feta_offset;
-       x6l = x4l;
-       y6l = vround y4r;
-       x6r := hround x6r + xpart feta_offset;
-       y6r := vround y6r + ypart feta_offset;
-       x7 = hround (xcenter + 2/5 staff_space) + xpart feta_offset;
-       y7 = -d;
-
-       save before, after;
-       path before, after;
-       before = z11{se}
-                .. {se}z5l;
-       after = z5r{nw}
-               ..tension1.4.. z6l;
-       (u, v) = before intersectiontimes after;
-
-       fill z1l{se}
-            .. {se}z10
-            .. z3l
-            .. subpath (0, u) of before
-            .. subpath (v, infinity) of after
-            ..tension1.4.. {se}z7l
-            .. z7r{nw}
-            ..tension1.4.. z6r
-            ..tension1.4.. {se}z5l
-            .. z5r{nw}
-            .. {nw}z12
-            .. z3r
-            .. z13{nw}
-            .. {nw}z1r
-            .. cycle;
-
-       penlabels (1, 2, 3, 4, 5, 6, 7);
-       penlabels (10, 11, 12, 13);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-%
-% Notes about 8th rest:
-%
-% * 8th rest should be no wider than the black note head
-%
-% * The inside corner of the horizontal portion is usually a little blotted.
-%
-% * The top of the crook chops off the vertical brush
-%
-% * The crook widens a little
-%
-% * The bottom of the brush is slightly flat, as it has to align with
-% stafflines if it is inside the staff.
-%
-% * The top of the brush usually is a little lower than the top of bulb.
-%
-% * The bulb can vary. Sometimes it is open (like in the clefs). Sometimes
-% it is closed, or even a flare.
-%
-
-% from an email to Rune Zedeler:
-%
-%
-% For example, the 8th rest was vaguely based on a book with trumpet
-% studies by Duhem, and by Baerenreiters cello suites. I included my
-% findings in a comment in the mf file.  One of the things that I tried
-% to do was make the rest a little lighter and narrower than the black
-% note head. I think this looks better in polyphonic music, when the
-% rest is below a head from a different voice.
-%
-
-save bulb_diam, thin, thick;
-
-bulb_diam# := 0.64 staff_space#;
-thin# := 1.4 linethickness# - 0.02 staff_space#;
-thick# := 2.2 linethickness#;
-
-crook_thin := 0.5 linethickness + 0.08 staff_space;
-lower_brush := 1.5 linethickness;
-
-define_pixels (bulb_diam);
-define_whole_blacker_pixels (thin, thick);
-
-
-%
-% PAT is a compact way to pass the brush shape to the routine.
-%
-
-def draw_rest_bulb (expr ycenter, ycut, pat, stretch, show_labels) =
-begingroup;
-       save x, y, pt, res;
-
-       z1l = point 0 of pat;
-       z2l = point 1 of pat;
-       z2r = point 3 of pat;
-       z1r = point 4 of pat;
-       z1 = 0.5 [z1l, z1r];
-       z2 = 0.5 [z2l, z2r];
-       y10 = ycenter;
-       z10 = whatever [z2, z1] + left * bulb_diam * stretch;
-
-       % this enforces similar bulb shapes for lower resolutions
-       x10 := hround x10;
-
-       z3 = z10 + bulb_diam / 2.15 * dir (-72);
-       y3 := hround y3;
-       z5 = z10 + up * bulb_diam / 2 + right * linethickness / 3;
-       y5 := hround y5;
-
-       z7 = 0.5 [z4, z5] + crook_thin * (0.45, 0.4) / 1.3;
-       x8 = hround (x10 - 0.4 bulb_diam);
-       y8 = y10 + 0.25 linethickness;
-
-       z6 = whatever [z1l, z2l];
-       z6 = z3 + whatever * dir (12);
-
-       z4 = z3 + whatever * (z6 - z3)
-            + 1.1 crook_thin * (unitvector (z6 - z3) rotated 90);
-       x4 = x10 + bulb_diam * .62;
-       y4 := vround y4;
-
-       (pt, whatever) = pat intersectiontimes ((0, ycut) -- (w, ycut));
-
-       path res;
-       res = point pt of pat {-direction pt of pat}
-             ..tension 2.. z4{left}
-             ..tension 0.9.. z7
-             .. z5{left}
-             .. z8
-             .. z3{right}
-             .. {curl 0.2}z6;
-
-       if show_labels = 1:
-               labels (3, 4, 5, 6, 7, 8, 10);
-       fi;
-
-res
-endgroup;
-enddef;
-
-
-def draw_eighth_rest (expr show_labels) =
-       save ycenter;
-       save pat, bulb;
-       path pat, bulb;
-
-       set_char_box (0, 1.0 staff_space#,
-                     1.0 staff_space# + 0.5 linethickness#,
-                     0.5 staff_space# + bulb_diam# / 2);
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 10);
-
-       y1 = -staff_space_rounded;
-       y2 = h - vround lower_brush;
-       x2r = w;
-       z2 = z1 + whatever * dir (72);
-       z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
-       y9 := vround y9;
-
-       x1l := hround x1l;
-       x1r := hround x1r;
-       x1 := .5 [x1l, x1r];
-
-       if show_labels = 1:
-               penlabels (1, 2);
-               labels (9);
-       fi;
-
-       pat = z1l
-             -- z2l
-             .. z9
-             .. z2r
-             -- z1r
-             .. cycle;
-       bulb = draw_rest_bulb (0.5 staff_space, y2r, pat, 1.0, show_labels);
-
-       fill simple_serif (z1l, z1r, 40)
-            -- z2r
-            .. z9
-            .. bulb
-            -- z1l
-            .. cycle;
-
-       draw_staff (-2, 2, 0);
-enddef;
-
-
-fet_beginchar ("Classical quarter rest", "2classical");
-       draw_eighth_rest (0);
-       currentpicture := currentpicture xscaled -1 shifted (w, 0);
-fet_endchar;
-
-
-fet_beginchar ("8th rest", "3");
-       draw_eighth_rest (1);
-fet_endchar;
-
-
-%
-% TODO: the X dimensions of the rests are fucked up:
-% they can collide with augmentation dots.
-%
-
-fet_beginchar ("16th rest", "4");
-       save ycenter;
-       save pat, bulb_a, bulb_b;
-       path pat, bulb_a, bulb_b;
-
-       set_char_box (0, 1.2 staff_space#,
-                     2.0 staff_space# + 0.5 linethickness#,
-                     0.5 staff_space# + bulb_diam# / 2);
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 10);
-
-       y1 = -2 staff_space_rounded;
-       y2 = h - vround lower_brush;
-       x2r = w;
-       z2 = z1 + whatever * dir (74);
-               z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
-       y9 := vround y9;
-
-       x1l := hround x1l;
-       x1r := hround x1r;
-       x1 := .5 [x1l, x1r];
-
-       pat = z1l
-             -- z2l
-             .. z9
-             .. z2r
-             -- z1r
-             .. cycle;
-       bulb_a = draw_rest_bulb (.5 staff_space,
-                                y2r, pat, 0.98, 1);
-       bulb_b = draw_rest_bulb (.5 staff_space - staff_space_rounded,
-                                hround ((-0.5 + 0.2) * staff_space),
-                                pat, 1.02, 1);
-
-       fill simple_serif (z1l, z1r, 40)
-            -- z2r
-            .. z9
-            .. bulb_a
-            -- bulb_b
-            -- z1l
-            .. cycle;
-
-       penlabels (1, 2);
-       labels (9);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("32th rest", "5");
-       save ycenter;
-       save pat, bulb_a, bulb_b, bulb_c;
-       path pat, bulb_a, bulb_b, bulb_c;
-
-       set_char_box (0, 1.3 staff_space#,
-                     2.0 staff_space# + 0.5 linethickness#,
-                     1.5 staff_space# + bulb_diam# / 2);
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 10);
-
-       y1 = -2 staff_space_rounded;
-       y2 = h - vround lower_brush;
-       x2r = w;
-       z2 = z1 + whatever * dir (76);
-               z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
-       y9 := vround y9;
-
-       x1l := hround x1l;
-       x1r := hround x1r;
-       x1 := .5 [x1l, x1r];
-
-       pat = z1l
-             -- z2l
-             .. z9
-             .. z2r
-             -- z1r
-             .. cycle;
-       bulb_a = draw_rest_bulb (.5 staff_space + staff_space_rounded,
-                                y2r, pat, 0.96, 1);
-       bulb_b = draw_rest_bulb (.5 staff_space,
-                                hround ((0.5 + 0.2) * staff_space),
-                                pat, 1.00, 1);
-       bulb_c = draw_rest_bulb (.5 staff_space - staff_space_rounded,
-                                hround ((-0.5 + 0.21) * staff_space),
-                                pat, 1.04, 1);
-
-       fill simple_serif (z1l, z1r, 40)
-            -- z2r
-            .. z9
-            .. bulb_a
-            -- bulb_b
-            -- bulb_c
-            -- z1l
-            .. cycle;
-
-       penlabels (1, 2);
-       labels (9);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("64th rest", "6");
-       save ycenter;
-       save pat, bulb_a, bulb_b, bulb_c, bulb_d;
-       path pat, bulb_a, bulb_b, bulb_c, bulb_d;
-
-       set_char_box (0, 1.4 staff_space#,
-                     3.0 staff_space# + 0.5 linethickness#,
-                     1.5 staff_space# + bulb_diam# / 2);
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 10);
-
-       y1 = -3 staff_space_rounded;
-       y2 = h - vround lower_brush;
-       x2r = w;
-       z2 = z1 + whatever * dir (78);
-               z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
-       y9 := vround y9;
-
-       x1l := hround x1l;
-       x1r := hround x1r;
-       x1 := .5 [x1l, x1r];
-
-       pat = z1l
-             -- z2l
-             .. z9
-             .. z2r
-             -- z1r
-             .. cycle;
-       bulb_a = draw_rest_bulb (.5 staff_space + staff_space_rounded,
-                                y2r, pat, 0.94, 1);
-       bulb_b = draw_rest_bulb (.5 staff_space,
-                                hround ((0.5 + 0.20) * staff_space),
-                                pat, 0.98, 1);
-       bulb_c = draw_rest_bulb (.5 staff_space - staff_space_rounded,
-                                hround ((-0.5 + 0.21) * staff_space),
-                                pat, 1.02, 1);
-       bulb_d = draw_rest_bulb (.5 staff_space - 2 staff_space_rounded,
-                                hround ((-1.5 + 0.22) * staff_space),
-                                pat, 1.06, 1);
-
-       fill simple_serif (z1l, z1r, 40)
-            -- z2r
-            .. z9
-            .. bulb_a
-            -- bulb_b
-            -- bulb_c
-            -- bulb_d
-            -- z1l
-            .. cycle;
-
-       penlabels (1, 2);
-       labels (9);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("128th rest", "7");
-       save ycenter;
-       save pat, bulb_a, bulb_b, bulb_c, bulb_d, bulb_e;
-       path pat, bulb_a, bulb_b, bulb_c, bulb_d, bulb_e;
-
-       set_char_box (0, 1.5 staff_space#,
-                     3.0 staff_space# + 0.5 linethickness#,
-                     2.5 staff_space# + bulb_diam# / 2);
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 10);
-
-       y1 = -3 staff_space_rounded;
-       y2 = h - vround lower_brush;
-       x2r = w;
-       z2 = z1 + whatever * dir (80);
-               z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1)- 10);
-       y9 := vround y9;
-
-       x1l := hround x1l;
-       x1r := hround x1r;
-       x1 := .5 [x1l, x1r];
-
-       pat = z1l
-             -- z2l
-             .. z9
-             .. z2r
-             -- z1r
-             .. cycle;
-       bulb_a = draw_rest_bulb (.5 staff_space + 2 staff_space_rounded,
-                                y2r, pat, 0.92, 1);
-       bulb_b = draw_rest_bulb (.5 staff_space + staff_space_rounded,
-                                hround ((1.5 + 0.20) * staff_space),
-                                pat, 0.96, 1);
-       bulb_c = draw_rest_bulb (.5 staff_space,
-                                hround ((0.5 + 0.21) * staff_space),
-                                pat, 1.0, 1);
-       bulb_d = draw_rest_bulb (.5 staff_space - staff_space_rounded,
-                                hround ((-0.5 + 0.22) * staff_space),
-                                pat, 1.04, 1);
-       bulb_e = draw_rest_bulb (.5 staff_space - 2 staff_space_rounded,
-                                hround ((-1.5 + 0.23) * staff_space),
-                                pat, 1.08, 1);
-
-       fill simple_serif (z1l, z1r, 40)
-            -- z2r
-            .. z9
-            .. bulb_a
-            -- bulb_b
-            -- bulb_c
-            -- bulb_d
-            -- bulb_e
-            -- z1l
-            .. cycle;
-
-       penlabels (1, 2);
-       labels (9);
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_endgroup ("rests");
diff --git a/mf/feta-flags.mf b/mf/feta-flags.mf
new file mode 100644 (file)
index 0000000..499fcfe
--- /dev/null
@@ -0,0 +1,561 @@
+% Feta (not the Font-En-Tja) music font -- draw flags
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%
+% LilyPond 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.
+%
+% 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 ("flags");
+
+save outer_path;
+path outer_path;
+
+%
+% Flags pointing down overlap with the notehead (in x-direction), so
+% the down-flag can be bigger.
+%
+
+upflag_width# = .65 black_notehead_width# + stemthickness# / 2;
+downflag_width# = .833 black_notehead_width# + stemthickness# / 2;
+
+right_upflag_space# = .0 upflag_width#;
+right_downflag_space# = .0 downflag_width#;
+
+%
+% Flags pointing down cannot overlap with the notehead in y-direction,
+% so they have less slant.
+%
+% Because of optical illusion, the utmost flag (bottom for
+% down-pointing, top for up-pointing) should be smaller than the other
+% flags.  Adobe Sonata doesn't do this correctly.  (Instead they have
+% an extension flag, which looks less elegant.)
+%
+
+save hip_thickness, foot_thickness;
+
+hip_thickness# = 1.0 linethickness# + 0.069 staff_space#;
+foot_thickness# = 1.2055 linethickness# + 0.06 staff_space#;
+
+define_pixels (hip_thickness, foot_thickness);
+
+%
+% Inspired by Adobe Sonata and [Wanske].
+% For example, see POSTSCRIPT Language -- program design,
+% page 119, and [Wanske], p 41, 42.
+%
+
+def draw_flag (expr center, flare, dims, hip_depth, foot_wid,
+              hip_thickness, foot_thickness, show_labels) =
+       save c;
+
+       clearxy;
+
+       c = 0.7;
+
+       penpos1 (flare, 90);
+       penpos2 (whatever, 0);
+
+       x2r - x2l = hround (hip_thickness);
+
+       penpos3 (foot_thickness, -20.0);
+
+       z1r = center;
+       z2r = center + (xpart (dims), -ypart (dims) * hip_depth);
+       z3r = center + (xpart (dims) * foot_wid, -ypart (dims));
+
+       x2r := hround x2r;
+       y2r := vround y2r;
+
+       outer_path := z3r{curl c}
+                     .. z2r{up}
+                     .. {up}z1r;
+
+       if show_labels = 1:
+               penlabels (1, 2, 3);
+       fi;
+
+       fill z1l{curl 0}
+            ..tension 1.1.. z2l{down}
+            .. {curl c}simple_serif (z3l, z3r, 80)
+            & outer_path
+            & z1r
+            -- cycle;
+enddef;
+
+%
+% TODO: calculate intersectpoint (see TeX book, p. 137)
+% TODO: calculate incision_depth
+%
+
+def add_flag (expr yoff, flare, hip_wid_multiplier, hip_dep_multiplier,
+             intersectpoint, hip_thickness, foot_thickness) =
+begingroup
+       save prev_center, prev_xextreme, prev_yextreme;
+       save rel_foot, ip, center, incision_depth;
+       save prev_hipwid, prev_footdep, prev_hipdep, wid, dep, hip_dep;
+       save hip_dep_ratio, foot_wid_ratio;
+       pair prev_center, center, foot, prev_xextreme, prev_yextreme;
+       pair ip, rel_foot;
+
+       incision_depth = 1.013;
+       prev_center = point 2 of outer_path;
+       prev_xextreme = point 1 of outer_path;
+       prev_yextreme = point 0 of outer_path;
+       prev_hipwid = xpart (prev_xextreme - prev_center);
+       prev_footdep = -ypart (prev_yextreme - prev_center);
+       prev_hipdep = -ypart (prev_xextreme - prev_center);
+       ip = point intersectpoint of outer_path;
+
+       wid = prev_hipwid * hip_wid_multiplier;
+       hip_dep = prev_hipdep * hip_dep_multiplier;
+
+       center = prev_center + (0, yoff);
+       rel_foot = incision_depth [(wid, hip_dep), ip - center];
+       dep = -ypart (rel_foot);
+       foot_wid_ratio = xpart (rel_foot) / wid;
+       hip_dep_ratio = hip_dep / dep;
+
+       draw_flag (center, flare, (wid, dep),
+                  hip_dep_ratio, foot_wid_ratio,
+                  hip_thickness, foot_thickness, 0);
+endgroup
+enddef;
+
+
+fet_beginchar ("8th Flag (up)", "u3");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+
+       flare = staff_space;
+       hip_depth_ratio = .72;
+       foot_width_ratio = .8;
+       hip_width# = upflag_width# - hip_thickness# / 2;
+       foot_depth# = 3 staff_space# - blot_diameter# / 2;
+       define_pixels (hip_width, foot_depth);
+
+       set_char_box (0,
+                     hip_width# + stemthickness# / 2 + right_upflag_space#,
+                     foot_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0,0), flare, (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 1);
+
+       draw_square_block ((-0.5 stemthickness_rounded, -staff_space_rounded),
+                          (0, 0));
+fet_endchar;
+
+
+fet_beginchar ("16th Flag (up)", "u4");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       total_depth# = 3.5 staff_space# - blot_diameter# / 2;
+       flag_count = 2;
+       flare = .85 staff_space;
+       flagspace# = .85 staff_space#;
+       hip_depth_ratio = .72;
+       hip_width# = upflag_width# - hip_thickness# / 2;
+       flagspace# + foot_depth# = total_depth#;
+       foot_width_ratio = .8;
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0,
+                     hip_width# + stemthickness# / 2 + right_upflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -flagspace), flare, (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 1);
+
+       add_flag (flagspace, flare, .97, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -2 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("32nd Flag (up)", "u5");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 3;
+       total_depth# = 4.25 staff_space#;
+       flare = .85 staff_space;
+       flagspace# = .87 staff_space#;
+       hip_depth_ratio = .72;
+       hip_width# = upflag_width# - hip_thickness# / 2;
+       foot_width_ratio = .8;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0, hip_width# + right_upflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -2 flagspace), flare, (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 1);
+
+       add_flag (flagspace, flare, .97, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, .95, 1.05, 1.25,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -3 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("64th Flag (up)", "u6");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 4;
+       flare = .85 staff_space;
+       flagspace# = .9 staff_space#;
+       hip_depth_ratio = .72;
+       hip_width# = upflag_width# - hip_thickness# / 2;
+       total_depth# = 5.25 staff_space#;
+       foot_width_ratio = .8;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0, hip_width# + right_upflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 1);
+
+       add_flag (flagspace, flare, .97, 1.00, 1.3,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, 1.00, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, .95, 1.05, 1.25,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -4 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("128th Flag (up)", "u7");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 5;
+       flare = .85 staff_space;
+       flagspace# = .93 staff_space#;
+       hip_depth_ratio = .72;
+       hip_width# = upflag_width# - hip_thickness# / 2;
+       total_depth# = 6.25 staff_space#;
+       foot_width_ratio = .8;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0, hip_width# + right_upflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 1);
+
+       add_flag (flagspace, flare, .97, 1.00, 1.3,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, 1.00, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, 1.00, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, 0.95, 1.05, 1.25,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -5 staff_space_rounded));
+fet_endchar;
+
+
+fet_beginchar ("8th (down)", "d3");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 1;
+       flare = staff_space;
+       flagspace# = .9 staff_space#;
+       hip_depth_ratio = .72;
+       hip_width# = downflag_width# - hip_thickness# / 2;
+       total_depth# = 2.85 staff_space#;
+       foot_width_ratio = .8;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       define_pixels (hip_width, flagspace, foot_depth);
+
+       set_char_box (0, hip_width# + right_downflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2)
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 0);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -staff_space_rounded));
+
+       y_mirror_char;
+fet_endchar;
+
+
+%%%%%%%%
+%
+% Single Stroke for Short Appogiatura
+%
+
+fet_beginchar ("grace dash (up)", "ugrace");
+       save flare, hip_depth_ratio, hip_width, foot_depth;
+
+       hip_depth_ratio = .72;
+       flare# = staff_space#;
+       hip_width# = upflag_width# - hip_thickness# / 2;
+       foot_depth# = 3 staff_space#;
+
+       define_pixels (hip_width, foot_depth);
+
+       set_char_box (hip_width# * hip_depth_ratio,
+                     hip_width# + right_upflag_space#,
+                     foot_depth# * hip_depth_ratio, -flare#)
+
+       pickup pencircle scaled 1.5 stemthickness;
+
+       z1 = (-b, -d);
+       z2 = (w, h);
+
+       penpos1 (1.5 stemthickness, angle (z2 - z1) - 90);
+       penpos2 (1.5 stemthickness, angle (z2 - z1) - 90);
+
+       fill z1l
+            -- z2l
+            .. top z2
+            .. rt z2
+            .. z2r
+            -- z1r
+            .. bot z1
+            .. lft z1
+            .. cycle;
+
+       penlabels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("grace dash (down)", "dgrace");
+       save flare, hip_depth_ratio, hip_width, foot_depth;
+       save total_depth;
+
+       hip_depth_ratio = .72 ;
+       flare# = .99 staff_space#;
+       hip_width# = downflag_width# - hip_thickness# / 2;
+       total_depth# = 2.85 staff_space#;
+       foot_depth# = total_depth#;
+       foot_width_ratio = .8;
+
+       define_pixels (hip_width, foot_depth);
+
+       set_char_box (hip_width# * hip_depth_ratio,
+                     hip_width# + right_downflag_space#,
+                     foot_depth# * hip_depth_ratio, -flare#)
+
+       pickup pencircle scaled 1.5 stemthickness;
+
+       z1 = (-b, -d);
+       z2 = (w, h);
+
+       penpos1 (1.5 stemthickness, angle (z2 - z1) - 90);
+       penpos2 (1.5 stemthickness, angle (z2 - z1) - 90);
+
+       fill z1l
+            -- z2l
+            .. top z2
+            .. rt z2
+            .. z2r
+            -- z1r
+            .. bot z1
+            .. lft z1
+            .. cycle;
+
+       y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("16th (down)", "d4");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 2;
+       flare = .8 staff_space;
+       flagspace# = .9 staff_space#;
+       hip_depth_ratio = .85;
+       hip_width# = downflag_width# - hip_thickness# / 2;
+       total_depth# = 3.0 staff_space# - blot_diameter# / 2;
+       foot_width_ratio = .95;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       set_char_box (0, hip_width# + right_downflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 0);
+
+       add_flag (flagspace, flare, .95, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -2 staff_space_rounded));
+
+       y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("32nd (down)", "d5");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 3;
+       flare = .84 staff_space;
+       flagspace# = .9 staff_space#;
+       hip_depth_ratio = .85;
+       hip_width# = downflag_width# - hip_thickness# / 2;
+       total_depth# = 3.85 staff_space#;
+       foot_width_ratio = .95;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0, hip_width# + right_downflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 0);
+
+       add_flag (flagspace, flare, .97, 1.00, 1.25,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, .95, 1.05, 1.25,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -3 staff_space_rounded));
+
+       y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("64th (down)", "d6");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 4;
+       flare = .8 staff_space;
+       flagspace# = .9 staff_space#;
+       hip_depth_ratio = .85;
+       hip_width# = downflag_width# - hip_thickness# / 2;
+       total_depth# = 4.35 staff_space#;
+       foot_width_ratio = .98;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0, hip_width# + right_downflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 0);
+
+       add_flag (flagspace, flare, .97, 1.20, 1.175,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, .97, 1.10, 1.175,
+                 hip_thickness, foot_thickness);
+       add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -4 staff_space_rounded));
+
+       y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("128th (down)", "d7");
+       save flare, hip_depth_ratio, hip_width, foot_depth, foot_width_ratio;
+       save flagspace, total_depth, flag_count;
+
+       flag_count = 5;
+       flare = .8 staff_space;
+       flagspace# = .9 staff_space#;
+       hip_depth_ratio = .85;
+       hip_width# = downflag_width# - hip_thickness# / 2;
+       total_depth# = 5.25 staff_space#;
+       foot_width_ratio = .98;
+
+       (flag_count - 1) * flagspace# + foot_depth# = total_depth#;
+       define_pixels (hip_width, foot_depth);
+       define_whole_vertical_pixels (flagspace);
+
+       set_char_box (0, hip_width# + right_downflag_space#,
+                     total_depth# + foot_thickness# / 2, stemthickness# / 2);
+
+       draw_flag ((0, -(flag_count - 1) * flagspace), flare,
+                  (hip_width, foot_depth),
+                  hip_depth_ratio, foot_width_ratio,
+                  hip_thickness, foot_thickness, 0);
+
+       add_flag (flagspace, flare, .97, 1.20, 1.175,
+                 hip_thickness, foot_thickness);
+       add_flag (flagspace, flare, .97, 1.10, 1.175,
+                 hip_thickness, foot_thickness);
+       add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
+                 hip_thickness, foot_thickness);
+       add_flag (.98 flagspace, flare, .91, 1.05, 1.2,
+                 hip_thickness, foot_thickness);
+
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -5 staff_space_rounded));
+
+       y_mirror_char;
+fet_endchar;
+
+fet_endgroup ("flags");
index 2f4471cc8e7eb350717b3e7f1e33bb08e4ace20f..8b7080a6fd779d33b82cd1cad3552e9bba95d55a 100644 (file)
@@ -32,24 +32,24 @@ input feta-params;
 
 font_x_height staff_space#;
 
-%% this is a fallback so we can run the font without including feta-bolletjes.
+%% this is a fallback so we can run the font without including feta-noteheads.
 black_notehead_width# := 1.0 staff_space#;
 
 
 fet_beginfont ("feta", design_size, "fetaMusic");
 
 if test = 0: 
-       input feta-eindelijk;
-       input feta-toevallig;
-       input feta-arrow;
-       input feta-puntje;
-       input feta-bolletjes;
-       input feta-schrift;
-       input feta-banier;
-       input feta-klef;
-       input feta-timesig;
-       input feta-pendaal;
-       input feta-haak;
+       input feta-rests;
+       input feta-accidentals;
+       input feta-arrowheads;
+       input feta-dots;
+       input feta-noteheads;
+       input feta-scripts;
+       input feta-flags;
+       input feta-clefs;
+       input feta-timesignatures;
+       input feta-pedals;
+       input feta-brackettips;
        input feta-accordion;
 else:
        input feta-test-generic.mf;
diff --git a/mf/feta-haak.mf b/mf/feta-haak.mf
deleted file mode 100644 (file)
index 3fbaf3f..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  bracket tips -*-Fundamental-*-
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%
-% LilyPond 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.
-%
-% 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 ("brackettips");
-
-def draw_bracket (expr thick_sharp, width_sharp, updown) =
-begingroup;
-       save p, thin, thick, flattening, width, hair, flare;
-       path p;
-       pair tipdir;
-
-       flattening = 0.72;
-       thick# = thick_sharp;
-       flare# = flattening * width#;
-       width# = width_sharp;
-
-       define_pixels (thick, width, flare);
-       if updown = 1:
-               set_char_box (0, width#,
-                             .5 thick#, flare#);
-       else:
-               set_char_box (0, width#,
-                             flare#, .5 thick#);
-       fi;
-
-       thin = 2 linethickness;
-       hair = 1.25 linethickness;
-
-       pickup pencircle scaled thin;
-       y7 = y1;
-       x7 = x2;
-       z2 = z4r + (thin, 0);
-
-       penpos3 (thin, 0);
-       penpos4 (thin, 90);
-
-       z3 = z4;
-
-       top y3 = 0.5 thick;
-       lft x3 = 0.0;
-       x1 = x3l;
-       y1 = -0.5 thick;
-
-       z8 = .5 [z2, z7];
-       top y5 = flare;
-       rt x5 = width;
-
-       p := z8{right}
-            ..tension 1.2.. z5{curl 0};
-       tipdir := direction 1 of p;
-
-       penpos5 (hair, angle tipdir);
-       penpos6 (hair, 90 + angle tipdir);
-
-       z5 = z6;
-
-       pickup pencircle scaled 1;
-
-       fill (z1
-             -- z3l{up}
-             .. z4r{right}
-             -- z2{right}
-             .. z6r{tipdir}
-             .. z5r
-             .. z6l{-tipdir}
-             ..tension 1.1.. z7{left}
-             & z7
-             -- z1
-             & cycle) yscaled updown;
-
-       if updown = 1:
-               penlabels (1, 2, 3, 4, 5, 6, 7, 8);
-       fi;
-endgroup;
-enddef;
-
-
-fet_beginchar ("bracket tip up", "up");
-       draw_bracket (0.45 staff_space#, 1.9 staff_space#, 1);
-fet_endchar;
-
-
-fet_beginchar ("bracket tip down", "down");
-       draw_bracket (0.45 staff_space#, 1.9 staff_space#, -1);
-fet_endchar;
-
-fet_endgroup ("brackettips");
diff --git a/mf/feta-klef.mf b/mf/feta-klef.mf
deleted file mode 100644 (file)
index 47a515b..0000000
+++ /dev/null
@@ -1,708 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  implement Clefs -*-Fundamental-*-
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
-% Jan Nieuwenhuizen <janneke@gnu.org>,
-% Juergen Reuter <reuter@ipd.uka.de>
-%
-% LilyPond 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.
-%
-% 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 ("clefs");
-
-%
-% [Wanske] says the bulbs should be positioned about 1/4 right of the
-% `arrow'.
-%
-% TODO: The hair-curve at z6r looks a little awkward.
-%
-
-def draw_c_clef (expr reduction) =
-       save hair, norm, reduced_ss, right_edge;
-       save xoff;
-
-       reduced_ss# = staff_space# * reduction;
-       norm# := 2/3 reduced_ss#;
-       hair# := 0.06 reduced_ss# + 0.5 linethickness#;
-       right_edge# = 15/4 norm# + 2 hair#;
-       define_pixels (norm, reduced_ss, right_edge);
-       define_whole_vertical_blacker_pixels (hair);
-
-       set_char_box (0, right_edge#, 2 reduced_ss#, 2 reduced_ss#);
-
-       % make unreduced glyph fit exactly into five staff lines
-       if reduction = 1:
-               h := d := 2 staff_space_rounded;
-       fi;
-
-       % assure that the gap between the left and right stem
-       % has the same number of pixels as the thickness of the right
-       % stem
-       draw_block ((0, -d + feta_shift),
-                   (3/4 norm + 1/2 hair, h));
-       draw_block ((3/4 norm + 1/2 hair + hround (3/2 hair), -d + feta_shift),
-                   (3/4 norm + 1/2 hair + 2 hround (3/2 hair), h));
-
-       % assure symmetry
-       h := h - feta_shift;
-
-       pickup feta_fillpen;
-
-       xoff = 3/4 norm + 1/2 hair + 2 hround (3/2 hair);
-       z5l = (xoff - 3/4 hair, 0);
-       z5r = (x4, 0);
-
-       penpos1 (hair - pen_top - pen_bot, -90);
-       top z1l = (xoff + norm + hair, h);
-
-       penpos2 (hround (norm - 3/2 hair) - pen_lft - pen_rt, 180);
-       rt z2l = (w, h / 2);
-
-       penpos3 (hair - pen_top - pen_bot, 90);
-       bot z3l = ((right_edge - xoff) / 2 + xoff,
-                  vround (.5 norm - 1.5 hair));
-
-       penpos4 (hair - pen_lft - pen_rt, 0);
-       top z4 = (xoff + 1/2 norm + 1/2 hair,
-                 vfloor (reduced_ss - linethickness - .2 hair));
-
-       bot z6 = (xoff + 3/4 norm, vround (.5 norm - .5 hair));
-
-       save t;
-       t = 0.833;
-
-       save pat;
-       path pat;
-
-       pat = z5l{curl 1}
-             .. z4l{up}
-             .. z4r{down}
-             .. z3r{right}
-             ..tension t.. z2r{up}
-             ..tension t.. flare_path (top z1l, 180, 90,
-                                       hair, hfloor (norm - 1/2 hair), -1)
-             ..tension t.. z2l{down}
-             .. z3l{left}
-             .. z6
-             .. z5r{down};
-
-       filldraw pat shifted (0, feta_shift)
-                -- reverse pat yscaled -1 shifted (0, -feta_eps)
-                -- cycle;
-
-       penlabels (1, 2, 3, 4, 5, 6);
-
-       % ugh, should be bulb, not flare?
-
-       draw_staff (-2, 2, 0);
-enddef;
-
-
-fet_beginchar ("C clef", "C");
-       draw_c_clef (1.0);
-fet_endchar;
-
-
-fet_beginchar ("C clef", "C_change");
-       draw_c_clef (.8);
-fet_endchar;
-
-
-%
-% New bulb routine:
-%
-% Insert a brushed piece of the path, and draw the rest of the bulb
-% separately.
-%
-% The bulb has circular form.  Neat merging of the bulb and brushed path
-% is done by playing with tension.
-%
-
-def new_bulb (expr start_point, start_angle,
-             outer_tangent_point,
-             end_point, end_angle,
-             big_radius, bulb_radius, flare,
-             direction, turning_dir) =
-begingroup;
-       save pat, before, after;
-       save center;
-       save u, v;
-       path pat, before, after;
-       pair center;
-
-       clearxy;
-
-       center = outer_tangent_point
-                + big_radius * dir (0);
-%               + (big_radius - bulb_radius) * dir (-turning_dir * 90)
-
-       z1' = center + bulb_radius * dir (turning_dir * 180);
-       z2' = outer_tangent_point + flare * dir (0);
-       z3' = center + bulb_radius * dir (0);
-       z4' = center + bulb_radius * dir (turning_dir * 90);
-       z5' = center - 0.5 [big_radius, bulb_radius] * dir (turning_dir * 90);
-
-       labels (1', 2', 3', 4', 5');
-
-       before := z3'{dir (turning_dir * 90)}
-                 .. z4'{-dir (0)}
-                 ..tension 1.1.. z1'{-dir (turning_dir* 90)};
-       after := z2'{dir (turning_dir * 90)}
-                .. end_point{dir (end_angle)};
-       (u, v) = before intersectiontimes after;
-
-       pat := start_point{dir (start_angle)}
-              .. outer_tangent_point{dir (-turning_dir * 90)}
-              ..tension 1.02.. z5'{dir (0)}
-              .. subpath (0, u) of before
-              .. subpath (v, infinity) of after;
-
-       if direction = 0:
-               pat := reverse pat;
-       fi
-
-pat
-endgroup
-enddef;
-
-
-%
-% There is some variation in the shape of bass clefs.
-%
-% * In some clefs the size of the swoosh tip almost reaches the
-%   bottom staff line; in some it crosses the 2nd line from the bottom
-%   with a small overshoot.
-%
-%   The most popular design is where the X part of the tip is aligned
-%   with the left bulb boundary, and the Y part ends on the 2nd
-%   staffline exactly.  This is what we do.
-%
-% * The diameter of the bulb is the width of the open space.
-%
-% * The vertical center of the bulb can be on or slightly above the
-%   staff line.
-%
-% * The vertical position of the dots can be symmetrical around the
-%   staffline, centered in the staff space.  The Baerenreiter SCS has
-%   the bottom dot raised by approximately 0.1 staff space.
-%
-% * Uncarefully set music may have overshoots at the top.  We have none.
-%
-% * It is not exactly clear where the vertical tangent at the right
-%   of the swoosh should be.
-%
-
-def draw_bass_clef (expr exact_center, reduction) =
-       save reduced_ss, swoosh_width;
-       save right_thickness, right_offset, tip_protrude;
-       save dot_diam, bulb_y_offset, bulb_flare;
-       pair tip_protrude;
-
-       reduced_ss# = staff_space# * reduction;
-       2.2 dot_diam# = reduction * (staff_space# - stafflinethickness#);
-       right_thickness# = 0.37 staff_space# + 1.2 linethickness#;
-       swoosh_width# = 2.1 reduced_ss#;
-       define_pixels (swoosh_width);
-       define_whole_pixels (reduced_ss);
-       define_whole_blacker_pixels (dot_diam, right_thickness);
-
-       right_offset = 0.05 staff_space;
-       bulb_y_offset := 0.075 staff_space;
-       bulb_flare := 2.5 linethickness;
-%      tip_protrude := (-linethickness, -.2 staff_space);
-       tip_protrude := (0, 0);
-
-       set_char_box (-xpart exact_center,
-                     xpart exact_center + swoosh_width# + 7/12 reduced_ss#,
-                     -ypart exact_center + 2.5 reduced_ss#,
-                     ypart exact_center + reduced_ss#);
-
-       y1 = bulb_y_offset;
-       x1 = 0;
-
-       x2 = .5 [x1, x3];
-       x2l = x2r = x2;
-
-       y2l := vround_pixels (reduced_ss# + 0.5 linethickness#);
-       y2l - y2r = linethickness;
-
-       x3l - x1 = swoosh_width;
-       x3l - x3r = right_thickness;
-
-       % optical correction: the top dot seems farther away if y3l = 0.
-       y3l = right_offset;
-
-       z4 = -(0, 2.0 reduced_ss) + tip_protrude;
-
-       penpos3 (whatever, 185);
-       penpos4 (linethickness, 135);
-
-       fill new_bulb (z2l, 180, z1, z2r, 0,
-                      0.45 reduced_ss, 0.4 reduced_ss,
-                      bulb_flare, 1, 1)
-            .. z3r{down}
-            .. {curl 0}simple_serif (z4r, z4l, 90){curl 0}
-            .. z3l{up}
-            ..tension 0.9.. cycle;
-
-       pickup pencircle scaled dot_diam;
-
-       lft x5 = hround (x3l + 1/3 reduced_ss - dot_diam / 2);
-       bot y5 = vfloor (.5 reduced_ss - dot_diam / 2);
-       z6 = z5 yscaled -1;
-
-       % for symmetry
-       y5 := y5 + feta_shift;
-
-       drawdot z5;
-       drawdot z6;
-
-       penlabels (1, 2, 3, 4, 5, 6);
-
-       draw_staff (-3, 1, 0);
-enddef;
-
-
-fet_beginchar ("F clef ", "F");
-       draw_bass_clef ((0, 0), 1.0);
-fet_endchar;
-
-
-fet_beginchar ("F clef (reduced)", "F_change");
-       draw_bass_clef ((0, 0), 0.8);
-fet_endchar;
-
-
-
-%
-% Inspired by Baerenreiter
-%
-%
-% Beste lezers, kijk,
-%
-% Een bolletje hebben we bij toeval allemaal wel eens getekend, maar begint u
-% toch eenvoudig.  Eerst een eenvoudig kruis of herstellingsteken
-% en via de dubbelslag naar een voorzichtig vlaggetje, en heb geduld!
-% Ikzelf heb bijvoorbeeld over mijn eerste gave G-sleutel
-% 35 kilobyte metafont, 12 patchlevels, 0 vriendinnen en 45 dagen gedaan
-%
-%  -- vrij naar Van Kooten & De Bie
-%
-
-def debugfill = fill enddef;
-
-def draw_gclef (expr reduction) =
-       save reduced_ss, downstroke_dir, downstroke_angle, center;
-       save breapth_factor, inner_thick_end, thinness, thickness, thinnib;
-       save start_angle, inner_start_angle, thinness;
-       save upward_swoosh_angle, bot_angle;
-       save pat;
-       path pat;
-       pair downstroke_dir, center;
-
-       reduced_ss# = staff_space# * reduction;
-       define_pixels (reduced_ss);
-
-       thinness = 0.095 staff_space + 0.75 linethickness;
-       downstroke_dir = unitvector (14, -75);
-       downstroke_angle = angle downstroke_dir;
-       bot_angle = -180;               % downstroke_angle - 87
-
-       upward_swoosh_angle = 132;
-       start_angle = -97;
-
-       breapth_factor = 21/14;
-       inner_thick_end = 45;
-       inner_start_angle = downstroke_angle - 43;
-       thickness = .32 reduced_ss + 1.1 linethickness;
-
-       thinnib = thinness;
-
-       set_char_box (0, 1.71 * breapth_factor * reduced_ss#,
-                     2.6 * reduced_ss#, 5 * reduced_ss#);
-
-       center := (breapth_factor * reduced_ss, 0);
-
-       z1 = center + whatever * dir (inner_start_angle);
-       x1 = xpart center - .28 reduced_ss;
-       penpos1 (thinnib, inner_start_angle);
-
-       x2r = xpart center;
-       y2r = vround_pixels (reduced_ss# + .5 stafflinethickness#);
-       penpos2 (thickness, 90);
-
-       z3 = (z4 - center) rotated inner_thick_end + center;
-       penpos3 (thinnib, -90 + inner_thick_end);
-
-       x4 = xpart center - .1 reduced_ss;
-       y4r = -y2r + feta_shift;
-       penpos4 (thinnib, -90);
-
-       x5r = -breapth_factor * reduced_ss + xpart center;
-       y5r = .37 reduced_ss + ypart center;
-       penpos5 (thickness, upward_swoosh_angle);
-
-       z6 = center + whatever * downstroke_dir;
-       y6 = ypart center + 2 reduced_ss;
-       % penpos6 is computed later
-
-       z7l - z6 = whatever * (z5 - z6) ;
-       y7l = 3.5 reduced_ss;
-       penpos7 (thickness, upward_swoosh_angle);
-
-       x9 = .7 [x10, x7r];
-       top y9l = 5 reduced_ss;
-       penpos9 (1.45 thickness, -70);
-
-       x11 - x13r = 1.5 reduced_ss + 0.5 thinnib;
-       y11 = ypart center - 47/28 reduced_ss;
-       y12 = ypart center - 71/28 reduced_ss;
-       y13 = .48 [y12, y4r];
-       x12r = xpart (.45 [z13r, z11] + .75 reduced_ss * downstroke_dir);
-
-%      z10 = center + whatever * dir (downstroke_angle - 1.5);
-       x10 = x6 - 2 thinnib;
-       y10 = ypart center + 3.5 reduced_ss;
-       y10l - y10r = 1.0 thickness;
-       z10r - z10l = .7 thinnib * dir (downstroke_angle + 90)
-                     + whatever * downstroke_dir;
-       z10 = .5 [z10l, z10r];
-       z11 = center + whatever * downstroke_dir + (-0.05 reduced_ss, 0);
-
-       penpos11 (thinnib, start_angle + 90);
-       penpos12 (thinnib, bot_angle + 90);
-       penpos13 (thinnib + 0.14 staff_space, 180);
-
-       % this auxiliary point ensures good contour overlapping
-       z8 = .5 [z9l, z9r] + .25 ((z9r - z9l) rotated -90);
-
-       z20 = z9l - (0, .25 blot_diameter);
-       penpos20 (blot_diameter, 0);
-       
-       pat := z10{down}
-              .. z6
-              ..tension 1.1.. z11{dir (start_angle)};
-
-       penpos6 (thinnib, angle (direction 1 of pat) + 90);
-
-       % two auxiliary points to simulate `draw' with `penstroke'
-       z10' = point 0.3 of pat;
-       penpos10' (1.3 thinnib, angle (direction 0.3 of pat) + 50);
-
-       z11' = point 1.5 of pat;
-       penpos11' (thinnib, angle (direction 1.5 of pat) + 90);
-
-       z21l = z20l;
-       z21r = z9r;
-
-       pat := z21l
-              .. z10l{down}
-              .. z10'l;
-
-       fill z2l{right}
-            .. z3l
-            .. z4l{left}
-            ..tension 1.07.. z5l{up}  % inside curve
-            .. z7l{up}
-            ..tension 1.2.. z20r{curl 1}
-            .. {direction 0 of pat}z20l
-            -- z8
-            -- z9r                     % {dir (downstroke_angle + 0)}
-            ..tension 0.8.. z7r{down}
-            .. z5r{down}
-            .. z4r{right}
-            .. z3r
-            .. z2r{left}
-            ..tension .95.. z1r
-            -- simple_serif (z1r, z1l, 80)
-            -- z1l
-            ..tension 0.85.. cycle;
-
-       penstroke z21e
-                 .. z10e{down}
-                 .. z10'e
-                 .. z6e
-                 .. z11'e
-                 .. z11e{dir (-95)}
-                 .. z12e{dir (bot_angle)};
-
-       fill new_bulb (z12r, bot_angle, z13r, z12l, bot_angle + 180,
-                      0.45 reduced_ss, 0.38 reduced_ss,
-                      thinnib + .05 staff_space, 1, -1)
-            -- cycle;
-
-       penlabels (range 1 thru 21);
-       penlabels (10', 11');
-
-       draw_staff (-1, 3, 0);
-enddef;
-
-
-fet_beginchar ("G clef", "G");
-       draw_gclef (1.0);
-fet_endchar;
-
-
-fet_beginchar ("G clef", "G_change");
-       draw_gclef (0.8);
-fet_endchar;
-
-
-%%%%
-%
-% PERCUSSION
-%
-
-%
-% The percussion clef extent is not coincident with its bbox, since
-% the percussion clef needs more space in front than a normal clef.
-%
-
-def draw_percussion_clef (expr reduction) =
-       save reduced_ss, razt;
-
-       reduced_ss# = staff_space# * reduction;
-       define_pixels (reduced_ss);
-
-       set_char_box (-.67 reduced_ss#, 2.0 reduced_ss#,
-                     reduced_ss#, reduced_ss#);
-
-       razt := hround (0.45 reduced_ss);
-
-       d := d - feta_shift;
-
-       draw_block ((-b, -d), (-b + razt, h));
-       draw_block ((w - razt, -d), (w, h));
-
-       draw_staff (-3, 1, 1);
-enddef;
-
-
-fet_beginchar ("percussion clef", "percussion");
-       draw_percussion_clef (1.0);
-fet_endchar;
-
-
-fet_beginchar ("percussion clef (reduced)", "percussion_change");
-       draw_percussion_clef (.8);
-fet_endchar;
-
-
-def draw_tab_T (expr pos, siz, slant) =
-begingroup;
-       save vx, vy;
-       pair vx, vy;
-
-       clearxy;
-
-       vx = (xpart siz) * dir 0;
-       vy = (ypart siz) * dir 90;
-
-       penpos1 (.75 penh, 100);
-       z1 = z2 + (1/6 * vx - .15 * vy);
-       penpos2 (hround (.9 penw), 0);
-       x2l = hround xpart (pos + .75 vy);
-       y2l = ypart (pos + .75 vy);
-       penpos3 (penh, -100);
-       z3l = pos + .4 vx + vy;
-       penpos4 (penh, -90);
-       z4 = -.1 vy + .5 [z3, z5];
-       penpos5 (.8 penh, -30);
-       x5r = xpart (pos + siz);
-       y5l = ypart (pos + siz);
-
-       penpos10 (penw, 170);
-       z10 = pos + .55 vx + .9 vy;
-       penpos11 (.75 [penh, penw], 170);
-       z11 = z10 - .5 vy + .025 vx;
-       penpos12 (penh, 100);
-       z12l = (xpart .5 [z13, z11], ypart (pos - .025 * siz));
-       penpos13 (.75 penh, 60);
-       z13 = pos + .2 vx + .15 vy;
-
-       % penlabels (range 1 thru 13);
-
-       soft_penstroke (z1e
-                       ..tension 1.1.. z2e
-                       .. z3e{right}
-                       ..tension 1.5.. z4e
-                       ..z5e)
-         slanted slant shifted (slant * -ypart pos, 0);
-
-       soft_end_penstroke (z10e
-                           ..tension 1.5.. z11e
-                           .. z12e
-                           ..tension 1.1.. z13e{(z13r - z13l) rotated 90})
-         slanted slant shifted (slant * -ypart pos, 0);
-endgroup;
-enddef;
-
-       
-def draw_tab_A (expr pos, siz, slant) =
-begingroup;
-       save vx, vy, pat;
-       pair vx, vy;
-       path pat;
-
-       clearxy;
-
-       vx = (xpart siz) * dir 0;
-       vy = (ypart siz) * dir 90;
-
-       penpos1 (.75 penh, -110);
-       z1r = pos + .07 vy;
-       penpos2 (penh, -75);
-       z2r = (.5 [x1, x3], ypart pos);
-       penpos3 (.25 [penh, penw], -30);
-       z3 = (.45 [x2, x4], .15 [y2, y4]);
-       penpos4 (1 [penh, penw], 0);
-       z4 = pos + .5 vx + .975 vy;
-
-       penpos5 (1 [penh, penw], -180);
-       z5 = z4;
-       penpos6 (.2 [penh, penw], -150);
-       z6l = (.8 [x5l, x7l], .9 [y5l, y7l]);
-       penpos7 (penh,-90);
-       z7r = (.5 [x6, x8], ypart pos);
-       penpos8 (.75 penh, -70);
-       z8r = (xpart (pos + siz), y7r + .075 ypart (siz));
-
-       pat := z2
-              .. z3
-              .. z4;
-
-       penpos10 (penh, angle (direction 1.2 of pat) - 180);
-       z10 = point 1.2 of pat;
-       penpos11 (.9 penh, -90);
-       z11 = .4 [z10, z6] - 0.05 vy;
-       penpos12 (.75 penh, -75);
-       z12 = .3 [z11, z6] + 0.02 vy;
-
-       % penlabels (range 1 thru 12);
-
-       soft_penstroke (z1e{(z1r - z1l) rotated 90}
-                       .. z2e
-                       .. z3e
-                       .. z4e)
-         slanted slant shifted (slant * -ypart pos, 0);
-
-       soft_end_penstroke (z5e
-                           .. z6e
-                           .. z7e
-                           .. z8e{(z8r - z8l) rotated 90})
-         slanted slant shifted (slant * -ypart pos, 0);
-
-       soft_end_penstroke (z10e
-                           .. z11e
-                           .. z12e)
-         slanted slant shifted (slant * -ypart pos, 0);
-endgroup;
-enddef;
-
-
-def draw_tab_B (expr pos, siz, slant) =
-begingroup;
-       save vx, vy;
-       pair vx, vy;
-
-       clearxy;
-
-       vx = (xpart siz) * dir 0;
-       vy = (ypart siz) * dir 90;
-
-       penpos1 (.75 penh, 100);
-       z1 = z2 + (.15 * vx - .1 * vy);
-       penpos2 (hround (.9 penw), 0);
-       x2l = hround xpart (pos + .75 vy);
-       y2l = ypart (pos + .75 vy);
-       penpos3 (penh, -100);
-       z3l = pos + .4 vx + 1.05 vy;
-       penpos4 (.8 [penh, penw], -180);
-       z4 = (xpart (pos + .75 siz), .5 [y3, y5]);
-       penpos5 (.8 penh, 90);
-       z5 = (.5 [x10, x4], ypart (pos + .55 siz));
-
-       penpos6 (.8 penh, 270);
-       z6 = z5;
-       penpos7 (penw, 180);
-       z7l = (xpart (pos + siz), .5 [y6, y8]);
-       penpos8 (.8 penh, 45);
-       z8 = .5 [z12l, z11l] + .15 vx - .05 vy;
-
-       penpos10 (.75 [penh, penw], 170);
-       z10 = pos + .375 vx + vy;
-       penpos11 (.8 [penh, penw], 150);
-       z11 = z10 - .5 vy + .04 vx;
-       penpos12 (penh, 100);
-       z12l = (xpart .5 [z13, z11], ypart pos);
-       penpos13 (.75 penh, 60);
-       z13 = pos + .1 vx + .15 vy;
-
-       % penlabels (range 1 thru 13);
-
-       soft_penstroke (z1e
-                       ..tension 1.1.. z2e
-                       .. z3e
-                       .. z4e
-                       ..z5e {left})
-         slanted slant shifted (slant * -ypart pos, 0);
-
-       soft_end_penstroke (z6e{right}
-                           .. z7e
-                           .. z8e{(z8r - z8l) rotated 90})
-         slanted slant shifted (slant * -ypart pos, 0);
-
-       soft_end_penstroke (z10e
-                           ..tension 1.5.. z11e
-                           .. z12e
-                           ..tension 1.1.. z13e{(z13r - z13l) rotated 90})
-         slanted slant shifted (slant * -ypart pos, 0);
-endgroup;
-enddef;
-
-
-def draw_tab_clef (expr reduction) =
-       save reduced_ss, letterheight, penw, penh;
-
-       reduced_ss# = staff_space# * reduction;
-       letterheight# = 1.8 reduced_ss#;
-       define_pixels (reduced_ss, letterheight);
-
-       set_char_box (-.2 reduced_ss#, 2.8 reduced_ss#,
-                     1.6 letterheight#, 1.6 letterheight#);
-
-       penw = .45 reduced_ss;
-       penh = .2 reduced_ss;
-
-       draw_tab_T ((-b + .15 reduced_ss, h - letterheight),
-                   (2.1 reduced_ss, letterheight), 0.2);
-       draw_tab_A ((-b - .05 reduced_ss, -.5 letterheight +.15 reduced_ss),
-                   (2.2 reduced_ss, letterheight), 0.4);
-       draw_tab_B ((-b + .025 reduced_ss, -d),
-                   (2.1 reduced_ss, letterheight), 0.25);
-
-       draw_staff (-3, 2, 0.5);
-enddef;
-
-
-fet_beginchar ("tab clef", "tab");
-       draw_tab_clef (1.0);
-fet_endchar;
-
-
-fet_beginchar ("tab clef (reduced)", "tab_change");
-       draw_tab_clef (.8);
-fet_endchar;
-
-fet_endgroup ("clefs");
diff --git a/mf/feta-noteheads.mf b/mf/feta-noteheads.mf
new file mode 100644 (file)
index 0000000..851d5e2
--- /dev/null
@@ -0,0 +1,1528 @@
+% Feta (not the Font-En-Tja) music font --  implement noteheads
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+% & Han-Wen Nienhuys <hanwen@xs4all.nl>
+% & Juergen Reuter <reuter@ipd.uka.de>
+%
+%
+% LilyPond 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.
+%
+% 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/>.
+
+test_outlines := 0;
+
+
+save remember_pic;
+picture remember_pic;
+
+
+% Most beautiful noteheads are pronounced, not circular,
+% and not even symmetric.
+% These examples are inspired by [Wanske]; see literature list.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% NOTE HEAD VARIABLES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+save black_notehead_width, noteheight;
+save half_notehead_width, whole_notehead_width, slash_thick;
+save slash_slope, overdone_heads, solfa_noteheight;
+
+numeric noteheight;
+numeric slash_thick;
+numeric black_notehead_width;
+numeric whole_notehead_width;
+numeric half_notehead_width;
+
+
+fet_begingroup ("noteheads");
+
+
+% Slope of slash.  From scm/grob-description.scm.  How to auto-copy?
+slash_slope := 1.7;
+
+% Thickness of slash lines.  Quarter notes get 1.5slt width.
+slash_thick# := 2/3 * 0.48 staff_space#;
+
+
+%
+% Hand-engraved music often has balls extending above and below
+% the lines.  If you like that, modify overdone heads (unit:
+% stafflinethickness).
+%
+overdone_heads = 0.0;
+noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
+
+
+%
+% solfa heads should not overlap on chords.
+%
+solfa_noteheight# := staff_space# - stafflinethickness#;
+
+define_pixels (slash_thick);
+define_whole_vertical_pixels (noteheight);
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SLANT moves both extrema on the long axis (by SLANT * ELLIPTICITY,
+% so SLANT = -1, puts the extreme on the long axis next to the short
+% axis one).
+%
+
+def draw_outside_ellipse (expr ellipticity, tilt, superness, slant) =
+       save attachment_y;
+       save pat;
+       path pat;
+
+       pat := superellipse ((ellipticity, 0), (-slant * ellipticity, 1.0),
+                            (-ellipticity, 0), (slant * ellipticity, -1.0),
+                            superness);
+       pat := pat rotated tilt;
+
+       save top_point, right_point;
+       pair top_point, right_point;
+
+       top_point := directionpoint left of pat;
+       right_point := directionpoint up of pat;
+
+       save scaling, width;
+
+       scaling# = noteheight# / (2 ypart (top_point));
+       width# := 2 xpart (right_point) * scaling#;
+       define_pixels (scaling, width);
+
+       set_char_box (0, width#, noteheight# / 2, noteheight# / 2);
+
+       d := d - feta_space_shift;
+
+       % attachment Y
+       charwy := ypart (right_point) * scaling#;
+       charwx := width#;
+
+       pat := pat scaled scaling shifted (w / 2, .5 (h - d));
+
+       width := hround width;
+
+       if test_outlines = 1:
+               draw pat;
+       else:
+               fill pat;
+       fi;
+enddef;
+
+
+def undraw_inside_ellipse (expr ellipticity, tilt, superness, clearance) =
+begingroup
+       save pat;
+       path pat;
+
+       pat := superellipse ((ellipticity, 0), (0, 1.0),
+                            (-ellipticity, 0), (0, -1.0),
+                            superness);
+       pat := pat rotated tilt;
+
+       save top_point, right_point;
+       pair top_point, right_point;
+
+       top_point := directionpoint left of pat;
+       right_point := directionpoint up of pat;
+
+       save height, scaling;
+
+       height# = staff_space# + stafflinethickness# - clearance;
+       scaling# = height# / (2 ypart (top_point));
+       define_pixels (scaling);
+       pat := pat scaled scaling shifted (w / 2, .5 (h - d));
+
+       if test_outlines = 1:
+               draw pat;
+       else:
+               unfill pat;
+       fi
+endgroup;
+enddef;
+
+
+%
+% dimensions aren't entirely right.
+%
+def draw_longa (expr up) =
+       save stemthick, fudge;
+
+       stemthick# = 2 stafflinethickness#;
+       define_whole_blacker_pixels (stemthick);
+
+       fudge = hround (blot_diameter / 2);
+
+       draw_outside_ellipse (1.80, 0, 0.707, 0);
+       undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#);
+
+       pickup pencircle scaled stemthick;
+
+       if up:
+               bot y1 = -d;
+               top y2 = h;
+               rt x1 - fudge = 0;
+               x1 = x2;
+
+               fudge + lft x3 = w;
+               x4 = x3;
+               top y4 = h + 3.0 staff_space;
+               y3 = y1;
+       else:
+               bot y1 = -d - 3.0 staff_space;
+               top y2 = h;
+               rt x1 - fudge = 0;
+               x1 = x2;
+
+               fudge + lft x3 = w;
+               x4 = x3;
+               y4 = y2;
+               bot y3 = -d;
+       fi;
+
+       draw_gridline (z1, z2, stemthick);
+       draw_gridline (z3, z4, stemthick);
+
+       labels (1, 2, 3, 4);
+enddef;
+
+
+fet_beginchar ("Longa notehead", "uM2");
+       draw_longa (true);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+fet_beginchar ("Longa notehead", "dM2");
+       draw_longa (false);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Longa notehead", "uM2");
+               draw_longa (true);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+
+       fet_beginchar ("Longa notehead", "dM2");
+               draw_longa (false);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+%
+% dimensions aren't entirely right.
+%
+def draw_brevis (expr linecount) =
+       save stemthick, fudge;
+
+       stemthick# = 2 stafflinethickness#;
+       define_whole_blacker_pixels (stemthick);
+
+       fudge = hround (blot_diameter / 2);
+
+       draw_outside_ellipse (1.80, 0, 0.707, 0);
+       undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#);
+
+       pickup pencircle scaled stemthick;
+
+       bot y1 = -d;
+       top y2 = h;
+       rt x1 - fudge = 0;
+       x1 = x2;
+
+       fudge + lft x3 = w;
+       x4 = x3;
+       y4 = y2;
+       y3 = y1;
+
+       for i := 0 step 1 until linecount - 1:
+               draw_gridline (z1 - (1.5 * i * stemthick, 0),
+                              z2 - (1.5 * i * stemthick, 0), stemthick);
+               draw_gridline (z3 + (1.5 * i * stemthick, 0),
+                              z4 + (1.5 * i * stemthick, 0), stemthick);
+       endfor;
+enddef;
+
+
+fet_beginchar ("Brevis notehead", "sM1");
+       draw_brevis (1);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Brevis notehead", "sM1");
+               draw_brevis(1);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Double-lined brevis notehead", "sM1double");
+       draw_brevis (2);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Double-lined brevis notehead", "sM1double");
+               draw_brevis (2);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Whole notehead", "s0");
+       draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0, 0.707, 0);
+       undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10,
+                              0.68, 2 stafflinethickness#);
+
+       whole_notehead_width# := charwd;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Whole notehead", "s0");
+               draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0,
+                                     0.707, 0);
+               undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10,
+                                      0.68, 2 stafflinethickness#);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Half notehead", "s1");
+       draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, 0.66, 0.17);
+       undraw_inside_ellipse (3.25, 33, 0.81, 2.5 stafflinethickness#);
+
+       half_notehead_width# := charwd;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Half notehead", "s1");
+               draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34,
+                                     0.66, 0.17);
+               undraw_inside_ellipse (3.25, 33, 0.81,
+                                      2.5 stafflinethickness#);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Quart notehead", "s2");
+       % used to have 32. With 31, they are slightly bolder.
+       draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0);
+       black_notehead_width# := charwd;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Quart notehead", "s2");
+               draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31,
+                                     0.707, 0);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+fet_beginchar ("Whole diamondhead", "s0diamond");
+       draw_outside_ellipse (1.80, 0, 0.495, 0);
+       undraw_inside_ellipse (1.30, 125, 0.6,
+                              .4 staff_space# + stafflinethickness#);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Whole diamondhead", "s0diamond");
+               draw_outside_ellipse (1.80, 0, 0.495, 0);
+               undraw_inside_ellipse (1.30, 125, 0.6,
+                                      .4 staff_space# + stafflinethickness#);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Half diamondhead", "s1diamond");
+       draw_outside_ellipse (1.50, 34, 0.49, 0.17);
+       undraw_inside_ellipse (3.5, 33, 0.80,
+                              .3 staff_space# + 1.5 stafflinethickness#);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Half diamondhead", "s1diamond");
+               draw_outside_ellipse (1.50, 34, 0.49, 0.17);
+               undraw_inside_ellipse (3.5, 33, 0.80,
+                                      .3 staff_space#
+                                      + 1.5 stafflinethickness#);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Quart diamondhead", "s2diamond");
+       draw_outside_ellipse (1.80, 35, 0.495, -0.25);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Quart diamondhead", "s2diamond");
+               draw_outside_ellipse (1.80, 35, 0.495, -0.25);
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+vardef penposx@# (expr d) =
+begingroup;
+       save pat;
+       path pat;
+
+       pat = top z@#
+             .. lft z@#
+             .. bot z@#
+             .. rt z@#
+             .. cycle;
+       z@#l = pat intersectionpoint (z@# -- infinity * dir (d + 180));
+       z@#r = pat intersectionpoint (z@# -- infinity * dir (d));
+endgroup
+enddef;
+
+
+%
+% UGH: xs not declared as argument.
+%
+def define_triangle_shape (expr stemdir) =
+       save triangle_a, triangle_b, triangle_c;
+       save triangle_out_a, triangle_out_b, triangle_out_c;
+       save triangle_in, triangle_out;
+       save width, depth, height;
+       save origin, left_up_dir;
+       save exact_left_point, exact_right_point, exact_down_point;
+
+       path triangle_a, triangle_b, triangle_c;
+       path triangle_out_a, triangle_out_b, triangle_out_c;
+       path triangle_in, triangle_out;
+       pair origin, left_up_dir;
+       pair exact_down_point, exact_left_point, exact_right_point;
+
+       save pen_thick;
+       pen_thick# = stafflinethickness# + .1 staff_space#;
+       define_pixels (llap);
+       define_blacker_pixels (pen_thick);
+
+       left_up_dir = llap# * dir (90 + tilt);
+
+       xpart (left_up_dir) * xs - (pen_thick# * xs) / 2 + xpart origin = 0;
+       ypart origin = 0;
+
+       exact_left_point := origin + (left_up_dir xscaled xs);
+       exact_down_point := origin + (left_up_dir rotated 120 xscaled xs);
+       exact_right_point := origin + (left_up_dir rotated 240 xscaled xs);
+
+       height# = ypart (exact_left_point + origin) + pen_thick# / 2;
+       depth# = -ypart (exact_down_point + origin) + pen_thick# / 2;
+       width# = xpart (exact_right_point - exact_left_point)
+                + pen_thick# * xs;
+
+       set_char_box (0, width#, depth#, height#);
+
+       % Formerly, the shape has simply been drawn with an elliptical pen
+       % (`scaled pen_thick xscaled xs'), but the envelope of such a curve
+       % is of 6th degree.  For the sake of mf2pt1, we approximate it.
+
+       pickup pencircle scaled pen_thick xscaled xs;
+
+       z0 = (hround_pixels (xpart origin), 0);
+
+       z1 = z1' = z0 + llap * dir (90 + tilt) xscaled xs;
+       z2 = z2' = z0 + llap * dir (90 + tilt + 120) xscaled xs;
+       z3 = z3' = z0 + llap * dir (90 + tilt + 240) xscaled xs;
+
+       z12 = caveness [.5[z1, z2], z3];
+       z23 = caveness [.5[z2, z3], z1];
+       z31 = caveness [.5[z3, z1], z2];
+
+       triangle_a = z1 .. z12 .. z2;
+       triangle_b = z2 .. z23 .. z3;
+       triangle_c = z3 .. z31 .. z1;
+
+       penposx1 (angle (direction 0 of triangle_a) - 90);
+       penposx2 (angle (direction 0 of triangle_b) - 90);
+       penposx3 (angle (direction 0 of triangle_c) - 90);
+
+       penposx1' (angle (direction infinity of triangle_c) + 90);
+       penposx2' (angle (direction infinity of triangle_a) + 90);
+       penposx3' (angle (direction infinity of triangle_b) + 90);
+
+       penposx12 (angle (z12 - z0));
+       penposx23 (angle (z23 - z0));
+       penposx31 (angle (z31 - z0));
+
+       z10 = (z0 -- z1) intersectionpoint (z1l .. z12l .. z2'r);
+       z20 = (z0 -- z2) intersectionpoint (z2l .. z23l .. z3'r);
+       z30 = (z0 -- z3) intersectionpoint (z3l .. z31l .. z1'r);
+
+       triangle_in = z10
+                     .. z12l
+                     .. z20
+                     & z20
+                     .. z23l
+                     .. z30
+                     & z30
+                     .. z31l
+                     .. z10
+                     & cycle;
+
+       triangle_out_a = z1r .. z12r .. z2'l;
+       triangle_out_b = z2r .. z23r .. z3'l;
+       triangle_out_c = z3r .. z31r .. z1'l;
+
+       triangle_out = top z1
+                      .. lft z1
+                      .. z1r{direction 0 of triangle_out_a}
+                      & triangle_out_a
+                      & {direction infinity of triangle_out_a}z2'l
+                      .. lft z2
+                      .. bot z2
+                      .. z2r{direction 0 of triangle_out_b}
+                      & triangle_out_b
+                      & {direction infinity of triangle_out_b}z3'l
+                      .. rt z3
+                      .. top z3
+                      .. z3r{direction 0 of triangle_out_c}
+                      & triangle_out_c
+                      & {direction infinity of triangle_out_c}z1'l
+                      .. cycle;
+
+       labels (0, 10, 20, 30);
+       penlabels (1, 1', 2, 2', 3, 3', 12, 23, 31);
+
+       % attachment Y
+       if stemdir = 1:
+               charwy := ypart exact_right_point;
+               charwx := xpart exact_right_point + .5 pen_thick# * xs;
+       else:
+               charwy := -ypart exact_down_point;
+               charwx := width# - (xpart exact_down_point - .5 pen_thick# * xs);
+       fi
+enddef;
+
+
+def draw_whole_triangle_head =
+       save hei, xs;
+       save llap;
+       save tilt;
+
+       tilt = 40;
+       llap# = 3/4 noteheight#;
+
+       xs = 1.5;
+       caveness := 0.1;
+       define_triangle_shape (1);
+       fill triangle_out;
+       unfill triangle_in;
+enddef;
+
+
+fet_beginchar ("Whole trianglehead", "s0triangle");
+       draw_whole_triangle_head;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Whole trianglehead", "s0triangle");
+               draw_whole_triangle_head;
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+def draw_small_triangle_head (expr dir) =
+       save hei, xs;
+       save llap;
+       save tilt;
+
+       tilt = 40;
+       llap# = 2/3 noteheight#;
+       xs = 1.2;
+       caveness := 0.1;
+       define_triangle_shape (dir);
+
+       pickup feta_fillpen;
+
+       filldraw triangle_out;
+       unfilldraw triangle_in;
+enddef;
+
+
+fet_beginchar ("Half trianglehead (downstem)", "d1triangle");
+       draw_small_triangle_head (-1);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Half trianglehead (upstem)", "u1triangle");
+       draw_small_triangle_head (1);
+
+       draw_staff (-2, 2, 0.5);
+fet_endchar;
+
+
+def draw_closed_triangle_head (expr dir) =
+       save hei, xs;
+       save llap;
+       save tilt;
+
+       tilt = 40;
+       llap# = 2/3 noteheight#;
+       xs = 1.0;
+       caveness := 0.1;
+       define_triangle_shape (dir);
+       fill triangle_out;
+enddef;
+
+
+fet_beginchar ("Quart trianglehead (upstem)", "u2triangle");
+       draw_closed_triangle_head (1);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Quart trianglehead (downstem)", "d2triangle");
+       draw_closed_triangle_head (-1);
+
+       draw_staff (-2, 2, 0.5);
+fet_endchar;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Slash heads are for indicating improvisation.  They are
+% twice as high as normal heads.
+%
+def draw_slash (expr hwid_hash) =
+       save exact_height;
+       save ne, nw_dist;
+       pair ne, nw_dist;
+       exact_height = staff_space# + stafflinethickness# / 2;
+
+       set_char_box (0, 2 exact_height / slash_slope + hwid_hash,
+                     exact_height, exact_height);
+
+       charwx := charwd;
+       charwy := charht;
+
+       clearxy;
+
+       d := d - feta_shift;
+
+       pickup pencircle scaled blot_diameter;
+
+       bot y1 = -d;
+       top y2 = h;
+       lft x1 = 0;
+       lft x2 = 2 h / slash_slope;
+
+       rt x3 = w;
+       y3 = y2;
+       y4 = y1;
+       x3 - x2 = x4 - x1;
+
+       ne = unitvector (z3 - z4);
+       nw_dist = (ne rotated 90) * 0.5 blot_diameter;
+
+       fill bot z1{left}
+            .. (z1 + nw_dist){ne}
+            -- (z2 + nw_dist){ne}
+            .. top z2{right}
+            -- top z3{right}
+            .. (z3 - nw_dist){-ne}
+            -- (z4 - nw_dist){-ne}
+            .. bot z4{left}
+            -- cycle;
+
+       if hwid_hash > 2 slash_thick#:
+               save th;
+
+               th = slash_thick - blot_diameter;
+               y6 = y7;
+               y5 = y8;
+               y3 - y7 = th;
+               y5 - y1 = th;
+               z6 - z5 = whatever * ne;
+               z8 - z7 = whatever * ne;
+
+               z5 = z1 + whatever * ne + th * (ne rotated -90);
+               z8 = z4 + whatever * ne + th * (ne rotated 90);
+
+               unfill z5
+                      -- z6
+                      -- z7
+                      -- z8
+                      -- cycle;
+       fi
+       labels (range 1 thru 10);
+enddef;
+
+
+fet_beginchar ("Whole slashhead", "s0slash");
+       draw_slash (4 slash_thick# + 0.5 staff_space#);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Half slashhead", "s1slash");
+       draw_slash (3.0 slash_thick# + 0.15 staff_space#);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Quart slashhead", "s2slash");
+       draw_slash (1.5 slash_thick#);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% `thick' is the distance between the NE/SW parallel lines in the cross
+% (distance between centres of lines) in multiples of stafflinethickness
+%
+def draw_cross (expr thick) =
+       save ne, nw;
+       save ne_dist, nw_dist, rt_dist, up_dist;
+       save crz_in, crz_out;
+       save thickness;
+       pair ne, nw;
+       pair ne_dist, nw_dist, rt_dist, up_dist;
+       path crz_in, crz_out;
+
+       pen_thick# := 1.2 stafflinethickness#;
+       thickness# := thick * stafflinethickness#;
+       define_pixels (thickness);
+       define_blacker_pixels (pen_thick);
+
+       pickup pencircle scaled pen_thick;
+
+       h := h - feta_shift;
+
+       top y3 = h;
+       ne = unitvector ((1, (2 h - pen_thick) / (w - pen_thick)));
+       rt x4 = w / 2;
+       y5 = 0;
+       z4 - z5 = whatever * ne;
+       x6 = 0;
+       z6 - z3 = whatever * ne;
+       z3 - z4 = whatever * (ne yscaled -1);
+
+       z4 - z3 = whatever * (ne) + (ne rotated -90) * thickness;
+
+
+       x1 = charwd / 2 - .5 pen_thick#;
+       z1 = whatever * ne
+            + thick / 2 * stafflinethickness# * (ne rotated -90);
+
+       % labels (1, 2, 3, 4, 5, 6);
+
+       nw = unitvector (z3 - z4);
+
+       up_dist = up * 0.5 pen_thick / cosd (angle (ne));
+       rt_dist = right * 0.5 pen_thick / sind (angle (ne));
+       nw_dist = (ne rotated 90) * 0.5 pen_thick;
+       ne_dist = (nw rotated -90) * 0.5 pen_thick;
+
+       x4' := x4;
+       x5' := x5;
+       y6' := y6;
+
+       x4 := hround (x4' + .5 pen_thick) - .5 pen_thick;
+       x5 := hfloor (x5' + xpart rt_dist) - xpart rt_dist;
+       y6 := vfloor (y6' + ypart up_dist) - ypart up_dist;
+
+       crz_out = (z6 + up_dist)
+                 -- (z3 + nw_dist){ne}
+                 .. (top z3)
+                 .. (z3 + ne_dist){-nw}
+                 -- (z4 + ne_dist){-nw}
+                 .. (rt z4)
+                 .. (z4 - nw_dist){-ne}
+                 -- (z5 + rt_dist);
+       crz_out := crz_out shifted (0, feta_shift)
+                  -- reverse crz_out yscaled -1 shifted (0, -feta_eps);
+       fill crz_out
+            -- reverse crz_out xscaled -1 shifted (-feta_eps, 0)
+            -- cycle;
+
+       if (thick > 1):
+               x4 := hround (x4' - xpart rt_dist) + xpart rt_dist;
+               x5 := hceiling (x5' - .5 pen_thick) + .5 pen_thick;
+               y6 := vfloor (y6' - .5 pen_thick) + .5 pen_thick;
+
+               crz_in = (bot z6){right}
+                        .. (z6 - nw_dist){ne}
+                        -- (z3 - up_dist)
+                        -- (z4 - rt_dist)
+                        -- (z5 + nw_dist){-ne}
+                        .. {down}(lft z5);
+               crz_in := crz_in shifted (0, feta_shift)
+                         -- reverse crz_in yscaled -1 shifted (0, -feta_eps);
+               unfill crz_in
+                      -- reverse crz_in xscaled -1 shifted (-feta_eps, 0)
+                      -- cycle;
+       fi
+
+       % ugh
+       currentpicture := currentpicture shifted (hround (w / 2), 0);
+
+       charwx := charwd;
+       charwy := y1 + feta_shift;
+
+       z12 = (charwx * hppp, y1 * vppp);
+
+       labels (12);
+enddef;
+
+
+fet_beginchar ("Whole Crossed notehead", "s0cross");
+       save wid, hei;
+
+       wid# := black_notehead_width# + 4 stafflinethickness#;
+       hei# := noteheight# + stafflinethickness#;
+
+       set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+       draw_cross (3.75);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Whole Crossed notehead", "s0cross");
+               save wid, hei;
+
+               wid# := black_notehead_width# + 4 stafflinethickness#;
+               hei# := noteheight# + stafflinethickness#;
+
+               set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+               currentpicture := remember_pic;
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Half Crossed notehead", "s1cross");
+       save wid, hei;
+
+       wid# := black_notehead_width# + 2 stafflinethickness#;
+       hei# := noteheight# + stafflinethickness# / 2;
+
+       set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+       draw_cross (3.0);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Half Crossed notehead", "s1cross");
+               save wid, hei;
+
+               wid# := black_notehead_width# + 2 stafflinethickness#;
+               hei# := noteheight# + stafflinethickness# / 2;
+
+               set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+               currentpicture := remember_pic;
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("Crossed notehead", "s2cross");
+       wid# := black_notehead_width#;
+       hei# := noteheight#;
+       set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+       draw_cross (1.0);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("Crossed notehead", "s2cross");
+               wid# := black_notehead_width#;
+               hei# := noteheight#;
+               set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+               currentpicture := remember_pic;
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+fet_beginchar ("X-Circled notehead", "s2xcircle");
+       save wid, hei;
+       save cthick, cxd, cyd, dy;
+
+       wid# := black_notehead_width# * sqrt (sqrt2);
+       hei# := noteheight# * sqrt (sqrt2);
+
+       set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+       d := d - feta_space_shift;
+
+       cthick# := (1.2 + 1/4) * stafflinethickness#;
+       define_blacker_pixels (cthick);
+
+       cxd := w - cthick;
+       cyd := h + d - cthick / 2;
+
+       dy = .5 (h - d);
+
+       pickup pencircle scaled cthick;
+
+       fill fullcircle xscaled (cxd + cthick)
+                       yscaled (cyd + cthick)
+                       shifted (w / 2, dy);
+       unfill fullcircle xscaled (cxd - cthick)
+                         yscaled (cyd - cthick)
+                         shifted (w / 2, dy);
+
+       xpos := .5 cxd / sqrt2;
+       ypos := .5 cyd / sqrt2;
+
+       pickup penrazor scaled cthick rotated (angle (xpos, ypos) + 90);
+       draw (-xpos + w / 2, -ypos + dy) -- (xpos + w / 2, ypos + dy);
+
+       pickup penrazor scaled cthick rotated (angle (xpos, -ypos) + 90);
+       draw (-xpos + w / 2, ypos + dy) -- (xpos + w / 2, -ypos + dy);
+
+       charwx := charwd;
+       charwy := 0;
+
+       z12 = (charwx * hppp, charwy * vppp);
+       labels (12);
+
+       remember_pic := currentpicture;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+if test > 0:
+       fet_beginchar ("X-Circled notehead", "s2xcircle");
+               save wid, hei;
+               save cthick, cxr, cyr;
+
+               wid# := black_notehead_width# * sqrt (sqrt2);
+               hei# := noteheight# * sqrt (sqrt2);
+
+               set_char_box (0, wid#, hei# / 2, hei# / 2);
+
+               currentpicture := remember_pic;
+
+               draw_staff (-2, 2, 0.5);
+       fet_endchar;
+fi;
+
+
+%%%%%%%%
+%
+% SOLFA SHAPED NOTES
+%
+
+save solfa_pen_thick;
+solfa_pen_thick# = 1.75 stafflinethickness#;
+define_blacker_pixels (solfa_pen_thick);
+
+
+save solfa_base_notewidth;
+solfa_base_notewidth# := black_notehead_width#;
+
+solfa_whole_width := whole_notehead_width# / black_notehead_width#;
+solfa_half_width := half_notehead_width# / black_notehead_width#;
+solfa_quarter_width := 1.0;
+
+def draw_do_head (expr width_factor, dir) =
+       save p_in, p_out;
+       save left_dist, right_dist;
+       path p_in, p_out;
+       pair left_dist, right_dist;
+
+       set_char_box (0, width_factor * solfa_base_notewidth#,
+                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+       pickup pencircle scaled solfa_pen_thick;
+
+       bot y1 = -d;
+       y1 = y2;
+       lft x1 = 0;
+       rt x2 = w;
+       top y3 = h;
+       x3 =.5 [x1, x2];
+
+       left_dist = (unitvector (z3 - z1) rotated 90) * 0.5 solfa_pen_thick;
+       right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 solfa_pen_thick;
+
+       p_in := (((z1 - left_dist) -- (z3 - left_dist)) intersectionpoint
+                 (top z1 -- top z2))
+               -- ((top z1 -- top z2) intersectionpoint
+                   ((z2 - right_dist) -- (z3 - right_dist)))
+               -- (((z2 - right_dist) -- (z3 - right_dist)) intersectionpoint
+                   ((z1 - left_dist) -- (z3 - left_dist)))
+               -- cycle;
+
+       p_out := bot z1
+                -- bot z2{right}
+                .. rt z2{up}
+                .. (z2 + right_dist){z3 - z2}
+                -- (z3 + right_dist){z3 - z2}
+                .. top z3{left}
+                .. (z3 + left_dist){z1 - z3}
+                -- (z1 + left_dist){z1 - z3}
+                .. lft z1{down}
+                .. {right}cycle;
+
+
+       labels (1, 2, 3);
+
+       charwx := charwd;
+       charwy := -chardp + 0.5 stafflinethickness#;
+       if dir = -1:
+               charwy := -charwy;
+       fi;
+enddef;
+
+
+fet_beginchar ("Whole dohead", "s0do");
+       draw_do_head (solfa_whole_width, 1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half dohead", "d1do");
+       draw_do_head (solfa_half_width, -1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half dohead", "u1do");
+       draw_do_head (solfa_half_width, 1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart dohead", "d2do");
+       draw_do_head (solfa_quarter_width, -1);
+       fill p_out;
+fet_endchar;
+
+
+fet_beginchar ("Quart dohead", "u2do");
+       draw_do_head (solfa_quarter_width, 1);
+       fill p_out;
+fet_endchar;
+
+
+%
+% re - flat top, curved bottom:
+%                (0,h/2) {dir -90} .. (w/2,-h/2) .. {dir 90} (w,h/2) -- cycle;
+% (broader along the base and with more vertical sides for half and
+% whole notes)
+% stem attachment: h/2
+%
+
+def draw_re_head (expr width_factor, dir) =
+       save p_in, p_out;
+       path p_in, p_out;
+
+       set_char_box (0, width_factor * solfa_base_notewidth#,
+                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+       pickup pencircle scaled solfa_pen_thick;
+
+       save curve_start;
+       curve_start = 0.7;
+       lft x1 = 0;
+       y1 = y5;
+       x1 = x2;
+       y2 = curve_start [y3, y1];
+       bot y3 = -d;
+       x3 = .5 [x2, x4];
+       rt x4 = w;
+       y4 = y2;
+       top y5 = h;
+       x5 = x4;
+
+       labels (range 1 thru 5);
+
+       p_in := (z1 + 0.5 solfa_pen_thick * (1, -1))
+               -- rt z2{down}
+               .. top z3
+               .. lft z4{up}
+               -- (z5 + 0.5 solfa_pen_thick * (-1, -1))
+               -- cycle;
+
+       p_out := lft z1
+                -- lft z2{down}
+                .. bot z3
+                .. rt z4{up}
+                -- rt z5{up}
+                .. top z5{left}
+                -- top z1{left}
+                .. {down}cycle;
+
+       charwx := charwd;
+       charwy := curve_start [-chardp, charht];
+
+       if dir = -1:
+               charwy := -charwy;
+       fi;
+enddef;
+
+
+fet_beginchar ("Whole rehead", "s0re");
+       draw_re_head (solfa_whole_width, 1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half up rehead", "u1re");
+       draw_re_head (solfa_half_width, 1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half down rehead", "d1re");
+       draw_re_head (solfa_half_width, -1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart rehead", "u2re");
+       draw_re_head (solfa_quarter_width, 1);
+       fill p_out;
+fet_endchar;
+
+
+fet_beginchar ("Quart rehead", "d2re");
+       draw_re_head (solfa_quarter_width, -1);
+       fill p_out;
+fet_endchar;
+
+
+def draw_mi_head (expr width_factor) =
+       save path_out, path_in;
+       save ne_dist, se_dist, ne, se;
+       path path_out, path_in;
+       pair ne_dist, se_dist, ne, se;
+
+       set_char_box (0, width_factor * solfa_base_notewidth#,
+                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+       pickup pencircle scaled solfa_pen_thick;
+
+       lft x1 = 0;
+       y1 = 0;
+       bot y2 = -d;
+       x2 = .5 [x1, x3];
+       rt x3 = w;
+       x4 = x2;
+       y3 = y1;
+       top y4 = h;
+
+       z6 - z5 = whatever * (z2 - z1);
+       z8 - z7 = whatever * (z2 - z1);
+       z8 - z5 = whatever * (z4 - z1);
+       z6 - z7 = whatever * (z4 - z1);
+
+       ne = unitvector (z4 - z1);
+       se = unitvector (z1 - z2);
+
+       ne_dist = (ne rotated 90) * 0.5 solfa_pen_thick;
+       se_dist = (se rotated 90) * 0.5 solfa_pen_thick;
+
+       z5 = whatever [z1, z4] - ne_dist;
+       z5 = whatever [z1, z2] - 1.5 se_dist;
+
+       z5 - z1 = -(z7 - z3);
+
+       labels (range 1 thru 8);
+
+       path_in := z5
+                  -- z6
+                  -- z7
+                  -- z8
+                  -- cycle;
+
+       path_out := lft z1
+                   .. (z1 + se_dist){-se}
+                   -- (z2 + se_dist){-se}
+                   .. bot z2
+                   .. (z2 - ne_dist){ne}
+                   -- (z3 - ne_dist){ne}
+                   .. rt z3
+                   .. (z3 - se_dist){se}
+                   -- (z4 - se_dist){se}
+                   .. top z4
+                   .. (z4 + ne_dist){-ne}
+                   -- (z1 + ne_dist){-ne}
+                   .. cycle;
+enddef;
+
+
+fet_beginchar ("Whole mihead", "s0mi");
+       draw_mi_head (solfa_whole_width);
+       fill path_out;
+       unfill path_in;
+fet_endchar;
+
+
+fet_beginchar ("Half mihead", "s1mi");
+       draw_mi_head (solfa_quarter_width);
+       fill path_out;
+       unfill path_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart mihead", "s2mi");
+       draw_mi_head (solfa_quarter_width);
+       fill path_out;
+fet_endchar;
+
+
+def draw_fa_head (expr width_factor) =
+       set_char_box (0, width_factor * solfa_base_notewidth#,
+                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+
+       save p_down_in, p_down_out, p_up_in, p_up_out, nw_dist, nw;
+       path p_down_in, p_down_out, p_up_in, p_up_out;
+       pair nw_dist, nw;
+
+       pickup pencircle scaled solfa_pen_thick;
+
+       lft x1 = 0;
+       top y1 = h;
+
+       rt x2 = w;
+       y2 = y1;
+       bot y3 = -d;
+       x3 = x2;
+
+       y4 = y3;
+       x4 = x1;
+
+       labels (1, 2, 3, 4);
+
+       nw = unitvector (z1 - z3);
+       nw_dist = (nw rotated 90) * 0.5 solfa_pen_thick;
+
+       p_up_in := (((z1 - nw_dist) -- (z3 - nw_dist)) intersectionpoint
+                    (bot z1 -- bot z2))
+                  -- (((z1 - nw_dist) -- (z3 - nw_dist)) intersectionpoint
+                       (lft z3 -- lft z2))
+                  -- (z2 + 0.5 solfa_pen_thick * (-1, -1))
+                  -- cycle;
+
+       p_up_out := lft z1{down}
+                   .. (z1 + nw_dist){-nw}
+                   -- (z3 + nw_dist){-nw}
+                   .. bot z3{right}
+                   .. rt z3{up}
+                   -- rt z2{up}
+                   .. top z2{left}
+                   -- top z1{left}
+                   .. {down}cycle;
+
+       p_down_in := p_up_in rotated 180 shifted (w, 0);
+       p_down_out := p_up_out rotated 180 shifted (w, 0);
+
+       charwy := 0.0;
+       charwx := charwd;
+enddef;
+
+
+fet_beginchar ("Whole fa up head", "u0fa");
+       draw_fa_head (solfa_whole_width);
+       fill p_up_out;
+       unfill p_up_in;
+fet_endchar;
+
+
+fet_beginchar ("Whole fa down head", "d0fa");
+       draw_fa_head (solfa_whole_width);
+       fill p_down_out;
+       unfill p_down_in;
+fet_endchar;
+
+
+fet_beginchar ("half fa up head", "u1fa");
+       draw_fa_head (solfa_half_width);
+       fill p_up_out;
+       unfill p_up_in;
+fet_endchar;
+
+
+fet_beginchar ("Half fa down head", "d1fa");
+       draw_fa_head (solfa_half_width);
+       fill p_down_out;
+       unfill p_down_in;
+fet_endchar;
+
+
+fet_beginchar ("Quarter fa up head", "u2fa");
+       draw_fa_head (solfa_quarter_width);
+       fill p_up_out;
+fet_endchar;
+
+
+fet_beginchar ("Quarter fa down head", "d2fa");
+       draw_fa_head (solfa_quarter_width);
+       fill p_down_out;
+fet_endchar;
+
+
+def draw_la_head (expr width_factor) =
+       set_char_box (0, width_factor * solfa_base_notewidth#,
+                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+       save p_in, p_out;
+       path p_in, p_out;
+
+       pickup pencircle scaled solfa_pen_thick;
+
+       lft x1 = 0;
+       top y1 = h;
+
+       rt x2 = w;
+       y2 = y1;
+       bot y3 = -d;
+       x3 = x2;
+
+       y4 = y3;
+       x4 = x1;
+
+       labels (range 1 thru 4);
+
+       p_in := (z1 + 0.5 solfa_pen_thick * (1, -1))
+               -- (z2 + 0.5 solfa_pen_thick * (-1, -1))
+               -- (z3 + 0.5 solfa_pen_thick * (-1, 1))
+               -- (z4 + 0.5 solfa_pen_thick * (1, 1))
+               -- cycle;
+
+       p_out := top z1
+                -- top z2{right}
+                .. rt z2{down}
+                -- rt z3{down}
+                .. bot z3{left}
+                -- bot z4{left}
+                .. lft z4{up}
+                -- lft z1{up}
+                .. cycle;
+enddef;
+
+
+fet_beginchar ("Whole lahead", "s0la");
+       draw_la_head (solfa_whole_width);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half lahead", "s1la");
+       draw_la_head (solfa_half_width);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart lahead", "s2la");
+       draw_la_head (solfa_quarter_width);
+       fill p_out;
+fet_endchar;
+
+
+def draw_ti_head (expr width_factor, dir) =
+       set_char_box (0, width_factor * solfa_base_notewidth#,
+                     0.5 solfa_noteheight#, 0.5 solfa_noteheight#);
+       save p_in, p_out, p_top;
+       save nw_dist, sw_dist, nw, sw;
+       path p_in, p_out, p_top;
+       pair nw_dist, sw_dist, nw, sw;
+       save cone_height;
+       cone_height = 0.64;
+
+       pickup pencircle scaled solfa_pen_thick;
+
+       x1 = .5 [x2, x4];
+       bot y1 = -d;
+       lft x2 = 0;
+       y2 = cone_height [y1, y3];
+       rt x4 = w;
+       y4 = y2;
+       x3 = x1;
+       top y3 = h;
+
+       labels (range 1 thru 4);
+
+       nw = unitvector (z2 - z1);
+       sw = unitvector (z1 - z4);
+
+       nw_dist = (nw rotated 90) * 0.5 solfa_pen_thick;
+       sw_dist = (sw rotated 90) * 0.5 solfa_pen_thick;
+
+       p_top := (z2 - sw_dist)
+                .. (top z3){right}
+                .. (z4 - nw_dist);
+
+       p_in := (((z1 - nw_dist) -- (z2 - nw_dist)) intersectionpoint
+                 ((z1 - sw_dist) -- (z4 - sw_dist)))
+               -- (((z1 - nw_dist) -- (z2 - nw_dist)) intersectionpoint
+                    ((z2 + sw_dist) .. {right}(bot z3)))
+               .. bot z3
+               .. (((bot z3){right} .. (z4 + nw_dist)) intersectionpoint
+                    ((z1 - sw_dist) -- (z4 - sw_dist)))
+               -- cycle;
+
+       p_out := bot z1
+                .. (z1 + nw_dist)
+                -- (z2 + nw_dist)
+                .. lft z2
+                .. (z2 - sw_dist){direction 0 of p_top}
+                & p_top
+                & {direction infinity of p_top}(z4 - nw_dist)
+                .. rt z4
+                .. (z4 + sw_dist)
+                -- (z1 + sw_dist)
+                .. cycle;
+
+       charwx := charwd;
+       charwy := cone_height [-chardp, charht];
+       if dir = -1:
+               charwy := -charwy;
+       fi;
+enddef;
+
+
+fet_beginchar ("Whole up tihead", "s0ti");
+       draw_ti_head (solfa_whole_width, 1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half up tihead", "u1ti");
+       draw_ti_head (solfa_half_width, 1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Half down tihead", "d1ti");
+       draw_ti_head (solfa_half_width, -1);
+       fill p_out;
+       unfill p_in;
+fet_endchar;
+
+
+fet_beginchar ("Quart up tihead", "u2ti");
+       draw_ti_head (solfa_quarter_width, 1);
+       fill p_out;
+fet_endchar;
+
+
+fet_beginchar ("Quart down tihead", "d2ti");
+       draw_ti_head (solfa_quarter_width, -1);
+       fill p_out;
+fet_endchar;
+
+
+fet_endgroup ("noteheads");
+
+
+%
+% we derive black_notehead_width# from the quarter head,
+% so we have to define black_notehead_width (pixel qty)
+% after the black_notehead_width# itself.
+%
+% Let's keep it outside the group as well.
+%
+
+define_pixels (black_notehead_width);
diff --git a/mf/feta-numbers.mf b/mf/feta-numbers.mf
new file mode 100644 (file)
index 0000000..d2c1ef6
--- /dev/null
@@ -0,0 +1,909 @@
+% Feta (not the Font-En-Tja) music font --  bold Orator numerals
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% LilyPond 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.
+%
+% 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/>.
+
+
+height# := number_design_size;
+space# := number_design_size / 2;
+
+font_x_height height#;
+font_normal_space space#;
+
+
+%
+% DOCME!
+%
+% ugh. b and h are reused.
+%
+
+save b, h;
+4 h + b = 1.15;
+10 h + b = 1;
+fatten := number_design_size * h + b;
+
+save b, h;
+4 h + b = 1.05;
+10 h + b = 1;
+widen := number_design_size * h + b;
+
+tense = 0.85;
+thick# := 7/30 height# * fatten;
+thin# := thick# / 4 * fatten + max (.1 (height# / 10 - 1), 0);
+
+%% sqrt (.8 * blot_diameter# * thin#);
+hair# := thin# * .8;
+
+flare# := 9/8 thick# + .75 (height# / 10 - 1);
+
+save b, h;
+4h + b = 1/8;
+10h + b = 1/6;
+kuulleke# := thick# * number_design_size * h + b;
+foot_top# := thick#;
+foot_width# := 9/4 thick#;
+
+
+%
+% These numbers were taken from a part that that the EJE violas played
+% 1997 -- Probably Mendelssohn's ouverture `Heimkehr aus der Fremde'.
+%
+
+
+%
+% TODO all the invocation of flare_path are weird --
+% the horizontal tangents should be more at the center of the
+% glyph.
+%
+
+define_pixels (height, thick, thick, thin, hair, flare);
+define_pixels (foot_top, foot_width);
+define_pixels (kuulleke);
+
+
+%
+% Yet Another Bulb Routine with smooth inside curve.
+%
+% alpha = start direction.
+% beta = which side to turn to
+% flare = diameter of the bulb
+% line = diameter of line attachment
+% direction = is ink on left or right side (1 or -1)
+%
+%
+% move_away_to = amount left (for 2)
+% turn_to = amount down (for 2)
+%
+
+def number_flare_path (expr pos, alpha, beta, line, flare,
+                      move_away_to, turn_to, taille, taille_ratio,
+                      direction) =
+begingroup;
+       save res;
+       path res;
+
+       clearxy;
+
+%      z5 = z2 + 0.43 * flare * dir (alpha - 1.5 beta);
+
+       z4 = (0.75 - taille) [z2r, z2l] + whatever * dir (alpha - beta);
+       z4 = (taille_ratio * taille) [z3l, z3r] + whatever * dir (alpha);
+
+       z1r = pos;
+       z2r = z1r + move_away_to * dir (alpha)
+             + (line + turn_to) * dir (alpha + beta);
+       z3r = 0.5 [z2l, z2r] + 0.5 * flare * dir (alpha + beta);
+
+       penpos1 (line, 180 + beta + alpha);
+       penpos2 (flare, alpha);
+       penpos3 (flare, alpha + beta);
+
+       penlabels (1, 2, 3, 4, 5);
+
+       res := z1r{dir (alpha)}
+              .. z2r{dir (180 + alpha - beta)}
+              .. z3r{dir (alpha + 180)}
+              .. z2l{dir (alpha - beta)}
+
+%%% Two versions of the curve: one with z4, the other with z5.
+%             .. z5{dir (alpha - beta / 2)}
+
+              .. z4{dir (180 + alpha + beta)}
+              .. z1l{dir (alpha + 180)};
+
+%      pickup pencircle;
+%      draw res;
+
+       if direction <> 1:
+               res := reverse res;
+       fi;
+
+res
+endgroup
+enddef;
+
+
+def calc_kuulleke (expr w, alpha) =
+begingroup;
+       save beta, gamma;
+
+       beta = (alpha - 90) / 2;
+       gamma = (90 + alpha) / 2;
+
+       penpos1 (w / cosd (alpha), alpha);
+       penpos2 (hair, 90 + beta);
+       penpos3 (hair, gamma - 90);
+
+       z2 = z1l + (1/2 hair / tand ((alpha + 90) / 2)) * dir (beta);
+       z3 = z1r - (1/2 hair / tand ((90 - alpha) / 2)) * dir (gamma);
+       z4 = z1 + kuulleke * dir (alpha - 90);
+endgroup;
+enddef;
+
+
+% should make generic macro?
+%
+def draw_foot (expr xpos) =
+begingroup;
+       clearxy;
+
+       penpos1 (thick, 0);
+       penpos2 (foot_width, 0);
+       penpos3 (hair, -90);
+       penpos4 (hair, 90);
+
+       z1= (xpos, foot_top);
+       z2= (x1, 0);
+       z3r = z2r;
+       z4l = z2l;
+       z5 = (x1, kuulleke);
+
+       penlabels (1, 2, 3, 4);
+
+       fill z1
+            .. {right}z1r{down}
+            .. {right}z3l
+            .. z3r{left}
+            .. z5
+            .. {left}z4l
+            .. z4r{right}
+            .. {up}z1l{right}
+            .. z1
+            .. cycle;
+endgroup;
+enddef;
+
+
+def draw_six =
+       save outer_t, t;
+       save before, after, u, v;
+       path before, after;
+
+       set_char_box (0, .68 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       penpos2 (hair, 90);
+       z2 = (w / 2, h / 2 + thin - hair / 2);
+
+       penpos3 (15/16 thick, 0);
+       x3r = w;
+       y3r = .5 [y4r, y2r];
+
+       penpos4 (hair, -90);
+       z4r = (x2, 0);
+
+       penpos6 (hair, 90);
+       x6r = .56 w;
+       y6r = h;
+
+       penpos7 (thick, 180);
+       x7r = 0;
+       y7r = .50 h;
+
+       penpos10 (thick, 180);
+       z10r = (0, y3);
+
+       penlabels (range 1 thru 10);
+
+       outer_t = 0.88;
+       t := tense;
+
+       before := z7{right}
+                 .. z2r{right};
+       after := z7r{up}
+                .. number_flare_path (z6r, 0, -90, hair, flare,
+                                      w - x6r - hair / 2, .16 h,
+                                      0.05, 2.5, 1)
+                .. z7l{down};
+       (u, v) = before intersectiontimes after;
+
+%      draw
+       fill subpath (u, infinity) of before
+            ..tension outer_t.. z3r{down}
+            ..tension outer_t.. z4r{left}
+            .. subpath (0, v) of after
+            .. cycle;
+
+       unfill z2l{right}
+              ..tension t.. z3l{down}
+              ..tension t.. z4l{left}
+              ..tension t.. z10l{up}
+              ..tension t.. cycle;
+enddef;
+
+
+save dot_diam;
+dot_diam# = 7/8 flare#;
+define_pixels (dot_diam);
+
+
+code := 42;    % , 43
+
+fet_beginchar ("Plus", "plus");
+       set_char_box (0, .5 height#, -0.25 height#, 0.75 height#);
+
+       save hthick, vthick, size, outer_hsize, outer_vsize;
+
+       hthick# = vthick# = 2 linethickness#;
+       size# = 1.1 staff_space#;
+       define_whole_blacker_pixels (vthick);
+       define_whole_vertical_blacker_pixels (hthick);
+
+       outer_hsize = hround ((b + w - vthick) / 2);
+       outer_vsize = vround ((h + d - hthick) / 2);
+
+       centerx := hround (w / 2);
+       centery := vround ((h - d) / 2);
+
+       z1 = (centerx - hthick / 2, -d);
+       z2 = (centerx + hthick / 2, h);
+
+       labels (1, 2);
+
+       draw_rounded_block (z1, z2, hthick);
+       draw_rounded_block ((0, centery - vthick / 2),
+                           (w, (centery + vthick / 2)),
+                           vthick);
+fet_endchar;
+
+
+code := 43;    % , = 44
+
+fet_beginchar ("Numeral comma", "comma");
+       save pat, pos;
+       path pat;
+
+       set_char_box (0, dot_diam#, 3/2 dot_diam#, dot_diam#);
+
+       pat := (dot_diam / 2, 0)
+              .. (dot_diam, dot_diam / 2)
+              .. (dot_diam / 2, dot_diam)
+              .. (0, dot_diam / 2)
+              .. cycle;
+
+       pos = ypart (((w / 3, 0) -- (w / 3, dot_diam / 2))
+                    intersectiontimes pat);
+       z0 = point pos of pat;
+
+       alpha = 65;
+       penpos1 (thin, alpha + 90);
+
+       z1l = (w / 2, -1.5 h + hair);
+       z2 = (w, h / 2);
+
+       pickup feta_fillpen;
+
+       % include z0 to assist removal of overlaps
+       fill subpath (0,3) of pat
+            .. z0
+            .. cycle;
+       filldraw z1l{dir (alpha)}
+                .. {up}z2
+                -- z0{direction pos of pat}
+                ..tension 0.95.. {dir (180 + alpha)}z1r
+                .. cycle;
+
+       labels (0, 2);
+       penlabels (1);
+fet_endchar;
+
+
+fet_beginchar ("Numeral dash", "hyphen");
+       set_char_box (0, height# / 3, 0, height#);
+
+       draw_rounded_block ((-b, h / 3 - thin / 2),
+                           (w, h / 3 + thin / 2), thin);
+fet_endchar;
+
+
+fet_beginchar ("Numeral dot", "period");
+       set_char_box (0, dot_diam#, 0, dot_diam#);
+
+       pickup pencircle scaled dot_diam;
+
+       drawdot (dot_diam / 2, dot_diam / 2);
+fet_endchar;
+
+
+% skip slash
+
+code := 47;    % 0 = 48
+
+fet_beginchar ("Numeral 0", "zero");
+       set_char_box (0, 11/15 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       penpos1 (thin, 90);
+       penpos2 (thick, 180);
+       penpos3 (thin,- 90);
+       penpos4 (thick, 0);
+
+       z1r = (w / 2, h);
+       z2r = (0, h / 2);
+       z3r = (w / 2, 0);
+       z4r = (w, h / 2);
+
+       fill z1r
+            .. z2r
+            .. z3r
+            .. z4r
+            .. cycle;
+
+       save t;
+       t = 1 / tense;
+
+       penlabels (1, 2, 3, 4);
+
+       unfill z1l
+              ..tension t.. z2l
+              ..tension t.. z3l
+              ..tension t.. z4l
+              ..tension t.. cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 1", "one");
+       save alpha, beta, gamma;
+
+%      set_char_box (0, 19/30 height# * widen, 0, height#);
+       set_char_box (0, 1/2 foot_width# + 3/2 thick# + 1/2 hair#,
+                     0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       alpha = 0;
+       calc_kuulleke (thick, alpha);
+       z1 = (3/2 thick, height);
+
+       penpos5 (thick, 0);
+       z5 = (x1, foot_top);
+
+       z6 = (0, h / 2);
+       beta = angle (z1l - z6);
+
+       penpos7 (thin, beta - 90);
+       z7l = z6;
+
+       penpos8 (thin / cosd (beta), -90);
+       z8l = z1l;
+
+       penpos9 (thin, beta - 90);
+       z9r = z8r + (thin / cosd (beta)) * down;
+
+       penlabels (range 1 thru 9);
+
+       gamma = angle (length (z1r - z1), 2 kuulleke);
+
+       fill z2r{dir (alpha - gamma)}
+            .. z4
+            .. {dir (alpha + gamma)}z3l
+            .. z3r{down}
+            -- z5r
+            -- z5l
+            -- z2l{up}
+            .. cycle;
+
+       fill z7l
+            -- z1l{dir (beta)}
+            .. {dir (alpha - gamma)}z2r
+            -- z9r{up}
+            .. {dir (180 + beta)}z9l
+            -- z7r{dir (180 + beta)}
+            .. {dir (beta)}cycle;
+
+       draw_foot (x1);
+fet_endchar;
+
+
+fet_beginchar ("Numeral 2", "two");
+       save tolerance;
+       save alpha, beta, gamma, theta;
+       save flare_start_distance;
+       save t, pat, bow;
+       path pat, bow;
+
+       set_char_box (0, 22/30 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       alpha = -45 * widen;
+       beta = 85;
+       gamma = beta - 10;
+       theta = 20 / widen;
+
+       flare_start = 0.25;
+
+       penpos1 (hair, 90 + beta);
+       z1 = (0, 0) + (1/2 sqrt (2) * hair) * dir (45);
+
+       penpos3 (hair,90 + gamma);
+       z3 = (w, thick) + (1/2 sqrt (2) * hair) * dir (-135);
+
+       penpos2 (thick, 90 + alpha - 15);
+       x2 - x1 = x3 - x2;
+       y2 = 10/16 thick / widen;
+
+       tolerance := epsilon;
+
+       % Find proper tension to exactly touch the x axis.
+       % Later on we directly use `bow'.
+       vardef f (expr t) =
+               bow := z3l{dir (180 + gamma)}
+                      ..tension t.. {dir (180 + alpha -5)}z2l;
+               ypart (directionpoint left of bow) < 0
+       enddef;
+
+       % the return value of `solve' is stored in a dummy variable
+       t = solve f (0.8, 1.2);
+
+       fill z1r{dir (beta)}
+            ..tension 0.9.. {dir (alpha + 10)}z2r
+            .. {dir (gamma)}z3r
+            .. bow
+            .. {dir (180 + beta)}z1l
+            .. cycle;
+
+       penpos4 (thick, 0);
+       z4r = (w - thin / 2, .71 h);
+
+       penpos5 (hair, 90);
+       y5r = h;
+       x5r = 9/20 w;
+
+       penlabels (range 1 thru 6);
+
+       t := tense;
+
+       pat := z1l{dir (beta)}
+              ..tension t.. z4r{up}
+              .. number_flare_path (z5r, 180, 90, hair, 1.05 flare,
+                                    x5r - 1/2 hair, .21 h, 0.006, 0.4, 1)
+              .. z4l{down}
+              ..tension t.. {dir (180 + beta)}z1r
+              -- cycle;
+
+%      pickup pencircle scaled 1;
+%      draw pat;
+
+       fill pat;
+fet_endchar;
+
+
+%%
+% TODO: should widen a bit.  The right edge of the 3 bumps into next glyph in
+% combinations
+%
+fet_beginchar ("Numeral 3", "three");
+       set_char_box (0, 2/3 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       penpos1 (hair, -90);
+
+%      flare_start = 0.25;
+
+       x1l = 36/80 w;
+       y1l = h;
+
+%      z1l = (17/16 thick, h);
+
+       penpos2 (7/8 thick, 180);
+       x2l = w - thick / 8;
+       y2l = 3/4 h + thick * 3/32;
+
+       penpos3 (thin, 90);
+       z3 = (w / 2, h / 2 + 1/8 thick);
+
+       penpos4 (thin, 90);
+       z4 = (5/8 thick + 1/2 thin, y3);
+
+       penpos5 (thick, 0);
+       x5r = w;
+       y5r = 17/64 h + thick / 16;
+
+       penpos6 (hair, -90);
+       x6r = 37/80 w;
+       y6r = 0;
+
+       penpos7 (3/2 thin, 90);
+       x7 = .83 w;
+       y7 = y3;
+
+       penlabels (range 1 thru 7);
+
+       save alpha, t, outer_t;
+       alpha = 25;
+       t = tense;
+       outer_t := 0.93;
+
+%      pickup pencircle scaled 1;
+%      draw
+       fill number_flare_path (z1l, 180, 90, hair, 7/8 flare, x1l - .5 hair,
+                               .16 h, 0.06, 1.5, -1)
+            ..tension outer_t.. z2l{down}
+            ..tension outer_t.. z7r{dir (180 + alpha)}
+            .. z7l{dir (-alpha)}
+            ..tension outer_t.. z5r{down}
+            ..tension outer_t.. number_flare_path (z6r, 180, -90, hair,
+                                                   flare, x6l, .18 h, 0.06,
+                                                   1.5, 1)
+            .. z5l{up}
+            ..tension t.. z3l{left}
+            .. z4l{left}
+            .. z4r{right}
+            .. z3r{right}
+            ..tension t.. z2r{up}
+            ..tension t.. cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 4", "four");
+       save alpha, beta, gamma;
+
+       set_char_box (0, 4/5 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       alpha = 0;
+       calc_kuulleke (3/2 thick, alpha);
+
+       z1r = (w - 3/4 thick, height);
+       z5 = (thin, 1/4 height + thin);
+
+       beta = angle (z3r - z5);
+
+       penpos6 (thin, -90);
+       z6l = z5;
+
+       penpos7 (thin, -90);
+       y7 = y6;
+       x7 = w - 1/2 thin;
+
+       penpos8 (thin, -alpha);
+       z8r = z5;
+
+       penlabels (range 1 thru 8);
+
+       gamma = angle (length (z1r - z1), 2 kuulleke);
+
+       fill z2r{dir (alpha - gamma)}
+            .. z4
+            .. {dir (alpha + gamma)}z3l
+            .. {dir (180 + beta)}z3r
+            -- z8r
+            -- z7l{right}
+            .. {left}z7r
+            -- z6r{left}
+            ..tension 0.8 and 2.. z8l{dir (beta)}
+            .. {up}z2l
+            .. cycle;
+
+       clearxy;
+
+       alpha := beta;
+       calc_kuulleke (thick, alpha);
+
+       z1r = (w - 3/4 thick, height - (3/2 thin) / cosd (alpha));
+
+       penpos5 (thick, 0);
+       z5 = (x1, foot_top);
+
+       gamma := angle (length (z1r - z1), 2 kuulleke);
+
+       fill z2r{dir (alpha - gamma)}
+            .. z4
+            .. {dir (alpha + gamma)}z3l
+            .. {down}z3r
+            -- z5r
+            -- z5l
+            -- z2l{up}
+            .. cycle;
+
+       penlabels (1, 2, 3, 4, 5);
+
+       draw_foot (x5);
+fet_endchar;
+
+
+fet_beginchar ("Numeral 5", "five");
+       save alpha, beta, gamma, delta;
+       save inner_t, outer_t;
+       save pat;
+       path pat;
+
+       set_char_box (0, 27/40 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       alpha = 0;
+       calc_kuulleke (w - thin, alpha);
+
+       z1 = (w / 2 + 1/8 thick, h);
+
+       penpos5 (thin, 0);
+       z5l = (x1l, h - 15/16 thick);
+
+       penpos6 (hair, 90 - 45);
+       z6 = z5r + 1/2 hair * dir (-45);
+
+       penpos7 (thin, 0);
+       z7l = (x1l, h / 2 + thin - hair);
+
+       penlabels (range 1 thru 7);
+
+       gamma = angle (length (z1r - z1), 2 kuulleke);
+
+       pat := z2r{dir (alpha - gamma)}
+              .. z4
+              .. {dir (alpha + gamma)}z3l
+              .. z3r{dir (-135)}
+              .. {left}z6r
+              .. {down}z6l
+              -- z7r{down}
+              .. {up}z7l
+              -- z2l{up}
+              .. cycle;
+
+       beta = 45;
+       delta = 180 + beta + 10;
+       z8r = (x7r, y7r - 1/16 thick + thin);
+       z8l = directionpoint dir (delta) of
+               subpath (6, 7) of pat;
+
+       % include intersection point to improve overlap removal
+       fill subpath (0, 6) of pat
+            .. z8l
+            .. subpath (7, length (pat)) of pat
+            .. cycle;
+
+       penpos9 (thin, 90);
+       y9 = 10/16 [y5, y7];
+       x9 = .36 [x8r, x10r];
+
+       penpos10 (thick, 0);
+       x10r = w + hair / 2;
+       y10r = 1/2 [y9r, y11r];
+
+       penpos11 (hair, -90);
+       y11r = 0;
+       x11r = .7 [0, x10l];
+
+       penlabels (range 8 thru 12);
+
+       inner_t = 1.0;
+       outer_t = .85;
+
+       fill z8r {dir (beta)}
+            .. z9r{right}
+            ..tension outer_t.. z10r{down}
+            .. number_flare_path (z11r, 180, -90, hair, flare, x11l,
+                                  .18 h, 0.06, 1.5, 1)
+            .. z11l{right}
+            ..tension inner_t.. z10l{up}
+            ..tension inner_t.. z9l{left}
+            .. z8l{dir (delta)}
+            -- cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 6", "six");
+       draw_six;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 7", "seven");
+       save tolerance;
+       save alpha, beta, gamma, delta;
+       save bow;
+       save x_overshoot;
+
+       path bow;
+
+       set_char_box (0, 11/15 height# * widen - thin#, 0, height#);
+       overshoot_x = .75 thin;
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       alpha = -180;
+
+       penpos1 (3/2 thick, 180 + alpha);
+       penpos2 (hair, 180 + alpha - 45);
+       penpos3 (hair, 180 + alpha + 45);
+
+       z2 = z1l + (1/4 sqrt (2) * hair) * dir (alpha - 135);
+       z3 = z1r + (1/4 sqrt (2) * hair) * dir (alpha - 45);
+       z4 = z1 + kuulleke * dir (alpha - 90);
+
+       z1l = (thin, 0);
+
+       beta = 55;
+       penpos5 (thin, 90 + beta);
+       z5 = (w, h) + (1/2 sqrt (2) * thin) * dir (-135) + (overshoot_x, 0);
+
+       gamma = angle (length (z1r - z1), 2 kuulleke);
+       delta = 12;
+
+       pickup pencircle;
+
+       fill z3l{dir (alpha - gamma)}
+            .. z4
+            .. {dir (alpha + gamma)}z2r
+            .. z2l{dir (beta + delta)}
+            .. {dir (beta)}z5r
+            .. z5l{dir (180 + beta)}
+            .. {dir (delta - 90)}z3r
+            .. cycle;
+
+       penlabels (1, 2, 3, 4, 5);
+
+       alpha := -45 * widen;
+
+       penpos11 (1/2 thick, 90);
+       z11 = (3/2 thin, h - (thick + thin) / 2);
+
+       penpos13 (thin, 90 + beta);
+       z13 = z5;
+
+       penpos12 (thick, 90 + alpha);
+       x12 = 1/2 [x11, x13] - 1/4 thick;
+       y12 = h - 15/16 thick + thin * widen;
+
+       penpos14 (thin, 0);
+       z14l = (0, h - thin / 2);
+
+       penpos15 (thin, 0);
+       z15l = (0, h / 2 + thin / 2);
+
+       penpos16 (9/8 thick, 90);
+       z16r = (thin, y11r + 2/16 thick);
+
+       tolerance := epsilon;
+
+       % Find proper tension to exactly touch the x axis.
+       % Later on we directly use `bow'.
+       vardef f (expr t) =
+               bow := z11r{dir (beta)}
+                      ..tension t.. {dir (alpha)}z12r;
+               ypart (directionpoint right of bow) > h
+       enddef;
+
+       % the return value of `solve' is stored in a dummy variable
+       t = solve f (0.8, 1.2);
+
+       fill bow
+            .. {dir (beta)}z13r
+            -- z13l{dir (180 + beta)}
+            .. {dir (180 + alpha)}z12l
+            .. {dir (180 + beta)}z11l
+            .. {down}z16l
+            -- z15r{down}
+            .. {up}z15l
+            -- z14l{up}
+            .. {down}z14r
+            -- z16r{down}
+            ..tension 1.5.. {dir (beta)}cycle;
+
+       penlabels (range 11 thru 16);
+fet_endchar;
+
+
+fet_beginchar ("Numeral 8", "eight");
+       save alpha, beta;
+
+       set_char_box (0, 11/15 height# * widen, 0, height#);
+
+       message "w:" & decimal w;
+       message "h:" & decimal h;
+
+       alpha = 60;
+       beta = alpha - 15;
+
+       z1 = (w / 2, h / 2 + thick / 8);
+
+       penpos2 (14/8 thin, 0);
+       z2 = (w / 3, h / 2 + thin);
+
+       penpos3 (3/2 thin, 0);
+       z3l = (0, h / 4 + thin / 2);
+
+       penpos4 (hair, 90);
+       z4l = (x1, 0);
+
+       penpos5 (thick, 90 + 90 + alpha);
+       z5 = z1 + w / 4 * dir (alpha - 90);
+
+       penpos6 (thick, 90 + 90 + alpha);
+       z6 = z1 + (w / 4 - thin / 2) * dir (90 + alpha);
+
+       penpos7 (hair, 90);
+       z7r = (x1 + .02 w, h);
+
+       penpos8 (3/2 thin, 0);
+       z8r = (w - thin / 2, 3/4 h + thin / 2);
+
+       penpos9 (13/8 thin, 0);
+       z9 = (2/3 w, h / 2);
+
+       penlabels (range 1 thru 9);
+
+       save t;
+       t = tense;
+
+       fill z2r{dir (180 + beta)}
+            .. z3r{down}
+            .. z4r{right}
+            .. z5r{dir (90 + alpha)}
+            -- z6r{dir (90 + alpha)}
+            ..tension t.. z7r{right}
+            .. z8r{down}
+            .. {dir (180 + beta)}z9r
+            -- z9l{dir (beta)}
+            .. z8l{up}
+            .. z7l{left}
+            .. {dir (alpha - 90)}z6l
+            -- z5l{dir (alpha - 90)}
+            ..tension t.. z4l{left}
+            .. z3l{up}
+            .. {dir (beta)}z2l
+            -- cycle;
+fet_endchar;
+
+
+fet_beginchar ("Numeral 9", "nine");
+       draw_six;
+%      xy_mirror_char;
+
+       currentpicture := currentpicture scaled -1;
+       currentpicture := currentpicture shifted (w, h);
+fet_endchar;
+
+
+ligtable "3":
+       "3" kern 0.1 space#,
+       "0" kern 0.1 space#;
+
+ligtable "2":
+       "7" kern 0.15 space#;
diff --git a/mf/feta-nummer-code.mf b/mf/feta-nummer-code.mf
deleted file mode 100644 (file)
index 471e295..0000000
+++ /dev/null
@@ -1,909 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  bold Orator numerals
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
-%
-% LilyPond 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.
-%
-% 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/>.
-
-
-height# := number_design_size;
-space# := number_design_size / 2;
-
-font_x_height height#;
-font_normal_space space#;
-
-
-%
-% DOCME!
-%
-% ugh. b and h are reused.
-%
-
-save b, h;
-4 h + b = 1.15;
-10 h + b = 1;
-fatten := number_design_size * h + b;
-
-save b, h;
-4 h + b = 1.05;
-10 h + b = 1;
-widen := number_design_size * h + b;
-
-tense = 0.85;
-thick# := 7/30 height# * fatten;
-thin# := thick# / 4 * fatten + max (.1 (height# / 10 - 1), 0);
-
-%% sqrt (.8 * blot_diameter# * thin#);
-hair# := thin# * .8;
-
-flare# := 9/8 thick# + .75 (height# / 10 - 1);
-
-save b, h;
-4h + b = 1/8;
-10h + b = 1/6;
-kuulleke# := thick# * number_design_size * h + b;
-foot_top# := thick#;
-foot_width# := 9/4 thick#;
-
-
-%
-% These numbers were taken from a part that that the EJE violas played
-% 1997 -- Probably Mendelssohn's ouverture `Heimkehr aus der Fremde'.
-%
-
-
-%
-% TODO all the invocation of flare_path are weird --
-% the horizontal tangents should be more at the center of the
-% glyph.
-%
-
-define_pixels (height, thick, thick, thin, hair, flare);
-define_pixels (foot_top, foot_width);
-define_pixels (kuulleke);
-
-
-%
-% Yet Another Bulb Routine with smooth inside curve.
-%
-% alpha = start direction.
-% beta = which side to turn to
-% flare = diameter of the bulb
-% line = diameter of line attachment
-% direction = is ink on left or right side (1 or -1)
-%
-%
-% move_away_to = amount left (for 2)
-% turn_to = amount down (for 2)
-%
-
-def number_flare_path (expr pos, alpha, beta, line, flare,
-                      move_away_to, turn_to, taille, taille_ratio,
-                      direction) =
-begingroup;
-       save res;
-       path res;
-
-       clearxy;
-
-%      z5 = z2 + 0.43 * flare * dir (alpha - 1.5 beta);
-
-       z4 = (0.75 - taille) [z2r, z2l] + whatever * dir (alpha - beta);
-       z4 = (taille_ratio * taille) [z3l, z3r] + whatever * dir (alpha);
-
-       z1r = pos;
-       z2r = z1r + move_away_to * dir (alpha)
-             + (line + turn_to) * dir (alpha + beta);
-       z3r = 0.5 [z2l, z2r] + 0.5 * flare * dir (alpha + beta);
-
-       penpos1 (line, 180 + beta + alpha);
-       penpos2 (flare, alpha);
-       penpos3 (flare, alpha + beta);
-
-       penlabels (1, 2, 3, 4, 5);
-
-       res := z1r{dir (alpha)}
-              .. z2r{dir (180 + alpha - beta)}
-              .. z3r{dir (alpha + 180)}
-              .. z2l{dir (alpha - beta)}
-
-%%% Two versions of the curve: one with z4, the other with z5.
-%             .. z5{dir (alpha - beta / 2)}
-
-              .. z4{dir (180 + alpha + beta)}
-              .. z1l{dir (alpha + 180)};
-
-%      pickup pencircle;
-%      draw res;
-
-       if direction <> 1:
-               res := reverse res;
-       fi;
-
-res
-endgroup
-enddef;
-
-
-def calc_kuulleke (expr w, alpha) =
-begingroup;
-       save beta, gamma;
-
-       beta = (alpha - 90) / 2;
-       gamma = (90 + alpha) / 2;
-
-       penpos1 (w / cosd (alpha), alpha);
-       penpos2 (hair, 90 + beta);
-       penpos3 (hair, gamma - 90);
-
-       z2 = z1l + (1/2 hair / tand ((alpha + 90) / 2)) * dir (beta);
-       z3 = z1r - (1/2 hair / tand ((90 - alpha) / 2)) * dir (gamma);
-       z4 = z1 + kuulleke * dir (alpha - 90);
-endgroup;
-enddef;
-
-
-% should make generic macro?
-%
-def draw_foot (expr xpos) =
-begingroup;
-       clearxy;
-
-       penpos1 (thick, 0);
-       penpos2 (foot_width, 0);
-       penpos3 (hair, -90);
-       penpos4 (hair, 90);
-
-       z1= (xpos, foot_top);
-       z2= (x1, 0);
-       z3r = z2r;
-       z4l = z2l;
-       z5 = (x1, kuulleke);
-
-       penlabels (1, 2, 3, 4);
-
-       fill z1
-            .. {right}z1r{down}
-            .. {right}z3l
-            .. z3r{left}
-            .. z5
-            .. {left}z4l
-            .. z4r{right}
-            .. {up}z1l{right}
-            .. z1
-            .. cycle;
-endgroup;
-enddef;
-
-
-def draw_six =
-       save outer_t, t;
-       save before, after, u, v;
-       path before, after;
-
-       set_char_box (0, .68 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       penpos2 (hair, 90);
-       z2 = (w / 2, h / 2 + thin - hair / 2);
-
-       penpos3 (15/16 thick, 0);
-       x3r = w;
-       y3r = .5 [y4r, y2r];
-
-       penpos4 (hair, -90);
-       z4r = (x2, 0);
-
-       penpos6 (hair, 90);
-       x6r = .56 w;
-       y6r = h;
-
-       penpos7 (thick, 180);
-       x7r = 0;
-       y7r = .50 h;
-
-       penpos10 (thick, 180);
-       z10r = (0, y3);
-
-       penlabels (range 1 thru 10);
-
-       outer_t = 0.88;
-       t := tense;
-
-       before := z7{right}
-                 .. z2r{right};
-       after := z7r{up}
-                .. number_flare_path (z6r, 0, -90, hair, flare,
-                                      w - x6r - hair / 2, .16 h,
-                                      0.05, 2.5, 1)
-                .. z7l{down};
-       (u, v) = before intersectiontimes after;
-
-%      draw
-       fill subpath (u, infinity) of before
-            ..tension outer_t.. z3r{down}
-            ..tension outer_t.. z4r{left}
-            .. subpath (0, v) of after
-            .. cycle;
-
-       unfill z2l{right}
-              ..tension t.. z3l{down}
-              ..tension t.. z4l{left}
-              ..tension t.. z10l{up}
-              ..tension t.. cycle;
-enddef;
-
-
-save dot_diam;
-dot_diam# = 7/8 flare#;
-define_pixels (dot_diam);
-
-
-code := 42;    % , 43
-
-fet_beginchar ("Plus", "plus");
-       set_char_box (0, .5 height#, -0.25 height#, 0.75 height#);
-
-       save hthick, vthick, size, outer_hsize, outer_vsize;
-
-       hthick# = vthick# = 2 linethickness#;
-       size# = 1.1 staff_space#;
-       define_whole_blacker_pixels (vthick);
-       define_whole_vertical_blacker_pixels (hthick);
-
-       outer_hsize = hround ((b + w - vthick) / 2);
-       outer_vsize = vround ((h + d - hthick) / 2);
-
-       centerx := hround (w / 2);
-       centery := vround ((h - d) / 2);
-
-       z1 = (centerx - hthick / 2, -d); 
-       z2 = (centerx + hthick / 2, h); 
-
-       labels (1, 2);
-
-       draw_rounded_block (z1, z2, hthick);
-       draw_rounded_block ((0, centery - vthick / 2),
-                           (w, (centery + vthick / 2)),
-                           vthick);
-fet_endchar;
-
-
-code := 43;    % , = 44
-
-fet_beginchar ("Numeral comma", "comma");
-       save pat, pos;
-       path pat;
-
-       set_char_box (0, dot_diam#, 3/2 dot_diam#, dot_diam#);
-
-       pat := (dot_diam / 2, 0)
-              .. (dot_diam, dot_diam / 2)
-              .. (dot_diam / 2, dot_diam)
-              .. (0, dot_diam / 2)
-              .. cycle;
-       
-       pos = ypart (((w / 3, 0) -- (w / 3, dot_diam / 2))
-                    intersectiontimes pat);
-       z0 = point pos of pat;
-
-       alpha = 65;
-       penpos1 (thin, alpha + 90);
-
-       z1l = (w / 2, -1.5 h + hair);
-       z2 = (w, h / 2);
-
-       pickup feta_fillpen;
-
-       % include z0 to assist removal of overlaps
-       fill subpath (0,3) of pat
-            .. z0
-            .. cycle;
-       filldraw z1l{dir (alpha)}
-                .. {up}z2
-                -- z0{direction pos of pat}
-                ..tension 0.95.. {dir (180 + alpha)}z1r
-                .. cycle;
-
-       labels (0, 2);
-       penlabels (1);
-fet_endchar;
-
-
-fet_beginchar ("Numeral dash", "hyphen");
-       set_char_box (0, height# / 3, 0, height#);
-
-       draw_rounded_block ((-b, h / 3 - thin / 2),
-                           (w, h / 3 + thin / 2), thin);
-fet_endchar;
-
-
-fet_beginchar ("Numeral dot", "period");
-       set_char_box (0, dot_diam#, 0, dot_diam#);
-
-       pickup pencircle scaled dot_diam;
-
-       drawdot (dot_diam / 2, dot_diam / 2);
-fet_endchar;
-
-
-% skip slash
-
-code := 47;    % 0 = 48
-
-fet_beginchar ("Numeral 0", "zero");
-       set_char_box (0, 11/15 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       penpos1 (thin, 90);
-       penpos2 (thick, 180);
-       penpos3 (thin,- 90);
-       penpos4 (thick, 0);
-
-       z1r = (w / 2, h);
-       z2r = (0, h / 2);
-       z3r = (w / 2, 0);
-       z4r = (w, h / 2);
-
-       fill z1r
-            .. z2r
-            .. z3r
-            .. z4r
-            .. cycle;
-
-       save t;
-       t = 1 / tense;
-
-       penlabels (1, 2, 3, 4);
-
-       unfill z1l
-              ..tension t.. z2l
-              ..tension t.. z3l
-              ..tension t.. z4l
-              ..tension t.. cycle;
-fet_endchar;
-
-
-fet_beginchar ("Numeral 1", "one");
-       save alpha, beta, gamma;
-
-%      set_char_box (0, 19/30 height# * widen, 0, height#);
-       set_char_box (0, 1/2 foot_width# + 3/2 thick# + 1/2 hair#,
-                     0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       alpha = 0;
-       calc_kuulleke (thick, alpha);
-       z1 = (3/2 thick, height);
-
-       penpos5 (thick, 0);
-       z5 = (x1, foot_top);
-
-       z6 = (0, h / 2);
-       beta = angle (z1l - z6);
-
-       penpos7 (thin, beta - 90);
-       z7l = z6;
-
-       penpos8 (thin / cosd (beta), -90);
-       z8l = z1l;
-
-       penpos9 (thin, beta - 90);
-       z9r = z8r + (thin / cosd (beta)) * down;
-
-       penlabels (range 1 thru 9);
-
-       gamma = angle (length (z1r - z1), 2 kuulleke);
-
-       fill z2r{dir (alpha - gamma)}
-            .. z4
-            .. {dir (alpha + gamma)}z3l
-            .. z3r{down}
-            -- z5r
-            -- z5l
-            -- z2l{up}
-            .. cycle;
-
-       fill z7l
-            -- z1l{dir (beta)}
-            .. {dir (alpha - gamma)}z2r
-            -- z9r{up}
-            .. {dir (180 + beta)}z9l
-            -- z7r{dir (180 + beta)}
-            .. {dir (beta)}cycle;
-
-       draw_foot (x1);
-fet_endchar;
-
-
-fet_beginchar ("Numeral 2", "two");
-       save tolerance;
-       save alpha, beta, gamma, theta;
-       save flare_start_distance;
-       save t, pat, bow;
-       path pat, bow;
-
-       set_char_box (0, 22/30 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       alpha = -45 * widen;
-       beta = 85;
-       gamma = beta - 10;
-       theta = 20 / widen;
-
-       flare_start = 0.25;
-
-       penpos1 (hair, 90 + beta);
-       z1 = (0, 0) + (1/2 sqrt (2) * hair) * dir (45);
-
-       penpos3 (hair,90 + gamma);
-       z3 = (w, thick) + (1/2 sqrt (2) * hair) * dir (-135);
-
-       penpos2 (thick, 90 + alpha - 15);
-       x2 - x1 = x3 - x2;
-       y2 = 10/16 thick / widen;
-
-       tolerance := epsilon;
-
-       % Find proper tension to exactly touch the x axis.
-       % Later on we directly use `bow'.
-       vardef f (expr t) =
-               bow := z3l{dir (180 + gamma)}
-                      ..tension t.. {dir (180 + alpha -5)}z2l;
-               ypart (directionpoint left of bow) < 0
-       enddef;
-
-       % the return value of `solve' is stored in a dummy variable
-       t = solve f (0.8, 1.2);
-
-       fill z1r{dir (beta)}
-            ..tension 0.9.. {dir (alpha + 10)}z2r
-            .. {dir (gamma)}z3r
-            .. bow
-            .. {dir (180 + beta)}z1l
-            .. cycle;
-
-       penpos4 (thick, 0);
-       z4r = (w - thin / 2, .71 h);
-
-       penpos5 (hair, 90);
-       y5r = h;
-       x5r = 9/20 w;
-
-       penlabels (range 1 thru 6);
-
-       t := tense;
-
-       pat := z1l{dir (beta)}
-              ..tension t.. z4r{up}
-              .. number_flare_path (z5r, 180, 90, hair, 1.05 flare,
-                                    x5r - 1/2 hair, .21 h, 0.006, 0.4, 1)
-              .. z4l{down}
-              ..tension t.. {dir (180 + beta)}z1r
-              -- cycle;
-
-%      pickup pencircle scaled 1;
-%      draw pat;
-
-       fill pat;
-fet_endchar;
-
-
-%%
-% TODO: should widen a bit.  The right edge of the 3 bumps into next glyph in
-% combinations
-%
-fet_beginchar ("Numeral 3", "three");
-       set_char_box (0, 2/3 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       penpos1 (hair, -90);
-
-%      flare_start = 0.25;
-
-       x1l = 36/80 w;
-       y1l = h;
-
-%      z1l = (17/16 thick, h);
-
-       penpos2 (7/8 thick, 180);
-       x2l = w - thick / 8;
-       y2l = 3/4 h + thick * 3/32;
-
-       penpos3 (thin, 90);
-       z3 = (w / 2, h / 2 + 1/8 thick);
-
-       penpos4 (thin, 90);
-       z4 = (5/8 thick + 1/2 thin, y3);
-
-       penpos5 (thick, 0);
-       x5r = w;
-       y5r = 17/64 h + thick / 16;
-
-       penpos6 (hair, -90);
-       x6r = 37/80 w;
-       y6r = 0;
-
-       penpos7 (3/2 thin, 90);
-       x7 = .83 w;
-       y7 = y3;
-
-       penlabels (range 1 thru 7);
-
-       save alpha, t, outer_t;
-       alpha = 25;
-       t = tense;
-       outer_t := 0.93;
-
-%      pickup pencircle scaled 1;
-%      draw
-       fill number_flare_path (z1l, 180, 90, hair, 7/8 flare, x1l - .5 hair,
-                               .16 h, 0.06, 1.5, -1)
-            ..tension outer_t.. z2l{down}
-            ..tension outer_t.. z7r{dir (180 + alpha)}
-            .. z7l{dir (-alpha)}
-            ..tension outer_t.. z5r{down}
-            ..tension outer_t.. number_flare_path (z6r, 180, -90, hair,
-                                                   flare, x6l, .18 h, 0.06,
-                                                   1.5, 1)
-            .. z5l{up}
-            ..tension t.. z3l{left}
-            .. z4l{left}
-            .. z4r{right}
-            .. z3r{right}
-            ..tension t.. z2r{up}
-            ..tension t.. cycle;
-fet_endchar;
-
-
-fet_beginchar ("Numeral 4", "four");
-       save alpha, beta, gamma;
-
-       set_char_box (0, 4/5 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       alpha = 0;
-       calc_kuulleke (3/2 thick, alpha);
-
-       z1r = (w - 3/4 thick, height);
-       z5 = (thin, 1/4 height + thin);
-
-       beta = angle (z3r - z5);
-
-       penpos6 (thin, -90);
-       z6l = z5;
-
-       penpos7 (thin, -90);
-       y7 = y6;
-       x7 = w - 1/2 thin;
-
-       penpos8 (thin, -alpha);
-       z8r = z5;
-
-       penlabels (range 1 thru 8);
-
-       gamma = angle (length (z1r - z1), 2 kuulleke);
-
-       fill z2r{dir (alpha - gamma)}
-            .. z4
-            .. {dir (alpha + gamma)}z3l
-            .. {dir (180 + beta)}z3r
-            -- z8r
-            -- z7l{right}
-            .. {left}z7r
-            -- z6r{left}
-            ..tension 0.8 and 2.. z8l{dir (beta)}
-            .. {up}z2l
-            .. cycle;
-
-       clearxy;
-
-       alpha := beta;
-       calc_kuulleke (thick, alpha);
-
-       z1r = (w - 3/4 thick, height - (3/2 thin) / cosd (alpha));
-
-       penpos5 (thick, 0);
-       z5 = (x1, foot_top);
-
-       gamma := angle (length (z1r - z1), 2 kuulleke);
-
-       fill z2r{dir (alpha - gamma)}
-            .. z4
-            .. {dir (alpha + gamma)}z3l
-            .. {down}z3r
-            -- z5r
-            -- z5l
-            -- z2l{up}
-            .. cycle;
-
-       penlabels (1, 2, 3, 4, 5);
-
-       draw_foot (x5);
-fet_endchar;
-
-
-fet_beginchar ("Numeral 5", "five");
-       save alpha, beta, gamma, delta;
-       save inner_t, outer_t;
-       save pat;
-       path pat;
-
-       set_char_box (0, 27/40 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       alpha = 0;
-       calc_kuulleke (w - thin, alpha);
-
-       z1 = (w / 2 + 1/8 thick, h);
-
-       penpos5 (thin, 0);
-       z5l = (x1l, h - 15/16 thick);
-
-       penpos6 (hair, 90 - 45);
-       z6 = z5r + 1/2 hair * dir (-45);
-
-       penpos7 (thin, 0);
-       z7l = (x1l, h / 2 + thin - hair);
-
-       penlabels (range 1 thru 7);
-
-       gamma = angle (length (z1r - z1), 2 kuulleke);
-
-       pat := z2r{dir (alpha - gamma)}
-              .. z4
-              .. {dir (alpha + gamma)}z3l
-              .. z3r{dir (-135)}
-              .. {left}z6r
-              .. {down}z6l
-              -- z7r{down}
-              .. {up}z7l
-              -- z2l{up}
-              .. cycle;
-
-       beta = 45;
-       delta = 180 + beta + 10;
-       z8r = (x7r, y7r - 1/16 thick + thin);
-       z8l = directionpoint dir (delta) of
-               subpath (6, 7) of pat;
-
-       % include intersection point to improve overlap removal
-       fill subpath (0, 6) of pat
-            .. z8l
-            .. subpath (7, length (pat)) of pat
-            .. cycle;
-
-       penpos9 (thin, 90);
-       y9 = 10/16 [y5, y7];
-       x9 = .36 [x8r, x10r];
-
-       penpos10 (thick, 0);
-       x10r = w + hair / 2;
-       y10r = 1/2 [y9r, y11r];
-
-       penpos11 (hair, -90);
-       y11r = 0;
-       x11r = .7 [0, x10l];
-
-       penlabels (range 8 thru 12);
-
-       inner_t = 1.0;
-       outer_t = .85;
-
-       fill z8r {dir (beta)}
-            .. z9r{right}
-            ..tension outer_t.. z10r{down}
-            .. number_flare_path (z11r, 180, -90, hair, flare, x11l,
-                                  .18 h, 0.06, 1.5, 1)
-            .. z11l{right}
-            ..tension inner_t.. z10l{up}
-            ..tension inner_t.. z9l{left}
-            .. z8l{dir (delta)}
-            -- cycle;
-fet_endchar;
-
-
-fet_beginchar ("Numeral 6", "six");
-       draw_six;
-fet_endchar;
-
-
-fet_beginchar ("Numeral 7", "seven");
-       save tolerance;
-       save alpha, beta, gamma, delta;
-       save bow;
-       save x_overshoot;
-
-       path bow;
-
-       set_char_box (0, 11/15 height# * widen - thin#, 0, height#);
-       overshoot_x = .75 thin;
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       alpha = -180;
-
-       penpos1 (3/2 thick, 180 + alpha);
-       penpos2 (hair, 180 + alpha - 45);
-       penpos3 (hair, 180 + alpha + 45);
-
-       z2 = z1l + (1/4 sqrt (2) * hair) * dir (alpha - 135);
-       z3 = z1r + (1/4 sqrt (2) * hair) * dir (alpha - 45);
-       z4 = z1 + kuulleke * dir (alpha - 90);
-
-       z1l = (thin, 0);
-
-       beta = 55;
-       penpos5 (thin, 90 + beta);
-       z5 = (w, h) + (1/2 sqrt (2) * thin) * dir (-135) + (overshoot_x, 0);
-
-       gamma = angle (length (z1r - z1), 2 kuulleke);
-       delta = 12;
-
-       pickup pencircle;
-
-       fill z3l{dir (alpha - gamma)}
-            .. z4
-            .. {dir (alpha + gamma)}z2r
-            .. z2l{dir (beta + delta)}
-            .. {dir (beta)}z5r
-            .. z5l{dir (180 + beta)}
-            .. {dir (delta - 90)}z3r
-            .. cycle;
-
-       penlabels (1, 2, 3, 4, 5);
-
-       alpha := -45 * widen;
-
-       penpos11 (1/2 thick, 90);
-       z11 = (3/2 thin, h - (thick + thin) / 2);
-
-       penpos13 (thin, 90 + beta);
-       z13 = z5;
-
-       penpos12 (thick, 90 + alpha);
-       x12 = 1/2 [x11, x13] - 1/4 thick;
-       y12 = h - 15/16 thick + thin * widen;
-
-       penpos14 (thin, 0);
-       z14l = (0, h - thin / 2);
-
-       penpos15 (thin, 0);
-       z15l = (0, h / 2 + thin / 2);
-
-       penpos16 (9/8 thick, 90);
-       z16r = (thin, y11r + 2/16 thick);
-
-       tolerance := epsilon;
-
-       % Find proper tension to exactly touch the x axis.
-       % Later on we directly use `bow'.
-       vardef f (expr t) =
-               bow := z11r{dir (beta)}
-                      ..tension t.. {dir (alpha)}z12r;
-               ypart (directionpoint right of bow) > h
-       enddef;
-
-       % the return value of `solve' is stored in a dummy variable
-       t = solve f (0.8, 1.2);
-
-       fill bow
-            .. {dir (beta)}z13r
-            -- z13l{dir (180 + beta)}
-            .. {dir (180 + alpha)}z12l
-            .. {dir (180 + beta)}z11l
-            .. {down}z16l
-            -- z15r{down}
-            .. {up}z15l
-            -- z14l{up}
-            .. {down}z14r
-            -- z16r{down}
-            ..tension 1.5.. {dir (beta)}cycle;
-
-       penlabels (range 11 thru 16);
-fet_endchar;
-
-
-fet_beginchar ("Numeral 8", "eight");
-       save alpha, beta;
-
-       set_char_box (0, 11/15 height# * widen, 0, height#);
-
-       message "w:" & decimal w;
-       message "h:" & decimal h;
-
-       alpha = 60;
-       beta = alpha - 15;
-
-       z1 = (w / 2, h / 2 + thick / 8);
-
-       penpos2 (14/8 thin, 0);
-       z2 = (w / 3, h / 2 + thin);
-
-       penpos3 (3/2 thin, 0);
-       z3l = (0, h / 4 + thin / 2);
-
-       penpos4 (hair, 90);
-       z4l = (x1, 0);
-
-       penpos5 (thick, 90 + 90 + alpha);
-       z5 = z1 + w / 4 * dir (alpha - 90);
-
-       penpos6 (thick, 90 + 90 + alpha);
-       z6 = z1 + (w / 4 - thin / 2) * dir (90 + alpha);
-
-       penpos7 (hair, 90);
-       z7r = (x1 + .02 w, h);
-
-       penpos8 (3/2 thin, 0);
-       z8r = (w - thin / 2, 3/4 h + thin / 2);
-
-       penpos9 (13/8 thin, 0);
-       z9 = (2/3 w, h / 2);
-
-       penlabels (range 1 thru 9);
-
-       save t;
-       t = tense;
-
-       fill z2r{dir (180 + beta)}
-            .. z3r{down}
-            .. z4r{right}
-            .. z5r{dir (90 + alpha)}
-            -- z6r{dir (90 + alpha)}
-            ..tension t.. z7r{right}
-            .. z8r{down}
-            .. {dir (180 + beta)}z9r
-            -- z9l{dir (beta)}
-            .. z8l{up}
-            .. z7l{left}
-            .. {dir (alpha - 90)}z6l
-            -- z5l{dir (alpha - 90)}
-            ..tension t.. z4l{left}
-            .. z3l{up}
-            .. {dir (beta)}z2l
-            -- cycle;
-fet_endchar;
-
-
-fet_beginchar ("Numeral 9", "nine");
-       draw_six;
-%      xy_mirror_char;
-
-       currentpicture := currentpicture scaled -1;
-       currentpicture := currentpicture shifted (w, h);
-fet_endchar;
-
-
-ligtable "3":
-       "3" kern 0.1 space#,
-       "0" kern 0.1 space#;
-
-ligtable "2":
-       "7" kern 0.15 space#;
diff --git a/mf/feta-pedals.mf b/mf/feta-pedals.mf
new file mode 100644 (file)
index 0000000..35c96aa
--- /dev/null
@@ -0,0 +1,357 @@
+% Feta (not the Font-En-Tja) music font -- piano pedal markings
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% Voor Cup
+%
+% LilyPond 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.
+%
+% 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/>.
+
+% Kerning
+%
+% Pe = -0.034 pedalh == -0.07 staff-space
+% ed = -0.27 pedalh == -0.53 staff-space
+
+
+fet_begingroup ("pedal");
+
+pedalpha = 40;
+pedbeta = 25;
+
+penh# = 0.7 linethickness#;
+penw# = 2 penh# + 0.14 staff_space#;
+define_pixels (penh, penw);
+
+pedalh# = 2 staff_space#;
+pedalbh# = 4/7 pedalh#;
+define_pixels (pedalh, pedalbh);
+
+
+fet_beginchar ("Pedal asterisk", "*");
+       save bulb, p, radius, thin, inner_r;
+       path pat;
+
+       set_char_box (0, 7/9 pedalh#, 0, 7/9 pedalh#);
+
+       z0 = (1/2 w, h - 1/2 w);
+
+       thin = 0.8 linethickness;
+
+       bulb + 2 radius = w;
+       0.9 thin + bulb = (radius * pi * 2) / 8;
+
+       pickup pencircle scaled penh;
+
+       penpos1 (bulb, 180);
+       penpos2 (bulb, 0);
+       penpos3 (thin, 0);
+
+       z1 = z0 + (0, radius);
+       z2 = z1;
+
+       inner_r = .45 radius;
+
+       z4l = z0 + inner_r * dir (90 + 360/16);
+       z4r = z0 + inner_r * dir (90 - 360/16);
+
+       z4 = .5 [z4l, z4r];
+       z3 = .75 [z1, z4];
+
+       penlabels (0, 1, 2, 3, 4);
+
+       pat := z3r{up}
+              .. z1l{up}
+              .. z2l{down}
+              .. z3l{down}
+              .. z4l{dir (180 + 360/16)};
+       for i = 1 upto 7:
+               pat := pat
+                      .. ((z3r{up}
+                          .. z1l{up}
+                          .. z2l{down}
+                          .. z3l{down}
+                          .. z4l{dir (180 + 360/16)})
+                               rotatedaround (z0, 360/8 i));
+       endfor;
+
+       pat := pat
+              .. cycle;
+       fill pat;
+
+       pickup pencircle scaled (7/8 inner_r);
+
+       undrawdot z0;
+fet_endchar;
+
+
+%% ugh. rounded corners!
+
+fet_beginchar ("Pedal dash", "M");
+       save dash_thickness;
+
+       dash_thickness# := penw#;
+       define_whole_vertical_blacker_pixels (dash_thickness);
+
+       set_char_box (0, 3 penw#, 0, pedalbh#);
+
+       penpos1 (dash_thickness, 60);
+       penpos2 (dash_thickness, 60);
+
+       z1l = (0, vround (2/3 h - 1/2 penw));
+       z2r = (w, vround (y1l + 1.2 penw));
+
+       penlabels (1, 2, 3);
+
+       penstroke z1e{dir 40}
+                 ..tension 1.2.. z2e{dir 40};
+fet_endchar;
+
+
+fet_beginchar ("Pedal dot", ".");
+       set_char_box (0, penw#, 0, penw#);
+
+       pickup pencircle scaled penw;
+
+       drawdot (hround (1/2 penw), vround (1/2 penw));
+fet_endchar;
+
+
+def draw_pedal_P (expr show_labels) =
+begingroup;
+       clearxy;
+
+       penpos1 (hround penh, 0);
+       penpos2 (penw, 55);
+       penpos3 (penw, pedalpha);
+       penpos4 (1.2 penh, -pedalpha);
+       penpos5 (penh, -pedalpha);
+       penpos6 (penh, 180 - pedalpha);
+       penpos7 (penh, 180 - pedalpha);
+       penpos8 (penh, 90);
+       penpos9 (4/3 penw, 50);
+       penpos10 (1.4 penw, 50);
+       penpos11 (penh, 90 + pedalpha);
+
+       z1r = (hround 0.6 w, h);
+       x2l = hround (x1l - penw) + xpart feta_offset;
+       y2 = vround (0.7 h) + ypart feta_offset;
+       x3r = hround (x2l + 2 penw);
+       y3r = 0.4 h;
+       z4l = z5r + 1/4 (z3r - z5r);
+       x5 = 1/4 w;
+       y5r = 0;
+       z6 = z5;
+       z7l = z6r + 1/3 (z8r - z6r);
+       z8r = z5r + 3/5 (z3r - z5r);
+       x9l = x10l - penh;
+       y9l = 1/4 penh;
+       x10l = w - tand (90 - pedalpha) * y11l;
+       y10l = 1/4 penh;
+       x11l = w;
+       y11 = 1/5 h;
+
+       % don't stick out at the top
+       z1' = round (0.9 [z2, z1]) + (xpart feta_offset, 0);
+       penpos1' (penh, 0);
+
+       % shift start point of pen stroke to avoid overlapping contours
+       z8'l = z8l;
+       y8'r = y8r;
+       z8'r = z8l + whatever * (z3r - z8l);
+
+       penpos12 (hround penh, 0);
+       penpos13 (penw, -90 - pedbeta);
+       penpos14 (vround penh, 90);
+       penpos15 (penw, -90 + pedbeta);
+       penpos16 (penh, 180 + pedbeta);
+
+       z12r = (hround (5/9 x1 + 1/2 hround penh), y2);
+       z13l = (1/2 x12r, y15r);
+       z14r = z1r;
+       z15l = (1/2 [x16, w], y2l + 0.5 penw);
+       x16 = 1/4 [x1, w];
+       y16r = y2r;
+
+       % We now do a correction to `center' the stem horizontally.  While
+       % this is not the most elegant solution, it is definitely the
+       % easiest...
+
+       save horz_corr;
+       horz_corr = 1/5 [x12, x16] - x2l;
+       x2 := x2 + horz_corr;
+       x2l := x2l + horz_corr;
+       x2r := x2r + horz_corr;
+
+       penstroke z1'e
+                 ..tension 2.5.. z2e
+                 ..tension 1.5.. z3e
+                 ..tension 2.5.. {dir (225)}z4e;
+
+       soft_end_penstroke z8'e{right}
+                          ..tension 1.5.. z9e{dir (-pedalpha)}
+                          .. z10e
+                          ..tension 2.5.. z11e;
+
+       fill z4r{dir (225)}
+            ..tension 1.5.. z5r{left}
+            .. z6r
+            ..tension 1.5.. z7r
+            ..tension 1.5.. z8r{right}
+            -- cycle;
+
+       soft_penstroke z12e{down}
+                      ..tension 1.1.. z13e{dir (180 - pedbeta)}
+                      ..tension 1.1.. z14e{right}
+                      ..tension 1.1.. z15e{dir (180 + pedbeta)}
+                      ..tension 1.1.. z16e{dir (90 + pedbeta)};
+
+       if show_labels = 1:
+               penlabels (range 1 thru 16);
+               penlabels (1', 8');
+       fi;
+endgroup;
+enddef;
+
+
+def draw_pedal_d (expr show_labels) =
+begingroup;
+       clearxy;
+
+       penpos1 (vround penh, -10 - 90);
+       penpos2 (hround penw, 190);
+       penpos3 (vround (2 penh), 90);
+       penpos4 (hround (3/4 penw), 0);
+       penpos5 (penh, -70);
+
+       x1r = 0;
+       y1l = h;
+       z2 = (w - 1/2 hround penw, 1/2 pedalbh + penh);
+       z4l = (hround (1/3 w), 1/2 pedalbh);
+       z5l = (2/3 w, pedalbh);
+       z3l = (hround x5l, 0);
+
+       if show_labels = 1:
+               penlabels (1, 2, 3, 4, 5);
+       fi;
+
+       soft_start_penstroke z1e{dir (-10)}
+                            ..tension 1.1.. z2e{dir (-90 + 10)}
+                            ..tension 1.1.. z3e{left}
+                            ..tension 1.1.. z4e{up}
+                            ..tension 1.1.. z5e{dir (-70 + 90)};
+endgroup;
+enddef;
+
+
+def draw_pedal_e (expr show_labels) =
+begingroup;
+       clearxy;
+
+       penpos1 (penh, pedalpha - 90);
+       penpos2 (penh, pedalpha - 90);
+       penpos3 (3/5 penw, pedalpha);
+       penpos4 (1.2 penh, 90 + pedalpha);
+       penpos5 (2/3 penw, 180);
+       penpos6 (penw, 180 + pedalpha);
+       penpos7 (2/3 penw, -90 - 20);
+       penpos8 (penh, pedalpha - 90);
+
+       z1l = (0, 1/5 pedalh);
+       % this helps to make the path go through z2 at low resolutions
+       z2 = round (z1 + dir pedalpha * penw) + feta_offset;
+       z3 = (3/5 w, 8/9 h);
+       z4 = (2/9 w,  y3);
+       x4r := hround x4r;
+       x5r = 0;
+       y5 = y2;
+       x6 = 3/8 w;
+       y6r = 1/2 penh;
+       z7l = (x6l + penh, y6l);
+       x8r = w;
+       y8 = 1/5 pedalh;
+
+       soft_penstroke z1e
+                      -- z2e{z2 - z1}
+                      ..tension 1.1.. z3e
+                      ..tension 1.05.. z4e
+                      ..tension 1.1.. z5e
+                      ..tension 1.5.. z6e{dir - pedalpha}
+                      ..tension 1.1.. z7e
+                      ..tension 2.5.. z8e;
+
+       if show_labels = 1:
+               penlabels (range 1 thru 8);
+       fi;
+endgroup;
+enddef;
+
+
+fet_beginchar ("Pedal P", "P");
+       set_char_box (0, 5/6 pedalh#, 0, pedalh#);
+
+       draw_pedal_P (1);
+fet_endchar;
+
+
+fet_beginchar ("Pedal d", "d");
+       set_char_box (0, 2/3 pedalh#, 0, 7/8 pedalh#);
+
+       draw_pedal_d (1);
+fet_endchar;
+
+
+fet_beginchar ("Pedal e", "e");
+       set_char_box (0, 2/5 pedalh#, 0, pedalbh#);
+
+       draw_pedal_e (1);
+fet_endchar;
+
+
+fet_beginchar ("Pedal Ped", "Ped");
+       P_width# = 5/6 pedalh#;
+       e_width# = 2/5 pedalh#;
+       d_width# = 2/3 pedalh#;
+       define_pixels (P_width, e_width, d_width);
+
+       e_height = pedalbh;
+       d_height = 7/8 pedalh;
+
+       % Pe = -0.034 pedalh == -0.07 staff-space
+       % ed = -0.27 pedalh == -0.53 staff-space
+       Pe_kern# = -0.034 pedalh#;
+       ed_kern# = -0.27 pedalh#;
+       define_pixels (Pe_kern, ed_kern);
+
+       w := hround d_width;
+       h := vround d_height;
+       draw_pedal_d (0);
+       currentpicture := currentpicture
+                           shifted (hround (e_width + ed_kern), 0);
+
+       w := hround e_width;
+       h := vround e_height;
+       draw_pedal_e (0);
+       currentpicture := currentpicture
+                           shifted (hround (P_width + Pe_kern), 0);
+
+       w := hround P_width;
+       h := vround pedalh;
+       draw_pedal_P (0);
+
+       set_char_box (0, P_width# + Pe_kern# + e_width# + ed_kern# + d_width#,
+                     0, pedalh#);
+fet_endchar;
+
+
+fet_endgroup ("pedal");
diff --git a/mf/feta-pendaal.mf b/mf/feta-pendaal.mf
deleted file mode 100644 (file)
index c35c0ce..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-% Feta (not the Font-En-Tja) music font -- piano pedal markings
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
-%
-% Voor Cup
-%
-% LilyPond 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.
-%
-% 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/>.
-
-% Kerning
-%
-% Pe = -0.034 pedalh == -0.07 staff-space
-% ed = -0.27 pedalh == -0.53 staff-space
-
-
-fet_begingroup ("pedal");
-
-pedalpha = 40;
-pedbeta = 25;
-
-penh# = 0.7 linethickness#;
-penw# = 2 penh# + 0.14 staff_space#;
-define_pixels (penh, penw);
-
-pedalh# = 2 staff_space#;
-pedalbh# = 4/7 pedalh#;
-define_pixels (pedalh, pedalbh);
-
-
-fet_beginchar ("Pedal asterisk", "*");
-       save bulb, p, radius, thin, inner_r;
-       path pat;
-
-       set_char_box (0, 7/9 pedalh#, 0, 7/9 pedalh#);
-
-       z0 = (1/2 w, h - 1/2 w);
-
-       thin = 0.8 linethickness;
-
-       bulb + 2 radius = w;
-       0.9 thin + bulb = (radius * pi * 2) / 8;
-
-       pickup pencircle scaled penh;
-
-       penpos1 (bulb, 180);
-       penpos2 (bulb, 0);
-       penpos3 (thin, 0);
-
-       z1 = z0 + (0, radius);
-       z2 = z1;
-
-       inner_r = .45 radius;
-
-       z4l = z0 + inner_r * dir (90 + 360/16);
-       z4r = z0 + inner_r * dir (90 - 360/16);
-
-       z4 = .5 [z4l, z4r];
-       z3 = .75 [z1, z4];
-
-       penlabels (0, 1, 2, 3, 4);
-
-       pat := z3r{up}
-              .. z1l{up}
-              .. z2l{down}
-              .. z3l{down}
-              .. z4l{dir (180 + 360/16)};
-       for i = 1 upto 7:
-               pat := pat
-                      .. ((z3r{up}
-                          .. z1l{up}
-                          .. z2l{down}
-                          .. z3l{down}
-                          .. z4l{dir (180 + 360/16)})
-                               rotatedaround (z0, 360/8 i));
-       endfor;
-
-       pat := pat
-              .. cycle;
-       fill pat;
-
-       pickup pencircle scaled (7/8 inner_r);
-
-       undrawdot z0;
-fet_endchar;
-
-
-%% ugh. rounded corners!
-
-fet_beginchar ("Pedal dash", "M");
-       save dash_thickness;
-
-       dash_thickness# := penw#;
-       define_whole_vertical_blacker_pixels (dash_thickness);
-
-       set_char_box (0, 3 penw#, 0, pedalbh#);
-
-       penpos1 (dash_thickness, 60);
-       penpos2 (dash_thickness, 60);
-
-       z1l = (0, vround (2/3 h - 1/2 penw));
-       z2r = (w, vround (y1l + 1.2 penw));
-
-       penlabels (1, 2, 3);
-
-       penstroke z1e{dir 40}
-                 ..tension 1.2.. z2e{dir 40};
-fet_endchar;
-
-
-fet_beginchar ("Pedal dot", ".");
-       set_char_box (0, penw#, 0, penw#);
-
-       pickup pencircle scaled penw;
-
-       drawdot (hround (1/2 penw), vround (1/2 penw));
-fet_endchar;
-
-
-def draw_pedal_P (expr show_labels) =
-begingroup;
-       clearxy;
-
-       penpos1 (hround penh, 0);
-       penpos2 (penw, 55);
-       penpos3 (penw, pedalpha);
-       penpos4 (1.2 penh, -pedalpha);
-       penpos5 (penh, -pedalpha);
-       penpos6 (penh, 180 - pedalpha);
-       penpos7 (penh, 180 - pedalpha);
-       penpos8 (penh, 90);
-       penpos9 (4/3 penw, 50);
-       penpos10 (1.4 penw, 50);
-       penpos11 (penh, 90 + pedalpha);
-
-       z1r = (hround 0.6 w, h);
-       x2l = hround (x1l - penw) + xpart feta_offset;
-       y2 = vround (0.7 h) + ypart feta_offset;
-       x3r = hround (x2l + 2 penw);
-       y3r = 0.4 h;
-       z4l = z5r + 1/4 (z3r - z5r);
-       x5 = 1/4 w;
-       y5r = 0;
-       z6 = z5;
-       z7l = z6r + 1/3 (z8r - z6r);
-       z8r = z5r + 3/5 (z3r - z5r);
-       x9l = x10l - penh;
-       y9l = 1/4 penh;
-       x10l = w - tand (90 - pedalpha) * y11l;
-       y10l = 1/4 penh;
-       x11l = w;
-       y11 = 1/5 h;
-
-       % don't stick out at the top
-       z1' = round (0.9 [z2, z1]) + (xpart feta_offset, 0);
-       penpos1' (penh, 0);
-
-       % shift start point of pen stroke to avoid overlapping contours
-       z8'l = z8l;
-       y8'r = y8r;
-       z8'r = z8l + whatever * (z3r - z8l);
-
-       penpos12 (hround penh, 0);
-       penpos13 (penw, -90 - pedbeta);
-       penpos14 (vround penh, 90);
-       penpos15 (penw, -90 + pedbeta);
-       penpos16 (penh, 180 + pedbeta);
-
-       z12r = (hround (5/9 x1 + 1/2 hround penh), y2);
-       z13l = (1/2 x12r, y15r);
-       z14r = z1r;
-       z15l = (1/2 [x16, w], y2l + 0.5 penw);
-       x16 = 1/4 [x1, w];
-       y16r = y2r;
-
-       % We now do a correction to `center' the stem horizontally.  While
-       % this is not the most elegant solution, it is definitely the
-       % easiest...
-
-       save horz_corr;
-       horz_corr = 1/5 [x12, x16] - x2l;
-       x2 := x2 + horz_corr;
-       x2l := x2l + horz_corr;
-       x2r := x2r + horz_corr; 
-
-       penstroke z1'e
-                 ..tension 2.5.. z2e
-                 ..tension 1.5.. z3e
-                 ..tension 2.5.. {dir (225)}z4e;
-
-       soft_end_penstroke z8'e{right}
-                          ..tension 1.5.. z9e{dir (-pedalpha)}
-                          .. z10e
-                          ..tension 2.5.. z11e;
-
-       fill z4r{dir (225)}
-            ..tension 1.5.. z5r{left}
-            .. z6r
-            ..tension 1.5.. z7r
-            ..tension 1.5.. z8r{right}
-            -- cycle;
-
-       soft_penstroke z12e{down}
-                      ..tension 1.1.. z13e{dir (180 - pedbeta)}
-                      ..tension 1.1.. z14e{right}
-                      ..tension 1.1.. z15e{dir (180 + pedbeta)}
-                      ..tension 1.1.. z16e{dir (90 + pedbeta)};
-
-       if show_labels = 1:
-               penlabels (range 1 thru 16);
-               penlabels (1', 8');
-       fi;
-endgroup;
-enddef;
-
-
-def draw_pedal_d (expr show_labels) =
-begingroup;
-       clearxy;
-
-       penpos1 (vround penh, -10 - 90);
-       penpos2 (hround penw, 190);
-       penpos3 (vround (2 penh), 90);
-       penpos4 (hround (3/4 penw), 0);
-       penpos5 (penh, -70);
-
-       x1r = 0;
-       y1l = h;
-       z2 = (w - 1/2 hround penw, 1/2 pedalbh + penh);
-       z4l = (hround (1/3 w), 1/2 pedalbh);
-       z5l = (2/3 w, pedalbh);
-       z3l = (hround x5l, 0);
-
-       if show_labels = 1:
-               penlabels (1, 2, 3, 4, 5);
-       fi;
-
-       soft_start_penstroke z1e{dir (-10)}
-                            ..tension 1.1.. z2e{dir (-90 + 10)}
-                            ..tension 1.1.. z3e{left}
-                            ..tension 1.1.. z4e{up}
-                            ..tension 1.1.. z5e{dir (-70 + 90)};
-endgroup;
-enddef;
-
-
-def draw_pedal_e (expr show_labels) =
-begingroup;
-       clearxy;
-
-       penpos1 (penh, pedalpha - 90);
-       penpos2 (penh, pedalpha - 90);
-       penpos3 (3/5 penw, pedalpha);
-       penpos4 (1.2 penh, 90 + pedalpha);
-       penpos5 (2/3 penw, 180);
-       penpos6 (penw, 180 + pedalpha);
-       penpos7 (2/3 penw, -90 - 20);
-       penpos8 (penh, pedalpha - 90);
-
-       z1l = (0, 1/5 pedalh);
-       % this helps to make the path go through z2 at low resolutions
-       z2 = round (z1 + dir pedalpha * penw) + feta_offset;
-       z3 = (3/5 w, 8/9 h);
-       z4 = (2/9 w,  y3);
-       x4r := hround x4r;
-       x5r = 0;
-       y5 = y2;
-       x6 = 3/8 w;
-       y6r = 1/2 penh;
-       z7l = (x6l + penh, y6l);
-       x8r = w;
-       y8 = 1/5 pedalh;
-
-       soft_penstroke z1e
-                      -- z2e{z2 - z1}
-                      ..tension 1.1.. z3e
-                      ..tension 1.05.. z4e
-                      ..tension 1.1.. z5e
-                      ..tension 1.5.. z6e{dir - pedalpha}
-                      ..tension 1.1.. z7e
-                      ..tension 2.5.. z8e;
-
-       if show_labels = 1:
-               penlabels (range 1 thru 8);
-       fi;
-endgroup;
-enddef;
-
-
-fet_beginchar ("Pedal P", "P");
-       set_char_box (0, 5/6 pedalh#, 0, pedalh#);
-
-       draw_pedal_P (1);
-fet_endchar;
-
-
-fet_beginchar ("Pedal d", "d");
-       set_char_box (0, 2/3 pedalh#, 0, 7/8 pedalh#);
-
-       draw_pedal_d (1);
-fet_endchar;
-
-
-fet_beginchar ("Pedal e", "e");
-       set_char_box (0, 2/5 pedalh#, 0, pedalbh#);
-
-       draw_pedal_e (1);
-fet_endchar;
-
-
-fet_beginchar ("Pedal Ped", "Ped");
-       P_width# = 5/6 pedalh#;
-       e_width# = 2/5 pedalh#;
-       d_width# = 2/3 pedalh#;
-       define_pixels (P_width, e_width, d_width);
-
-       e_height = pedalbh;
-       d_height = 7/8 pedalh;
-
-       % Pe = -0.034 pedalh == -0.07 staff-space
-       % ed = -0.27 pedalh == -0.53 staff-space
-       Pe_kern# = -0.034 pedalh#;
-       ed_kern# = -0.27 pedalh#;
-       define_pixels (Pe_kern, ed_kern);
-
-       w := hround d_width;
-       h := vround d_height;
-       draw_pedal_d (0);
-       currentpicture := currentpicture
-                           shifted (hround (e_width + ed_kern), 0);
-
-       w := hround e_width;
-       h := vround e_height;
-       draw_pedal_e (0);
-       currentpicture := currentpicture
-                           shifted (hround (P_width + Pe_kern), 0);
-
-       w := hround P_width;
-       h := vround pedalh;
-       draw_pedal_P (0);
-
-       set_char_box (0, P_width# + Pe_kern# + e_width# + ed_kern# + d_width#,
-                     0, pedalh#);
-fet_endchar;
-
-
-fet_endgroup ("pedal");
diff --git a/mf/feta-puntje.mf b/mf/feta-puntje.mf
deleted file mode 100644 (file)
index 52e4a38..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-% Feta (not the Font-En-Tja) music font -- a duration dot
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%
-% LilyPond 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.
-%
-% 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 ("dots");
-
-save dot_diam;
-
-2 dot_diam# = staff_space# - stafflinethickness#;
-define_whole_blacker_pixels (dot_diam);
-
-fet_beginchar ("duration dot", "dot");
-       pickup pencircle scaled dot_diam;
-
-       lft x0 = 0;
-       top y0 = vround (.5 dot_diam);
-
-       drawdot z0;
-
-       set_char_box (0, dot_diam#, .5 dot_diam#, .5 dot_diam#);
-fet_endchar;
-
-fet_endgroup ("dots");
diff --git a/mf/feta-rests.mf b/mf/feta-rests.mf
new file mode 100644 (file)
index 0000000..84a525b
--- /dev/null
@@ -0,0 +1,603 @@
+% Feta (not the Font-En-Tja) music font --  rest symbols -*-Fundamental-*-
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+% LilyPond 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.
+%
+% 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 ("rests");
+
+save block_rest_y, block_rest_x;
+save breve_rest_y, breve_rest_x;
+
+breve_rest_y# = staff_space#;
+breve_rest_x# = 3/5 staff_space#;
+block_rest_y# = 5/8 staff_space#;
+block_rest_x# = 3/2 staff_space#;
+
+define_whole_pixels (block_rest_y, block_rest_x);
+define_whole_pixels (breve_rest_y, breve_rest_x);
+
+
+def block_rest =
+       draw_block ((0, 0), (block_rest_x, block_rest_y));
+enddef;
+
+
+fet_beginchar ("whole rest", "0");
+       set_char_box (0, block_rest_x#,
+                     block_rest_y#, 0);
+
+       block_rest;
+       currentpicture := currentpicture
+                           shifted (0, -block_rest_y + feta_space_shift);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("half rest", "1");
+       set_char_box (0, block_rest_x#, 0, block_rest_y#);
+
+       block_rest;
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+%
+% should use ledgerline thickness?
+%
+fet_beginchar ("whole rest (outside staff)", "0o");
+       set_char_box (0, block_rest_x#,
+                     block_rest_y#, ledgerlinethickness# / 2);
+
+       block_rest;
+       currentpicture := currentpicture shifted (0, -block_rest_y);
+
+       pickup pencircle scaled ledgerlinethickness;
+
+       y5 = y6 = 0;
+       lft x5 = -b - block_rest_y;
+       rt x6 = w + block_rest_y;
+       draw_gridline (z5, z6, ledgerlinethickness_rounded);
+
+       draw_staff (-2, 2, -3);
+fet_endchar;
+
+
+fet_beginchar ("half rest (outside staff)", "1o");
+       set_char_box (0, block_rest_x#,
+                     ledgerlinethickness# / 2, block_rest_y#);
+
+       block_rest;
+
+       pickup pencircle scaled ledgerlinethickness;
+
+       y5 = y6 = 0;
+       lft x5 = -b - block_rest_y;
+       rt x6 = w + block_rest_y;
+
+       draw_gridline (z5, z6, ledgerlinethickness_rounded);
+
+       draw_staff (-2, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("maxima rest", "M3");
+       set_char_box (0, 3 breve_rest_x#, breve_rest_y#, breve_rest_y#);
+
+       draw_block ((0, -breve_rest_y + feta_shift),
+                   (breve_rest_x, breve_rest_y));
+
+       addto currentpicture also currentpicture shifted (2 breve_rest_x, 0);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("longa rest", "M2");
+       set_char_box (0, breve_rest_x#, breve_rest_y#, breve_rest_y#);
+
+       draw_block ((0, -breve_rest_y + feta_shift),
+                   (breve_rest_x, breve_rest_y));
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("breve rest", "M1");
+       set_char_box (0, breve_rest_x#, 0, breve_rest_y#);
+
+       draw_block ((0, 0), (breve_rest_x, breve_rest_y));
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("Quarter rest", "2");
+       save alpha, yshift, height;
+       save xcenter;
+
+       yshift# := -1.25 staff_space#;
+       height# := 2.8125 staff_space#;
+       define_pixels (yshift, height);
+
+       alpha := -50;
+       thick := 1/4 staff_space;
+       rthin := 1.25 linethickness;
+       xcenter := -0.1 staff_space;
+       rthick := 2 thick + rthin;
+
+       set_char_box (0, 0.95 staff_space#, -yshift#, yshift# + height#);
+
+       save ne, nw, se, sw;
+       pair ne, nw, se, sw;
+
+       se = dir alpha;
+       ne = dir (alpha + 90);
+       nw = dir (alpha + 180);
+       sw = dir (alpha + 270);
+
+       penpos1 (rthin, alpha + 90);
+       penpos2 (5/4 rthick, alpha);
+       penpos4 (5/4 rthick, alpha);
+       penpos5 (rthin, alpha + 90);
+       penpos3 (3/4 rthick, alpha);
+%      penpos6 (5/8 rthick, alpha);
+       penpos6 (2/3 rthick, alpha);
+       penpos7 (1/2 rthin, alpha + 90);
+
+       z10 = z2l + 1/2 rthin * sw;
+%      z11 = z4l + 1/2 rthin * sw;
+       z11 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
+       z12 = z4r + 1/2 rthin * ne;
+%      z13 = z2r + 1/2 rthin * ne;
+       z13 = z2r + 1/2 rthin * ne + 1/2 rthin * nw;
+
+       y1r = h;
+       x1l = xcenter + 1/3 staff_space;
+       z2r = z1 + staff_space * se;
+       z3 = 1/2 [z2, z4];
+       x4 = xcenter + 3/8 staff_space;
+       y4 = 0;
+       y4l := vround y4l;
+       z5 = round (z4l + 1.3 staff_space * se) + feta_offset;
+       x6l = x4l;
+       y6l = vround y4r;
+       x6r := hround x6r + xpart feta_offset;
+       y6r := vround y6r + ypart feta_offset;
+       x7 = hround (xcenter + 2/5 staff_space) + xpart feta_offset;
+       y7 = -d;
+
+       save before, after;
+       path before, after;
+       before = z11{se}
+                .. {se}z5l;
+       after = z5r{nw}
+               ..tension1.4.. z6l;
+       (u, v) = before intersectiontimes after;
+
+       fill z1l{se}
+            .. {se}z10
+            .. z3l
+            .. subpath (0, u) of before
+            .. subpath (v, infinity) of after
+            ..tension1.4.. {se}z7l
+            .. z7r{nw}
+            ..tension1.4.. z6r
+            ..tension1.4.. {se}z5l
+            .. z5r{nw}
+            .. {nw}z12
+            .. z3r
+            .. z13{nw}
+            .. {nw}z1r
+            .. cycle;
+
+       penlabels (1, 2, 3, 4, 5, 6, 7);
+       penlabels (10, 11, 12, 13);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+%
+% Notes about 8th rest:
+%
+% * 8th rest should be no wider than the black note head
+%
+% * The inside corner of the horizontal portion is usually a little blotted.
+%
+% * The top of the crook chops off the vertical brush
+%
+% * The crook widens a little
+%
+% * The bottom of the brush is slightly flat, as it has to align with
+% stafflines if it is inside the staff.
+%
+% * The top of the brush usually is a little lower than the top of bulb.
+%
+% * The bulb can vary. Sometimes it is open (like in the clefs). Sometimes
+% it is closed, or even a flare.
+%
+
+% from an email to Rune Zedeler:
+%
+%
+% For example, the 8th rest was vaguely based on a book with trumpet
+% studies by Duhem, and by Baerenreiters cello suites. I included my
+% findings in a comment in the mf file.  One of the things that I tried
+% to do was make the rest a little lighter and narrower than the black
+% note head. I think this looks better in polyphonic music, when the
+% rest is below a head from a different voice.
+%
+
+save bulb_diam, thin, thick;
+
+bulb_diam# := 0.64 staff_space#;
+thin# := 1.4 linethickness# - 0.02 staff_space#;
+thick# := 2.2 linethickness#;
+
+crook_thin := 0.5 linethickness + 0.08 staff_space;
+lower_brush := 1.5 linethickness;
+
+define_pixels (bulb_diam);
+define_whole_blacker_pixels (thin, thick);
+
+
+%
+% PAT is a compact way to pass the brush shape to the routine.
+%
+
+def draw_rest_bulb (expr ycenter, ycut, pat, stretch, show_labels) =
+begingroup;
+       save x, y, pt, res;
+
+       z1l = point 0 of pat;
+       z2l = point 1 of pat;
+       z2r = point 3 of pat;
+       z1r = point 4 of pat;
+       z1 = 0.5 [z1l, z1r];
+       z2 = 0.5 [z2l, z2r];
+       y10 = ycenter;
+       z10 = whatever [z2, z1] + left * bulb_diam * stretch;
+
+       % this enforces similar bulb shapes for lower resolutions
+       x10 := hround x10;
+
+       z3 = z10 + bulb_diam / 2.15 * dir (-72);
+       y3 := hround y3;
+       z5 = z10 + up * bulb_diam / 2 + right * linethickness / 3;
+       y5 := hround y5;
+
+       z7 = 0.5 [z4, z5] + crook_thin * (0.45, 0.4) / 1.3;
+       x8 = hround (x10 - 0.4 bulb_diam);
+       y8 = y10 + 0.25 linethickness;
+
+       z6 = whatever [z1l, z2l];
+       z6 = z3 + whatever * dir (12);
+
+       z4 = z3 + whatever * (z6 - z3)
+            + 1.1 crook_thin * (unitvector (z6 - z3) rotated 90);
+       x4 = x10 + bulb_diam * .62;
+       y4 := vround y4;
+
+       (pt, whatever) = pat intersectiontimes ((0, ycut) -- (w, ycut));
+
+       path res;
+       res = point pt of pat {-direction pt of pat}
+             ..tension 2.. z4{left}
+             ..tension 0.9.. z7
+             .. z5{left}
+             .. z8
+             .. z3{right}
+             .. {curl 0.2}z6;
+
+       if show_labels = 1:
+               labels (3, 4, 5, 6, 7, 8, 10);
+       fi;
+
+res
+endgroup;
+enddef;
+
+
+def draw_eighth_rest (expr show_labels) =
+       save ycenter;
+       save pat, bulb;
+       path pat, bulb;
+
+       set_char_box (0, 1.0 staff_space#,
+                     1.0 staff_space# + 0.5 linethickness#,
+                     0.5 staff_space# + bulb_diam# / 2);
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 10);
+
+       y1 = -staff_space_rounded;
+       y2 = h - vround lower_brush;
+       x2r = w;
+       z2 = z1 + whatever * dir (72);
+       z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+       y9 := vround y9;
+
+       x1l := hround x1l;
+       x1r := hround x1r;
+       x1 := .5 [x1l, x1r];
+
+       if show_labels = 1:
+               penlabels (1, 2);
+               labels (9);
+       fi;
+
+       pat = z1l
+             -- z2l
+             .. z9
+             .. z2r
+             -- z1r
+             .. cycle;
+       bulb = draw_rest_bulb (0.5 staff_space, y2r, pat, 1.0, show_labels);
+
+       fill simple_serif (z1l, z1r, 40)
+            -- z2r
+            .. z9
+            .. bulb
+            -- z1l
+            .. cycle;
+
+       draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("Classical quarter rest", "2classical");
+       draw_eighth_rest (0);
+       currentpicture := currentpicture xscaled -1 shifted (w, 0);
+fet_endchar;
+
+
+fet_beginchar ("8th rest", "3");
+       draw_eighth_rest (1);
+fet_endchar;
+
+
+%
+% TODO: the X dimensions of the rests are fucked up:
+% they can collide with augmentation dots.
+%
+
+fet_beginchar ("16th rest", "4");
+       save ycenter;
+       save pat, bulb_a, bulb_b;
+       path pat, bulb_a, bulb_b;
+
+       set_char_box (0, 1.2 staff_space#,
+                     2.0 staff_space# + 0.5 linethickness#,
+                     0.5 staff_space# + bulb_diam# / 2);
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 10);
+
+       y1 = -2 staff_space_rounded;
+       y2 = h - vround lower_brush;
+       x2r = w;
+       z2 = z1 + whatever * dir (74);
+       z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+       y9 := vround y9;
+
+       x1l := hround x1l;
+       x1r := hround x1r;
+       x1 := .5 [x1l, x1r];
+
+       pat = z1l
+             -- z2l
+             .. z9
+             .. z2r
+             -- z1r
+             .. cycle;
+       bulb_a = draw_rest_bulb (.5 staff_space,
+                                y2r, pat, 0.98, 1);
+       bulb_b = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+                                hround ((-0.5 + 0.2) * staff_space),
+                                pat, 1.02, 1);
+
+       fill simple_serif (z1l, z1r, 40)
+            -- z2r
+            .. z9
+            .. bulb_a
+            -- bulb_b
+            -- z1l
+            .. cycle;
+
+       penlabels (1, 2);
+       labels (9);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("32th rest", "5");
+       save ycenter;
+       save pat, bulb_a, bulb_b, bulb_c;
+       path pat, bulb_a, bulb_b, bulb_c;
+
+       set_char_box (0, 1.3 staff_space#,
+                     2.0 staff_space# + 0.5 linethickness#,
+                     1.5 staff_space# + bulb_diam# / 2);
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 10);
+
+       y1 = -2 staff_space_rounded;
+       y2 = h - vround lower_brush;
+       x2r = w;
+       z2 = z1 + whatever * dir (76);
+       z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+       y9 := vround y9;
+
+       x1l := hround x1l;
+       x1r := hround x1r;
+       x1 := .5 [x1l, x1r];
+
+       pat = z1l
+             -- z2l
+             .. z9
+             .. z2r
+             -- z1r
+             .. cycle;
+       bulb_a = draw_rest_bulb (.5 staff_space + staff_space_rounded,
+                                y2r, pat, 0.96, 1);
+       bulb_b = draw_rest_bulb (.5 staff_space,
+                                hround ((0.5 + 0.2) * staff_space),
+                                pat, 1.00, 1);
+       bulb_c = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+                                hround ((-0.5 + 0.21) * staff_space),
+                                pat, 1.04, 1);
+
+       fill simple_serif (z1l, z1r, 40)
+            -- z2r
+            .. z9
+            .. bulb_a
+            -- bulb_b
+            -- bulb_c
+            -- z1l
+            .. cycle;
+
+       penlabels (1, 2);
+       labels (9);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("64th rest", "6");
+       save ycenter;
+       save pat, bulb_a, bulb_b, bulb_c, bulb_d;
+       path pat, bulb_a, bulb_b, bulb_c, bulb_d;
+
+       set_char_box (0, 1.4 staff_space#,
+                     3.0 staff_space# + 0.5 linethickness#,
+                     1.5 staff_space# + bulb_diam# / 2);
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 10);
+
+       y1 = -3 staff_space_rounded;
+       y2 = h - vround lower_brush;
+       x2r = w;
+       z2 = z1 + whatever * dir (78);
+       z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1) - 10);
+       y9 := vround y9;
+
+       x1l := hround x1l;
+       x1r := hround x1r;
+       x1 := .5 [x1l, x1r];
+
+       pat = z1l
+             -- z2l
+             .. z9
+             .. z2r
+             -- z1r
+             .. cycle;
+       bulb_a = draw_rest_bulb (.5 staff_space + staff_space_rounded,
+                                y2r, pat, 0.94, 1);
+       bulb_b = draw_rest_bulb (.5 staff_space,
+                                hround ((0.5 + 0.20) * staff_space),
+                                pat, 0.98, 1);
+       bulb_c = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+                                hround ((-0.5 + 0.21) * staff_space),
+                                pat, 1.02, 1);
+       bulb_d = draw_rest_bulb (.5 staff_space - 2 staff_space_rounded,
+                                hround ((-1.5 + 0.22) * staff_space),
+                                pat, 1.06, 1);
+
+       fill simple_serif (z1l, z1r, 40)
+            -- z2r
+            .. z9
+            .. bulb_a
+            -- bulb_b
+            -- bulb_c
+            -- bulb_d
+            -- z1l
+            .. cycle;
+
+       penlabels (1, 2);
+       labels (9);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_beginchar ("128th rest", "7");
+       save ycenter;
+       save pat, bulb_a, bulb_b, bulb_c, bulb_d, bulb_e;
+       path pat, bulb_a, bulb_b, bulb_c, bulb_d, bulb_e;
+
+       set_char_box (0, 1.5 staff_space#,
+                     3.0 staff_space# + 0.5 linethickness#,
+                     2.5 staff_space# + bulb_diam# / 2);
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 10);
+
+       y1 = -3 staff_space_rounded;
+       y2 = h - vround lower_brush;
+       x2r = w;
+       z2 = z1 + whatever * dir (80);
+       z9 = z2 + 0.5 linethickness * dir (angle (z2 - z1)- 10);
+       y9 := vround y9;
+
+       x1l := hround x1l;
+       x1r := hround x1r;
+       x1 := .5 [x1l, x1r];
+
+       pat = z1l
+             -- z2l
+             .. z9
+             .. z2r
+             -- z1r
+             .. cycle;
+       bulb_a = draw_rest_bulb (.5 staff_space + 2 staff_space_rounded,
+                                y2r, pat, 0.92, 1);
+       bulb_b = draw_rest_bulb (.5 staff_space + staff_space_rounded,
+                                hround ((1.5 + 0.20) * staff_space),
+                                pat, 0.96, 1);
+       bulb_c = draw_rest_bulb (.5 staff_space,
+                                hround ((0.5 + 0.21) * staff_space),
+                                pat, 1.0, 1);
+       bulb_d = draw_rest_bulb (.5 staff_space - staff_space_rounded,
+                                hround ((-0.5 + 0.22) * staff_space),
+                                pat, 1.04, 1);
+       bulb_e = draw_rest_bulb (.5 staff_space - 2 staff_space_rounded,
+                                hround ((-1.5 + 0.23) * staff_space),
+                                pat, 1.08, 1);
+
+       fill simple_serif (z1l, z1r, 40)
+            -- z2r
+            .. z9
+            .. bulb_a
+            -- bulb_b
+            -- bulb_c
+            -- bulb_d
+            -- bulb_e
+            -- z1l
+            .. cycle;
+
+       penlabels (1, 2);
+       labels (9);
+
+       draw_staff (-2, 2, 0);
+fet_endchar;
+
+
+fet_endgroup ("rests");
diff --git a/mf/feta-schrift.mf b/mf/feta-schrift.mf
deleted file mode 100644 (file)
index 1afbcc2..0000000
+++ /dev/null
@@ -1,1623 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  implement scripts
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%      Jan Nieuwenhuizen <janneke@gnu.org>
-%
-%
-% LilyPond 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.
-%
-% 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 ("scripts");
-
-def draw_fermata =
-       save alpha, radius, crook_thinness, crook_fatness, dot_size;
-       save pat;
-       path pat;
-
-       % [Wanske] and some Baerenreiter editions
-       % suggest about 80 degrees instead of a half-circle
-       alpha := 10;
-
-       radius# = 1.25 staff_space#;
-       crook_thinness# = 1.5 linethickness#;
-       crook_fatness# = 0.25 staff_space# + 1.5 linethickness#;
-
-       radius# + crook_fatness# / 2 = h#;
-       radius# + crook_thinness# / 2 = w#;
-
-       set_char_box (w#, w#, crook_thinness# / 2, h#);
-
-       define_pixels (radius, crook_thinness, crook_fatness);
-
-       dot_size# = 8/6 crook_fatness#;
-       define_whole_blacker_pixels (dot_size);
-
-       penpos1 (crook_thinness, 0);
-       penpos2 (crook_fatness, -90);
-       z1 = (-radius, 0);
-       z2 = (0, radius);
-
-       pat := z2l{left}
-              .. z1l{dir (-alpha - 90)}
-              .. {dir (90 - alpha)}z1r
-              .. {right}z2r;
-       pat := pat
-              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
-              -- cycle;
-       fill pat;
-
-       pickup pencircle scaled dot_size;
-       x4 = 0;
-       bot y4 = vround (-crook_thinness / 2);
-       drawdot z4;
-enddef;
-
-
-fet_beginchar ("fermata up", "ufermata");
-       draw_fermata;
-       penlabels (1, 2, 4);
-fet_endchar;
-
-
-fet_beginchar ("fermata down", "dfermata");
-       draw_fermata;
-       y_mirror_char;
-fet_endchar;
-
-
-def draw_short_fermata =
-       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_size# = 0.266 staff_space# + 2.666 linethickness#;
-       define_whole_blacker_pixels (dot_size);
-
-       fat_factor = .11;
-       thinness = 1.5 linethickness;
-
-       pickup pencircle scaled thinness;
-
-       rt x2 = w;
-       lft x5 = -b;
-       bot y5 = 0;
-       top y3 = h;
-       y1 = y2 = y5;
-
-       x3 = 0;
-       z1 - z4 = whatever * (charwd, -charht);
-       z4 = fat_factor [z3, z5];
-
-       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){-ne}
-            -- (z5 + left_dist){-ne}
-            .. cycle;
-
-       pickup pencircle scaled dot_size;
-
-       x1 - 2 x6 = x2;
-       x6 := vround (x6);
-       bot y6 = -d;
-
-       drawdot z6;
-enddef;
-
-fet_beginchar ("short fermata up", "ushortfermata");
-       draw_short_fermata;
-       labels (1, 2, 3, 4, 5, 6);
-fet_endchar;
-
-
-fet_beginchar ("short fermata down", "dshortfermata");
-       draw_short_fermata;
-       xy_mirror_char;
-fet_endchar;
-
-
-def draw_long_fermata =
-       save stemthick, beamheight, dot_size, wd;
-       save pat;
-       path pat;
-
-       wd# = 2.5 staff_space#;
-       stemthick = hround (1.5 linethickness);
-       beamheight = 0.3 staff_space + 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#);
-
-       pickup pencircle scaled blot_diameter;
-
-       top y1 = h;
-       lft x1 = -b;
-
-       pat := top z1{left}
-              .. {down}lft z1;
-
-       pickup pencircle scaled stemthick;
-
-       x2 = -b + stemthick;
-       y2 = h - beamheight;
-       lft x3 = -b;
-       bot y3 = -d;
-
-       pat := pat
-              -- lft z3
-              .. bot z3
-              .. rt z3
-              -- z2;
-       pat := pat
-              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
-              -- cycle;
-
-       fill pat;
-
-       pickup pencircle scaled dot_size;
-
-       x4 = 0;
-       bot y4 = -d;
-
-       drawdot z4;
-enddef;
-
-
-fet_beginchar ("long fermata up", "ulongfermata");
-       draw_long_fermata;
-       labels (1, 2, 3, 4);
-fet_endchar;
-
-
-fet_beginchar ("long fermata down", "dlongfermata");
-       draw_long_fermata;
-       y_mirror_char;
-fet_endchar;
-
-
-def draw_very_long_fermata =
-       save ibeamheight, obeamheight;
-       save ihwd, ohwd, iht, oht;      % inner/outer half_width/height
-       save stemthick, dot_size;
-       save opat, ipat;
-       path opat, ipat;
-
-       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);
-
-       dot_size# = (iht# - ibeamheight#) * 8/10;
-       define_whole_blacker_pixels (dot_size);
-
-       set_char_box (ohwd#, ohwd#, 0, oht#);
-
-       pickup pencircle scaled blot_diameter;
-
-       top y1 = oht;
-       lft x1 = -ohwd;
-       top y11 = iht;
-       lft x11 = -ihwd;
-
-       opat := top z1{left}
-               .. {down}lft z1;
-       ipat := top z11{left}
-               .. {down}lft z11;
-
-       pickup pencircle scaled stemthick;
-
-       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 z3
-               .. bot z3
-               .. rt z3
-               -- z2;
-       opat := opat
-               -- reverse opat xscaled -1 shifted (-feta_eps, 0)
-               -- cycle;
-       ipat := ipat
-               -- lft z13
-               .. bot z13
-               .. rt z13
-               -- z12;
-       ipat := ipat
-               -- reverse ipat xscaled -1 shifted (-feta_eps, 0)
-               -- cycle;
-
-       fill opat;
-       fill ipat;
-
-       pickup pencircle scaled dot_size;
-
-       x4 = 0;
-       bot y4 = -d;
-
-       drawdot z4;
-enddef;
-
-
-fet_beginchar ("very long fermata up", "uverylongfermata");
-       draw_very_long_fermata;
-       labels (1, 2, 3, 11, 12, 13, 4);
-fet_endchar;
-
-
-fet_beginchar ("very long fermata down", "dverylongfermata");
-       draw_very_long_fermata;
-       y_mirror_char;
-fet_endchar;
-
-
-%
-% Thumbs are used in cello music.
-% TODO : thumbs should look like the finger-font and should be placed in
-% the same way in the score.
-%
-
-fet_beginchar ("Thumb", "thumb");
-       save thin, height, width, thick, depth;
-       height# = 5/4 width#;
-       height# = staff_space#;
-       depth# = 1.6 (height# / 2);
-
-       set_char_box (width# / 2, width# / 2, depth#, height# / 2);
-
-       define_pixels (height, width);
-
-       thin = .6 linethickness + 0.06 staff_space;
-       2 thick + 0.5 (height - 2 thin) = width;
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 90);
-       penpos3 (thick, 180);
-       penpos4 (thin, 270);
-       z1r = (w, 0);
-       z2r = (0, h);
-       z3r = (-w, 0);
-       z4r = (0, -h);
-
-       penlabels (1, 2, 3, 4);
-
-       penstroke z1e{up}
-                 .. z2e{left}
-                 .. z3e{down}
-                 .. z4e{right}
-                 .. cycle;
-
-       save brush_thick;
-       y5 = -d + brush_thick / 2;
-       brush_thick = 0.9 thick;
-       x5 = 0;
-
-       labels (5);
-
-       draw_brush (z4r, 1.4 thin, z5, brush_thick);
-fet_endchar;
-
-
-%
-% `\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;
-       top y1 = ypart top_right;
-       lft x6 = xpart bottom_left;
-       bot y6 = ypart bottom_left;
-
-       rt z4 = (xpart top_right, (ypart top_right + ypart 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];
-
-       penpos1 (thickness, angle (z3 - z1) + 90);
-       penpos3 (thickness, angle (z3 - z1) + 90);
-       penpos4 (thickness, 90);
-       penpos5 (thickness, angle (z6 - z5) + 90);
-       penpos6 (thickness, angle (z6 - z5) + 90);
-
-       x4 - x7 = diminish * thickness;
-       y7 = y4;
-
-       fill z1l
-            -- z3l
-            -- z7
-            -- z5l
-            -- z6l
-            .. lft z6{down}
-            .. bot z6
-            .. z6r
-            -- z4l
-            ..tension 0.8.. rt z4
-            ..tension 0.8.. z4r
-            -- z1r
-            .. top z1
-            .. lft z1{down}
-            .. cycle;
-enddef;
-
-
-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.7);
-       penlabels (1, 3, 4, 5, 6);
-       labels (7);
-fet_endchar;
-
-
-fet_beginchar ("espr", "espr");
-       set_char_box (1.9 staff_space#, 1.9 staff_space#,
-                     .5 staff_space#, .5 staff_space#);
-
-       draw_accent ((w - 1.78 staff_space, -d), (w, h),
-                    0.05 staff_space + linethickness, 0.6);
-       addto currentpicture also currentpicture xscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("staccato dot", "staccato");
-       save radius;
-       radius# = 0.20 * staff_space#;
-       define_whole_pixels (radius);
-
-       pickup pencircle scaled 2 radius;
-       drawdot (0, 0);
-
-       set_char_box (radius#, radius#, radius#, radius#);
-fet_endchar;
-
-
-def draw_staccatissimo =
-       save radius, height;
-       height# = .8 staff_space#;
-       radius# = linethickness# + .1 staff_space#;
-       define_whole_blacker_pixels (radius);
-       define_pixels (height);
-
-       draw_brush ((0, 0), linethickness, (0, height), 2 radius);
-
-       set_char_box (radius#, radius#,
-                     blot_diameter# / 2, height# + radius#);
-enddef;
-
-
-fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo");
-       draw_staccatissimo;
-fet_endchar;
-
-
-fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo");
-       draw_staccatissimo;
-       y_mirror_char;
-fet_endchar;
-
-
-fet_beginchar ("portato/single tenuto", "tenuto");
-       save thick;
-       thick# = 1.6 linethickness#;
-       define_whole_blacker_pixels (thick);
-
-       set_char_box (.6 staff_space#, .6 staff_space#,
-                     thick# / 2, thick# / 2);
-
-       draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
-fet_endchar;
-
-
-def draw_portato =
-       save thick, dot_size;
-       thick# = 1.4 linethickness#;
-       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# + .5 dot_size#);
-
-       draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
-
-       pickup pencircle scaled dot_size;
-       drawdot (0, h);
-enddef;
-
-
-fet_beginchar ("portato/tenuto with staccato", "uportato");
-       draw_portato;
-fet_endchar;
-
-
-fet_beginchar ("portato/tenuto with staccato", "dportato");
-       draw_portato;
-       y_mirror_char
-fet_endchar;
-
-
-def draw_marcato =
-       save fat_factor, thinness;
-       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#);
-
-       fat_factor = .3;
-       thinness = linethickness;
-
-       pickup pencircle scaled thinness;
-
-       rt x2 = w;
-       lft x5 = -b;
-       bot y5 = 0;
-       top y3 = h;
-       y1 = y2 = y5;
-
-       x3 =0;
-       z1 - z4 = whatever * (charwd, -charht);
-       z4 = fat_factor [z3, z5];
-
-       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){-ne}
-            -- (z5 + left_dist){-ne}
-            .. cycle;
-enddef;
-
-
-fet_beginchar ("marcato up", "umarcato");
-       draw_marcato;
-       labels (1, 2, 3, 4, 5);
-fet_endchar;
-
-
-%
-% The down marcato char (not very much used).
-% Contrary to what some MF/TeX `gurus' believe
-% it is *point*-symmetric with the "up" version
-%
-
-fet_beginchar ("marcato down", "dmarcato");
-       draw_marcato;
-       xy_mirror_char;
-fet_endchar;
-
-
-%
-% used in french horn music todo
-%
-% TODO: too light at 20pt
-%
-
-fet_beginchar ("open (unstopped)", "open");
-       save thin, height, width, thick;
-
-       height# = 5/4 width#;
-       height# = staff_space#;
-       thin = .6 linethickness + 0.06 staff_space;
-
-       set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
-
-       define_pixels (width, height);
-
-       2 thick + 0.6 (height - 2 thin) = width;
-
-       penpos1 (thick, 0);
-       penpos2 (thin, 90);
-       penpos3 (thick, 180);
-       penpos4 (thin, 270);
-       z1r = (w, 0);
-       z2r = (0, h);
-       z3r = (-w, 0);
-       z4r = (0, -h);
-
-       penlabels (1, 2, 3, 4);
-
-       penstroke z1e{up}
-                 .. z2e{left}
-                 .. z3e{down}
-                 .. z4e{right}
-                 .. cycle;
-fet_endchar;
-
-
-fet_beginchar ("plus (stopped)", "stopped");
-       save hthick, vthick, size, outer_hsize, outer_vsize;
-
-       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);
-
-       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");
-       save ht, wd, thick;
-
-       thick = 1.4 linethickness;
-       wd# = 1.3 staff_space#;
-       ht# = 1.6 wd#;
-
-       set_char_box (wd# / 2, wd# / 2, 0, ht#);
-
-       draw_accent ((-h, -w), (0, w), thick, 0.9);
-       currentpicture := currentpicture rotated -90;
-fet_endchar;
-
-
-fet_beginchar ("Downbow", "downbow");
-       save stemthick, beamheight, wd;
-       save pat;
-       path pat;
-
-       wd# = 1.5 staff_space#;
-       define_pixels (wd);
-
-       stemthick = hround (1.2 linethickness);
-
-       set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#);
-
-       beamheight = 4/10 h;
-
-       pickup pencircle scaled blot_diameter;
-
-       top y1 = h;
-       lft x1 = -b;
-
-       pat := top z1{left}
-              .. {down}lft z1;
-
-       pickup pencircle scaled stemthick;
-
-       x2 = -b + stemthick;
-       y2 = h - beamheight;
-       lft x3 = -b;
-       bot y3 = -d;
-
-       pat := pat
-              -- lft z3
-              .. bot z3
-              .. rt z3
-              -- z2;
-       pat := pat
-              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
-              -- cycle;
-
-       fill pat;
-
-       labels (1, 2, 3);
-fet_endchar;
-
-%
-% Inspired by a computer-set version of Auf dem Strom by Baerenreiter.
-%
-
-def draw_turn =
-       save thin, thick, ball_diam, darkness;
-       save wd, ht, thick_nibangle, ball_nib_thick;
-       save turndir;
-       pair turndir;
-
-       wd# = 35/16 staff_space#;
-       ht# = 18/17 staff_space#;
-       darkness = 0.3 linethickness + 0.09 staff_space;
-
-       set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
-
-       thick_nibangle = 60;
-       thick = 3 darkness;
-       thin = darkness;
-       ball_nib_thick = 2.7 darkness;
-       ball_diam = ball_nib_thick + (h - ball_nib_thick) / 10;
-
-       x3l = w;
-       y3 = 0;
-       y4l = h;
-       x4 = x2;
-       x2l = w / 2;
-       y2l = -d;
-       z1 = (0,0);
-
-       penpos1 (1.1 thick, thick_nibangle);
-       penpos2 (thick, thick_nibangle);
-       penpos3 (thin, 180);
-       penpos4 (ball_nib_thick, -90);
-
-       path swoosh, ploop;
-       swoosh := z1l{curl 0}
-                 .. z2l
-                 .. z3l{up}
-                 .. {left}z4l
-                 -- z4r
-                 .. z3r{down}
-                 .. z2r{left};
-       fill swoosh
-            .. swoosh scaled -1 shifted (-feta_eps, -feta_eps)
-            .. cycle;
-
-       x5r = x4;
-       y5r = y4l - ball_diam / 2;
-       z6r = z5r;
-
-       penpos5 (1.6 ball_diam / 2, 10);
-       penpos6 (ball_diam / 2, 150);
-
-       ploop := z4l{left}
-                .. z5l
-                .. z6l
-                -- cycle;
-       fill ploop;
-       fill ploop scaled -1 shifted (-feta_eps, -feta_eps);
-enddef;
-
-
-fet_beginchar ("Reverse turn", "reverseturn");
-       draw_turn;
-       currentpicture := currentpicture yscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("Turn", "turn");
-       draw_turn;
-       penlabels (1, 2, 3, 4, 5, 6, 7);
-fet_endchar;
-
-
-%
-% Inspired by a (by now) PD edition of Durand & C'ie edition of
-% Saint-Saens' Celloconcerto no. 1
-%
-% FIXME take out hardcoded vars.
-% FIXME the two loops on the `t' should be smoother (and the left one bigger).
-% FIXME generic macros for serifs: top of the t and bottom of r
-%
-
-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;
-       save u, v;
-
-       ascender_extra# = 1/2 ex#;
-       ascender# = ascender_extra# + ex#;
-       ex# = 1.4 staff_space#;
-       kerning# = 0.6 ex#;
-       start_nib_angle = 20;
-       bulb_size = 0.8;
-       define_pixels (ex, ascender_extra, ascender, kerning);
-
-       t_overshoot = 0.03 ex;
-       fatness = 12/40 ex;
-       t_fatness = 0.78 fatness;
-       t_width =  1.9 t_fatness;
-       r_fatness = 0.78 fatness;
-       uitschieter = 0.48 ex;
-       hair_thick = linethickness;
-       r_flare = .5 hair_thick + 0.25 r_fatness;
-       r_width =  2 r_fatness + 0.25 kerning;
-       slant = .2;
-
-       local_copy (transform)(currenttransform);
-       currenttransform := currenttransform slanted slant
-                                            shifted (-staff_space, 0);
-
-       set_char_box (.85 staff_space#, .85 staff_space#, 0, ascender#);
-
-       y1 = ascender;
-
-       % try to position in such a way that the center is the visual
-       % center
-
-       x1l = 0.2 staff_space;
-       x1r - x1l = t_fatness;
-       penpos1 (start_nib_wid, start_nib_angle);
-
-       z2 = (x1, 7/18 ex);
-       penpos2 (start_nib_wid, start_nib_angle);
-
-       z3l = (x2l + 0.5 t_width, - t_overshoot);
-
-       z4l = (x2l + t_width, 0.23 ex);
-       penpos4 (whatever, 180);        % 200
-       x4l - x4r = hair_thick;
-
-       x3r = 0.5 [x4r, x2r];
-%      1.7 [x3l, x3r] = x4r;
-       y3r - y3l = 0.6 t_fatness;
-
-       save krul_p;
-       path krul_p;
-
-       krul_ang = 32;
-
-       pickup pencircle scaled hair_thick;
-
-       z5 = (x2l + t_fatness / 2, 2/3 ex);
-       lft x6 = x2l - uitschieter;
-       y6 = y5;                                % - 1/20 ex;
-       z7 = z5 + whatever * dir krul_ang;
-       up_angle = krul_ang;                    % = angle (z7-z5)
-       x7 = 5/10 kerning + x5;
-
-       krul_p := z4{up}
-                 ..tension 0.98.. z5
-                 .. z6
-                 .. z5{z7 - z5}
-                 -- z7;
-
-       z4' = point 0.85 of krul_p;
-       penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90);
-
-       % the body of the `t' and the bottom loop
-       fill z1r{dir (angle (z1l - z1r) + 30)}
-            .. z1l{-dir (angle (z1r - z1l) - 45)}
-            -- z2l{down}
-            ..tension (1 + .5 slant).. z3l{right}
-            .. z4l{up}
-            .. z4'l{direction 0.85 of krul_p}
-            -- z4'r{-direction 0.85 of krul_p}
-            .. z4r{down}
-            .. z3r{left}
-            ..tension (1.5 + .7 slant).. z2r{up}
-            -- cycle;
-
-       z5' = point 1.1 of krul_p;
-       penpos5' (hair_thick, angle (direction 1.1 of krul_p) + 90);
-       z5'' = point 1.5 of krul_p;
-       penpos5'' (hair_thick, angle (direction 1.5 of krul_p) + 90);
-       z5''' = point 1.8 of krul_p;
-       penpos5''' (hair_thick, angle (direction 1.8 of krul_p) + 90);
-       z6 = point 2 of krul_p;
-       penpos6 (hair_thick, angle (direction 2 of krul_p) + 90);
-       z6' = point 2.3 of krul_p;
-       penpos6' (hair_thick, angle (direction 2.3 of krul_p) + 90);
-       z6'' = point 2.6 of krul_p;
-       penpos6'' (hair_thick, angle (direction 2.6 of krul_p) + 90);
-       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.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}
-                 .. z5''e{direction 1.5 of krul_p}
-                 .. z5'''e{direction 1.8 of krul_p}
-                 .. z6e{direction 2 of krul_p}
-                 .. z6'e{direction 2.3 of krul_p}
-                 .. z6''e{direction 2.6 of krul_p}
-                 .. {direction 2.9 of krul_p}z6'''e;
-
-       y9 = 3/4 ex;
-       x9 = x1 + kerning;
-       penpos9 (r_fatness, 0);
-
-       x10 = x9;
-       y10 = -0.3 linethickness;
-       penpos10 (r_fatness, 0);
-
-       penpos11 (hair_thick, -4);
-       z11r = z9r;
-
-       z13l = (x9l + r_width, y11 - linethickness);
-       penpos13 (r_flare, 180);
-
-       z15 = z13r - (bulb_size * r_fatness, 0);
-       z14 = 0.5 [z13l, z15] - (0, bulb_size * r_fatness);
-
-       save before, after;
-       path before, after;
-       before := z13l{up}
-                 .. {down}z11l;
-       after := z9r{up}
-                .. 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 the bulb
-       fill z7'l
-            -- z7l{z7 - z7'}
-            .. z9l{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;
-
-       penlabels (range 1 thru 15);
-       penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7');
-fet_endchar;
-
-
-def draw_heel =
-       save radius, thickness;
-       save pat;
-       path pat;
-
-       radius# := .5 staff_space#;
-
-       set_char_box (radius#, radius#, radius#, 2/3 staff_space#);
-
-       thickness := hround (1.5 linethickness);
-
-       pickup pencircle scaled thickness;
-
-       rt x1 = b;
-       top y1 = h;
-
-       x2 =x1;
-       y2 = 0;
-
-       x3 = 0;
-       bot y3 = -d;
-
-       pat := top z3{right}
-              .. lft z2{up}
-              -- lft z1
-              .. top z1
-              .. rt z1
-              -- rt z2{down}
-              .. bot z3{left};
-       pat := pat
-              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
-              -- cycle;
-       fill pat;
-enddef;
-
-
-fet_beginchar ("left heel", "upedalheel");
-       draw_heel;
-       labels (1, 2, 3);
-fet_endchar;
-
-
-fet_beginchar ("right heel", "dpedalheel");
-       draw_heel;
-       y_mirror_char;
-fet_endchar;
-
-
-def draw_toe =
-       save ht, wd, thickness;
-
-       thickness := 1.5 linethickness;
-       ht# := 1.5 staff_space#;
-       wd# := 1/3 ht#;
-       define_pixels (ht, wd);
-
-       set_char_box (wd#, wd#, 0, ht#);
-       draw_accent ((-h, -w), (0, w), thickness, 0.9);
-       currentpicture := currentpicture rotated -90;
-enddef;
-
-
-fet_beginchar ("left toe", "upedaltoe");
-       draw_toe;
-fet_endchar;
-
-
-fet_beginchar ("right toe", "dpedaltoe");
-       draw_toe;
-       y_mirror_char;
-fet_endchar;
-
-
-fet_beginchar ("Flageolet", "flageolet");
-       save height, width, thickness, superness;
-
-       height# = 4/15 staffsize#;
-       width# = height#;
-       thickness# = blot_diameter#;
-       define_pixels (height, width);
-       define_whole_blacker_pixels (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 = 0;
-       y1r = h;
-       x4r = w;
-       x2r = -x4r;
-       y2 = 0;
-       y4 = y2;
-       x3 = x1;
-       y3r = -y1r;
-
-       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;
-       else:
-               pickup pencircle scaled thickness;
-               draw z1
-                    .. z2
-                    .. z3
-                    .. z4
-                    .. cycle;
-       fi;
-fet_endchar;
-
-
-%
-% TODO:  ARGRGHGH code dup.
-%
-
-fet_beginchar ("Segno", "segno");
-       save thin, thick, ball_diam, darkness, pointheight;
-       save wd, ht, thick_nibangle, ball_nib_thick;
-       save turndir;
-       pair turndir;
-
-       ht# = 3 staff_space#;
-       wd# = 2 staff_space#;
-       darkness = .08 staff_space + 0.4 linethickness;
-
-       set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
-
-       thick_nibangle = 30;
-       thick = 3 darkness;
-       thin = darkness;
-       ball_nib_thick = 2.7 darkness;
-       ball_diam = ball_nib_thick + (w - ball_nib_thick) / 10;
-       pointheight = 2 linethickness;
-
-       y3l = h;
-       2 x3 = x2 + x4;
-       x4 = 0;
-       y4 = y2;
-       y2l = .6 h;
-       x2l = -b;
-       z1 = (0, 0);
-
-       penpos1 (thick, 2 thick_nibangle);
-       penpos2 (thick, thick_nibangle);
-       penpos3 (thin, -90);
-       penpos4 (ball_nib_thick, 180 - thick_nibangle);
-
-       save swoosh, ploop;
-       path swoosh, ploop;
-
-       swoosh := z1l{curl 0}
-                 .. z2l
-                 .. z3l{right}
-                 .. {down}z4l
-                 -- z4r
-                 .. z3r{left}
-                 .. z2r{down};
-       fill swoosh
-            .. (swoosh scaled -1)
-            .. cycle;
-
-       y5r = y4;
-       x5r = x4l - ball_diam / 2;
-       z6r = z5r;
-
-       penpos5 (1.6 ball_diam / 2, 100);
-       penpos6 (ball_diam / 2, 240);
-
-       ploop := z4l{down}
-                .. z5l
-                .. z6l
-                -- cycle;
-       fill ploop;
-       fill ploop scaled -1;
-
-       penpos7 (2 thin, 0);
-       z7l = (-b, -d);
-       penpos8 (2 thin, 0);
-       z8r = (w, h);
-
-       penstroke z7e
-                 -- z8e;
-
-       pickup pencircle scaled 2 thin;
-       drawdot (-x2r, pointheight);
-       drawdot (x2r, -pointheight);
-
-       penlabels (range 1 thru 8);
-fet_endchar;
-
-
-fet_beginchar ("Coda", "coda");
-       save stickout, thin, thick, codawidth, codaheight;
-
-       stickout# = 0.35 staff_space#;
-       codawidth# = 2/3 staff_space#;
-       codaheight# = staff_space#;
-       define_pixels (codawidth, codaheight);
-
-       set_char_box (codawidth# + stickout#, codawidth# + stickout#,
-                     codaheight# + stickout#, codaheight# + stickout#);
-
-       thin = 1.2 linethickness;
-       0.1 (codaheight - 2 thin) = (codawidth - 2 thick);
-
-       penpos1 (thick, 0);
-       penpos2 (thin, -90);
-       penpos3 (thick, -180);
-       penpos4 (thin, -270);
-
-       x1l = -codawidth;
-       y2l = codaheight;
-       y1 = 0;
-       x2 = 0;
-       z3 = -z1;
-       z4 = -z2;
-
-       penlabels (1, 2, 3, 4);
-
-       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);
-fet_endchar;
-
-
-fet_beginchar ("Varied Coda", "varcoda");
-       save thin, thick, codawidth, codaheight;
-       thin# = 1.2 linethickness#;
-       thick# = 1.0 linethickness# + 0.25 staff_space#;
-       codawidth# = 2/3 staff_space#;
-       codaheight# = staff_space#;
-       define_pixels (thin, thick, codawidth, codaheight);
-
-       set_char_box (codawidth# + thick#, codawidth# + thick#,
-                     codaheight# + thick#, codaheight# + thick#);
-
-       x1 = -codawidth + thick - .5 blot_diameter;
-       y1 = y2 - thin;
-       x2 = codawidth - thick + .5 blot_diameter;
-       y2 = codaheight;
-       draw_square_block (z1, z2);
-
-       x3 = -codawidth;
-       y3 = -codaheight;
-       x4 = x3 + thick;
-       y4 = y2;
-       draw_block (z3, z4);
-
-       labels (1, 2, 3, 4);
-
-       addto currentpicture also currentpicture scaled -1;
-
-       draw_gridline ((0, -h), (0, h), thin);
-       draw_gridline ((-w, 0), (w, 0), thin);
-fet_endchar;
-
-
-def draw_comma =
-       save alpha, thick, thin, ht;
-
-       alpha := 35;
-       thin# = 1.2 linethickness#;
-       thick# = 3 linethickness#;
-       ht# = .6 staff_space#;
-       define_pixels (thin, thick, ht);
-
-       set_char_box (0, .5 staff_space#, ht#, ht#);
-
-       penpos1 (thick, alpha);
-       penpos2 (thick, alpha + 90);
-       penpos3 (thin, 180 - alpha);
-       penpos4 (thin, 90 - alpha);
-
-       x3r = 0;
-       x1l = x3l;
-       y2r = -y4l = h;
-       z1 = z2;
-       z3 = z4;
-
-       fill z1l{dir (alpha + 90)}
-            .. z2r{dir alpha}
-            .. z1r{dir (alpha - 90)}
-            .. z3l{dir (270 - alpha)}
-            .. z4l{dir (180 - alpha)}
-            .. z3r{dir (90-alpha)}
-            .. cycle;
-enddef;
-
-
-fet_beginchar ("Right Comma", "rcomma");
-       draw_comma;
-       penlabels (1, 2, 3, 4);
-fet_endchar;
-
-
-fet_beginchar ("Left Comma", "lcomma");
-       draw_comma;
-       xy_mirror_char;
-fet_endchar;
-
-
-def draw_varcomma =
-       save thick, thin, ht, wd, alpha;
-
-       alpha := 35;
-       thin# = 1.2 linethickness#;
-       thick# = 3 linethickness#;
-       ht# = .6 staff_space#;
-       wd# = .25 staff_space#;
-       define_pixels (thin, thick, ht, alpha);
-
-       set_char_box (wd#, wd#, ht#, ht#);
-
-       z1 = (-b, -d);
-       z2 = (w, h);
-
-       draw_brush (z1, thin, z2, thick);
-enddef;
-
-
-fet_beginchar ("Right Varied Comma", "rvarcomma");
-       draw_varcomma;
-       labels (1, 2);
-fet_endchar;
-
-
-fet_beginchar ("Left Varied Comma", "lvarcomma");
-       draw_varcomma;
-       xy_mirror_char;
-fet_endchar;
-
-
-thick# := 1/24 designsize;
-define_blacker_pixels (thick);
-
-rthin := 0.075 * staff_space + 0.5 linethickness;
-rthick := 2 thick + rthin;
-
-
-def draw_arpeggio =
-       save alpha;
-       save ne, nw, se, sw;
-       save x, y;
-       pair ne, nw, se, sw;
-
-       alpha := -40;
-
-       nw = dir (alpha + 180);
-       ne = dir (alpha + 90);
-       se = dir alpha;
-       sw = dir (alpha - 90);
-
-       penpos1 (rthin, alpha + 90);
-       penpos2 (5/4 rthick, alpha);
-       penpos3 (3/4 rthick, alpha);
-       penpos4 (5/4 rthick, alpha);
-       penpos5 (rthin, alpha + 90);
-
-       z1 = (width / 2, height) - overshoot * se;
-       z2 = 2 [z4, (width / 2, height / 2)];
-       z3 = 1/2 [z2, z4];
-       x4 = 2/8 staff_space;
-       y4 = rthin;
-
-       z5 = 2 [z1, (width / 2, height / 2)];
-       z6 = z2l + 1/2 rthin * sw;
-       z7 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
-       z8 = 2 [z6, (width / 2, height / 2)];
-       z9 = 2 [z7, (width / 2, height / 2)];
-
-       fill z1l{se}
-            -- z6
-            .. z3l
-            .. z7{se}
-            -- z5l
-            .. z5r{nw}
-            -- z8
-            .. z3r
-            .. z9{nw}
-            -- z1r
-            .. cycle;
-enddef;
-
-
-fet_beginchar ("Arpeggio", "arpeggio");
-       save height, overshoot, width;
-       height# = staff_space#;
-       width# = 0.8 height#;
-       overshoot# = 0.25 staff_space#;
-       define_pixels (height, overshoot, width);
-
-       set_char_box (0, width#, 0, height#);
-       draw_arpeggio;
-       penlabels (range 1 thru 9);
-
-       draw_staff (-2, 2, 0.0);
-fet_endchar;
-
-
-%
-% Extendable Trill symbol.
-% Not yet used
-% Rename me to Trill, rename Trill to Tr?
-%
-
-fet_beginchar ("Trill_element", "trill_element");
-       save height, overshoot;
-       height# = staff_space#;
-       width# = 0.8 height#;
-       overshoot# = 0.25 staff_space#;
-       define_pixels (height, overshoot, width);
-
-       set_char_box (0, height#, 0, width#);
-       draw_arpeggio;
-
-       currentpicture := currentpicture shifted -(width / 2, height / 2);
-       currentpicture := currentpicture rotated 90;
-       currentpicture := currentpicture shifted (height / 2, width / 2);
-fet_endchar;
-
-
-%
-% Arpeggio arrow by Chris Jackson <chris@fluffhouse.org.uk>
-%
-
-def draw_arpeggio_arrow =
-       save thinness, height, width, overshoot;
-       save nw, ne, se, sw;
-       save alpha;
-       save before_left, before_right, after_left, after_right;
-       save u_left, v_left, u_right, v_right;
-       pair nw, ne, se, sw;
-       path before_left, before_right, after_left, after_right;
-
-       height# = staff_space#;
-       width# = 0.8 height#;
-       overshoot# = 0.25 staff_space#;
-       define_pixels (height, overshoot, width);
-
-       set_char_box (0, width#, 0, height#);
-
-       alpha := -40;
-       nw = dir (alpha + 180);
-       ne = dir (alpha + 90);
-       se = dir alpha;
-       sw = dir (alpha - 90);
-
-       penpos1 (rthin, alpha + 90);
-       penpos2 (5/4 rthick, alpha);
-       penpos3 (5/4 rthick, 0);
-
-       z1 = (width / 2, height) - overshoot * se; % numbering is consistent
-                                                  % with the arpeggio symbol
-       z2 = 2 [z4, (width / 2, height / 2)];
-       z3 = (0.5 width, 0.5 height);
-       z4 = (0.25 staff_space, rthin);
-       z6 = z2l + 1/2 rthin * sw;
-       z9 = (width / 2, height) + overshoot * se;
-
-       pickup pencircle scaled vround (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 - z1l}
-                      .. {down}z3l;
-       after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw))))
-                     -- (z11 + 0.25 rthin * ne);
-       (u_left, v_left) = before_left intersectiontimes after_left;
-
-       before_right := (z12 + 0.25 rthin * nw)
-                       -- (z3 + (0, -0.25 rthin / cosd (angle (nw))));
-       after_right := z3r{up}
-                      .. z9{z1r - z9}
-                      -- z1r;
-       (u_right, v_right) = before_right intersectiontimes after_right;
-
-       fill subpath (0, u_left) of before_left
-            .. subpath (v_left, infinity) of after_left
-            .. top z11
-            .. lft z11
-            .. {dir -50}(z11 + 0.25 rthin * sw)
-            .. (z10 + 0.25 rthin * sw){dir -70}
-            .. bot z10
-            .. {dir 70}(z10 + 0.25 rthin * se)
-            .. (z12 + 0.25 rthin * se){dir 50}
-            .. rt z12
-            .. top z12
-            .. subpath (0, u_right) of before_right
-            .. subpath (v_right, infinity) of after_right
-            .. 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;
-
-
-fet_beginchar ("Arpeggio arrow down", "arpeggio.arrow.M1");
-       draw_arpeggio_arrow;
-       penlabels (range 1 thru 12);
-fet_endchar;
-
-
-fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1");
-       draw_arpeggio_arrow;
-       currentpicture := currentpicture scaled -1
-                                        shifted (w - feta_eps, h - feta_eps);
-fet_endchar;
-
-
-% Hmm
-input feta-slag;
-
-
-%
-% Railroad tracks.  We define two variants of these -- both as slightly
-% tapered, comma-shaped curves and as two straight parallel slashes.
-%
-
-fet_beginchar ("Curved caesura", "caesura.curved");
-       save slant, space_between, clearance;
-       save alpha, pat;
-       save botthick, topthick;
-       save krom;
-       path pat;
-
-       botthick = 1.5 linethickness;
-       topthick = 2.5 linethickness;
-
-       pickup pencircle scaled botthick;
-
-       slant = 3.5;
-       space_between# = 0.6 staff_space#;
-       clearance# = 0.2 staff_space#;
-       height# = 1.2 staff_space#;
-
-       set_char_box (0, 2.0 staff_space#,
-                     staff_space# - clearance#, height#);
-       define_pixels (clearance, height);
-       define_whole_pixels (space_between);
-
-       bot y1 = -d;
-       top y2 = h;
-
-       lft x1 = 0;
-       x2 = (y2 - y1) / slant;
-
-       krom = 10;
-
-       alpha = angle (z2 - z1);
-       penpos1 (botthick, alpha - krom);
-       penpos3 (botthick, alpha - krom + 90);
-
-       penpos2 (topthick, alpha + krom);
-       penpos4 (topthick, alpha + krom + 90);
-
-       z3 = z1;
-       z4 = z2;
-
-       penlabels (1, 2, 3, 4);
-
-       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_beginchar ("snap pizzicato (Bartok pizzicato)", "snappizzicato");
-       save height, width, thickness, superness;
-
-       height# = 4/15 staffsize#;
-       width# = height#;
-       thickness# = 1.3 linethickness#;
-       define_pixels (height, width);
-       define_whole_blacker_pixels (thickness);
-
-       set_char_box (width# / 2, width# / 2, height# / 2, height# * 3 / 4);
-
-       penpos1 (thickness, 90);
-       penpos2 (thickness, 180);
-       penpos3 (thickness, 270);
-       penpos4 (thickness, 0);
-
-       x1 = 0;
-       y1r = height / 2;
-       x3 = x1;
-       y3r = -y1r;
-       x4r = width / 2;
-       y4 = 0;
-       x2r = -x4r;
-       y2 = y4;
-
-       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;
-       else:
-               pickup pencircle scaled thickness;
-               draw z1
-                    .. z2
-                    .. z3
-                    .. z4
-                    .. cycle;
-       fi;
-
-       z5 = (0, 0);
-       z6 = (x5, 1.5 y1r);
-
-       draw_gridline (z5, z6, thickness);
-
-       labels (5, 6);
-fet_endchar;
-
-fet_endgroup ("scripts");
diff --git a/mf/feta-scripts.mf b/mf/feta-scripts.mf
new file mode 100644 (file)
index 0000000..7d76d0f
--- /dev/null
@@ -0,0 +1,1623 @@
+% Feta (not the Font-En-Tja) music font --  implement scripts
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%      Jan Nieuwenhuizen <janneke@gnu.org>
+%
+%
+% LilyPond 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.
+%
+% 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 ("scripts");
+
+def draw_fermata =
+       save alpha, radius, crook_thinness, crook_fatness, dot_size;
+       save pat;
+       path pat;
+
+       % [Wanske] and some Baerenreiter editions
+       % suggest about 80 degrees instead of a half-circle
+       alpha := 10;
+
+       radius# = 1.25 staff_space#;
+       crook_thinness# = 1.5 linethickness#;
+       crook_fatness# = 0.25 staff_space# + 1.5 linethickness#;
+
+       radius# + crook_fatness# / 2 = h#;
+       radius# + crook_thinness# / 2 = w#;
+
+       set_char_box (w#, w#, crook_thinness# / 2, h#);
+
+       define_pixels (radius, crook_thinness, crook_fatness);
+
+       dot_size# = 8/6 crook_fatness#;
+       define_whole_blacker_pixels (dot_size);
+
+       penpos1 (crook_thinness, 0);
+       penpos2 (crook_fatness, -90);
+       z1 = (-radius, 0);
+       z2 = (0, radius);
+
+       pat := z2l{left}
+              .. z1l{dir (-alpha - 90)}
+              .. {dir (90 - alpha)}z1r
+              .. {right}z2r;
+       pat := pat
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
+       fill pat;
+
+       pickup pencircle scaled dot_size;
+       x4 = 0;
+       bot y4 = vround (-crook_thinness / 2);
+       drawdot z4;
+enddef;
+
+
+fet_beginchar ("fermata up", "ufermata");
+       draw_fermata;
+       penlabels (1, 2, 4);
+fet_endchar;
+
+
+fet_beginchar ("fermata down", "dfermata");
+       draw_fermata;
+       y_mirror_char;
+fet_endchar;
+
+
+def draw_short_fermata =
+       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_size# = 0.266 staff_space# + 2.666 linethickness#;
+       define_whole_blacker_pixels (dot_size);
+
+       fat_factor = .11;
+       thinness = 1.5 linethickness;
+
+       pickup pencircle scaled thinness;
+
+       rt x2 = w;
+       lft x5 = -b;
+       bot y5 = 0;
+       top y3 = h;
+       y1 = y2 = y5;
+
+       x3 = 0;
+       z1 - z4 = whatever * (charwd, -charht);
+       z4 = fat_factor [z3, z5];
+
+       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){-ne}
+            -- (z5 + left_dist){-ne}
+            .. cycle;
+
+       pickup pencircle scaled dot_size;
+
+       x1 - 2 x6 = x2;
+       x6 := vround (x6);
+       bot y6 = -d;
+
+       drawdot z6;
+enddef;
+
+fet_beginchar ("short fermata up", "ushortfermata");
+       draw_short_fermata;
+       labels (1, 2, 3, 4, 5, 6);
+fet_endchar;
+
+
+fet_beginchar ("short fermata down", "dshortfermata");
+       draw_short_fermata;
+       xy_mirror_char;
+fet_endchar;
+
+
+def draw_long_fermata =
+       save stemthick, beamheight, dot_size, wd;
+       save pat;
+       path pat;
+
+       wd# = 2.5 staff_space#;
+       stemthick = hround (1.5 linethickness);
+       beamheight = 0.3 staff_space + 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#);
+
+       pickup pencircle scaled blot_diameter;
+
+       top y1 = h;
+       lft x1 = -b;
+
+       pat := top z1{left}
+              .. {down}lft z1;
+
+       pickup pencircle scaled stemthick;
+
+       x2 = -b + stemthick;
+       y2 = h - beamheight;
+       lft x3 = -b;
+       bot y3 = -d;
+
+       pat := pat
+              -- lft z3
+              .. bot z3
+              .. rt z3
+              -- z2;
+       pat := pat
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
+
+       fill pat;
+
+       pickup pencircle scaled dot_size;
+
+       x4 = 0;
+       bot y4 = -d;
+
+       drawdot z4;
+enddef;
+
+
+fet_beginchar ("long fermata up", "ulongfermata");
+       draw_long_fermata;
+       labels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_beginchar ("long fermata down", "dlongfermata");
+       draw_long_fermata;
+       y_mirror_char;
+fet_endchar;
+
+
+def draw_very_long_fermata =
+       save ibeamheight, obeamheight;
+       save ihwd, ohwd, iht, oht;      % inner/outer half_width/height
+       save stemthick, dot_size;
+       save opat, ipat;
+       path opat, ipat;
+
+       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);
+
+       dot_size# = (iht# - ibeamheight#) * 8/10;
+       define_whole_blacker_pixels (dot_size);
+
+       set_char_box (ohwd#, ohwd#, 0, oht#);
+
+       pickup pencircle scaled blot_diameter;
+
+       top y1 = oht;
+       lft x1 = -ohwd;
+       top y11 = iht;
+       lft x11 = -ihwd;
+
+       opat := top z1{left}
+               .. {down}lft z1;
+       ipat := top z11{left}
+               .. {down}lft z11;
+
+       pickup pencircle scaled stemthick;
+
+       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 z3
+               .. bot z3
+               .. rt z3
+               -- z2;
+       opat := opat
+               -- reverse opat xscaled -1 shifted (-feta_eps, 0)
+               -- cycle;
+       ipat := ipat
+               -- lft z13
+               .. bot z13
+               .. rt z13
+               -- z12;
+       ipat := ipat
+               -- reverse ipat xscaled -1 shifted (-feta_eps, 0)
+               -- cycle;
+
+       fill opat;
+       fill ipat;
+
+       pickup pencircle scaled dot_size;
+
+       x4 = 0;
+       bot y4 = -d;
+
+       drawdot z4;
+enddef;
+
+
+fet_beginchar ("very long fermata up", "uverylongfermata");
+       draw_very_long_fermata;
+       labels (1, 2, 3, 11, 12, 13, 4);
+fet_endchar;
+
+
+fet_beginchar ("very long fermata down", "dverylongfermata");
+       draw_very_long_fermata;
+       y_mirror_char;
+fet_endchar;
+
+
+%
+% Thumbs are used in cello music.
+% TODO : thumbs should look like the finger-font and should be placed in
+% the same way in the score.
+%
+
+fet_beginchar ("Thumb", "thumb");
+       save thin, height, width, thick, depth;
+       height# = 5/4 width#;
+       height# = staff_space#;
+       depth# = 1.6 (height# / 2);
+
+       set_char_box (width# / 2, width# / 2, depth#, height# / 2);
+
+       define_pixels (height, width);
+
+       thin = .6 linethickness + 0.06 staff_space;
+       2 thick + 0.5 (height - 2 thin) = width;
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 90);
+       penpos3 (thick, 180);
+       penpos4 (thin, 270);
+       z1r = (w, 0);
+       z2r = (0, h);
+       z3r = (-w, 0);
+       z4r = (0, -h);
+
+       penlabels (1, 2, 3, 4);
+
+       penstroke z1e{up}
+                 .. z2e{left}
+                 .. z3e{down}
+                 .. z4e{right}
+                 .. cycle;
+
+       save brush_thick;
+       y5 = -d + brush_thick / 2;
+       brush_thick = 0.9 thick;
+       x5 = 0;
+
+       labels (5);
+
+       draw_brush (z4r, 1.4 thin, z5, brush_thick);
+fet_endchar;
+
+
+%
+% `\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;
+       top y1 = ypart top_right;
+       lft x6 = xpart bottom_left;
+       bot y6 = ypart bottom_left;
+
+       rt z4 = (xpart top_right, (ypart top_right + ypart 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];
+
+       penpos1 (thickness, angle (z3 - z1) + 90);
+       penpos3 (thickness, angle (z3 - z1) + 90);
+       penpos4 (thickness, 90);
+       penpos5 (thickness, angle (z6 - z5) + 90);
+       penpos6 (thickness, angle (z6 - z5) + 90);
+
+       x4 - x7 = diminish * thickness;
+       y7 = y4;
+
+       fill z1l
+            -- z3l
+            -- z7
+            -- z5l
+            -- z6l
+            .. lft z6{down}
+            .. bot z6
+            .. z6r
+            -- z4l
+            ..tension 0.8.. rt z4
+            ..tension 0.8.. z4r
+            -- z1r
+            .. top z1
+            .. lft z1{down}
+            .. cycle;
+enddef;
+
+
+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.7);
+       penlabels (1, 3, 4, 5, 6);
+       labels (7);
+fet_endchar;
+
+
+fet_beginchar ("espr", "espr");
+       set_char_box (1.9 staff_space#, 1.9 staff_space#,
+                     .5 staff_space#, .5 staff_space#);
+
+       draw_accent ((w - 1.78 staff_space, -d), (w, h),
+                    0.05 staff_space + linethickness, 0.6);
+       addto currentpicture also currentpicture xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("staccato dot", "staccato");
+       save radius;
+       radius# = 0.20 * staff_space#;
+       define_whole_pixels (radius);
+
+       pickup pencircle scaled 2 radius;
+       drawdot (0, 0);
+
+       set_char_box (radius#, radius#, radius#, radius#);
+fet_endchar;
+
+
+def draw_staccatissimo =
+       save radius, height;
+       height# = .8 staff_space#;
+       radius# = linethickness# + .1 staff_space#;
+       define_whole_blacker_pixels (radius);
+       define_pixels (height);
+
+       draw_brush ((0, 0), linethickness, (0, height), 2 radius);
+
+       set_char_box (radius#, radius#,
+                     blot_diameter# / 2, height# + radius#);
+enddef;
+
+
+fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo");
+       draw_staccatissimo;
+fet_endchar;
+
+
+fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo");
+       draw_staccatissimo;
+       y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("portato/single tenuto", "tenuto");
+       save thick;
+       thick# = 1.6 linethickness#;
+       define_whole_blacker_pixels (thick);
+
+       set_char_box (.6 staff_space#, .6 staff_space#,
+                     thick# / 2, thick# / 2);
+
+       draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
+fet_endchar;
+
+
+def draw_portato =
+       save thick, dot_size;
+       thick# = 1.4 linethickness#;
+       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# + .5 dot_size#);
+
+       draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
+
+       pickup pencircle scaled dot_size;
+       drawdot (0, h);
+enddef;
+
+
+fet_beginchar ("portato/tenuto with staccato", "uportato");
+       draw_portato;
+fet_endchar;
+
+
+fet_beginchar ("portato/tenuto with staccato", "dportato");
+       draw_portato;
+       y_mirror_char
+fet_endchar;
+
+
+def draw_marcato =
+       save fat_factor, thinness;
+       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#);
+
+       fat_factor = .3;
+       thinness = linethickness;
+
+       pickup pencircle scaled thinness;
+
+       rt x2 = w;
+       lft x5 = -b;
+       bot y5 = 0;
+       top y3 = h;
+       y1 = y2 = y5;
+
+       x3 =0;
+       z1 - z4 = whatever * (charwd, -charht);
+       z4 = fat_factor [z3, z5];
+
+       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){-ne}
+            -- (z5 + left_dist){-ne}
+            .. cycle;
+enddef;
+
+
+fet_beginchar ("marcato up", "umarcato");
+       draw_marcato;
+       labels (1, 2, 3, 4, 5);
+fet_endchar;
+
+
+%
+% The down marcato char (not very much used).
+% Contrary to what some MF/TeX `gurus' believe
+% it is *point*-symmetric with the "up" version
+%
+
+fet_beginchar ("marcato down", "dmarcato");
+       draw_marcato;
+       xy_mirror_char;
+fet_endchar;
+
+
+%
+% used in french horn music todo
+%
+% TODO: too light at 20pt
+%
+
+fet_beginchar ("open (unstopped)", "open");
+       save thin, height, width, thick;
+
+       height# = 5/4 width#;
+       height# = staff_space#;
+       thin = .6 linethickness + 0.06 staff_space;
+
+       set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
+
+       define_pixels (width, height);
+
+       2 thick + 0.6 (height - 2 thin) = width;
+
+       penpos1 (thick, 0);
+       penpos2 (thin, 90);
+       penpos3 (thick, 180);
+       penpos4 (thin, 270);
+       z1r = (w, 0);
+       z2r = (0, h);
+       z3r = (-w, 0);
+       z4r = (0, -h);
+
+       penlabels (1, 2, 3, 4);
+
+       penstroke z1e{up}
+                 .. z2e{left}
+                 .. z3e{down}
+                 .. z4e{right}
+                 .. cycle;
+fet_endchar;
+
+
+fet_beginchar ("plus (stopped)", "stopped");
+       save hthick, vthick, size, outer_hsize, outer_vsize;
+
+       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);
+
+       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");
+       save ht, wd, thick;
+
+       thick = 1.4 linethickness;
+       wd# = 1.3 staff_space#;
+       ht# = 1.6 wd#;
+
+       set_char_box (wd# / 2, wd# / 2, 0, ht#);
+
+       draw_accent ((-h, -w), (0, w), thick, 0.9);
+       currentpicture := currentpicture rotated -90;
+fet_endchar;
+
+
+fet_beginchar ("Downbow", "downbow");
+       save stemthick, beamheight, wd;
+       save pat;
+       path pat;
+
+       wd# = 1.5 staff_space#;
+       define_pixels (wd);
+
+       stemthick = hround (1.2 linethickness);
+
+       set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#);
+
+       beamheight = 4/10 h;
+
+       pickup pencircle scaled blot_diameter;
+
+       top y1 = h;
+       lft x1 = -b;
+
+       pat := top z1{left}
+              .. {down}lft z1;
+
+       pickup pencircle scaled stemthick;
+
+       x2 = -b + stemthick;
+       y2 = h - beamheight;
+       lft x3 = -b;
+       bot y3 = -d;
+
+       pat := pat
+              -- lft z3
+              .. bot z3
+              .. rt z3
+              -- z2;
+       pat := pat
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
+
+       fill pat;
+
+       labels (1, 2, 3);
+fet_endchar;
+
+%
+% Inspired by a computer-set version of Auf dem Strom by Baerenreiter.
+%
+
+def draw_turn =
+       save thin, thick, ball_diam, darkness;
+       save wd, ht, thick_nibangle, ball_nib_thick;
+       save turndir;
+       pair turndir;
+
+       wd# = 35/16 staff_space#;
+       ht# = 18/17 staff_space#;
+       darkness = 0.3 linethickness + 0.09 staff_space;
+
+       set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
+
+       thick_nibangle = 60;
+       thick = 3 darkness;
+       thin = darkness;
+       ball_nib_thick = 2.7 darkness;
+       ball_diam = ball_nib_thick + (h - ball_nib_thick) / 10;
+
+       x3l = w;
+       y3 = 0;
+       y4l = h;
+       x4 = x2;
+       x2l = w / 2;
+       y2l = -d;
+       z1 = (0,0);
+
+       penpos1 (1.1 thick, thick_nibangle);
+       penpos2 (thick, thick_nibangle);
+       penpos3 (thin, 180);
+       penpos4 (ball_nib_thick, -90);
+
+       path swoosh, ploop;
+       swoosh := z1l{curl 0}
+                 .. z2l
+                 .. z3l{up}
+                 .. {left}z4l
+                 -- z4r
+                 .. z3r{down}
+                 .. z2r{left};
+       fill swoosh
+            .. swoosh scaled -1 shifted (-feta_eps, -feta_eps)
+            .. cycle;
+
+       x5r = x4;
+       y5r = y4l - ball_diam / 2;
+       z6r = z5r;
+
+       penpos5 (1.6 ball_diam / 2, 10);
+       penpos6 (ball_diam / 2, 150);
+
+       ploop := z4l{left}
+                .. z5l
+                .. z6l
+                -- cycle;
+       fill ploop;
+       fill ploop scaled -1 shifted (-feta_eps, -feta_eps);
+enddef;
+
+
+fet_beginchar ("Reverse turn", "reverseturn");
+       draw_turn;
+       currentpicture := currentpicture yscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("Turn", "turn");
+       draw_turn;
+       penlabels (1, 2, 3, 4, 5, 6, 7);
+fet_endchar;
+
+
+%
+% Inspired by a (by now) PD edition of Durand & C'ie edition of
+% Saint-Saens' Celloconcerto no. 1
+%
+% FIXME take out hardcoded vars.
+% FIXME the two loops on the `t' should be smoother (and the left one bigger).
+% FIXME generic macros for serifs: top of the t and bottom of r
+%
+
+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;
+       save u, v;
+
+       ascender_extra# = 1/2 ex#;
+       ascender# = ascender_extra# + ex#;
+       ex# = 1.4 staff_space#;
+       kerning# = 0.6 ex#;
+       start_nib_angle = 20;
+       bulb_size = 0.8;
+       define_pixels (ex, ascender_extra, ascender, kerning);
+
+       t_overshoot = 0.03 ex;
+       fatness = 12/40 ex;
+       t_fatness = 0.78 fatness;
+       t_width =  1.9 t_fatness;
+       r_fatness = 0.78 fatness;
+       uitschieter = 0.48 ex;
+       hair_thick = linethickness;
+       r_flare = .5 hair_thick + 0.25 r_fatness;
+       r_width =  2 r_fatness + 0.25 kerning;
+       slant = .2;
+
+       local_copy (transform)(currenttransform);
+       currenttransform := currenttransform slanted slant
+                                            shifted (-staff_space, 0);
+
+       set_char_box (.85 staff_space#, .85 staff_space#, 0, ascender#);
+
+       y1 = ascender;
+
+       % try to position in such a way that the center is the visual
+       % center
+
+       x1l = 0.2 staff_space;
+       x1r - x1l = t_fatness;
+       penpos1 (start_nib_wid, start_nib_angle);
+
+       z2 = (x1, 7/18 ex);
+       penpos2 (start_nib_wid, start_nib_angle);
+
+       z3l = (x2l + 0.5 t_width, - t_overshoot);
+
+       z4l = (x2l + t_width, 0.23 ex);
+       penpos4 (whatever, 180);        % 200
+       x4l - x4r = hair_thick;
+
+       x3r = 0.5 [x4r, x2r];
+%      1.7 [x3l, x3r] = x4r;
+       y3r - y3l = 0.6 t_fatness;
+
+       save krul_p;
+       path krul_p;
+
+       krul_ang = 32;
+
+       pickup pencircle scaled hair_thick;
+
+       z5 = (x2l + t_fatness / 2, 2/3 ex);
+       lft x6 = x2l - uitschieter;
+       y6 = y5;                                % - 1/20 ex;
+       z7 = z5 + whatever * dir krul_ang;
+       up_angle = krul_ang;                    % = angle (z7-z5)
+       x7 = 5/10 kerning + x5;
+
+       krul_p := z4{up}
+                 ..tension 0.98.. z5
+                 .. z6
+                 .. z5{z7 - z5}
+                 -- z7;
+
+       z4' = point 0.85 of krul_p;
+       penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90);
+
+       % the body of the `t' and the bottom loop
+       fill z1r{dir (angle (z1l - z1r) + 30)}
+            .. z1l{-dir (angle (z1r - z1l) - 45)}
+            -- z2l{down}
+            ..tension (1 + .5 slant).. z3l{right}
+            .. z4l{up}
+            .. z4'l{direction 0.85 of krul_p}
+            -- z4'r{-direction 0.85 of krul_p}
+            .. z4r{down}
+            .. z3r{left}
+            ..tension (1.5 + .7 slant).. z2r{up}
+            -- cycle;
+
+       z5' = point 1.1 of krul_p;
+       penpos5' (hair_thick, angle (direction 1.1 of krul_p) + 90);
+       z5'' = point 1.5 of krul_p;
+       penpos5'' (hair_thick, angle (direction 1.5 of krul_p) + 90);
+       z5''' = point 1.8 of krul_p;
+       penpos5''' (hair_thick, angle (direction 1.8 of krul_p) + 90);
+       z6 = point 2 of krul_p;
+       penpos6 (hair_thick, angle (direction 2 of krul_p) + 90);
+       z6' = point 2.3 of krul_p;
+       penpos6' (hair_thick, angle (direction 2.3 of krul_p) + 90);
+       z6'' = point 2.6 of krul_p;
+       penpos6'' (hair_thick, angle (direction 2.6 of krul_p) + 90);
+       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.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}
+                 .. z5''e{direction 1.5 of krul_p}
+                 .. z5'''e{direction 1.8 of krul_p}
+                 .. z6e{direction 2 of krul_p}
+                 .. z6'e{direction 2.3 of krul_p}
+                 .. z6''e{direction 2.6 of krul_p}
+                 .. {direction 2.9 of krul_p}z6'''e;
+
+       y9 = 3/4 ex;
+       x9 = x1 + kerning;
+       penpos9 (r_fatness, 0);
+
+       x10 = x9;
+       y10 = -0.3 linethickness;
+       penpos10 (r_fatness, 0);
+
+       penpos11 (hair_thick, -4);
+       z11r = z9r;
+
+       z13l = (x9l + r_width, y11 - linethickness);
+       penpos13 (r_flare, 180);
+
+       z15 = z13r - (bulb_size * r_fatness, 0);
+       z14 = 0.5 [z13l, z15] - (0, bulb_size * r_fatness);
+
+       save before, after;
+       path before, after;
+       before := z13l{up}
+                 .. {down}z11l;
+       after := z9r{up}
+                .. 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 the bulb
+       fill z7'l
+            -- z7l{z7 - z7'}
+            .. z9l{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;
+
+       penlabels (range 1 thru 15);
+       penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7');
+fet_endchar;
+
+
+def draw_heel =
+       save radius, thickness;
+       save pat;
+       path pat;
+
+       radius# := .5 staff_space#;
+
+       set_char_box (radius#, radius#, radius#, 2/3 staff_space#);
+
+       thickness := hround (1.5 linethickness);
+
+       pickup pencircle scaled thickness;
+
+       rt x1 = b;
+       top y1 = h;
+
+       x2 =x1;
+       y2 = 0;
+
+       x3 = 0;
+       bot y3 = -d;
+
+       pat := top z3{right}
+              .. lft z2{up}
+              -- lft z1
+              .. top z1
+              .. rt z1
+              -- rt z2{down}
+              .. bot z3{left};
+       pat := pat
+              -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+              -- cycle;
+       fill pat;
+enddef;
+
+
+fet_beginchar ("left heel", "upedalheel");
+       draw_heel;
+       labels (1, 2, 3);
+fet_endchar;
+
+
+fet_beginchar ("right heel", "dpedalheel");
+       draw_heel;
+       y_mirror_char;
+fet_endchar;
+
+
+def draw_toe =
+       save ht, wd, thickness;
+
+       thickness := 1.5 linethickness;
+       ht# := 1.5 staff_space#;
+       wd# := 1/3 ht#;
+       define_pixels (ht, wd);
+
+       set_char_box (wd#, wd#, 0, ht#);
+       draw_accent ((-h, -w), (0, w), thickness, 0.9);
+       currentpicture := currentpicture rotated -90;
+enddef;
+
+
+fet_beginchar ("left toe", "upedaltoe");
+       draw_toe;
+fet_endchar;
+
+
+fet_beginchar ("right toe", "dpedaltoe");
+       draw_toe;
+       y_mirror_char;
+fet_endchar;
+
+
+fet_beginchar ("Flageolet", "flageolet");
+       save height, width, thickness, superness;
+
+       height# = 4/15 staffsize#;
+       width# = height#;
+       thickness# = blot_diameter#;
+       define_pixels (height, width);
+       define_whole_blacker_pixels (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 = 0;
+       y1r = h;
+       x4r = w;
+       x2r = -x4r;
+       y2 = 0;
+       y4 = y2;
+       x3 = x1;
+       y3r = -y1r;
+
+       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;
+       else:
+               pickup pencircle scaled thickness;
+               draw z1
+                    .. z2
+                    .. z3
+                    .. z4
+                    .. cycle;
+       fi;
+fet_endchar;
+
+
+%
+% TODO:  ARGRGHGH code dup.
+%
+
+fet_beginchar ("Segno", "segno");
+       save thin, thick, ball_diam, darkness, pointheight;
+       save wd, ht, thick_nibangle, ball_nib_thick;
+       save turndir;
+       pair turndir;
+
+       ht# = 3 staff_space#;
+       wd# = 2 staff_space#;
+       darkness = .08 staff_space + 0.4 linethickness;
+
+       set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
+
+       thick_nibangle = 30;
+       thick = 3 darkness;
+       thin = darkness;
+       ball_nib_thick = 2.7 darkness;
+       ball_diam = ball_nib_thick + (w - ball_nib_thick) / 10;
+       pointheight = 2 linethickness;
+
+       y3l = h;
+       2 x3 = x2 + x4;
+       x4 = 0;
+       y4 = y2;
+       y2l = .6 h;
+       x2l = -b;
+       z1 = (0, 0);
+
+       penpos1 (thick, 2 thick_nibangle);
+       penpos2 (thick, thick_nibangle);
+       penpos3 (thin, -90);
+       penpos4 (ball_nib_thick, 180 - thick_nibangle);
+
+       save swoosh, ploop;
+       path swoosh, ploop;
+
+       swoosh := z1l{curl 0}
+                 .. z2l
+                 .. z3l{right}
+                 .. {down}z4l
+                 -- z4r
+                 .. z3r{left}
+                 .. z2r{down};
+       fill swoosh
+            .. (swoosh scaled -1)
+            .. cycle;
+
+       y5r = y4;
+       x5r = x4l - ball_diam / 2;
+       z6r = z5r;
+
+       penpos5 (1.6 ball_diam / 2, 100);
+       penpos6 (ball_diam / 2, 240);
+
+       ploop := z4l{down}
+                .. z5l
+                .. z6l
+                -- cycle;
+       fill ploop;
+       fill ploop scaled -1;
+
+       penpos7 (2 thin, 0);
+       z7l = (-b, -d);
+       penpos8 (2 thin, 0);
+       z8r = (w, h);
+
+       penstroke z7e
+                 -- z8e;
+
+       pickup pencircle scaled 2 thin;
+       drawdot (-x2r, pointheight);
+       drawdot (x2r, -pointheight);
+
+       penlabels (range 1 thru 8);
+fet_endchar;
+
+
+fet_beginchar ("Coda", "coda");
+       save stickout, thin, thick, codawidth, codaheight;
+
+       stickout# = 0.35 staff_space#;
+       codawidth# = 2/3 staff_space#;
+       codaheight# = staff_space#;
+       define_pixels (codawidth, codaheight);
+
+       set_char_box (codawidth# + stickout#, codawidth# + stickout#,
+                     codaheight# + stickout#, codaheight# + stickout#);
+
+       thin = 1.2 linethickness;
+       0.1 (codaheight - 2 thin) = (codawidth - 2 thick);
+
+       penpos1 (thick, 0);
+       penpos2 (thin, -90);
+       penpos3 (thick, -180);
+       penpos4 (thin, -270);
+
+       x1l = -codawidth;
+       y2l = codaheight;
+       y1 = 0;
+       x2 = 0;
+       z3 = -z1;
+       z4 = -z2;
+
+       penlabels (1, 2, 3, 4);
+
+       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);
+fet_endchar;
+
+
+fet_beginchar ("Varied Coda", "varcoda");
+       save thin, thick, codawidth, codaheight;
+       thin# = 1.2 linethickness#;
+       thick# = 1.0 linethickness# + 0.25 staff_space#;
+       codawidth# = 2/3 staff_space#;
+       codaheight# = staff_space#;
+       define_pixels (thin, thick, codawidth, codaheight);
+
+       set_char_box (codawidth# + thick#, codawidth# + thick#,
+                     codaheight# + thick#, codaheight# + thick#);
+
+       x1 = -codawidth + thick - .5 blot_diameter;
+       y1 = y2 - thin;
+       x2 = codawidth - thick + .5 blot_diameter;
+       y2 = codaheight;
+       draw_square_block (z1, z2);
+
+       x3 = -codawidth;
+       y3 = -codaheight;
+       x4 = x3 + thick;
+       y4 = y2;
+       draw_block (z3, z4);
+
+       labels (1, 2, 3, 4);
+
+       addto currentpicture also currentpicture scaled -1;
+
+       draw_gridline ((0, -h), (0, h), thin);
+       draw_gridline ((-w, 0), (w, 0), thin);
+fet_endchar;
+
+
+def draw_comma =
+       save alpha, thick, thin, ht;
+
+       alpha := 35;
+       thin# = 1.2 linethickness#;
+       thick# = 3 linethickness#;
+       ht# = .6 staff_space#;
+       define_pixels (thin, thick, ht);
+
+       set_char_box (0, .5 staff_space#, ht#, ht#);
+
+       penpos1 (thick, alpha);
+       penpos2 (thick, alpha + 90);
+       penpos3 (thin, 180 - alpha);
+       penpos4 (thin, 90 - alpha);
+
+       x3r = 0;
+       x1l = x3l;
+       y2r = -y4l = h;
+       z1 = z2;
+       z3 = z4;
+
+       fill z1l{dir (alpha + 90)}
+            .. z2r{dir alpha}
+            .. z1r{dir (alpha - 90)}
+            .. z3l{dir (270 - alpha)}
+            .. z4l{dir (180 - alpha)}
+            .. z3r{dir (90-alpha)}
+            .. cycle;
+enddef;
+
+
+fet_beginchar ("Right Comma", "rcomma");
+       draw_comma;
+       penlabels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_beginchar ("Left Comma", "lcomma");
+       draw_comma;
+       xy_mirror_char;
+fet_endchar;
+
+
+def draw_varcomma =
+       save thick, thin, ht, wd, alpha;
+
+       alpha := 35;
+       thin# = 1.2 linethickness#;
+       thick# = 3 linethickness#;
+       ht# = .6 staff_space#;
+       wd# = .25 staff_space#;
+       define_pixels (thin, thick, ht, alpha);
+
+       set_char_box (wd#, wd#, ht#, ht#);
+
+       z1 = (-b, -d);
+       z2 = (w, h);
+
+       draw_brush (z1, thin, z2, thick);
+enddef;
+
+
+fet_beginchar ("Right Varied Comma", "rvarcomma");
+       draw_varcomma;
+       labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("Left Varied Comma", "lvarcomma");
+       draw_varcomma;
+       xy_mirror_char;
+fet_endchar;
+
+
+thick# := 1/24 designsize;
+define_blacker_pixels (thick);
+
+rthin := 0.075 * staff_space + 0.5 linethickness;
+rthick := 2 thick + rthin;
+
+
+def draw_arpeggio =
+       save alpha;
+       save ne, nw, se, sw;
+       save x, y;
+       pair ne, nw, se, sw;
+
+       alpha := -40;
+
+       nw = dir (alpha + 180);
+       ne = dir (alpha + 90);
+       se = dir alpha;
+       sw = dir (alpha - 90);
+
+       penpos1 (rthin, alpha + 90);
+       penpos2 (5/4 rthick, alpha);
+       penpos3 (3/4 rthick, alpha);
+       penpos4 (5/4 rthick, alpha);
+       penpos5 (rthin, alpha + 90);
+
+       z1 = (width / 2, height) - overshoot * se;
+       z2 = 2 [z4, (width / 2, height / 2)];
+       z3 = 1/2 [z2, z4];
+       x4 = 2/8 staff_space;
+       y4 = rthin;
+
+       z5 = 2 [z1, (width / 2, height / 2)];
+       z6 = z2l + 1/2 rthin * sw;
+       z7 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
+       z8 = 2 [z6, (width / 2, height / 2)];
+       z9 = 2 [z7, (width / 2, height / 2)];
+
+       fill z1l{se}
+            -- z6
+            .. z3l
+            .. z7{se}
+            -- z5l
+            .. z5r{nw}
+            -- z8
+            .. z3r
+            .. z9{nw}
+            -- z1r
+            .. cycle;
+enddef;
+
+
+fet_beginchar ("Arpeggio", "arpeggio");
+       save height, overshoot, width;
+       height# = staff_space#;
+       width# = 0.8 height#;
+       overshoot# = 0.25 staff_space#;
+       define_pixels (height, overshoot, width);
+
+       set_char_box (0, width#, 0, height#);
+       draw_arpeggio;
+       penlabels (range 1 thru 9);
+
+       draw_staff (-2, 2, 0.0);
+fet_endchar;
+
+
+%
+% Extendable Trill symbol.
+% Not yet used
+% Rename me to Trill, rename Trill to Tr?
+%
+
+fet_beginchar ("Trill_element", "trill_element");
+       save height, overshoot;
+       height# = staff_space#;
+       width# = 0.8 height#;
+       overshoot# = 0.25 staff_space#;
+       define_pixels (height, overshoot, width);
+
+       set_char_box (0, height#, 0, width#);
+       draw_arpeggio;
+
+       currentpicture := currentpicture shifted -(width / 2, height / 2);
+       currentpicture := currentpicture rotated 90;
+       currentpicture := currentpicture shifted (height / 2, width / 2);
+fet_endchar;
+
+
+%
+% Arpeggio arrow by Chris Jackson <chris@fluffhouse.org.uk>
+%
+
+def draw_arpeggio_arrow =
+       save thinness, height, width, overshoot;
+       save nw, ne, se, sw;
+       save alpha;
+       save before_left, before_right, after_left, after_right;
+       save u_left, v_left, u_right, v_right;
+       pair nw, ne, se, sw;
+       path before_left, before_right, after_left, after_right;
+
+       height# = staff_space#;
+       width# = 0.8 height#;
+       overshoot# = 0.25 staff_space#;
+       define_pixels (height, overshoot, width);
+
+       set_char_box (0, width#, 0, height#);
+
+       alpha := -40;
+       nw = dir (alpha + 180);
+       ne = dir (alpha + 90);
+       se = dir alpha;
+       sw = dir (alpha - 90);
+
+       penpos1 (rthin, alpha + 90);
+       penpos2 (5/4 rthick, alpha);
+       penpos3 (5/4 rthick, 0);
+
+       z1 = (width / 2, height) - overshoot * se; % numbering is consistent
+                                                  % with the arpeggio symbol
+       z2 = 2 [z4, (width / 2, height / 2)];
+       z3 = (0.5 width, 0.5 height);
+       z4 = (0.25 staff_space, rthin);
+       z6 = z2l + 1/2 rthin * sw;
+       z9 = (width / 2, height) + overshoot * se;
+
+       pickup pencircle scaled vround (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 - z1l}
+                      .. {down}z3l;
+       after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw))))
+                     -- (z11 + 0.25 rthin * ne);
+       (u_left, v_left) = before_left intersectiontimes after_left;
+
+       before_right := (z12 + 0.25 rthin * nw)
+                       -- (z3 + (0, -0.25 rthin / cosd (angle (nw))));
+       after_right := z3r{up}
+                      .. z9{z1r - z9}
+                      -- z1r;
+       (u_right, v_right) = before_right intersectiontimes after_right;
+
+       fill subpath (0, u_left) of before_left
+            .. subpath (v_left, infinity) of after_left
+            .. top z11
+            .. lft z11
+            .. {dir -50}(z11 + 0.25 rthin * sw)
+            .. (z10 + 0.25 rthin * sw){dir -70}
+            .. bot z10
+            .. {dir 70}(z10 + 0.25 rthin * se)
+            .. (z12 + 0.25 rthin * se){dir 50}
+            .. rt z12
+            .. top z12
+            .. subpath (0, u_right) of before_right
+            .. subpath (v_right, infinity) of after_right
+            .. 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;
+
+
+fet_beginchar ("Arpeggio arrow down", "arpeggio.arrow.M1");
+       draw_arpeggio_arrow;
+       penlabels (range 1 thru 12);
+fet_endchar;
+
+
+fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1");
+       draw_arpeggio_arrow;
+       currentpicture := currentpicture scaled -1
+                                        shifted (w - feta_eps, h - feta_eps);
+fet_endchar;
+
+
+% Hmm
+input feta-trills;
+
+
+%
+% Railroad tracks.  We define two variants of these -- both as slightly
+% tapered, comma-shaped curves and as two straight parallel slashes.
+%
+
+fet_beginchar ("Curved caesura", "caesura.curved");
+       save slant, space_between, clearance;
+       save alpha, pat;
+       save botthick, topthick;
+       save krom;
+       path pat;
+
+       botthick = 1.5 linethickness;
+       topthick = 2.5 linethickness;
+
+       pickup pencircle scaled botthick;
+
+       slant = 3.5;
+       space_between# = 0.6 staff_space#;
+       clearance# = 0.2 staff_space#;
+       height# = 1.2 staff_space#;
+
+       set_char_box (0, 2.0 staff_space#,
+                     staff_space# - clearance#, height#);
+       define_pixels (clearance, height);
+       define_whole_pixels (space_between);
+
+       bot y1 = -d;
+       top y2 = h;
+
+       lft x1 = 0;
+       x2 = (y2 - y1) / slant;
+
+       krom = 10;
+
+       alpha = angle (z2 - z1);
+       penpos1 (botthick, alpha - krom);
+       penpos3 (botthick, alpha - krom + 90);
+
+       penpos2 (topthick, alpha + krom);
+       penpos4 (topthick, alpha + krom + 90);
+
+       z3 = z1;
+       z4 = z2;
+
+       penlabels (1, 2, 3, 4);
+
+       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_beginchar ("snap pizzicato (Bartok pizzicato)", "snappizzicato");
+       save height, width, thickness, superness;
+
+       height# = 4/15 staffsize#;
+       width# = height#;
+       thickness# = 1.3 linethickness#;
+       define_pixels (height, width);
+       define_whole_blacker_pixels (thickness);
+
+       set_char_box (width# / 2, width# / 2, height# / 2, height# * 3 / 4);
+
+       penpos1 (thickness, 90);
+       penpos2 (thickness, 180);
+       penpos3 (thickness, 270);
+       penpos4 (thickness, 0);
+
+       x1 = 0;
+       y1r = height / 2;
+       x3 = x1;
+       y3r = -y1r;
+       x4r = width / 2;
+       y4 = 0;
+       x2r = -x4r;
+       y2 = y4;
+
+       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;
+       else:
+               pickup pencircle scaled thickness;
+               draw z1
+                    .. z2
+                    .. z3
+                    .. z4
+                    .. cycle;
+       fi;
+
+       z5 = (0, 0);
+       z6 = (x5, 1.5 y1r);
+
+       draw_gridline (z5, z6, thickness);
+
+       labels (5, 6);
+fet_endchar;
+
+fet_endgroup ("scripts");
diff --git a/mf/feta-slag.mf b/mf/feta-slag.mf
deleted file mode 100644 (file)
index 3b0789b..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  implement trill symbols
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
-%
-%
-% LilyPond 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.
-%
-% 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/>.
-
-% this file is included by feta-scripts.mf
-
-trill_thin# = 0.1 staff_space# + 0.6 stafflinethickness#;
-trill_stemwidth# = trill_thin#;
-define_pixels (trill_thin);
-define_whole_blacker_pixels (trill_stemwidth);
-
-trill_thick = 1/2 staff_space;
-trill_overlap = 1/6 staff_space;
-
-trill_width# = 5/6 staff_space#;
-trill_height# = 1/2 staff_space#;
-define_pixels (trill_height);
-define_whole_pixels (trill_width);
-
-pair trill_ne;
-trill_ne := unitvector ((2, 3));
-
-
-%
-% The trill element sticks out on both the left and right side
-% of the normal bbox, so you can glue them together easily.
-%
-% `ending' is either 0 for none, 1 for left, or 2 for right.
-%
-
-def draw_trillelement (expr offset, ending) =
-       clearxy;
-
-begingroup;
-       save nw, pat, nw_dist, ne_dist;
-       pair nw, nw_dist, ne_dist;
-       path pat;
-
-       pickup pencircle scaled trill_thin;
-
-       x1 = -.5 trill_width;
-       y1 = 0;
-       z3 = whatever * trill_ne + z1;
-       top y3 = vround trill_height;
-       z2 = z3 - (trill_thick - trill_thin) * trill_ne;
-
-       bot z3' = (top z3) scaled -1;
-
-       nw = unitvector (z2 - z3');
-       ne_dist = (nw rotated -90) * 0.5 trill_thin;
-       nw_dist = (trill_ne rotated 90) * 0.5 trill_thin;
-
-       z5 = whatever * trill_ne + (z1 - nw_dist);
-       z5 = whatever * nw + (z3' - ne_dist);
-
-       pat := z5
-              -- (z1 - nw_dist){-trill_ne}
-              -- (z1 + nw_dist){trill_ne}
-              -- (z3 + nw_dist){trill_ne}
-              .. top z3{right}
-              .. (z3 + ne_dist){-nw};
-       pat := pat
-              -- pat scaled -1 shifted (-feta_eps, -feta_eps)
-              -- cycle;
-       pat := pat shifted (offset, 0);
-       fill pat;
-
-       z4 = z1 - trill_ne * trill_overlap;
-       x4 := hround (x4 + 0.5 trill_thin) - 0.5 trill_thin;
-
-       pat := (z4 - nw_dist){-trill_ne}
-              .. bot z4{left}
-              .. lft z4{up}
-              .. (z4 + nw_dist){trill_ne}
-              -- (z1 + nw_dist){trill_ne}
-              -- (z1 - nw_dist){-trill_ne}
-              -- cycle;
-
-       if ending = 1:
-               fill pat shifted (offset, 0);
-       elseif ending = 2:
-               pat := pat scaled -1 shifted (-feta_eps, -feta_eps);
-                fill pat shifted (offset, 0);
-       fi;
-endgroup;
-enddef;
-
-
-fet_beginchar ("trilelement", "trilelement");
-       set_char_box (.5 trill_width#, .5 trill_width#,
-                     trill_height#, trill_height#);
-
-       draw_trillelement (0, 0);
-       labels (1, 2, 3, 3', 4, 5, 5');
-fet_endchar;
-
-
-fet_beginchar ("prall", "prall");
-       set_char_box (trill_width#, trill_width#,
-                     trill_height#, trill_height#);
-
-       draw_trillelement (-hround (.5 trill_width), 1);
-       draw_trillelement (-hround (.5 trill_width) + trill_width, 2);
-fet_endchar;
-
-
-fet_beginchar ("mordent", "mordent");
-       set_char_box (trill_width#, trill_width#,
-                     4/3 trill_height#, 4/3 trill_height#);
-
-       draw_trillelement (-hround (.5 trill_width), 1);
-       draw_trillelement (-hround (.5 trill_width) + trill_width, 2);
-
-       clearxy;
-
-       pickup pencircle scaled trill_stemwidth;
-
-       top y1 = h;
-       bot y2 = -d;
-       x1 = x2;
-       x2 = 0;
-
-       draw_gridline (z2, z1, trill_stemwidth);
-
-       labels (1, 2);
-fet_endchar;
-
-
-fet_beginchar ("prallprall", "prallprall");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     trill_height#, trill_height#);
-
-       draw_trillelement (-trill_width, 1);
-       draw_trillelement (0, 0);
-       draw_trillelement (trill_width, 2);
-fet_endchar;
-
-
-fet_beginchar ("prallmordent", "prallmordent");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     4/3 trill_height#, 4/3 trill_height#);
-
-       draw_trillelement (-trill_width, 1);
-       draw_trillelement (0, 0);
-       draw_trillelement (trill_width, 2);
-
-       clearxy;
-
-       pickup pencircle scaled trill_stemwidth;
-
-       top y1 = h;
-       bot y2 = -d;
-       x1 = x2 ;
-       x2 = good.x (.5 trill_width);
-
-       draw_gridline (z2, z1, trill_stemwidth);
-
-       labels (1, 2);
-fet_endchar;
-
-
-save remember_pic;
-picture remember_pic;
-
-
-fet_beginchar ("upprall", "upprall");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     trill_height#, trill_height#);
-
-       draw_trillelement (-trill_width, 1);
-       draw_trillelement (0, 0);
-       draw_trillelement (trill_width, 2);
-
-       z11 = z4 shifted (-trill_width, 0);
-       z12 = z11 + (0, -2 trill_height);
-
-       penpos11 (trill_thin, angle (trill_ne) - 90);
-       penpos12 (trill_thin, angle (trill_ne yscaled -1) + 90);
-       penlabels (11, 12);
-
-       pickup pencircle scaled trill_stemwidth;
-
-       fill z11l{-trill_ne}
-            .. z12l{trill_ne yscaled -1}
-            .. bot z12
-            .. rt z12
-            .. z12r{-trill_ne yscaled -1}
-            .. z11r{trill_ne}
-            -- cycle;
-
-       remember_pic := currentpicture;
-fet_endchar;
-
-
-fet_beginchar ("upmordent", "upmordent");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     4/3 trill_height#, 4/3 trill_height#);
-
-       currentpicture := remember_pic;
-
-       clearxy;
-
-       pickup pencircle scaled trill_stemwidth;
-
-       top y1 = h;
-       bot y2 = -d;
-       x1 = x2;
-       x2 = good.x (.5 trill_width);
-
-       draw_gridline (z2, z1, trill_stemwidth);
-
-       labels (1, 2);
-fet_endchar;
-
-
-fet_beginchar ("pralldown", "pralldown");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     trill_height#, trill_height#);
-
-       currentpicture := remember_pic xscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("downprall", "downprall");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     trill_height#, trill_height#);
-
-       draw_trillelement (-trill_width, 1);
-       draw_trillelement (0, 0);
-       draw_trillelement (trill_width, 2);
-
-       z11 = z4 shifted (-trill_width, 0);
-       z12 = z11 + (0, 2 trill_height);
-
-       penpos11 (trill_thin, angle (trill_ne xscaled -1) - 90);
-       penpos12 (trill_thin, angle (trill_ne) - 90);
-       penlabels (11, 12);
-
-       pickup pencircle scaled trill_stemwidth;
-
-       fill z11l{trill_ne xscaled -1}
-            .. z12l{trill_ne}
-            .. top z12
-            .. rt z12
-            .. z12r{-trill_ne}
-            .. z11r{-trill_ne xscaled -1}
-            -- cycle;
-
-       remember_pic := currentpicture;
-fet_endchar;
-
-
-fet_beginchar ("downmordent", "downmordent");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     4/3 trill_height#, 4/3 trill_height#);
-
-       currentpicture := remember_pic;
-
-       clearxy;
-
-       pickup pencircle scaled trill_stemwidth;
-
-       top y1 = h;
-       bot y2 = -d;
-       x1 = x2;
-       x2 = good.x (.5 trill_width);
-
-       draw_gridline (z2, z1, trill_stemwidth);
-
-       labels (1, 2);
-fet_endchar;
-
-
-fet_beginchar ("prallup", "prallup");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     trill_height#, trill_height#);
-
-       currentpicture := remember_pic xscaled -1;
-fet_endchar;
-
-
-fet_beginchar ("lineprall", "lineprall");
-       set_char_box (1.5 trill_width#, 1.5 trill_width#,
-                     trill_height#, 4 trill_height#);
-
-       draw_trillelement (-trill_width, 1);
-
-       labels (1, 2, 3, 3', 4, 5, 5');
-
-       pickup pencircle scaled trill_stemwidth;
-
-       penpos10 (trill_stemwidth, 0);
-       penpos11 (trill_stemwidth, 0);
-
-       x10l = x4 - .5 trill_thin - trill_width;
-       y10 = y4;
-       z11 = z10 + (0, h);
-
-       penlabels (10, 11);
-
-       fill z11l
-            .. top z11
-            .. z11r
-            -- z10r
-            -- z10l
-            -- cycle;
-
-       draw_trillelement (0, 0);
-       draw_trillelement (trill_width, 2);
-fet_endchar;
index 1ade03f2c354ad142a0616ac673b9fd9ccbe1b49..c18061b15a32c4f0e6a5b6a9b51e45b359958bd7 100644 (file)
@@ -3,18 +3,16 @@
 % in a separate file to avoid tainting non-test font files for testing.
 %
 
-%input feta-eindelijk;
-input feta-toevallig;
-%input feta-puntje;
-%input feta-bolletjes; 
-%input feta-arrow;     
-%input feta-schrift;   
-%input feta-schrift;
-%input feta-banier;
-%      input feta-slag;
-%input feta-klef;
-%input feta-haak;
-%      input feta-haak;
-%input feta-timesig;
-%input feta-pendaal;
+%input feta-rests;
+input feta-accidentals;
+%input feta-dots;
+%input feta-noteheads;
+%input feta-arrowheads;
+%input feta-scripts;
+%input feta-flags;
+%input feta-trills;
+%input feta-clefs;
+%input feta-brackettips;
+%input feta-timesignatures;
+%input feta-pedals;
 %input feta-accordion;
diff --git a/mf/feta-timesig.mf b/mf/feta-timesig.mf
deleted file mode 100644 (file)
index 67289ee..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  implement Time Signatures
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
-%               Christian Mondrup <scancm@biobase.dk>
-%
-% LilyPond 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.
-%
-% 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 ("timesig");
-
-
-%
-% Originally by Mats B. nuked by Han-Wen, inspired by
-% Baerenreiter BA320 (Bach Cello Suites, Suite III).
-%
-% Notes:
-%
-%  * The inside curve of the C is rather straight.
-%  * The outside curve of the C is rather round.
-%  * Right tips of the C point slightly outward.
-%  * Lower tip protrudes to the right very slightly.
-%
-
-def draw_C =
-       save hair, bulb_rad, left_fatness;
-       save left_width, right_width;
-       save width, lower_offset;
-
-       width# := 1.8 staff_space# - stafflinethickness#;
-
-       left_width := 1.0 staff_space;
-       right_width := 0.8 staff_space;
-
-       hair := stafflinethickness;
-
-       bulb_rad := 0.40 staff_space - .6 stafflinethickness;
-       left_fatness := 0.55 * staff_space;
-       lower_offset := 0.3 stafflinethickness;
-
-       set_char_box (0, width#, staff_space#, staff_space#);
-
-       d := d - feta_shift;
-
-       x1r = w;
-       x3r = 0;
-       y1r = .45 h;
-       y2r = h + vround (.5 stafflinethickness_rounded);
-       y4r = -d - vround (.5 stafflinethickness_rounded);
-       x2 = x4;
-       x2 = x3r + h;
-       y3r = .5 (h - d);
-
-       x5r = x1r + lower_offset;
-       y5r = -0.37 h;
-
-       penpos1 (hair, 10);
-       penpos2 (stafflinethickness_rounded, 90);
-       penpos3 (left_fatness, 180);
-       penpos4 (stafflinethickness_rounded, -90);
-       penpos5 (hair, -13);
-
-       draw_bulb (-1, z1l, z1r, bulb_rad, .8);
-
-       save s;
-       s := 0.735;
-
-       fill z1l{dir (100)}
-            .. z2l{left}
-            ..tension 0.8.. z3l{down}
-            ..tension 0.8.. z4l{right}
-            .. simple_serif (z5l, z5r, -90)
-            .. z4r{left}
-            .. super_curvelet (z4r, z3r, s, -1)
-            .. z3r{up}
-            .. super_curvelet (z3r, z2r, s, 1)
-            .. z2r{right}
-            .. {dir (-80)}z1r
-            -- cycle;
-
-       penlabels (1, 2, 3, 4, 5);
-
-       draw_staff (-2, 2, 0);
-enddef;
-
-
-fet_beginchar ("4/4 meter", "C44");
-       draw_C;
-fet_endchar;
-
-
-fet_beginchar ("2/2 meter", "C22");
-       save eccentricity, top_stemlen, bottom_stemlen, thick, left_pos;
-
-       draw_C;
-
-       eccentricity = -1.75 stafflinethickness - 0.025 staff_space;
-       top_stemlen# = bottom_stemlen# = 1.4 staff_space#;
-       thick# = stafflinethickness# + 0.05 staff_space#;
-       define_whole_pixels (top_stemlen, bottom_stemlen);
-       define_whole_blacker_pixels (thick);
-
-       bottom_stemlen := bottom_stemlen - feta_shift;
-
-       draw_block ((x2 + eccentricity, -bottom_stemlen),
-                   (x2 + eccentricity + thick, top_stemlen));
-fet_endchar;
-
-fet_endgroup ("timesig");
diff --git a/mf/feta-timesignatures.mf b/mf/feta-timesignatures.mf
new file mode 100644 (file)
index 0000000..67289ee
--- /dev/null
@@ -0,0 +1,119 @@
+% Feta (not the Font-En-Tja) music font --  implement Time Signatures
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
+%               Christian Mondrup <scancm@biobase.dk>
+%
+% LilyPond 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.
+%
+% 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 ("timesig");
+
+
+%
+% Originally by Mats B. nuked by Han-Wen, inspired by
+% Baerenreiter BA320 (Bach Cello Suites, Suite III).
+%
+% Notes:
+%
+%  * The inside curve of the C is rather straight.
+%  * The outside curve of the C is rather round.
+%  * Right tips of the C point slightly outward.
+%  * Lower tip protrudes to the right very slightly.
+%
+
+def draw_C =
+       save hair, bulb_rad, left_fatness;
+       save left_width, right_width;
+       save width, lower_offset;
+
+       width# := 1.8 staff_space# - stafflinethickness#;
+
+       left_width := 1.0 staff_space;
+       right_width := 0.8 staff_space;
+
+       hair := stafflinethickness;
+
+       bulb_rad := 0.40 staff_space - .6 stafflinethickness;
+       left_fatness := 0.55 * staff_space;
+       lower_offset := 0.3 stafflinethickness;
+
+       set_char_box (0, width#, staff_space#, staff_space#);
+
+       d := d - feta_shift;
+
+       x1r = w;
+       x3r = 0;
+       y1r = .45 h;
+       y2r = h + vround (.5 stafflinethickness_rounded);
+       y4r = -d - vround (.5 stafflinethickness_rounded);
+       x2 = x4;
+       x2 = x3r + h;
+       y3r = .5 (h - d);
+
+       x5r = x1r + lower_offset;
+       y5r = -0.37 h;
+
+       penpos1 (hair, 10);
+       penpos2 (stafflinethickness_rounded, 90);
+       penpos3 (left_fatness, 180);
+       penpos4 (stafflinethickness_rounded, -90);
+       penpos5 (hair, -13);
+
+       draw_bulb (-1, z1l, z1r, bulb_rad, .8);
+
+       save s;
+       s := 0.735;
+
+       fill z1l{dir (100)}
+            .. z2l{left}
+            ..tension 0.8.. z3l{down}
+            ..tension 0.8.. z4l{right}
+            .. simple_serif (z5l, z5r, -90)
+            .. z4r{left}
+            .. super_curvelet (z4r, z3r, s, -1)
+            .. z3r{up}
+            .. super_curvelet (z3r, z2r, s, 1)
+            .. z2r{right}
+            .. {dir (-80)}z1r
+            -- cycle;
+
+       penlabels (1, 2, 3, 4, 5);
+
+       draw_staff (-2, 2, 0);
+enddef;
+
+
+fet_beginchar ("4/4 meter", "C44");
+       draw_C;
+fet_endchar;
+
+
+fet_beginchar ("2/2 meter", "C22");
+       save eccentricity, top_stemlen, bottom_stemlen, thick, left_pos;
+
+       draw_C;
+
+       eccentricity = -1.75 stafflinethickness - 0.025 staff_space;
+       top_stemlen# = bottom_stemlen# = 1.4 staff_space#;
+       thick# = stafflinethickness# + 0.05 staff_space#;
+       define_whole_pixels (top_stemlen, bottom_stemlen);
+       define_whole_blacker_pixels (thick);
+
+       bottom_stemlen := bottom_stemlen - feta_shift;
+
+       draw_block ((x2 + eccentricity, -bottom_stemlen),
+                   (x2 + eccentricity + thick, top_stemlen));
+fet_endchar;
+
+fet_endgroup ("timesig");
diff --git a/mf/feta-toevallig.mf b/mf/feta-toevallig.mf
deleted file mode 100644 (file)
index f8ed7c6..0000000
+++ /dev/null
@@ -1,1321 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  Accidentals
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
-%
-%
-% LilyPond 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.
-%
-% 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/>.
-
-
-%
-% also show in other configuration wrt staff lines.
-%
-def draw_shifted_too =
-if test > 0:
-       fet_beginchar ("shifted too", "");
-               set_char_box (0, 0, 0, 0);
-               currentpicture := remember_pic;
-
-               draw_staff (-2, 2, 0.5);
-       fet_endchar;
-fi;
-enddef;
-
-
-%
-% Accidentals from various sources, notably
-%
-%   Baerenreiter edition of Schuberts `Auf dem Strom' (sharp, natural)
-%   F Hofmeister edition of Muellers `Etueden fuer Horn' (double sharp, flat)
-%
-
-
-%
-% Naming for accidentals (including microtonal variants):
-%
-%   SHARPBASE[.SLASHES.STEMS]
-%   FLATBASE[.MODIFIER]
-%  
-% Examples:
-%
-%   sharp.slashslash.stem
-%   mirroredflat.flat
-%
-%
-
-
-fet_begingroup ("accidentals");
-
-%
-% Draw an arrow
-%
-% * `stemslant' gives the direction of the stem's left boundary
-%   (needed for brushed stems, equals "up" for straight stems)
-% * `extend' is used to make the stem longer or shorter (if negative);
-%   different kinds of accidentals need different values here
-%
-def draw_arrow (expr attach, stemwidth, stemslant, extend, pointingdown) =
-begingroup;
-       save htip;  % tip height
-       save wwing; % wing `radius'
-       save angle_wing_bot, angle_wing_top, angle_tip;
-       save upshift;
-       clearxy;
-
-       wwing := 0.26 stemwidth;
-       htip := staff_space * 0.85 + stafflinethickness - wwing;
-
-       % `flip' is used to reflect the arrow vertically
-       % if arrow points downward
-       transform flip;
-       if pointingdown:
-               flip = identity reflectedabout (origin, right);
-       else:
-               flip = identity;
-       fi;
-
-       z1 = attach shifted (-stemwidth / 2, 0);
-       upshift := max (0, wwing + 0.1 staff_space + extend);
-       z2 = z1 shifted (((unitvector stemslant)
-                         scaled upshift) transformed flip);
-
-       z7 = attach shifted ((stemwidth/2),0);
-       z6 = z7 shifted (((unitvector (-xpart stemslant, ypart stemslant))
-                         scaled upshift) transformed flip);
-       z2 - z3 = ( 0.38 staff_space, 0.05 htip) transformed flip;
-       z6 - z5 = (-0.38 staff_space, 0.05 htip) transformed flip;
-
-       z4 = attach shifted ((-0.2 stemwidth, upshift + htip)
-                            transformed flip);
-       z4'= attach shifted (( 0.2 stemwidth, upshift + htip)
-                            transformed flip);
-
-       % `angle_wing_bot' is the angle at which the arc
-       % from z2 to z3a enters z3a
-       % `angle_wing_top' is the angle at which the arc
-       % from z3b to z4 leaves z3b
-       % `angle_tip' is the angle at which the arc
-       % from z4 to z4' leaves z4
-       angle_wing_bot = 30;
-       angle_wing_top = 55;
-       angle_tip = 68;
-
-       z3a = z3 shifted ((((dir angle_wing_bot) rotated -90)
-                          scaled wwing) transformed flip);
-       z3b = z3 shifted ((((dir angle_wing_top) rotated 90)
-                          scaled wwing) transformed flip);
-
-       z5a = z5 shifted ((((dir (180 - angle_wing_bot)) rotated 90)
-                          scaled wwing) transformed flip);
-       z5b = z5 shifted ((((dir (180 - angle_wing_top)) rotated -90)
-                          scaled wwing) transformed flip);
-
-       % Draw the arrow
-       pickup pencircle scaled 1;
-       fill z1
-            -- z2{stemslant transformed flip}
-            .. {(-dir angle_wing_bot) transformed flip}z3a
-            .. z3b{(dir angle_wing_top) transformed flip}
-            .. z4{(dir angle_tip) transformed flip}
-            .. z4'{(dir (-angle_tip)) transformed flip}
-            .. {(dir (-angle_wing_top)) transformed flip}z5b
-            .. z5a{(-dir (-angle_wing_bot)) transformed flip}
-            .. z6{((-stemslant) reflectedabout (origin, up)) transformed flip}
-            -- z7
-            -- cycle;
-
-       labels (range 0 thru 7, 4', 3a, 3b, 5a, 5b);
-endgroup;
-enddef;
-
-save remember_pic;
-picture remember_pic;
-
-save sharp_beamheight;
-sharp_beamheight# := 0.3 staff_space# + stafflinethickness#;
-
-%
-% The beams of most sharps have horizontal endings (as if drawn with
-% a square pen).  [Wanske] does not mention this, so we'll just ignore
-% this fact.
-%
-
-def draw_meta_sharp (expr width, offset) =
-       save beamwidth, beamslope;
-       save ne, nw_dist;
-       pair ne, nw_dist;
-
-       beamwidth := width;
-
-       define_whole_vertical_blacker_pixels (sharp_beamheight);
-
-       clearxy;
-
-       beamslope = sharp_beamheight / beamwidth;
-
-       pickup pencircle scaled 2 blot_diameter;
-
-       rt x2 - lft x1 = beamwidth;
-       z2 = z1 + whatever * (beamwidth, sharp_beamheight);
-       .5 [z1, z3] = (.5 w, offset);
-       x3 = x2;
-       top y2 - bot y3 = sharp_beamheight;
-       x4 = x1;
-       top y1 - bot y4 = sharp_beamheight;
-
-       ne = unitvector (z2 - z1);
-       nw_dist = (ne rotated 90) * blot_diameter;
-
-       fill lft z1{up}
-            ... (z1 + nw_dist){ne}
-            -- (z2 + nw_dist){ne}
-            ... rt z2{down}
-            -- rt z3{down}
-            ... (z3 - nw_dist){-ne}
-            -- (z4 - nw_dist){-ne}
-            ... lft z4{up}
-            -- cycle;
-
-       labels (1, 2, 3, 4);
-enddef;
-
-
-def draw_sharp(expr arrowup, arrowdown) =
-       save stem, stemx, stemwidth;
-       save outer_space, interbeam;
-       save stemlength, extendleft, extendright, height, depth;
-
-       stemwidth# := stafflinethickness# + .05 staff_space#;
-       define_whole_blacker_pixels (stemwidth);
-
-       interbeam := 1.05 staff_space_rounded;
-
-       stemlength# := 1.5 staff_space#;
-       define_pixels (stemlength);
-
-       height# = stemlength#;
-       depth# = stemlength#;
-       extendright# = 0;
-       extendleft# = 0;
-       if arrowup:
-               height# := height# + 1.2 staff_space#;
-               extendright# := extendright# + 1.5 stafflinethickness#;
-       fi;
-       if arrowdown:
-               depth# := depth# + 1.2 staff_space#;
-               extendleft# := extendleft# + 1.5 stafflinethickness#;
-       fi;
-       define_pixels (extendleft, extendright);
-       set_char_box (extendleft#, 1.1 staff_space#, depth#, height#);
-
-       stem := 7 / 16 * w;
-       stemx := hround stem;
-       outer_space := hround ((w - stemx - stemwidth) / 2);
-
-       w := 2 outer_space + stemx + stemwidth;
-       d := d - feta_space_shift;
-
-       draw_meta_sharp (w, -.5 interbeam);
-       draw_meta_sharp (w, -.5 interbeam + vround interbeam);
-
-       % expand the charbox so that it encloses the whole arrow;
-       % this must not happen earlier because some commands above
-       % still rely on the old width
-       w := w + extendright;
-
-       pickup pencircle scaled stemwidth;
-
-       lft x5 = lft x6 = outer_space;
-       lft x7 = lft x8 = outer_space + stemx;
-       bot y5 = -stemlength;
-       top y6 = vround (1.5 staff_space - stem * beamslope);
-       bot y7 = -top y6 + feta_space_shift;
-       top y8 = stemlength;
-
-       labels (5, 6, 7, 8);
-
-       draw_gridline (z5, z6, stemwidth);
-       draw_gridline (z7, z8, stemwidth);
-
-       if arrowup:
-               draw_arrow (z8, stemwidth, up,
-                           stafflinethickness / 2 + stemwidth / 2, false);
-       fi;
-       if arrowdown:
-               draw_arrow (z5, stemwidth, up,
-                           stafflinethickness / 2 + stemwidth / 2, true);
-       fi;
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-enddef;
-
-
-fet_beginchar ("Sharp", "sharp");
-       draw_sharp (false, false);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup");
-       draw_sharp (true, false);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown");
-       draw_sharp (false, true);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth");
-       draw_sharp (true, true);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem");
-       save stem, stemwidth;
-       save outer_space, interbeam;
-
-       stemwidth# := stafflinethickness# + .05 staff_space#;
-       define_whole_blacker_pixels (stemwidth);
-
-       interbeam := 1.05 staff_space_rounded;
-
-       set_char_box (0, 0.7 staff_space#,
-                     1.5 staff_space#, 1.5 staff_space#);
-
-       stem := 7 / 16 * w;
-       outer_space := hround ((w - stemwidth) / 2);
-
-       w := 2 outer_space + stemwidth;
-       d := d - feta_space_shift;
-
-       draw_meta_sharp (w, -.5 interbeam);
-       draw_meta_sharp (w, -.5 interbeam + vround interbeam);
-
-       pickup pencircle scaled stemwidth;
-
-       lft x5 = lft x6 = outer_space;
-       top y6 = vround (1.5 staff_space - .5 stem);
-       bot y5 = -top y6 + feta_space_shift;
-
-       labels (5, 6);
-
-       draw_gridline (z5, z6, stemwidth);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem");
-       save stem, stemx, stemwidth;
-       save outer_space, interbeam;
-       save sharp_beamheight;
-
-       sharp_beamheight# := 0.22 staff_space# + stafflinethickness#;
-
-       stemwidth# := stafflinethickness# + .05 staff_space#;
-       define_whole_blacker_pixels (stemwidth);
-
-       interbeam := 1.2 staff_space_rounded;
-
-       set_char_box (0, 1.1 staff_space#,
-                     1.5 staff_space#, 1.5 staff_space#);
-
-       stem := 7 / 16 * w;
-       stemx := hround stem;
-       outer_space := hround ((w - stemx - stemwidth) / 2);
-
-       w := 2 outer_space + stemx + stemwidth;
-       d := d - feta_space_shift;
-
-       draw_meta_sharp (.88 w, -.5 interbeam);
-       draw_meta_sharp (.88 w, -.5 interbeam + vround interbeam);
-       sharp_beamheight# := 1/.88 sharp_beamheight#;
-       draw_meta_sharp (w, 0);
-
-       pickup pencircle scaled stemwidth;
-
-       lft x5 = lft x6 = outer_space;
-       lft x7 = lft x8 = outer_space + stemx;
-       bot y5 = -d;
-       top y6 = vround (1.5 staff_space - stem * beamslope);
-       bot y7 = -top y6 + feta_space_shift;
-       top y8 = h;
-
-       labels (5, 6, 7, 8);    
-
-       draw_gridline (z5, z6, stemwidth);
-       draw_gridline (z7, z8, stemwidth);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem");
-       save stem, stemx, stemwidth;
-       save outer_space, interbeam;
-       save sharp_beamheight;
-
-       sharp_beamheight# := 0.22 staff_space# + stafflinethickness#;
-
-       stemwidth# := stafflinethickness# + .05 staff_space#;
-       define_whole_blacker_pixels (stemwidth);
-
-       interbeam := 1.2 staff_space_rounded;
-
-       set_char_box (0, 0.95 staff_space#,
-                     1.3 staff_space#, 1.3 staff_space#);
-
-       stem := 7 / 16 * w;
-       outer_space := hround ((w - stemwidth) / 2);
-
-       w := 2 outer_space + stemwidth;
-       d := d - feta_space_shift;
-
-       draw_meta_sharp (.8 w, -.5 interbeam);
-       draw_meta_sharp (.8 w, -.5 interbeam + vround interbeam);
-       sharp_beamheight# := 1/.8 sharp_beamheight#;
-       draw_meta_sharp (w, 0);
-
-       pickup pencircle scaled stemwidth;
-
-       lft x5 = lft x6 = outer_space;
-       top y6 = vround (1.5 staff_space - .5 stem);
-       bot y5 = -top y6 + feta_space_shift;
-       labels (5, 6);
-
-       draw_gridline (z5, z6, stemwidth);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem");
-       save stem, stemx, stemwidth;
-       save outer_space, interbeam;
-
-       stemwidth# := stafflinethickness# + .05 staff_space#;
-       define_whole_blacker_pixels (stemwidth);
-
-       interbeam := 1.05 staff_space_rounded;
-
-       set_char_box (0, 1.6 staff_space#,
-                     1.5 staff_space#, 1.5 staff_space#);
-
-       stem := 9 / 32 * w;
-       stemx := hround stem;
-       outer_space := hround ((w - 2 stemx - stemwidth) / 2);
-
-       w := 2 outer_space + 2 stemx + stemwidth;
-       d := d - feta_space_shift;
-
-       draw_meta_sharp (w, -.5 interbeam);
-       draw_meta_sharp (w, -.5 interbeam + vround interbeam);
-
-       pickup pencircle scaled stemwidth;
-
-       lft x5 = lft x6 = outer_space;
-       lft x7 = lft x8 = outer_space + stemx;
-       lft x9 = lft x10 = outer_space + 2 stemx;
-       bot y5 = -d;
-       top y6 = vround (1.5 staff_space - 2 stem * beamslope);
-       bot y9 = -top y6 + feta_space_shift;
-       top y10 = h;
-       y7 = .5 [y5, y9];
-       y8 = .5 [y6, y10];
-
-       labels (5, 6, 7, 8, 9, 10);
-
-       draw_gridline (z5, z6, stemwidth);
-       draw_gridline (z7, z8, stemwidth);
-       draw_gridline (z9, z10, stemwidth);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-%
-% The stems of the natural are brushed (at least, in Barenreiter SCS)
-%
-
-def draw_natural (expr arrowup, arrowdown) =
-       save stemwidth, top_stem_thick;
-       save ne, pat_top, pat_bottom;
-       save depth, height, extendleft, extendright, stemlength;
-       save brush_scale_up, brush_scale_down;
-       pair ne;
-       path pat_top, pat_bottom;
-
-       top_stem_thick# = stafflinethickness# + .10 staff_space#;
-       stemwidth# = 0.09 staff_space# + .5 stafflinethickness#;
-       define_whole_blacker_pixels (top_stem_thick, stemwidth);
-
-       stemlength# = 1.5 staff_space#;
-       define_pixels (stemlength);
-
-       height# = stemlength#;
-       depth# = stemlength#;
-       extendleft# = 0;
-       extendright# = 0;
-       if arrowup:
-               extendleft# := 3 stafflinethickness#;
-               height# := height# + 1.2 staff_space#;
-       fi;
-       if arrowdown:
-               extendright# := 3.15 stafflinethickness#;
-               depth# := depth# + 1.2 staff_space#;
-       fi;
-       define_pixels (extendright);
-
-       set_char_box (extendleft#, 2/3 staff_space#, depth#, height#);
-
-       d := d - feta_space_shift;
-
-       pickup pencircle scaled stemwidth;
-
-       brush_scale_up := 1.0;
-       brush_scale_down := 1.0;
-       % to look nice, arrowed stems must be less brushed
-       if arrowup:
-               brush_scale_up := 0.85;
-       fi;
-       if arrowdown:
-               brush_scale_down := 0.85;
-       fi;
-
-       penpos1 (top_stem_thick, 0);
-       penpos3 (top_stem_thick, 0);
-       penpos2 (stemwidth, 0);
-       penpos4 (stemwidth, 0);
-       % z1' and z3' are needed for the arrowed accidentals
-       penpos1' (top_stem_thick * brush_scale_up, 0);
-       penpos3' (top_stem_thick * brush_scale_down, 0);
-
-       x2r = w;
-       x4l = 0;
-       x3 = x3' = x2;
-       x1 = x1' = x4;
-
-       y1 = y1' = stemlength;
-       y3 = y3' = -stemlength;
-       top y2 = vround (staff_space - 3/2 stafflinethickness);
-       y4 = -y2 + feta_space_shift;
-
-       pat_bottom := z4r{z4r - z1r}
-                     .. bot z4
-                     .. z4l{z1l - z4l};
-       fill simple_serif (z1'l, z1'r, -30)
-            -- pat_bottom
-            -- cycle;
-
-       pat_top := z2r{z2r - z3r}
-                  .. top z2
-                  .. z2l{z3l - z2l};
-       fill simple_serif (z3'l, z3'r, 30)
-            -- pat_top
-            -- cycle;
-
-       ne = (x2 - x4, stafflinethickness);
-
-       z11' = z3l + whatever * (z2l - z3l);
-       y11' = vround (.5 (staff_space - stafflinethickness));
-       z11 = z11' + whatever * ne;
-       x11 = x12;
-       z12 = directionpoint -ne of pat_top;
-       z13 = z12 + whatever * ne;
-       x13 = x1;
-       z14 = z11 + whatever * ne;
-       x14 = x1;
-
-       z21' = z4r + whatever * (z1r - z4r);
-       y21' = -y11' + feta_space_shift;
-       z21 = z21' + whatever * ne;
-       x21 = x22;
-       z22 = directionpoint -ne of pat_bottom;
-       z23 = z22 + whatever * ne;
-       x23 = x3;
-       z24 = z21 + whatever * ne;
-       x24 = x3;
-
-       fill z11
-            -- z12
-            -- z13
-            -- z14
-            -- cycle;
-       fill z21
-            -- z22
-            -- z23
-            -- z24
-            -- cycle;
-
-       penlabels (1, 1', 2, 3, 3', 4);
-       labels (11, 11', 12, 13, 14, 21, 21', 22, 23, 24);
-
-       if arrowup:
-               draw_arrow (z1, top_stem_thick * brush_scale_up,
-                           z1'l - z4l, stafflinethickness / 2, false);
-       fi;
-       if arrowdown:
-               draw_arrow (z3, top_stem_thick * brush_scale_down,
-                           z2r - z3'r, stafflinethickness / 2, true);
-               w := w + extendright;
-       fi;
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-enddef;
-
-
-fet_beginchar ("Natural", "natural");
-       draw_natural (false, false);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Natural (arrow up)", "natural.arrowup");
-       draw_natural (true, false);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Natural (arrow down)", "natural.arrowdown");
-       draw_natural (false, true);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Natural (arrows up and down)", "natural.arrowboth");
-       draw_natural (true, true);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-%
-% Dedicated to my mom.    (3/10/97)
-%
-% Mamma, ik hou van je; kom je alsjeblieft terug?
-%    -- HW
-%
-%
-% TODO: remove crook_fatness
-% TODO: document, simplify!
-%
-
-def draw_meta_flat (expr xcenter, w, crook_fatness, arrowup, arrowdown) =
-       save crook_thinness;
-       save bottom_overshoot, bot_crook_dir;
-       save top_stem_thick, top_stem_thick_orig;
-       save bottom_stem_thick, hair, smaller_hole;
-       save top_crook_thinness;
-       save zwiep;
-       save center;
-       pair center, bot_crook_dir;
-       save clearing, clearing_orig;
-
-       clearxy;
-
-       % the stem shouldn't reach the top staff line.
-       %% TODO: should take from height.
-       %
-       % TODO: parameterize this
-       %
-       if w >= 0.75 staff_space:
-               smaller_hole = 0.35 stafflinethickness;
-       else:
-               smaller_hole = 0;
-       fi;
-       crook_thinness = .7 stafflinethickness + .06 staff_space;
-       top_crook_thinness = 1 stafflinethickness + .065 staff_space;
-       clearing = 1.7 stafflinethickness;
-       clearing_orig = clearing;
-       if arrowup:
-               clearing := 0.5 staff_space;
-       fi;
-       bottom_overshoot = stafflinethickness;
-
-       bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#;
-       top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#;
-       top_stem_thick_orig# = top_stem_thick#;
-       if arrowup:
-               % to look nice, arrowed stems should be less brushed
-               top_stem_thick# := top_stem_thick# * 0.8;
-       fi;
-       define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick,
-                                    top_stem_thick_orig);
-
-       if odd (top_stem_thick - bottom_stem_thick):
-               top_stem_thick := top_stem_thick - 1;
-       fi;
-       if odd (top_stem_thick_orig - bottom_stem_thick):
-               top_stem_thick_orig := top_stem_thick_orig - 1;
-       fi;
-
-       center = (xcenter, 0);
-
-       x1l = hround (xcenter - .5 top_stem_thick);
-       y1 = vround (2 staff_space - clearing);
-       x2l = hround (xcenter - .5 bottom_stem_thick);
-       y2 = -.5 staff_space - .5 stafflinethickness;
-       % z16 and the `*_orig' variables are needed for arrowed accidentals
-       % because their inner part should be unchanged from plain ones but
-       % the points z3l, z3r, and z10 depend on values that are different
-       % for arrowed accidentals
-       x16l = hround (xcenter -.5 top_stem_thick_orig);
-       y16 = vround (2 staff_space - clearing_orig);
-
-       penpos1 (top_stem_thick, 0);
-       penpos16 (top_stem_thick_orig, 0);
-       penpos2 (bottom_stem_thick, 0);
-
-       y3l = vfloor ((staff_space - stafflinethickness) / 2);
-       z3l = whatever [z2r, z1r];
-       z3r = .3 [z2r,
-                 (z16r shifted (0, clearing_orig - 1.7 stafflinethickness))]
-             + (smaller_hole, 0);
-       x3r := hceiling x3r;
-
-       % we insert z3l to get better conversion with mf2pt1
-       fill simple_serif (z1r, z1l, 30)
-            -- z2l
-            -- z2r
-            -- z3l
-            -- cycle;
-
-       z10 = whatever [z2r, z16r] + (smaller_hole, 0);
-       y10 = -1/10 staff_space;
-       x10 := hceiling x10;
-
-       x11 = xcenter + bottom_overshoot / 3;
-       y11 = -vround (.5 (staff_space + stafflinethickness)
-                      + bottom_overshoot);
-
-       x2a = 0.2[x2r, x7];
-       y2a = 1.5[y2, y11];
-
-       penpos4 (whatever, 53);
-
-       y4l - y4r = top_crook_thinness;
-       y5r = .15 staff_space;
-       x5l = hround (w + xcenter);
-       y4 = staff_space / 2;
-       x4r = .45 [x5r, x3r];
-       y4l := vround y4l;
-
-       penpos5 (crook_fatness, -175);
-
-       bot_crook_dir = unitvector ((x5l, 0) - z11);
-       z8 = z11 + whatever * bot_crook_dir;
-       y8 = -staff_space / 2;
-
-       z7 = z8
-            + whatever * bot_crook_dir
-            + crook_thinness * (bot_crook_dir rotated 90);
-       x7 = .1 [x3r, x8];
-
-       unfill z3r{z3r - z10}
-              .. z4r{right}
-              .. z5r{down}
-              .. z7{-bot_crook_dir}
-              & z7
-              .. z10{z3r - z10}
-              -- cycle;
-
-       if arrowdown:
-               fill z2l{down}
-                    .. z2a{up}
-                    .. z8{bot_crook_dir}
-                    .. z5l{up}
-                    .. z4l{left}
-                    .. z3l
-                    -- cycle;
-       else:
-               fill z2l{down}
-                    .. z11{right}
-                    .. z8{bot_crook_dir}
-                    .. z5l{up}
-                    .. z4l{left}
-                    .. z3l
-                    -- cycle;
-       fi;
-
-       if arrowup:
-               draw_arrow (z1, top_stem_thick, z1l - z2l,
-                           0.5 stafflinethickness, false);
-       fi;
-       if arrowdown:
-               draw_arrow ((0.5 [x2l, x2a], y2), x2a - x2l, up,
-                           staff_space / 2, true);
-       fi;
-enddef;
-
-
-def draw_arrowed_meta_flat (expr xcenter, width, crook_fatness,
-                                arrowup, arrowdown) =
-       save depth, height, extendleft;
-
-       depth# = 0.6 staff_space#;
-       height# = 1.9 staff_space#;
-       extendleft# := 1.2 stafflinethickness#;
-       if arrowup:
-               extendleft# := 3.45 stafflinethickness#;
-               height# := height# + 0.8 staff_space#;
-       fi;
-       if arrowdown:
-               extendleft# := 3.45 stafflinethickness#;
-               depth# := depth# + 1.6 staff_space#;
-       fi;
-
-       set_char_box (extendleft#, width, depth#, height#);
-       draw_meta_flat(xcenter, w, crook_fatness, arrowup, arrowdown);
-enddef;
-
-%
-% unfortunately, 600dpi is not enough to show the brush of the stem.
-%
-
-fet_beginchar ("Flat", "flat");
-       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
-                               false, false);
-       penlabels (range 0 thru 11);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Flat (arrow up)", "flat.arrowup");
-       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
-                               true, false);
-       penlabels (range 0 thru 23);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Flat (arrow down)", "flat.arrowdown");
-       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
-                               false, true);
-       penlabels (range 0 thru 23);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Arrowed Flat (arrow up and down)", "flat.arrowboth");
-       draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space,
-                               true, true);
-       penlabels (range 0 thru 23);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Flat (slashed)", "flat.slash");
-       set_char_box (.4 staff_space#, .8 staff_space#,
-                     0.6 staff_space#, 1.9 staff_space#);
-
-       draw_meta_flat (0, w, 0.31 staff_space, false, false);
-
-       clearxy;
-
-       save slope, slash_width;
-       slope = 0.5;
-       slash_width = w;
-
-       z11 = (0, h / 2);
-       z12 = z11 - (slash_width, slash_width * slope) / 2;
-       z13 = z11 + (slash_width, slash_width * slope) / 2;
-       penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
-       penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
-
-       z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
-       z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
-
-       fill z13r
-            .. z15
-            .. z13l
-            -- z12l
-            .. z14
-            .. z12r
-            -- z13r
-            .. cycle;
-
-       penlabels (12, 13);
-       labels (14, 15);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Flat (slashed twice)", "flat.slashslash");
-       set_char_box (.4 staff_space#, .8 staff_space#,
-                     0.6 staff_space#, 1.9 staff_space#);
-
-       draw_meta_flat (0, w, 0.31 staff_space, false, false);
-
-       clearxy;
-
-       save slope, slash_width;
-       slope = 0.5;
-       slash_width = w;
-
-       z11 = (0, 5/12 h);
-       z12 = z11 - (slash_width, slash_width * slope) / 2;
-       z13 = z11 + (slash_width, slash_width * slope) / 2;
-       penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
-       penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
-
-       z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
-       z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
-
-       fill z13r
-            .. z15
-            .. z13l
-            -- z12l
-            .. z14
-            .. z12r
-            -- z13r
-            .. cycle;
-
-       penlabels (12, 13);
-       labels (14, 15);
-
-       z21 = (0, 2/3 h);
-       z22 = z21 - (slash_width, slash_width * slope) / 2;
-       z23 = z21 + (slash_width, slash_width * slope) / 2;
-       penpos22 (1.5 stafflinethickness, angle (z23 - z22) - 90);
-       penpos23 (1.5 stafflinethickness, angle (z23 - z22) - 90);
-
-       z24 = z22 - .75 stafflinethickness * unitvector (z23 - z22);
-       z25 = z23 + .75 stafflinethickness * unitvector (z23 - z22);
-
-       fill z23r
-            .. z25
-            .. z23l
-            -- z22l
-            .. z24
-            .. z22r
-            -- z23r
-            .. cycle;
-
-       penlabels (22, 23);
-       labels (24, 25);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat");
-       set_char_box (0, 1.6 staff_space#, 
-                     0.6 staff_space#, 1.9 staff_space#);
-
-       % This is a modified version of `draw_meta_flat'.
-
-       save crook_thinness, crook_fatness;
-       save bottom_overshoot, bot_crook_dir;
-       save top_stem_thick, bottom_stem_thick, hair, smaller_hole;
-       save top_crook_thinness;
-       save zwiep;
-       save center;
-       pair center, bot_crook_dir;
-       save clearing, wid;
-       save pat;
-       path pat;
-
-       clearxy;
-
-       wid = w / 2;
-
-       % the stem shouldn't reach the top staff line.
-       %% TODO: should take from height.
-       %
-       % TODO: parameterize this
-       %
-       if wid >= 0.75 staff_space:
-               smaller_hole = 0.35 stafflinethickness;
-       else:
-               smaller_hole = 0;
-       fi;
-       clearing = 1.7 stafflinethickness;
-       crook_thinness = .7 stafflinethickness + .06 staff_space;
-       crook_fatness = 0.31 staff_space;
-       top_crook_thinness = 1 stafflinethickness + .065 staff_space;
-       bottom_overshoot = stafflinethickness;
-
-       bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#;
-       top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#;
-       define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick);
-
-       if odd (top_stem_thick - bottom_stem_thick):
-               top_stem_thick := top_stem_thick - 1;
-       fi;
-
-       center = (0, 0);
-
-       x1l = hround (-.5 top_stem_thick);
-       y1 = vround (2 staff_space - clearing);
-       x2l = hround (-.5 bottom_stem_thick);
-       y2 = -.5 staff_space - .5 stafflinethickness;
-
-       penpos1 (top_stem_thick, 0);
-       penpos2 (bottom_stem_thick, 0);
-
-       y3l = vfloor ((staff_space - stafflinethickness) / 2);
-       z3l = whatever [z2r, z1r];
-       z3r = .3 [z2r, z1r] + (smaller_hole, 0);
-       x3r := hceiling x3r;
-
-       z10 = whatever [z2r, z1r] + (smaller_hole, 0);
-       y10 = -1/10 staff_space;
-       x10 := hceiling x10;
-
-       x11 = bottom_overshoot / 3;
-       y11 = -vround (.5 (staff_space + stafflinethickness)
-                      + bottom_overshoot);
-
-       penpos4 (whatever, 53);
-
-       y4l - y4r = top_crook_thinness;
-       y5r = .15 staff_space;
-       x5l = hround (wid);
-       y4 = staff_space / 2;
-       x4r = .45 [x5r, x3r];
-       y4l := vround y4l;
-
-       penpos5 (crook_fatness, -175);
-
-       bot_crook_dir = unitvector ((x5l, 0) - z11);
-       z8 = z11 + whatever * bot_crook_dir;
-       y8 = -staff_space / 2;
-
-       z7 = z8
-            + whatever * bot_crook_dir
-            + crook_thinness * (bot_crook_dir rotated 90);
-       x7 = .1 [x3r, x8];
-
-       pat := z3r{z3r - z10}
-              .. z4r{right}
-              .. z5r{down}
-              .. z7{-bot_crook_dir}
-              & z7
-              .. z10{z3r - z10}
-              -- cycle;
-       unfill pat;
-       unfill pat xscaled -1;
-
-       pat := z11{right}
-              .. z8{bot_crook_dir}
-              .. z5l{up}
-              .. z4l{left}
-              .. z3l;
-       fill pat
-            -- simple_serif (z1r, z1l, 30)
-            -- reverse pat xscaled -1 shifted (-feta_eps, 0)
-            -- cycle;
-
-       currentpicture := currentpicture shifted (w/2, 0);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Semi flat", "mirroredflat");
-       set_char_box (1.2 stafflinethickness#, .8 staff_space#,
-                     0.6 staff_space#, 1.9 staff_space#);
-
-       draw_meta_flat (0, w, 0.31 staff_space, false, false);
-       currentpicture := currentpicture xscaled -1 shifted (w - b, 0);
-fet_endchar;
-
-
-fet_beginchar ("Semi flat", "mirroredflat.backslash");
-       set_char_box (.4 staff_space#, .8 staff_space#,
-                     0.6 staff_space#, 1.9 staff_space#);
-
-       draw_meta_flat (0, w, 0.31 staff_space, false, false);
-
-       clearxy;
-
-       save slope, slash_width;
-       slope = 0.5;
-       slash_width = w;
-
-       z11 = (0, h / 2);
-       z12 = z11 - (slash_width, slash_width * slope) / 2;
-       z13 = z11 + (slash_width, slash_width * slope) / 2;
-       penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90);
-       penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90);
-
-       z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12);
-       z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12);
-
-       fill z13r
-            .. z15
-            .. z13l
-            -- z12l
-            .. z14
-            .. z12r
-            -- z13r
-            .. cycle;
-
-       currentpicture := currentpicture xscaled -1 shifted (w - b, 0);
-
-       labels (1, 2, 3);
-fet_endchar;
-
-
-fet_beginchar ("Double Flat", "flatflat");
-       save left_wid, overlap, right_wid;
-
-       left_wid = .7;
-       right_wid = .8;
-       overlap = .05;
-
-       set_char_box (1.2 stafflinethickness#,
-                     (left_wid + right_wid - overlap) * staff_space#,
-                     .6 staff_space#, 1.9 staff_space#);
-       draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space,
-                       false, false);
-       draw_meta_flat (hround ((left_wid - overlap) * staff_space),
-                       right_wid * staff_space, 1/3 staff_space,
-                       false, false);
-fet_endchar;
-
-
-fet_beginchar ("3/4 Flat", "flatflat.slash");
-       save left_wid, overlap, right_wid;
-
-       left_wid = .7;
-       right_wid = .8;
-       overlap = .05;
-
-       set_char_box (1.2 stafflinethickness#,
-                     (left_wid + right_wid - overlap) * staff_space#,
-                     .6 staff_space#, 1.9 staff_space#);
-       draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space,
-                       false, false);
-       draw_meta_flat (hround ((left_wid - overlap) * staff_space),
-                       right_wid * staff_space, 1/3 staff_space,
-                       false, false);
-
-       %% maybe we should clip part of the stems?
-       %% or make the 1st flat smaller?
-       %% or reverse it?
-       pickup pencircle scaled 2 stafflinethickness;
-
-       z12 = round (-.25 w - b, .55 staff_space) + feta_offset;
-       z13 = round (.75 w, 1.45 staff_space) + feta_offset;
-       penpos12 (2 stafflinethickness, angle (z13 - z12) - 90);
-       penpos13 (2 stafflinethickness, angle (z13 - z12) - 90);
-
-       z14 = z12 - stafflinethickness * unitvector (z13 - z12);
-       z15 = z13 + stafflinethickness * unitvector (z13 - z12);
-
-       fill z13r
-            .. z15
-            .. z13l
-            -- z12l
-            .. z14
-            .. z12r
-            -- z13r
-            .. cycle;
-
-       penlabels (12, 13);
-       labels (14, 15);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Double Sharp", "doublesharp");
-       save klaverblad, klaversteel;
-       save pat;
-       path pat;
-
-       klaversteel = 1/15 staff_space;
-       klaverblad = .4 staff_space - .5 stafflinethickness;
-
-       set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#);
-
-       z1 = (klaversteel, 0);
-       z2 = (w / 2 - klaverblad / 10, h - klaverblad);
-       z3 = (w / 2, h);
-       z4 = z2 reflectedabout ((0, 0), (1, 1));
-       z5 = z1 reflectedabout ((0, 0), (1, 1));
-
-       labels (1, 2, 3, 4, 5);
-
-       pickup pencircle scaled blot_diameter;
-
-       x2 := hfloor (rt x2) - blot_diameter / 2;
-       x3 := hfloor (rt x3) - blot_diameter / 2;
-       y3 := vfloor (top y3) - blot_diameter / 2;
-       y4 := vfloor (top y4) - blot_diameter / 2;
-
-       pat = (rt z1){dir45}
-             .. {right}(bot z2)
-             .. rt z2
-             -- rt z3{z3 - z2}
-             .. top z3{z4 - z3}
-             -- top z4{z4 - z3}
-             .. (lft z4){down}
-             .. {dir 225}(top z5);
-       pat := pat
-              -- reverse pat xscaled -1 shifted (-feta_eps, 0);
-
-       % assure symmetry -- it's more important to center the glyph on the
-       % staff line than centering it between staff lines, so we use
-       % feta_shift, not feta_space_shift.
-       h := h + feta_shift;
-
-       fill pat shifted (0, feta_shift)
-            -- reverse pat yscaled -1 shifted (0, -feta_eps)
-            -- cycle;
-
-       % ugh
-       currentpicture := currentpicture shifted (hround (w / 2), 0);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-def draw_paren =
-       save leftindent;
-
-       leftindent := .2 staff_space;
-
-       set_char_box (0, .5 staff_space# + stafflinethickness#,
-                     staff_space#, staff_space#);
-
-       d := d - feta_shift;
-
-       z1 = (leftindent, h);
-       z2 = (w - stafflinethickness, .5 (h - d));
-       z3 = (leftindent, -d);
-
-       penpos1 (stafflinethickness, 35);
-       penpos2 (.1 staff_space + stafflinethickness, 0);
-       penpos3 (stafflinethickness, -35);
-
-       fill z2l{down}
-            .. simple_serif (z3l, z3r, 90)
-            .. z2r{up}
-            .. simple_serif (z1r, z1l, 90)
-            .. z2l{down}
-            -- cycle;
-enddef;
-
-
-fet_beginchar ("Right Parenthesis", "rightparen");
-       draw_paren;
-       penlabels (1, 2, 3);
-
-       remember_pic := currentpicture;
-
-       draw_staff (-2, 2, 0);
-fet_endchar;
-
-
-draw_shifted_too;
-
-
-fet_beginchar ("Left Parenthesis", "leftparen");
-       draw_paren;
-
-       currentpicture := currentpicture xscaled -1;
-
-       set_char_box (charwd, charbp, chardp, charht);
-fet_endchar;
-
-fet_endgroup ("accidentals");
diff --git a/mf/feta-trills.mf b/mf/feta-trills.mf
new file mode 100644 (file)
index 0000000..3b0789b
--- /dev/null
@@ -0,0 +1,325 @@
+% Feta (not the Font-En-Tja) music font --  implement trill symbols
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+%
+%
+% LilyPond 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.
+%
+% 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/>.
+
+% this file is included by feta-scripts.mf
+
+trill_thin# = 0.1 staff_space# + 0.6 stafflinethickness#;
+trill_stemwidth# = trill_thin#;
+define_pixels (trill_thin);
+define_whole_blacker_pixels (trill_stemwidth);
+
+trill_thick = 1/2 staff_space;
+trill_overlap = 1/6 staff_space;
+
+trill_width# = 5/6 staff_space#;
+trill_height# = 1/2 staff_space#;
+define_pixels (trill_height);
+define_whole_pixels (trill_width);
+
+pair trill_ne;
+trill_ne := unitvector ((2, 3));
+
+
+%
+% The trill element sticks out on both the left and right side
+% of the normal bbox, so you can glue them together easily.
+%
+% `ending' is either 0 for none, 1 for left, or 2 for right.
+%
+
+def draw_trillelement (expr offset, ending) =
+       clearxy;
+
+begingroup;
+       save nw, pat, nw_dist, ne_dist;
+       pair nw, nw_dist, ne_dist;
+       path pat;
+
+       pickup pencircle scaled trill_thin;
+
+       x1 = -.5 trill_width;
+       y1 = 0;
+       z3 = whatever * trill_ne + z1;
+       top y3 = vround trill_height;
+       z2 = z3 - (trill_thick - trill_thin) * trill_ne;
+
+       bot z3' = (top z3) scaled -1;
+
+       nw = unitvector (z2 - z3');
+       ne_dist = (nw rotated -90) * 0.5 trill_thin;
+       nw_dist = (trill_ne rotated 90) * 0.5 trill_thin;
+
+       z5 = whatever * trill_ne + (z1 - nw_dist);
+       z5 = whatever * nw + (z3' - ne_dist);
+
+       pat := z5
+              -- (z1 - nw_dist){-trill_ne}
+              -- (z1 + nw_dist){trill_ne}
+              -- (z3 + nw_dist){trill_ne}
+              .. top z3{right}
+              .. (z3 + ne_dist){-nw};
+       pat := pat
+              -- pat scaled -1 shifted (-feta_eps, -feta_eps)
+              -- cycle;
+       pat := pat shifted (offset, 0);
+       fill pat;
+
+       z4 = z1 - trill_ne * trill_overlap;
+       x4 := hround (x4 + 0.5 trill_thin) - 0.5 trill_thin;
+
+       pat := (z4 - nw_dist){-trill_ne}
+              .. bot z4{left}
+              .. lft z4{up}
+              .. (z4 + nw_dist){trill_ne}
+              -- (z1 + nw_dist){trill_ne}
+              -- (z1 - nw_dist){-trill_ne}
+              -- cycle;
+
+       if ending = 1:
+               fill pat shifted (offset, 0);
+       elseif ending = 2:
+               pat := pat scaled -1 shifted (-feta_eps, -feta_eps);
+                fill pat shifted (offset, 0);
+       fi;
+endgroup;
+enddef;
+
+
+fet_beginchar ("trilelement", "trilelement");
+       set_char_box (.5 trill_width#, .5 trill_width#,
+                     trill_height#, trill_height#);
+
+       draw_trillelement (0, 0);
+       labels (1, 2, 3, 3', 4, 5, 5');
+fet_endchar;
+
+
+fet_beginchar ("prall", "prall");
+       set_char_box (trill_width#, trill_width#,
+                     trill_height#, trill_height#);
+
+       draw_trillelement (-hround (.5 trill_width), 1);
+       draw_trillelement (-hround (.5 trill_width) + trill_width, 2);
+fet_endchar;
+
+
+fet_beginchar ("mordent", "mordent");
+       set_char_box (trill_width#, trill_width#,
+                     4/3 trill_height#, 4/3 trill_height#);
+
+       draw_trillelement (-hround (.5 trill_width), 1);
+       draw_trillelement (-hround (.5 trill_width) + trill_width, 2);
+
+       clearxy;
+
+       pickup pencircle scaled trill_stemwidth;
+
+       top y1 = h;
+       bot y2 = -d;
+       x1 = x2;
+       x2 = 0;
+
+       draw_gridline (z2, z1, trill_stemwidth);
+
+       labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("prallprall", "prallprall");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     trill_height#, trill_height#);
+
+       draw_trillelement (-trill_width, 1);
+       draw_trillelement (0, 0);
+       draw_trillelement (trill_width, 2);
+fet_endchar;
+
+
+fet_beginchar ("prallmordent", "prallmordent");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     4/3 trill_height#, 4/3 trill_height#);
+
+       draw_trillelement (-trill_width, 1);
+       draw_trillelement (0, 0);
+       draw_trillelement (trill_width, 2);
+
+       clearxy;
+
+       pickup pencircle scaled trill_stemwidth;
+
+       top y1 = h;
+       bot y2 = -d;
+       x1 = x2 ;
+       x2 = good.x (.5 trill_width);
+
+       draw_gridline (z2, z1, trill_stemwidth);
+
+       labels (1, 2);
+fet_endchar;
+
+
+save remember_pic;
+picture remember_pic;
+
+
+fet_beginchar ("upprall", "upprall");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     trill_height#, trill_height#);
+
+       draw_trillelement (-trill_width, 1);
+       draw_trillelement (0, 0);
+       draw_trillelement (trill_width, 2);
+
+       z11 = z4 shifted (-trill_width, 0);
+       z12 = z11 + (0, -2 trill_height);
+
+       penpos11 (trill_thin, angle (trill_ne) - 90);
+       penpos12 (trill_thin, angle (trill_ne yscaled -1) + 90);
+       penlabels (11, 12);
+
+       pickup pencircle scaled trill_stemwidth;
+
+       fill z11l{-trill_ne}
+            .. z12l{trill_ne yscaled -1}
+            .. bot z12
+            .. rt z12
+            .. z12r{-trill_ne yscaled -1}
+            .. z11r{trill_ne}
+            -- cycle;
+
+       remember_pic := currentpicture;
+fet_endchar;
+
+
+fet_beginchar ("upmordent", "upmordent");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     4/3 trill_height#, 4/3 trill_height#);
+
+       currentpicture := remember_pic;
+
+       clearxy;
+
+       pickup pencircle scaled trill_stemwidth;
+
+       top y1 = h;
+       bot y2 = -d;
+       x1 = x2;
+       x2 = good.x (.5 trill_width);
+
+       draw_gridline (z2, z1, trill_stemwidth);
+
+       labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("pralldown", "pralldown");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     trill_height#, trill_height#);
+
+       currentpicture := remember_pic xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("downprall", "downprall");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     trill_height#, trill_height#);
+
+       draw_trillelement (-trill_width, 1);
+       draw_trillelement (0, 0);
+       draw_trillelement (trill_width, 2);
+
+       z11 = z4 shifted (-trill_width, 0);
+       z12 = z11 + (0, 2 trill_height);
+
+       penpos11 (trill_thin, angle (trill_ne xscaled -1) - 90);
+       penpos12 (trill_thin, angle (trill_ne) - 90);
+       penlabels (11, 12);
+
+       pickup pencircle scaled trill_stemwidth;
+
+       fill z11l{trill_ne xscaled -1}
+            .. z12l{trill_ne}
+            .. top z12
+            .. rt z12
+            .. z12r{-trill_ne}
+            .. z11r{-trill_ne xscaled -1}
+            -- cycle;
+
+       remember_pic := currentpicture;
+fet_endchar;
+
+
+fet_beginchar ("downmordent", "downmordent");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     4/3 trill_height#, 4/3 trill_height#);
+
+       currentpicture := remember_pic;
+
+       clearxy;
+
+       pickup pencircle scaled trill_stemwidth;
+
+       top y1 = h;
+       bot y2 = -d;
+       x1 = x2;
+       x2 = good.x (.5 trill_width);
+
+       draw_gridline (z2, z1, trill_stemwidth);
+
+       labels (1, 2);
+fet_endchar;
+
+
+fet_beginchar ("prallup", "prallup");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     trill_height#, trill_height#);
+
+       currentpicture := remember_pic xscaled -1;
+fet_endchar;
+
+
+fet_beginchar ("lineprall", "lineprall");
+       set_char_box (1.5 trill_width#, 1.5 trill_width#,
+                     trill_height#, 4 trill_height#);
+
+       draw_trillelement (-trill_width, 1);
+
+       labels (1, 2, 3, 3', 4, 5, 5');
+
+       pickup pencircle scaled trill_stemwidth;
+
+       penpos10 (trill_stemwidth, 0);
+       penpos11 (trill_stemwidth, 0);
+
+       x10l = x4 - .5 trill_thin - trill_width;
+       y10 = y4;
+       z11 = z10 + (0, h);
+
+       penlabels (10, 11);
+
+       fill z11l
+            .. top z11
+            .. z11r
+            -- z10r
+            -- z10l
+            -- cycle;
+
+       draw_trillelement (0, 0);
+       draw_trillelement (trill_width, 2);
+fet_endchar;
index b886e6c49692e28eea93ed6332ad721a06afa432..36fe12e05017a8d61563f64471e31c777cde99ea 100644 (file)
@@ -38,12 +38,12 @@ font_x_height staff_space#;
 fet_beginfont ("parmesan", design_size, "parmesanMusic");
        if test = 0:
                input parmesan-rests;
-               input parmesan-heads;
+               input parmesan-noteheads;
                input parmesan-clefs;
                input parmesan-custodes
                input parmesan-accidentals;
                input parmesan-flags;
-               input parmesan-timesig;
+               input parmesan-timesignatures;
                input parmesan-scripts;
                input parmesan-dots;
        else:
diff --git a/mf/parmesan-heads.mf b/mf/parmesan-heads.mf
deleted file mode 100644 (file)
index 6b993a0..0000000
+++ /dev/null
@@ -1,1503 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  ancient note heads
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
-% 
-% Neo-mensural heads originally by
-% Christian Mondrup and Mats Bengtsson
-% 
-%
-% LilyPond 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.
-%
-% 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/>.
-
-save black_notehead_width;
-numeric black_notehead_width;
-
-fet_begingroup ("noteheads");
-
-%
-% character aligment:
-%
-%   The head is assumed to be vertically centered around (0, 0).
-%   The left-most edge of the head should touch the vertical line
-%   that goes though the point (0, 0).
-%
-% set_char_box() conventions:
-%
-% * breapth: Ignored (as far as I know).  Should be set to 0.
-%
-% * width: Should match the head's width.
-%
-% * depth: Should match the bottom edge of the head.  Affects vertical
-%   collision handling.
-%
-% * height: Should match the top edge of the head.  Affects vertical
-%   collision handling.
-%
-% TODO: should depth/height include appendages/stems?
-
-overdone_heads = 0;
-noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
-define_pixels (noteheight);
-
-
-%%%%%%%%
-%
-%
-%
-% MENSURAL NOTATION
-%
-%
-%
-
-def draw_neomensural_brevis (expr brevwid) =
-       save beamheight, head_width;
-       save holeheight, stem_width;
-       save serif_size, serif_protrude;
-
-       head_width# = brevwid;
-       holeheight = 3 stafflinethickness;
-       stem_width = 1.4 stafflinethickness;
-
-       define_pixels (head_width);
-
-       set_char_box (0, head_width#,
-                     noteheight# / 2, noteheight# / 2);
-       
-       2 beamheight + holeheight = noteheight;
-       serif_size = (holeheight - stafflinethickness) / 2;
-       serif_protrude = 1.5 serif_size;
-
-       z1l = (0, 0);
-       z2l = (0, -stafflinethickness / 2);
-       z3r = z2r + serif_size * (1, -1);
-       y4r = y3r;
-       x4r = head_width / 2;
-       z5l = z3l + (-serif_size, -serif_protrude);
-
-       penpos1 (stem_width, 0);
-       penpos2 (stem_width, 0);
-       penpos3 (beamheight, 90);
-       penpos4 (beamheight, 90);
-       penpos5 (stem_width, 180);
-
-       save pat_in, pat_out;
-       path pat_in, pat_out;
-
-       pat_out := z4l
-                  -- z3l{left}
-                  .. z5l{down}
-                  .. z5r{up}
-                  -- z1l;
-       pat_out := pat_out
-                  -- reverse pat_out yscaled -1;
-       pat_out := pat_out
-                  -- reverse pat_out shifted (-x4r, 0)
-                                     xscaled -1
-                                     shifted (x4l, 0)
-                  -- cycle;
-       fill pat_out;
-
-       pat_in := z4r
-                 -- z3r{left}
-                 .. z2r{up}
-                 -- z1r;
-       pat_in := pat_in
-                 -- reverse pat_in yscaled -1;
-       pat_in := pat_in
-                 -- reverse pat_in shifted (-x4r, 0)
-                                   xscaled -1
-                                   shifted (x4l, 0)
-                 -- cycle;
-       unfill pat_in;
-
-       penlabels (1, 2, 3, 4, 5);
-enddef;
-
-
-%%% This head does not seem to be used anywhere.  Junk me?  -- jr
-def draw_neomensural_left_stemmed_head (expr wid) =
-       draw_neomensural_brevis (wid);
-
-       x6 = x7 = stem_width / 2;
-       y6 = y5;
-       y7 = y5 - 2.25 staff_space;
-
-       z17 = (x7, y7 - stem_width / 2);
-
-       penpos6 (stem_width, 0);
-       penpos7 (stem_width, 0);
-
-       fill z7l
-            -- z6l
-            -- z6r
-            -- z7r
-            .. z17
-            .. cycle;
-
-       penlabels (6, 7);
-       labels (17);
-enddef;
-
-
-%%% This head does not seem to be used anywhere.  Junk me?  -- jr
-fet_beginchar ("Left stemmed notehead", "slneomensural");
-       draw_neomensural_left_stemmed_head (2 staff_space#);
-fet_endchar;
-
-
-%
-% Some sources (eg. Musix/OpusTeX) think that the appendage should be on
-% the left, some say right.  Right wins democratically.
-%
-def draw_neomensural_longa (expr wid) =
-       draw_neomensural_brevis (wid);
-
-       save theta;
-
-       x7r = head_width;
-       y7 = y5;
-       z6 - z7 = (stem_width / 2, -staff_space);
-       theta = angle (z6 - z7) + 90;
-
-       penpos7 (stem_width, 0);
-       penpos6 (1.2 stem_width, theta);
-       
-       z7' = find_tangent (z6l, pat_out,
-                           (x7l + 0.5 stem_width, y7l),
-                           (x7l - 0.5 stem_width, y7l));
-
-       fill z7r
-            .. z6r{z6 - z7}
-            .. {z7 - z6}z6l
-            -- z7'
-            -- cycle;
-
-       penlabels (6, 7);
-       labels (7');
-enddef;
-
-
-%
-% En wij presenteren U: de opvolgster van Emily
-%
-% (ze is wel breed)
-% 
-fet_beginchar ("Neo-mensural maxima notehead", "sM3neomensural");
-       draw_neomensural_longa (2.6 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural longa notehead", "sM2neomensural");
-       draw_neomensural_longa (2 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural brevis notehead", "sM1neomensural");
-       draw_neomensural_brevis (2 staff_space#);
-fet_endchar;
-
-
-def draw_neomensural_black_head (expr wid, height) =
-       save head_width;
-       save ne, nw, ne_dist, nw_dist;
-       pair ne, nw, ne_dist, nw_dist;
-
-       head_width# = wid;
-
-       set_char_box (0, head_width#,
-                     height / 2, height / 2);
-       
-       charwx := head_width# / 2;
-       charwy := height / 2;
-
-       y3 = y1 = 0;
-       x2 = x4 = (x1 + x3) / 2;
-
-       pickup pencircle scaled blot_diameter;
-
-       top y2 = h;
-       bot y4 = -d;
-       lft x1 = 0;
-       rt x3 = w;
-
-       ne := unitvector (z2 - z1);
-       nw_dist := (ne rotated 90) * 0.5 blot_diameter;
-       nw := unitvector (z2 - z3);
-       ne_dist := (nw rotated -90) * 0.5 blot_diameter;
-
-       fill lft z1{up}
-            .. (z1 + nw_dist){ne}
-            -- (z2 + nw_dist){ne}
-            .. top z2{right}
-            .. (z2 + ne_dist){-nw}
-            -- (z3 + ne_dist){-nw}
-            .. rt z3{down}
-            .. (z3 - nw_dist){-ne}
-            -- (z4 - nw_dist){-ne}
-            .. bot z4{left}
-            .. (z4 - ne_dist){nw}
-            -- (z1 - ne_dist){nw}
-            .. cycle;
-
-       labels (1, 2, 3, 4);
-enddef;
-
-
-def draw_neomensural_open_head (expr wid, height)=
-       draw_neomensural_black_head (wid, height);
-
-       save diamNW, diamSW;
-
-       diamNW = length (z2 - z1) + blot_diameter;
-       diamSW = length (z4 - z1) + blot_diameter;
-       
-       save hole_widthNW, hole_widthSW;
-
-       hole_widthNW = 0.34 diamNW ;
-       hole_widthSW + 2.6 linethickness = diamSW;
-
-       (z7 + z5) / 2 = (w / 2, 0);
-       (z8 + z6) / 2 = (w / 2, 0);
-       z6 - z5 = hole_widthNW * unitvector (z2 - z1);
-       z7 - z6 = hole_widthSW * unitvector (z4 - z1);
-
-       unfill z5
-              -- z6
-              -- z7
-              -- z8
-              -- cycle;
-
-       labels (5, 6, 7, 8);
-enddef;
-
-
-%
-% WL says the thin lines should be thinner.
-%
-fet_beginchar ("Harmonic notehead (Neo-mensural open)", "s0harmonic");
-       draw_neomensural_open_head (1.3 staff_space#, 1.3 noteheight#);
-       charwx := head_width#;
-       charwy := 0;
-fet_endchar;
-
-
-fet_beginchar ("Harmonic notehead (Neo-mensural black)", "s2harmonic");
-       draw_neomensural_black_head (1.3 staff_space#, 1.3 noteheight#);
-       charwx := head_width#;
-       charwy := 0;
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural semibrevis head", "s0neomensural");
-       draw_neomensural_open_head (staff_space#, noteheight#);
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural minima head", "s1neomensural");
-       draw_neomensural_open_head (staff_space#, noteheight#);
-fet_endchar;
-
-
-fet_beginchar ("Neo-mensural semiminima head", "s2neomensural");
-       draw_neomensural_black_head (staff_space#, noteheight#);
-fet_endchar;
-
-
-def draw_mensural_brevis (expr wid) =
-       % TODO.  For the moment, fall back to draw_neomensural_brevis.
-       draw_neomensural_brevis (wid);
-enddef;
-
-
-%%% This head does not seem to be used anywhere.  Junk me?  -- jr
-def draw_mensural_left_stemmed_head (expr wid) =
-       draw_mensural_brevis (wid);
-
-       x6 = x7 = stem_width / 2;
-       y6 = y5;
-       y7 = y5 - 2.25 staff_space;
-
-       z17 = (x7, y7 - stem_width / 2);
-
-       penpos6 (stem_width, 0);
-       penpos7 (stem_width, 0);
-
-       fill z7l
-            -- z6l
-            -- z6r
-            -- z7r
-            .. z17
-            .. cycle;
-
-       penlabels (6, 7);
-       labels (17);
-enddef;
-
-
-def draw_mensural_longa (expr wid) =
-       draw_mensural_brevis (wid);
-
-       x6 = x7 = head_width - stem_width / 2;
-       y6 = y5;
-       y7 = y5 - 2.25 staff_space;
-
-       z17 = (x7, y7 - stem_width / 2);
-
-       penpos6 (stem_width, 0);
-       penpos7 (stem_width, 0);
-
-       fill z7l
-            -- z6l
-            -- z6r
-            -- z7r
-            .. z17
-            .. cycle;
-
-       penlabels (6, 7);
-       labels (17);
-enddef;
-
-
-%%% This head does not seem to be used anywhere.  Junk me?  -- jr
-fet_beginchar ("Mensural left stemmed notehead", "slmensural");
-       draw_mensural_left_stemmed_head (staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Mensural maxima notehead", "sM3mensural");
-       draw_mensural_longa (2.0 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Mensural longa notehead", "sM2mensural");
-       draw_mensural_longa (staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Mensural brevis notehead", "sM1mensural");
-       draw_mensural_brevis (staff_space#);
-fet_endchar;
-
-
-def draw_diamond_head (expr head_h, pen_w, pen_h, angle, open) =
-       save head_width, head_height;
-       save ellipse, ellipse_r;
-       path ellipse, ellipse_r, diamond_shape;
-
-       head_height# = head_h;
-       head_width# / head_height# = tand (angle);
-
-       set_char_box (0, head_width#,
-                     head_height# / 2, head_height# / 2);
-
-       charwx := head_width# / 2;
-       charwy := head_height# / 2 - linethickness#;
-
-       define_pixels (head_width, head_height);
-
-       ellipse := reverse fullcircle
-                    xscaled (max (blot_diameter, pen_w * head_width))
-                    yscaled (max (blot_diameter, pen_h * head_width))
-                    rotated -angle;
-
-       z1 = find_tangent_shift (((0, h) -- (0, -h)), ellipse,
-                                (0, 0), (w / 2, 0));
-       z2 = find_tangent_shift (((0, h) -- (w, h)), ellipse,
-                                (w / 2, h), (w / 2, 0));
-       z3 = find_tangent_shift (((w, h) -- (w, -h)), ellipse,
-                                (w, 0), (w / 2, 0));
-       z4 = find_tangent_shift (((0, -h) -- (w, -h)), ellipse,
-                                (w / 2, -h), (w / 2, 0));
-
-       diamond_shape := get_subpath (ellipse, z1 - z4, z2 - z1, z1)
-                        -- get_subpath (ellipse, z2 - z1, z3 - z2, z2)
-                        -- get_subpath (ellipse, z3 - z2, z4 - z3, z3)
-                        -- get_subpath (ellipse, z4 - z3, z1 - z4, z4)
-                        -- cycle;
-       fill diamond_shape;
-
-       if open:
-               save l;
-               path l[];
-
-               l12 := (directionpoint (z1 - z2) of ellipse) shifted z1
-                       -- (directionpoint (z1 - z2) of ellipse) shifted z2;
-               l23 := (directionpoint (z2 - z3) of ellipse) shifted z2
-                       -- (directionpoint (z2 - z3) of ellipse) shifted z3;
-               l34 := (directionpoint (z3 - z4) of ellipse) shifted z3
-                       -- (directionpoint (z3 - z4) of ellipse) shifted z4;
-               l41 := (directionpoint (z4 - z1) of ellipse) shifted z4
-                       -- (directionpoint (z4 - z1) of ellipse) shifted z1;
-
-               unfill l12 intersectionpoint l23
-                      -- l23 intersectionpoint l34
-                      -- l34 intersectionpoint l41
-                      -- l41 intersectionpoint l12
-                      -- cycle;
-       fi;
-
-       labels (1, 2, 3, 4);
-enddef;
-
-
-fet_beginchar ("Mensural semibrevis head", "s0mensural");
-       draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
-fet_endchar;
-
-
-fet_beginchar ("Mensural minima head", "s1mensural");
-       draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
-fet_endchar;
-
-
-fet_beginchar ("Mensural semiminima head", "s2mensural");
-       draw_diamond_head (staff_space#, 0.15, 0.30, 30, false);
-fet_endchar;
-
-
-fet_beginchar ("Petrucci semibrevis head", "s0petrucci");
-%      draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, true);
-       draw_neomensural_open_head (staff_space#, 1.8 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Petrucci minima head", "s1petrucci");
-%      draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, true);
-       draw_neomensural_open_head (staff_space#, 1.8 staff_space#);
-fet_endchar;
-
-
-fet_beginchar ("Petrucci semiminima head", "s2petrucci");
-%      draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, false);
-       draw_neomensural_black_head (staff_space#, 1.8 staff_space#);
-fet_endchar;
-
-
-%%%%%%%%
-%
-%
-%
-% EDITIO VATICANA (including solesmes extensions)
-%
-%
-%
-
-def vat_punctum_char (expr verbose_name, internal_name,
-                          linea, cavum, straight, auctum,
-                          d_up, up_shift, down_shift, mag) =
-       fet_beginchar (verbose_name, "s" & internal_name);
-               save a_b, b_h, a_w;
-
-               a_b := 1.54; % b_h * a_b / a_w = wd / ht
-               b_h := 0.85;
-               a_w := 1.09;
-
-               save a, beta, ht, wd;
-
-               ht# = noteheight# * mag;
-               2 beta = ht# * b_h;
-               a = beta * a_b;
-               wd# = 2 a / a_w;
-               black_notehead_width# := wd#;
-
-               % direction
-               save d_, d_sign;
-               pair d_;
-
-               if d_up:
-                       d_ := up;
-                       d_sign := 1;
-               else:
-                       d_ := down;
-                       d_sign := -1;
-               fi;
-
-               % convexity and eccentricity
-               save u_convexity, u_eccentricity;
-
-               if straight:
-                       u_convexity# := -0.01 ht#;
-                       u_eccentricity# := 0.0 ht#; % dummy
-               elseif auctum:
-                       u_convexity# := -0.03 ht#;
-                       u_eccentricity# := +0.25 ht#;
-               else:
-                       u_convexity# := -0.05 ht#;
-                       u_eccentricity# := 0.0 ht#; % dummy
-               fi;
-
-               save convexity, eccentricity;
-
-               convexity# := d_sign * u_convexity#;
-               eccentricity# := d_sign * u_eccentricity#;
-
-               % y shift offset
-               save yoffs;
-
-               if up_shift:
-                       yoffs# := 0.08 ht#;
-               elseif down_shift:
-                       yoffs# := -0.11 ht#;
-               else:
-                       yoffs# := 0.00 ht#;
-               fi;
-
-               define_pixels (convexity, eccentricity, yoffs, ht, wd);
-
-               pickup pencircle scaled linethickness;
-
-               save height, yoffs_bt, p, circle, circle_r;
-               path p, circle, circle_r;
-
-               height# = 0.47 ht#;
-               yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
-
-               define_pixels (height, yoffs_bt);
-
-               circle := fullcircle scaled linethickness;
-
-               x1 = x6;
-               x2 = x5;
-               x3 = x4;
-               y1 + height = y6;
-               y2 + height = y5;
-               y3 + height = y4;
-
-               save box_top, box_bt;
-
-               if auctum:
-                       z1 = (0.00 wd + linethickness / 2, yoffs_bt);
-                       z2 = (0.21 wd, yoffs_bt + convexity);
-                       z3 = (0.42 wd - linethickness/ 2,
-                             yoffs_bt + eccentricity);
-                       box_top# = height# + yoffs_bt# +
-                                    max (0, convexity#, eccentricity#);
-                       box_bt# = yoffs_bt# +
-                                    min (0, convexity#, eccentricity#);
-                       p = z1
-                           .. {right}z2
-                           .. {d_}z3
-                           -- z4{-d_}
-                           .. z5{left}
-                           .. z6
-                           -- cycle;
-               else:
-                       z1 = (0.00 wd + linethickness / 2, yoffs_bt);
-                       z2 = (0.21 wd, yoffs_bt + convexity);
-                       z3 = (0.42 wd - linethickness / 2, yoffs_bt);
-                       box_top# = height# + yoffs_bt# + max (0, convexity#);
-                       box_bt# = yoffs_bt# + min (0, convexity#);
-                       p = z1
-                           .. z2
-                           .. z3
-                           -- z4
-                           .. z5
-                           .. z6
-                           -- cycle;
-               fi;
-
-               labels (1, 2, 3, 4, 5, 6);
-
-               save dirs;
-               pair dirs[];
-
-               dirs12 := direction (0 + epsilon) of p;
-               dirs2 := direction 1 of p;
-               dirs32 := direction (2 - epsilon) of p;
-               dirs45 := direction (3 + epsilon) of p;
-               dirs5 := direction 4 of p;
-               dirs65 := direction (5 - epsilon) of p;
-
-               fill get_subpath (circle, down, dirs12, z1)
-                    .. (bot z2){dirs2}
-                    .. get_subpath (circle, dirs32, up, z3)
-                    -- get_subpath (circle, up, dirs45, z4)
-                    .. (top z5){dirs5}
-                    .. get_subpath (circle, dirs65, down, z6)
-                    -- cycle;
-
-               if cavum:
-                       save pat, t;
-                       path pat[];
-                       numeric t[];
-
-                       pat123 := ((directionpoint -dirs12 of circle)
-                                   shifted z1){dirs12}
-                                 .. (top z2){dirs2}
-                                 .. {dirs32}((directionpoint -dirs32 of circle)
-                                      shifted z3);
-                       pat34 := lft z3
-                                -- lft z4;
-                       pat456 := ((directionpoint -dirs45 of circle)
-                                   shifted z4){dirs45}
-                                 .. (bot z5){dirs5}
-                                 .. {dirs65}((directionpoint -dirs65 of circle)
-                                      shifted z6);
-                       pat61 := rt z6
-                                -- rt z1;
-
-                       t61 := ypart (pat61 intersectiontimes pat123);
-                       t12 := xpart (pat123 intersectiontimes pat34);
-                       t34 := ypart (pat34 intersectiontimes pat456);
-                       t45 := xpart (pat456 intersectiontimes pat61);
-
-                       unfill subpath (t61, t12) of pat123
-                              -- subpath (t34, t45) of pat456
-                              -- cycle;
-               fi;
-
-               set_char_box (0.00 wd#, 0.42 wd#,
-                             max (0, -box_bt#) + linethickness# / 2,
-                             max (0, box_top#) + linethickness# / 2);
-
-               if linea:
-                       save linea_width, linea_height;
-
-                       linea_width# = 0.6 linethickness#;
-                       linea_height# = 0.7 ht#;
-
-                       define_pixels (linea_width, linea_height);
-
-                       pickup pencircle scaled 0.6 linethickness;
-
-                       draw_rounded_block ((-0.10 wd - linea_width / 2,
-                                            -linea_height / 2),
-                                           (-0.10 wd + linea_width / 2,
-                                            +linea_height / 2),
-                                           0.6 linethickness);
-                       draw_rounded_block ((+0.52 wd - linea_width / 2,
-                                            -linea_height / 2),
-                                           (+0.52 wd + linea_width / 2,
-                                            +linea_height / 2),
-                                           0.6 linethickness);
-
-                       set_char_box (0, 0.62 wd# + linea_width#,
-                                     linea_height# / 2,
-                                     linea_height# / 2);
-
-                       currentpicture := currentpicture
-                               shifted (0.10 wd + linea_width / 2, 0);
-               fi;
-       fet_endchar;
-enddef;
-
-
-def plica_char (expr verbose_name, internal_name,
-                    d_up, mag) =
-       fet_beginchar (verbose_name, "s" & internal_name);
-               save a_b, b_h, a_w;
-
-               a_b := 1.54; % b_h * a_b / a_w = wd / ht
-               b_h := 0.85;
-               a_w := 1.09;
-
-               save a, beta, ht, wd;
-
-               ht# = noteheight# * mag;
-               2 beta = ht# * b_h;
-               a = beta * a_b;
-               wd# = 2 a / a_w;
-               black_notehead_width# := wd#;
-
-               % direction
-               save d_, d_sign;
-               pair d_;
-
-               if d_up:
-                       d_ := up;
-                       d_sign := 1;
-               else:
-                       d_ := down;
-                       d_sign := -1;
-               fi;
-
-               % convexity and eccentricity
-               save convexity, eccentricity;
-
-               convexity# := d_sign * -0.10 ht#;
-               eccentricity# := d_sign * -0.12 ht#;
-
-               % y shift offset
-               save yoffs;
-
-               yoffs# := -0.11 ht#;
-
-               define_pixels (convexity, eccentricity, yoffs, ht, wd);
-
-               pickup pencircle scaled linethickness;
-
-               save height, yoffs_bt, p, circle, circle_r;
-               path p, circle, circle_r;
-
-               height# = 0.47 ht#;
-               yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
-
-               define_pixels (height, yoffs_bt);
-
-               circle := fullcircle scaled linethickness;
-
-               x1 = x6;
-               x2 = x5;
-               x3 = x4;
-               y1 + height = y6;
-               y2 + height = y5;
-               y3 + height = y4;
-
-               save box_top, box_bt;
-
-               z1 = (0.00 wd + linethickness / 2, yoffs_bt);
-               z2 = (0.21 wd, yoffs_bt + convexity);
-               z3 = (0.42 wd - linethickness/ 2, yoffs_bt + eccentricity);
-               box_top# = height# + yoffs_bt# +
-                            max (0, convexity#, eccentricity#);
-               box_bt# = yoffs_bt# +
-                            min (0, convexity#, eccentricity#);
-               p = z1
-                   .. z2{right}
-                   .. z3
-                   -- z4
-                   .. z5{left}
-                   .. z6
-                   -- cycle;
-
-               labels (1, 2, 3, 4, 5, 6);
-
-               save dirs;
-               pair dirs[];
-
-               dirs12 := direction (0 + epsilon) of p;
-               dirs2 := direction 1 of p;
-               dirs32 := direction (2 - epsilon) of p;
-               dirs45 := direction (3 + epsilon) of p;
-               dirs5 := direction 4 of p;
-               dirs65 := direction (5 - epsilon) of p;
-
-               fill get_subpath (circle, down, dirs12, z1)
-                    .. (bot z2){dirs2}
-                    .. get_subpath (circle, dirs32, up, z3)
-                    -- get_subpath (circle, up, dirs45, z4)
-                    .. (top z5){dirs5}
-                    .. get_subpath (circle, dirs65, down, z6)
-                    -- cycle;
-
-               pickup pencircle scaled 0.6 linethickness;
-
-               save stem_bt;
-
-               set_char_box (0.00 wd#, 0.42 wd#,
-                             max (0, -box_bt#) + linethickness# / 2,
-                             max (0, box_top#) + linethickness# / 2);
-
-       fet_endchar;
-enddef;
-
-
-def epiphonus_char (expr verbose_name, internal_name,
-                        left_stem, d_up, down_shift, mag) =
-       fet_beginchar (verbose_name, "s" & internal_name);
-               save a_b, b_h, a_w;
-
-               a_b := 1.54; % b_h * a_b / a_w = wd / ht
-               b_h := 0.85;
-               a_w := 1.09;
-
-               save a, beta, ht, wd;
-
-               ht# = noteheight# * mag;
-               2 beta = ht# * b_h;
-               a = beta * a_b;
-               wd# = 2 a / a_w;
-               black_notehead_width# := wd#;
-
-               % direction
-               save d_, d_sign;
-               pair d_;
-
-               if d_up:
-                       d_ := up;
-                       d_sign := 1;
-               else:
-                       d_ := down;
-                       d_sign := -1;
-               fi;
-
-               % convexity and eccentricity
-               save convexity;
-
-               convexity# := d_sign * -0.05ht#;
-
-               % y shift offset
-               save yoffs;
-
-               if down_shift:
-                       yoffs# := -0.11 ht#;
-               else:
-                       yoffs# := 0.00 ht#;
-               fi;
-
-               define_pixels (convexity, yoffs, ht, wd);
-
-               pickup pencircle scaled linethickness;
-
-               save height, yoffs_bt, p, circle, circle_r;
-               path p, circle, circle_r;
-
-               height# = 0.47 ht#;
-               yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
-
-               define_pixels (height, yoffs_bt);
-
-               circle := fullcircle scaled linethickness;
-
-               x1 = x6;
-               x2 = x5;
-               x3 = x4;
-               y1 + height = y6;
-               y2 + height = y5;
-               y3 + height = y4;
-
-               save box_top, box_bt;
-
-               z1 = (0.00 wd + linethickness / 2, yoffs_bt - 2.5 convexity);
-               z2 = (0.06 wd, yoffs_bt + 1.4 convexity);
-               z3 = (0.42 wd - linethickness / 2, yoffs_bt - 1.0 convexity);
-               box_top# = height# + yoffs_bt# +
-                            max (-1.0 convexity#, 1.4 convexity#, 0);
-               box_bt# = yoffs_bt# +
-                            min (-1.0 convexity#, 1.4 convexity#, 0);
-               p = z1{-d_}
-                   .. {curl 1}z2{right}
-                   .. z3
-                   -- z4
-                   .. {left}z5{curl 1}
-                   .. {d_}z6
-                   -- cycle;
-
-               labels (1, 2, 3, 4, 5, 6);
-
-               save dirs;
-               pair dirs[];
-
-               dirs12 := direction (0 + epsilon) of p;
-               dirs21 := direction (1 - epsilon) of p;
-               dirs23 := direction (1 + epsilon) of p;
-               dirs32 := direction (2 - epsilon) of p;
-               dirs45 := direction (3 + epsilon) of p;
-               dirs54 := direction (4 - epsilon) of p;
-               dirs56 := direction (4 + epsilon) of p;
-               dirs65 := direction (5 - epsilon) of p;
-
-               fill get_subpath (circle, down, dirs12, z1)
-                    .. get_subpath (circle, dirs21, dirs23, z2)
-                    .. get_subpath (circle, dirs32, up, z3)
-                    -- get_subpath (circle, up, dirs45, z4)
-                    .. get_subpath (circle, dirs54, dirs56, z5)
-                    .. get_subpath (circle, dirs65, down, z6)
-                    -- cycle;
-
-               save stem_bt;
-
-               if left_stem:
-                       pickup pencircle scaled 0.6 linethickness;
-
-                       lft x11 = x1 - linethickness / 2;
-                       bot y11 = yoffs - 1.1 ht - linethickness / 2;
-                       x12 = x11;
-                       y12 = y1;
-
-                       draw_rounded_block (bot lft z11, top rt z12,
-                                           0.6 linethickness);
-                       stem_bt# = yoffs# - 1.1 ht#;
-
-                       labels (11, 12);
-               else:
-                       stem_bt# = 0;
-               fi;
-
-               set_char_box (0.00 wd#, 0.42 wd#,
-                             max (0, -box_bt#, -stem_bt#) + linethickness# / 2,
-                             max (0, box_top#) + linethickness# / 2);
-       fet_endchar;
-enddef;
-
-
-def inclinatum_char (expr verbose_name, internal_name,
-                         small, stropha, auctum) =
-       fet_beginchar (verbose_name, "s" & internal_name);
-               save ht, alpha;
-
-               alpha := 35;
-
-               if small:
-                       ht# = 0.50 noteheight#;
-               else:
-                       ht# = 0.80 noteheight#;
-               fi;
-
-               draw_diamond_head (ht#, 0, 0, alpha, false);
-
-               save off_angle;
-
-               off_angle := alpha + 15;
-
-               save stropha_ellipse, auctum_hook, circle;
-               path stropha_ellipse, auctum_hook, circle;
-
-               circle := reverse fullcircle scaled linethickness;
-
-               stropha_ellipse := fullcircle xscaled 0.25 head_height
-                                             yscaled 0.55 head_height
-                                             rotated alpha;
-
-               z11 = z12
-                     + linethickness / 2 * dir (180 - off_angle)
-                     - directionpoint dir (90 - off_angle)
-                         of stropha_ellipse;
-               z12 = directionpoint -dir (90 - off_angle) of diamond_shape +
-                       linethickness / 2 * dir (180 - off_angle);
-               z13 = (0, -0.5 head_height + linethickness);
-
-               auctum_hook := z12{-dir (90 - off_angle)}
-                              .. {dir (90 + alpha)}z13;
-
-               labels (12);
-
-               if (stropha and not auctum):
-                       clearit;
-
-                       save t_in, t_out;
-
-                       t_in := xpart ((stropha_ellipse shifted z11)
-                                      intersectiontimes
-                                      get_subpath (diamond_shape,
-                                                   left, up,
-                                                   (0, 0)));
-                       t_out := xpart ((stropha_ellipse shifted z11)
-                                       intersectiontimes
-                                       get_subpath (diamond_shape,
-                                                    up, right,
-                                                    (0, 0)));
-
-                       % the addition or subtraction of `1' is necessary
-                       % so that we get the right starting point
-                       fill get_subpath_i (diamond_shape,
-                                           dir (angle (z2 - z1) - 1),
-                                           dir (angle (z1 - z4) + 1),
-                                           (0, 0))
-                            -- get_subpath (stropha_ellipse,
-                                            direction t_in of stropha_ellipse,
-                                            direction t_out of stropha_ellipse,
-                                            z11)
-                            -- cycle;
-
-                       labels (11);
-               fi;
-
-               if (auctum and not stropha):
-                       clearit;
-
-                       fill get_subpath (diamond_shape,
-                                         left,
-                                         -dir (90 - off_angle),
-                                         (0, 0))
-                            .. get_subpath (circle,
-                                            dir (90 + alpha),
-                                            -dir (90 + alpha),
-                                            z13)
-                            .. get_subpath (circle,
-                                            dir (90 - off_angle),
-                                            right,
-                                            z12)
-                            -- cycle;
-
-                       labels (13);
-               fi;
-
-               if (auctum and stropha):
-                       clearit;
-
-                       save t;
-
-                       t := xpart ((stropha_ellipse shifted z11)
-                                   intersectiontimes
-                                   get_subpath (diamond_shape, up, right,
-                                                (0, 0)));
-
-                       % the addition or subtraction of `1' is necessary
-                       % so that we get the right starting point
-                       fill get_subpath_i (diamond_shape,
-                                           dir (angle (z2 - z1) - 1),
-                                           -dir (90 - off_angle),
-                                           (0, 0))
-                            .. get_subpath (circle,
-                                            dir (90 + alpha),
-                                            -dir (90 + alpha),
-                                            z13)
-                            .. get_subpath (stropha_ellipse,
-                                            dir (90 - off_angle),
-                                            direction t of stropha_ellipse,
-                                            z11)
-                            -- cycle;
-
-                       labels (11, 13);
-               fi;
-       fet_endchar;
-enddef;
-
-
-% punctum
-vat_punctum_char ("Ed. Vat. punctum", "vaticana.punctum",
-                 false, false, false, false,
-                 false, false, false, 1.0);
-
-
-% punctum cavum (for OpusTeX compatibility)
-vat_punctum_char ("Ed. Vat. punctum cavum", "vaticana.punctum.cavum",
-                 false, true, false, false,
-                 false, false, false, 1.0);
-
-
-% linea punctum (for OpusTeX compatibility)
-vat_punctum_char ("Ed. Vat. linea punctum", "vaticana.linea.punctum",
-                 true, false, false, false,
-                 false, false, false, 1.0);
-
-
-% linea punctum cavum (for OpusTeX compatibility)
-vat_punctum_char ("Ed. Vat. linea punctum cavum", "vaticana.linea.punctum.cavum",
-                 true, true, false, false,
-                 false, false, false, 1.0);
-
-
-% punctum inclinatum
-inclinatum_char ("Ed. Vat. inclinatum", "vaticana.inclinatum",
-                false, false, false);
-
-
-% pes lower punctum
-vat_punctum_char ("Ed. Vat. pes lower punctum", "vaticana.lpes",
-                 false, false, true, false,
-                 true, false, false, 1.0);
-
-
-% pes lower punctum
-vat_punctum_char ("Ed. Vat. pes var lower punctum", "vaticana.vlpes",
-                 false, false, true, false,
-                 true, false, true, 1.0);
-
-
-% pes upper punctum
-vat_punctum_char ("Ed. Vat. pes upper punctum", "vaticana.upes", 
-                 false, false, true, false,
-                 false, false, false, 1.0);
-
-
-% pes upper punctum (shifted variation)
-%
-% This note head is used instead of the regular pes upper punctum to
-% avoid collision with the lower punctum note of the pes when the upper
-% punctum sits directly on top of the lower punctum.
-%
-vat_punctum_char ("Ed. Vat. var pes upper punctum", "vaticana.vupes",
-                 false, false, true, false,
-                 false, true, false, 1.0);
-
-
-% small punctum as used in epiphonus
-vat_punctum_char ("Ed. Vat. plica", "vaticana.plica", 
-                 false, false, false, false,
-                 false, false, false, 0.6);
-
-
-% small punctum as used in epiphonus
-plica_char ("Ed. Vat. var plica", "vaticana.vplica", 
-           false, 0.6);
-
-
-% eccentric punctum as used in epiphonus
-epiphonus_char ("Ed. Vat. epiphonus", "vaticana.epiphonus", 
-               false, true, false, 1.0);
-
-
-% eccentric punctum as used in epiphonus (shifted variation)
-%
-% This note head is used instead of the regular epiphonus punctum to
-% avoid collision with the plica head when the plica sits directly on
-% top of the lower head.
-%
-epiphonus_char ("Ed. Vat. var epiphonus", "vaticana.vepiphonus",
-               false, true, true, 1.0);
-
-
-% small punctum as used in cephalicus
-vat_punctum_char ("Ed. Vat. rev. plica", "vaticana.reverse.plica",
-                 false, false, false, false,
-                 true, false, false, 0.6);
-
-
-% small punctum as used in cephalicus
-plica_char ("Ed. Vat. rev. var plica", "vaticana.reverse.vplica",
-           true, 0.6);
-
-
-% eccentric punctum as used in cephalicus; without left stem
-epiphonus_char ("Ed. Vat. inner cephalicus", "vaticana.inner.cephalicus",
-               false, false, false, 1.0);
-
-
-% eccentric punctum as used in cephalicus; with left stem
-epiphonus_char ("Ed. Vat. cephalicus", "vaticana.cephalicus",
-               true, false, false, 1.0);
-
-
-% quilisma
-fet_beginchar ("Ed. Vat. quilisma", "svaticana.quilisma");
-       save a_b, b_h, a_w;
-
-       a_b := 1.54; % b_h * a_b / a_w = wd / ht
-       b_h := 0.85;
-       a_w := 1.09;
-
-       save a, beta, ht, wd;
-
-       ht# = noteheight#;
-       2 beta = ht# * b_h;
-       a = beta * a_b;
-       wd# = 2 a / a_w;
-
-       set_char_box (0, 0.42 wd#, 0.28 ht#, 0.36 ht#);
-
-       black_notehead_width# := wd#;
-
-       define_pixels (ht, wd);
-
-       save ellipse, T;
-       path ellipse;
-       transform T;
-
-       T := identity xscaled linethickness
-                     yscaled 0.44 ht;
-       pickup pencircle transformed T;
-       ellipse := reverse fullcircle transformed T;
-
-       z1 = (rt 0.00 wd, top -0.28 ht);
-       z2 = (0.11 wd, -0.14 ht);
-       z3 = (0.12 wd, +0.03 ht);
-       z4 = (0.25 wd, -0.09 ht);
-       z5 = (0.25 wd, +0.08 ht);
-       z6 = (lft 0.42 wd, -0.04 ht);
-       z7 = (lft 0.40 wd, bot +0.36 ht);
-
-       fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
-            -- get_subpath (ellipse, z2 - z1, z1 - z2, z2)
-            -- cycle;
-       fill get_subpath (ellipse, z3 - z4, z4 - z3, z3)
-            -- get_subpath (ellipse, z4 - z3, z3 - z4, z4)
-            -- cycle;
-       fill get_subpath (ellipse, z5 - z6, z6 - z5, z5)
-            -- point 0 of get_subpath (ellipse, z6 - z5, z5 - z6, z6)
-            -- get_subpath (ellipse, z7 - z6, z6 - z7, z7)
-            -- get_subpath (ellipse, z6 - z7, z5 - z6, z6)
-            -- cycle;
-
-       labels (1, 2, 3, 4, 5, 6, 7);
-fet_endchar;
-
-
-% solesmes punctum inclinatum parvum
-inclinatum_char ("Solesmes punctum inclinatum parvum", "solesmes.incl.parvum",
-                true, false, false);
-
-
-% solesmes punctum auctum ascendens
-vat_punctum_char ("Solesmes punctum auctum ascendens", "solesmes.auct.asc",
-                 false, false, false, true,
-                 true, false, false, 1.0);
-
-
-% solesmes punctum auctum descendens
-vat_punctum_char ("Solesmes punctum auctum descendens", "solesmes.auct.desc",
-                 false, false, false, true,
-                 false, false, false, 1.0);
-
-
-% solesmes punctum inclinatum auctum
-inclinatum_char ("Solesmes punctum incl. auctum", "solesmes.incl.auctum",
-                false, false, true);
-
-
-% solesmes stropha
-inclinatum_char ("Solesmes stropha", "solesmes.stropha",
-                false, true, false);
-
-
-% solesmes stropha aucta
-inclinatum_char ("Solesmes stropha aucta", "solesmes.stropha.aucta",
-                false, true, true);
-
-
-% solesmes oriscus
-fet_beginchar ("Solesmes oriscus", "ssolesmes.oriscus");
-       save a_b, b_h, a_w;
-
-       a_b := 1.54; % b_h * a_b / a_w = wd / ht
-       b_h := 0.85;
-       a_w := 1.09;
-
-       save a, beta, ht, wd;
-
-       ht# = noteheight#;
-       2 beta = ht# * b_h;
-       a = beta * a_b;
-       wd# = 2 a / a_w;
-       black_notehead_width# := wd#;
-
-       save convexity;
-
-       convexity# = +0.05 ht#;
-
-       define_pixels (ht, wd, convexity);
-
-       set_char_box (0.00 wd#, 0.50 wd#,
-                     0.25 ht# + convexity#, 0.25 ht# + convexity#);
-
-       z1 = (0.00 wd + blot_diameter / 2, -convexity);
-       z2 = (1/6 wd, +convexity);
-       z3 = (2/6 wd, -convexity);
-       z4 = (0.50 wd - blot_diameter / 2, +convexity);
-
-
-       save height;
-
-       height = 2 ypart (directionpoint right of (z1
-                                                  .. z2
-                                                  .. z3
-                                                  .. z4));
-
-       save ellipse, T;
-       path ellipse;
-       transform T;
-
-       T := identity xscaled blot_diameter
-                     yscaled (h + d - height);
-       pickup pencircle transformed T;
-       ellipse := fullcircle transformed T;
-
-       % Adjust vertical coordinates to touch bounding box.
-       y1 := top -d;
-       y4 := bot h;
-
-       save d_;
-       pair d_;
-
-       d_ := direction 0 of (z1
-                             .. z2
-                             .. z3
-                             .. z4);
-
-       fill get_subpath (ellipse, -d_, d_, z1)
-            .. bot z2
-            .. bot z3
-            .. get_subpath (ellipse, d_, -d_, z4)
-            .. top z3
-            .. top z2
-            .. cycle;
-
-       labels (1, 2, 3, 4);
-fet_endchar;
-
-
-%%%%%%%%
-%
-%
-%
-% EDITIO MEDICAEA
-%
-%
-%
-
-% inclinatum
-fet_beginchar ("Ed. Med. inclinatum", "smedicaea.inclinatum");
-       draw_diamond_head (1.2 staff_space#, 0, 0, 35, false);
-fet_endchar;
-
-
-def med_punctum_char (expr verbose_name, internal_name,
-                          left_up_stem, left_down_stem) =
-       fet_beginchar (verbose_name, "s" & internal_name);
-               save a, ht, wd;
-
-               ht# = 2 staff_space#;
-               wd# = ht#;
-               black_notehead_width# := wd#;
-
-               define_pixels (ht, wd);
-
-               save ellipse;
-               path ellipse;
-
-               ellipse := fullcircle xscaled blot_diameter
-                                     yscaled 0.50 ht;
-
-               z1 = (0.00 wd + blot_diameter / 2, 0);
-               z2 = (0.4 wd - blot_diameter / 2, 0);
-
-               labels (1, 2);
-
-               pickup pencircle scaled linethickness;
-
-               if left_down_stem:
-                       z4 = (0.00 wd + linethickness / 2, -1.25 ht);
-
-                       fill get_subpath (ellipse, left, down, z1)
-                            -- top lft z4{down}
-                            .. z4{right}
-                            .. top rt z4{up}
-                            -- (rt x4, -.5 ht / 2)
-                            -- get_subpath (ellipse, right, left, z2)
-                            -- cycle;
-
-                       labels (4);
-
-                       set_char_box (0.0, 0.4 wd#, 1.25 ht#, 0.25 ht#);
-               elseif left_up_stem:
-                       z4 = (0.00 wd + linethickness / 2, +1.25 ht);
-
-                       fill get_subpath (ellipse, down, right, z1)
-                            -- get_subpath (ellipse, right, left, z2)
-                            -- (rt x4, .5 ht / 2)
-                            -- bot rt z4{up}
-                            .. z4{left}
-                            .. bot lft z4{down}
-                            -- cycle;
-
-                       labels (4);
-
-                       set_char_box (0.0, 0.4 wd#, 0.25 ht#, 1.25 ht#);
-               else:
-                       fill get_subpath (ellipse, left, right, z1)
-                            -- get_subpath (ellipse, right, left, z2)
-                            -- cycle;
-
-                       set_char_box (0.0, 0.4 wd#, 0.25 ht#, 0.25 ht#);
-               fi;
-
-       fet_endchar;
-enddef;
-
-
-% punctum
-med_punctum_char ("Ed. Med. punctum", "medicaea.punctum", 
-                 false, false);
-
-
-% left up-stemmed punctum
-med_punctum_char ("Ed. Med. reverse virga", "medicaea.rvirga",
-                 true, false);
-
-
-% virga (i.e. left down-stemmed punctum)
-med_punctum_char ("Ed. Med. virga", "medicaea.virga", 
-                 false, true);
-
-
-%%%%%%%%
-%
-%
-%
-% HUFNAGEL
-%
-%
-%
-
-def huf_punctum_char (expr verbose_name, internal_name,
-                          down_stem) =
-       fet_beginchar (verbose_name, "s" & internal_name);
-               save alpha;
-
-               alpha = 55;
-
-               draw_diamond_head (staff_space#, 0, 0, alpha, false);
-
-               if down_stem:
-                       set_char_box (0, head_width#,
-                                     1.5 staff_space#, head_height# / 2);
-
-                       save ellipse;
-                       path ellipse;
-
-                       ellipse := reverse fullcircle xscaled blot_diameter
-                                                     yscaled 0.7 staff_space
-                                                     rotated -alpha;
-
-                       z11 = (head_width / 2, 0);
-                       z12 = find_tangent_shift (((0, -d) -- (w, -d)), ellipse,
-                                                 (w / 2, -d), (w / 2, 0));
-
-                       fill get_subpath (ellipse, up, down, z11)
-                            -- get_subpath (ellipse, down, up, z12)
-                            -- cycle;
-
-                       labels (11, 12);
-               fi;
-       fet_endchar;
-enddef;
-
-
-% punctum
-huf_punctum_char ("Hufnagel punctum", "hufnagel.punctum", false)
-
-
-% virga
-huf_punctum_char ("Hufnagel virga", "hufnagel.virga", true)
-
-
-% pes lower punctum
-fet_beginchar ("Hufnagel pes lower punctum", "shufnagel.lpes")
-       save width, height, alpha;
-
-       width# = 2 * staff_space#;
-       height# = 0.7 * staff_space#;
-       alpha = 35;
-
-       set_char_box (0, width#, height# / 2, height# / 2);
-
-       define_pixels (width, height);
-
-       save circle;
-       path circle;
-
-       circle := reverse fullcircle scaled linethickness;
-
-       pickup pencircle scaled linethickness;
-
-       rt x3 = -lft x1 = width / 2;
-       y2 = y3 = height / 2;
-       y1 = y4 = -height / 2;
-
-       tand (alpha) * (y2 - y1) = x2 - x1 = x3 - x4;
-
-       fill get_subpath (circle, left, z2 - z1, z1)
-            -- get_subpath (circle, z2 - z1, right, z2)
-            -- get_subpath (circle, right, z4 - z3, z3)
-            -- get_subpath (circle, z4 - z3, left, z4)
-            -- cycle;
-
-       currentpicture := currentpicture shifted (width/2, 0);
-
-%      labels (1, 2, 3, 4);
-fet_endchar;
-
-
-fet_endgroup ("noteheads");
diff --git a/mf/parmesan-noteheads.mf b/mf/parmesan-noteheads.mf
new file mode 100644 (file)
index 0000000..ef762a2
--- /dev/null
@@ -0,0 +1,1503 @@
+% Feta (not the Font-En-Tja) music font --  ancient note heads
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+% Neo-mensural heads originally by
+% Christian Mondrup and Mats Bengtsson
+%
+%
+% LilyPond 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.
+%
+% 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/>.
+
+save black_notehead_width;
+numeric black_notehead_width;
+
+fet_begingroup ("noteheads");
+
+%
+% character aligment:
+%
+%   The head is assumed to be vertically centered around (0, 0).
+%   The left-most edge of the head should touch the vertical line
+%   that goes though the point (0, 0).
+%
+% set_char_box() conventions:
+%
+% * breapth: Ignored (as far as I know).  Should be set to 0.
+%
+% * width: Should match the head's width.
+%
+% * depth: Should match the bottom edge of the head.  Affects vertical
+%   collision handling.
+%
+% * height: Should match the top edge of the head.  Affects vertical
+%   collision handling.
+%
+% TODO: should depth/height include appendages/stems?
+
+overdone_heads = 0;
+noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#;
+define_pixels (noteheight);
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL NOTATION
+%
+%
+%
+
+def draw_neomensural_brevis (expr brevwid) =
+       save beamheight, head_width;
+       save holeheight, stem_width;
+       save serif_size, serif_protrude;
+
+       head_width# = brevwid;
+       holeheight = 3 stafflinethickness;
+       stem_width = 1.4 stafflinethickness;
+
+       define_pixels (head_width);
+
+       set_char_box (0, head_width#,
+                     noteheight# / 2, noteheight# / 2);
+
+       2 beamheight + holeheight = noteheight;
+       serif_size = (holeheight - stafflinethickness) / 2;
+       serif_protrude = 1.5 serif_size;
+
+       z1l = (0, 0);
+       z2l = (0, -stafflinethickness / 2);
+       z3r = z2r + serif_size * (1, -1);
+       y4r = y3r;
+       x4r = head_width / 2;
+       z5l = z3l + (-serif_size, -serif_protrude);
+
+       penpos1 (stem_width, 0);
+       penpos2 (stem_width, 0);
+       penpos3 (beamheight, 90);
+       penpos4 (beamheight, 90);
+       penpos5 (stem_width, 180);
+
+       save pat_in, pat_out;
+       path pat_in, pat_out;
+
+       pat_out := z4l
+                  -- z3l{left}
+                  .. z5l{down}
+                  .. z5r{up}
+                  -- z1l;
+       pat_out := pat_out
+                  -- reverse pat_out yscaled -1;
+       pat_out := pat_out
+                  -- reverse pat_out shifted (-x4r, 0)
+                                     xscaled -1
+                                     shifted (x4l, 0)
+                  -- cycle;
+       fill pat_out;
+
+       pat_in := z4r
+                 -- z3r{left}
+                 .. z2r{up}
+                 -- z1r;
+       pat_in := pat_in
+                 -- reverse pat_in yscaled -1;
+       pat_in := pat_in
+                 -- reverse pat_in shifted (-x4r, 0)
+                                   xscaled -1
+                                   shifted (x4l, 0)
+                 -- cycle;
+       unfill pat_in;
+
+       penlabels (1, 2, 3, 4, 5);
+enddef;
+
+
+%%% This head does not seem to be used anywhere.  Junk me?  -- jr
+def draw_neomensural_left_stemmed_head (expr wid) =
+       draw_neomensural_brevis (wid);
+
+       x6 = x7 = stem_width / 2;
+       y6 = y5;
+       y7 = y5 - 2.25 staff_space;
+
+       z17 = (x7, y7 - stem_width / 2);
+
+       penpos6 (stem_width, 0);
+       penpos7 (stem_width, 0);
+
+       fill z7l
+            -- z6l
+            -- z6r
+            -- z7r
+            .. z17
+            .. cycle;
+
+       penlabels (6, 7);
+       labels (17);
+enddef;
+
+
+%%% This head does not seem to be used anywhere.  Junk me?  -- jr
+fet_beginchar ("Left stemmed notehead", "slneomensural");
+       draw_neomensural_left_stemmed_head (2 staff_space#);
+fet_endchar;
+
+
+%
+% Some sources (eg. Musix/OpusTeX) think that the appendage should be on
+% the left, some say right.  Right wins democratically.
+%
+def draw_neomensural_longa (expr wid) =
+       draw_neomensural_brevis (wid);
+
+       save theta;
+
+       x7r = head_width;
+       y7 = y5;
+       z6 - z7 = (stem_width / 2, -staff_space);
+       theta = angle (z6 - z7) + 90;
+
+       penpos7 (stem_width, 0);
+       penpos6 (1.2 stem_width, theta);
+
+       z7' = find_tangent (z6l, pat_out,
+                           (x7l + 0.5 stem_width, y7l),
+                           (x7l - 0.5 stem_width, y7l));
+
+       fill z7r
+            .. z6r{z6 - z7}
+            .. {z7 - z6}z6l
+            -- z7'
+            -- cycle;
+
+       penlabels (6, 7);
+       labels (7');
+enddef;
+
+
+%
+% En wij presenteren U: de opvolgster van Emily
+%
+% (ze is wel breed)
+%
+fet_beginchar ("Neo-mensural maxima notehead", "sM3neomensural");
+       draw_neomensural_longa (2.6 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural longa notehead", "sM2neomensural");
+       draw_neomensural_longa (2 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural brevis notehead", "sM1neomensural");
+       draw_neomensural_brevis (2 staff_space#);
+fet_endchar;
+
+
+def draw_neomensural_black_head (expr wid, height) =
+       save head_width;
+       save ne, nw, ne_dist, nw_dist;
+       pair ne, nw, ne_dist, nw_dist;
+
+       head_width# = wid;
+
+       set_char_box (0, head_width#,
+                     height / 2, height / 2);
+
+       charwx := head_width# / 2;
+       charwy := height / 2;
+
+       y3 = y1 = 0;
+       x2 = x4 = (x1 + x3) / 2;
+
+       pickup pencircle scaled blot_diameter;
+
+       top y2 = h;
+       bot y4 = -d;
+       lft x1 = 0;
+       rt x3 = w;
+
+       ne := unitvector (z2 - z1);
+       nw_dist := (ne rotated 90) * 0.5 blot_diameter;
+       nw := unitvector (z2 - z3);
+       ne_dist := (nw rotated -90) * 0.5 blot_diameter;
+
+       fill lft z1{up}
+            .. (z1 + nw_dist){ne}
+            -- (z2 + nw_dist){ne}
+            .. top z2{right}
+            .. (z2 + ne_dist){-nw}
+            -- (z3 + ne_dist){-nw}
+            .. rt z3{down}
+            .. (z3 - nw_dist){-ne}
+            -- (z4 - nw_dist){-ne}
+            .. bot z4{left}
+            .. (z4 - ne_dist){nw}
+            -- (z1 - ne_dist){nw}
+            .. cycle;
+
+       labels (1, 2, 3, 4);
+enddef;
+
+
+def draw_neomensural_open_head (expr wid, height)=
+       draw_neomensural_black_head (wid, height);
+
+       save diamNW, diamSW;
+
+       diamNW = length (z2 - z1) + blot_diameter;
+       diamSW = length (z4 - z1) + blot_diameter;
+
+       save hole_widthNW, hole_widthSW;
+
+       hole_widthNW = 0.34 diamNW ;
+       hole_widthSW + 2.6 linethickness = diamSW;
+
+       (z7 + z5) / 2 = (w / 2, 0);
+       (z8 + z6) / 2 = (w / 2, 0);
+       z6 - z5 = hole_widthNW * unitvector (z2 - z1);
+       z7 - z6 = hole_widthSW * unitvector (z4 - z1);
+
+       unfill z5
+              -- z6
+              -- z7
+              -- z8
+              -- cycle;
+
+       labels (5, 6, 7, 8);
+enddef;
+
+
+%
+% WL says the thin lines should be thinner.
+%
+fet_beginchar ("Harmonic notehead (Neo-mensural open)", "s0harmonic");
+       draw_neomensural_open_head (1.3 staff_space#, 1.3 noteheight#);
+       charwx := head_width#;
+       charwy := 0;
+fet_endchar;
+
+
+fet_beginchar ("Harmonic notehead (Neo-mensural black)", "s2harmonic");
+       draw_neomensural_black_head (1.3 staff_space#, 1.3 noteheight#);
+       charwx := head_width#;
+       charwy := 0;
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural semibrevis head", "s0neomensural");
+       draw_neomensural_open_head (staff_space#, noteheight#);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural minima head", "s1neomensural");
+       draw_neomensural_open_head (staff_space#, noteheight#);
+fet_endchar;
+
+
+fet_beginchar ("Neo-mensural semiminima head", "s2neomensural");
+       draw_neomensural_black_head (staff_space#, noteheight#);
+fet_endchar;
+
+
+def draw_mensural_brevis (expr wid) =
+       % TODO.  For the moment, fall back to draw_neomensural_brevis.
+       draw_neomensural_brevis (wid);
+enddef;
+
+
+%%% This head does not seem to be used anywhere.  Junk me?  -- jr
+def draw_mensural_left_stemmed_head (expr wid) =
+       draw_mensural_brevis (wid);
+
+       x6 = x7 = stem_width / 2;
+       y6 = y5;
+       y7 = y5 - 2.25 staff_space;
+
+       z17 = (x7, y7 - stem_width / 2);
+
+       penpos6 (stem_width, 0);
+       penpos7 (stem_width, 0);
+
+       fill z7l
+            -- z6l
+            -- z6r
+            -- z7r
+            .. z17
+            .. cycle;
+
+       penlabels (6, 7);
+       labels (17);
+enddef;
+
+
+def draw_mensural_longa (expr wid) =
+       draw_mensural_brevis (wid);
+
+       x6 = x7 = head_width - stem_width / 2;
+       y6 = y5;
+       y7 = y5 - 2.25 staff_space;
+
+       z17 = (x7, y7 - stem_width / 2);
+
+       penpos6 (stem_width, 0);
+       penpos7 (stem_width, 0);
+
+       fill z7l
+            -- z6l
+            -- z6r
+            -- z7r
+            .. z17
+            .. cycle;
+
+       penlabels (6, 7);
+       labels (17);
+enddef;
+
+
+%%% This head does not seem to be used anywhere.  Junk me?  -- jr
+fet_beginchar ("Mensural left stemmed notehead", "slmensural");
+       draw_mensural_left_stemmed_head (staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Mensural maxima notehead", "sM3mensural");
+       draw_mensural_longa (2.0 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Mensural longa notehead", "sM2mensural");
+       draw_mensural_longa (staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Mensural brevis notehead", "sM1mensural");
+       draw_mensural_brevis (staff_space#);
+fet_endchar;
+
+
+def draw_diamond_head (expr head_h, pen_w, pen_h, angle, open) =
+       save head_width, head_height;
+       save ellipse, ellipse_r;
+       path ellipse, ellipse_r, diamond_shape;
+
+       head_height# = head_h;
+       head_width# / head_height# = tand (angle);
+
+       set_char_box (0, head_width#,
+                     head_height# / 2, head_height# / 2);
+
+       charwx := head_width# / 2;
+       charwy := head_height# / 2 - linethickness#;
+
+       define_pixels (head_width, head_height);
+
+       ellipse := reverse fullcircle
+                    xscaled (max (blot_diameter, pen_w * head_width))
+                    yscaled (max (blot_diameter, pen_h * head_width))
+                    rotated -angle;
+
+       z1 = find_tangent_shift (((0, h) -- (0, -h)), ellipse,
+                                (0, 0), (w / 2, 0));
+       z2 = find_tangent_shift (((0, h) -- (w, h)), ellipse,
+                                (w / 2, h), (w / 2, 0));
+       z3 = find_tangent_shift (((w, h) -- (w, -h)), ellipse,
+                                (w, 0), (w / 2, 0));
+       z4 = find_tangent_shift (((0, -h) -- (w, -h)), ellipse,
+                                (w / 2, -h), (w / 2, 0));
+
+       diamond_shape := get_subpath (ellipse, z1 - z4, z2 - z1, z1)
+                        -- get_subpath (ellipse, z2 - z1, z3 - z2, z2)
+                        -- get_subpath (ellipse, z3 - z2, z4 - z3, z3)
+                        -- get_subpath (ellipse, z4 - z3, z1 - z4, z4)
+                        -- cycle;
+       fill diamond_shape;
+
+       if open:
+               save l;
+               path l[];
+
+               l12 := (directionpoint (z1 - z2) of ellipse) shifted z1
+                       -- (directionpoint (z1 - z2) of ellipse) shifted z2;
+               l23 := (directionpoint (z2 - z3) of ellipse) shifted z2
+                       -- (directionpoint (z2 - z3) of ellipse) shifted z3;
+               l34 := (directionpoint (z3 - z4) of ellipse) shifted z3
+                       -- (directionpoint (z3 - z4) of ellipse) shifted z4;
+               l41 := (directionpoint (z4 - z1) of ellipse) shifted z4
+                       -- (directionpoint (z4 - z1) of ellipse) shifted z1;
+
+               unfill l12 intersectionpoint l23
+                      -- l23 intersectionpoint l34
+                      -- l34 intersectionpoint l41
+                      -- l41 intersectionpoint l12
+                      -- cycle;
+       fi;
+
+       labels (1, 2, 3, 4);
+enddef;
+
+
+fet_beginchar ("Mensural semibrevis head", "s0mensural");
+       draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural minima head", "s1mensural");
+       draw_diamond_head (staff_space#, 0.15, 0.30, 30, true);
+fet_endchar;
+
+
+fet_beginchar ("Mensural semiminima head", "s2mensural");
+       draw_diamond_head (staff_space#, 0.15, 0.30, 30, false);
+fet_endchar;
+
+
+fet_beginchar ("Petrucci semibrevis head", "s0petrucci");
+%      draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, true);
+       draw_neomensural_open_head (staff_space#, 1.8 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Petrucci minima head", "s1petrucci");
+%      draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, true);
+       draw_neomensural_open_head (staff_space#, 1.8 staff_space#);
+fet_endchar;
+
+
+fet_beginchar ("Petrucci semiminima head", "s2petrucci");
+%      draw_diamond_head (1.8 staff_space#, 0.15, 0.40, 30, false);
+       draw_neomensural_black_head (staff_space#, 1.8 staff_space#);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% EDITIO VATICANA (including solesmes extensions)
+%
+%
+%
+
+def vat_punctum_char (expr verbose_name, internal_name,
+                          linea, cavum, straight, auctum,
+                          d_up, up_shift, down_shift, mag) =
+       fet_beginchar (verbose_name, "s" & internal_name);
+               save a_b, b_h, a_w;
+
+               a_b := 1.54; % b_h * a_b / a_w = wd / ht
+               b_h := 0.85;
+               a_w := 1.09;
+
+               save a, beta, ht, wd;
+
+               ht# = noteheight# * mag;
+               2 beta = ht# * b_h;
+               a = beta * a_b;
+               wd# = 2 a / a_w;
+               black_notehead_width# := wd#;
+
+               % direction
+               save d_, d_sign;
+               pair d_;
+
+               if d_up:
+                       d_ := up;
+                       d_sign := 1;
+               else:
+                       d_ := down;
+                       d_sign := -1;
+               fi;
+
+               % convexity and eccentricity
+               save u_convexity, u_eccentricity;
+
+               if straight:
+                       u_convexity# := -0.01 ht#;
+                       u_eccentricity# := 0.0 ht#; % dummy
+               elseif auctum:
+                       u_convexity# := -0.03 ht#;
+                       u_eccentricity# := +0.25 ht#;
+               else:
+                       u_convexity# := -0.05 ht#;
+                       u_eccentricity# := 0.0 ht#; % dummy
+               fi;
+
+               save convexity, eccentricity;
+
+               convexity# := d_sign * u_convexity#;
+               eccentricity# := d_sign * u_eccentricity#;
+
+               % y shift offset
+               save yoffs;
+
+               if up_shift:
+                       yoffs# := 0.08 ht#;
+               elseif down_shift:
+                       yoffs# := -0.11 ht#;
+               else:
+                       yoffs# := 0.00 ht#;
+               fi;
+
+               define_pixels (convexity, eccentricity, yoffs, ht, wd);
+
+               pickup pencircle scaled linethickness;
+
+               save height, yoffs_bt, p, circle, circle_r;
+               path p, circle, circle_r;
+
+               height# = 0.47 ht#;
+               yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
+
+               define_pixels (height, yoffs_bt);
+
+               circle := fullcircle scaled linethickness;
+
+               x1 = x6;
+               x2 = x5;
+               x3 = x4;
+               y1 + height = y6;
+               y2 + height = y5;
+               y3 + height = y4;
+
+               save box_top, box_bt;
+
+               if auctum:
+                       z1 = (0.00 wd + linethickness / 2, yoffs_bt);
+                       z2 = (0.21 wd, yoffs_bt + convexity);
+                       z3 = (0.42 wd - linethickness/ 2,
+                             yoffs_bt + eccentricity);
+                       box_top# = height# + yoffs_bt# +
+                                    max (0, convexity#, eccentricity#);
+                       box_bt# = yoffs_bt# +
+                                    min (0, convexity#, eccentricity#);
+                       p = z1
+                           .. {right}z2
+                           .. {d_}z3
+                           -- z4{-d_}
+                           .. z5{left}
+                           .. z6
+                           -- cycle;
+               else:
+                       z1 = (0.00 wd + linethickness / 2, yoffs_bt);
+                       z2 = (0.21 wd, yoffs_bt + convexity);
+                       z3 = (0.42 wd - linethickness / 2, yoffs_bt);
+                       box_top# = height# + yoffs_bt# + max (0, convexity#);
+                       box_bt# = yoffs_bt# + min (0, convexity#);
+                       p = z1
+                           .. z2
+                           .. z3
+                           -- z4
+                           .. z5
+                           .. z6
+                           -- cycle;
+               fi;
+
+               labels (1, 2, 3, 4, 5, 6);
+
+               save dirs;
+               pair dirs[];
+
+               dirs12 := direction (0 + epsilon) of p;
+               dirs2 := direction 1 of p;
+               dirs32 := direction (2 - epsilon) of p;
+               dirs45 := direction (3 + epsilon) of p;
+               dirs5 := direction 4 of p;
+               dirs65 := direction (5 - epsilon) of p;
+
+               fill get_subpath (circle, down, dirs12, z1)
+                    .. (bot z2){dirs2}
+                    .. get_subpath (circle, dirs32, up, z3)
+                    -- get_subpath (circle, up, dirs45, z4)
+                    .. (top z5){dirs5}
+                    .. get_subpath (circle, dirs65, down, z6)
+                    -- cycle;
+
+               if cavum:
+                       save pat, t;
+                       path pat[];
+                       numeric t[];
+
+                       pat123 := ((directionpoint -dirs12 of circle)
+                                   shifted z1){dirs12}
+                                 .. (top z2){dirs2}
+                                 .. {dirs32}((directionpoint -dirs32 of circle)
+                                      shifted z3);
+                       pat34 := lft z3
+                                -- lft z4;
+                       pat456 := ((directionpoint -dirs45 of circle)
+                                   shifted z4){dirs45}
+                                 .. (bot z5){dirs5}
+                                 .. {dirs65}((directionpoint -dirs65 of circle)
+                                      shifted z6);
+                       pat61 := rt z6
+                                -- rt z1;
+
+                       t61 := ypart (pat61 intersectiontimes pat123);
+                       t12 := xpart (pat123 intersectiontimes pat34);
+                       t34 := ypart (pat34 intersectiontimes pat456);
+                       t45 := xpart (pat456 intersectiontimes pat61);
+
+                       unfill subpath (t61, t12) of pat123
+                              -- subpath (t34, t45) of pat456
+                              -- cycle;
+               fi;
+
+               set_char_box (0.00 wd#, 0.42 wd#,
+                             max (0, -box_bt#) + linethickness# / 2,
+                             max (0, box_top#) + linethickness# / 2);
+
+               if linea:
+                       save linea_width, linea_height;
+
+                       linea_width# = 0.6 linethickness#;
+                       linea_height# = 0.7 ht#;
+
+                       define_pixels (linea_width, linea_height);
+
+                       pickup pencircle scaled 0.6 linethickness;
+
+                       draw_rounded_block ((-0.10 wd - linea_width / 2,
+                                            -linea_height / 2),
+                                           (-0.10 wd + linea_width / 2,
+                                            +linea_height / 2),
+                                           0.6 linethickness);
+                       draw_rounded_block ((+0.52 wd - linea_width / 2,
+                                            -linea_height / 2),
+                                           (+0.52 wd + linea_width / 2,
+                                            +linea_height / 2),
+                                           0.6 linethickness);
+
+                       set_char_box (0, 0.62 wd# + linea_width#,
+                                     linea_height# / 2,
+                                     linea_height# / 2);
+
+                       currentpicture := currentpicture
+                               shifted (0.10 wd + linea_width / 2, 0);
+               fi;
+       fet_endchar;
+enddef;
+
+
+def plica_char (expr verbose_name, internal_name,
+                    d_up, mag) =
+       fet_beginchar (verbose_name, "s" & internal_name);
+               save a_b, b_h, a_w;
+
+               a_b := 1.54; % b_h * a_b / a_w = wd / ht
+               b_h := 0.85;
+               a_w := 1.09;
+
+               save a, beta, ht, wd;
+
+               ht# = noteheight# * mag;
+               2 beta = ht# * b_h;
+               a = beta * a_b;
+               wd# = 2 a / a_w;
+               black_notehead_width# := wd#;
+
+               % direction
+               save d_, d_sign;
+               pair d_;
+
+               if d_up:
+                       d_ := up;
+                       d_sign := 1;
+               else:
+                       d_ := down;
+                       d_sign := -1;
+               fi;
+
+               % convexity and eccentricity
+               save convexity, eccentricity;
+
+               convexity# := d_sign * -0.10 ht#;
+               eccentricity# := d_sign * -0.12 ht#;
+
+               % y shift offset
+               save yoffs;
+
+               yoffs# := -0.11 ht#;
+
+               define_pixels (convexity, eccentricity, yoffs, ht, wd);
+
+               pickup pencircle scaled linethickness;
+
+               save height, yoffs_bt, p, circle, circle_r;
+               path p, circle, circle_r;
+
+               height# = 0.47 ht#;
+               yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
+
+               define_pixels (height, yoffs_bt);
+
+               circle := fullcircle scaled linethickness;
+
+               x1 = x6;
+               x2 = x5;
+               x3 = x4;
+               y1 + height = y6;
+               y2 + height = y5;
+               y3 + height = y4;
+
+               save box_top, box_bt;
+
+               z1 = (0.00 wd + linethickness / 2, yoffs_bt);
+               z2 = (0.21 wd, yoffs_bt + convexity);
+               z3 = (0.42 wd - linethickness/ 2, yoffs_bt + eccentricity);
+               box_top# = height# + yoffs_bt# +
+                            max (0, convexity#, eccentricity#);
+               box_bt# = yoffs_bt# +
+                            min (0, convexity#, eccentricity#);
+               p = z1
+                   .. z2{right}
+                   .. z3
+                   -- z4
+                   .. z5{left}
+                   .. z6
+                   -- cycle;
+
+               labels (1, 2, 3, 4, 5, 6);
+
+               save dirs;
+               pair dirs[];
+
+               dirs12 := direction (0 + epsilon) of p;
+               dirs2 := direction 1 of p;
+               dirs32 := direction (2 - epsilon) of p;
+               dirs45 := direction (3 + epsilon) of p;
+               dirs5 := direction 4 of p;
+               dirs65 := direction (5 - epsilon) of p;
+
+               fill get_subpath (circle, down, dirs12, z1)
+                    .. (bot z2){dirs2}
+                    .. get_subpath (circle, dirs32, up, z3)
+                    -- get_subpath (circle, up, dirs45, z4)
+                    .. (top z5){dirs5}
+                    .. get_subpath (circle, dirs65, down, z6)
+                    -- cycle;
+
+               pickup pencircle scaled 0.6 linethickness;
+
+               save stem_bt;
+
+               set_char_box (0.00 wd#, 0.42 wd#,
+                             max (0, -box_bt#) + linethickness# / 2,
+                             max (0, box_top#) + linethickness# / 2);
+
+       fet_endchar;
+enddef;
+
+
+def epiphonus_char (expr verbose_name, internal_name,
+                        left_stem, d_up, down_shift, mag) =
+       fet_beginchar (verbose_name, "s" & internal_name);
+               save a_b, b_h, a_w;
+
+               a_b := 1.54; % b_h * a_b / a_w = wd / ht
+               b_h := 0.85;
+               a_w := 1.09;
+
+               save a, beta, ht, wd;
+
+               ht# = noteheight# * mag;
+               2 beta = ht# * b_h;
+               a = beta * a_b;
+               wd# = 2 a / a_w;
+               black_notehead_width# := wd#;
+
+               % direction
+               save d_, d_sign;
+               pair d_;
+
+               if d_up:
+                       d_ := up;
+                       d_sign := 1;
+               else:
+                       d_ := down;
+                       d_sign := -1;
+               fi;
+
+               % convexity and eccentricity
+               save convexity;
+
+               convexity# := d_sign * -0.05ht#;
+
+               % y shift offset
+               save yoffs;
+
+               if down_shift:
+                       yoffs# := -0.11 ht#;
+               else:
+                       yoffs# := 0.00 ht#;
+               fi;
+
+               define_pixels (convexity, yoffs, ht, wd);
+
+               pickup pencircle scaled linethickness;
+
+               save height, yoffs_bt, p, circle, circle_r;
+               path p, circle, circle_r;
+
+               height# = 0.47 ht#;
+               yoffs_bt# = yoffs# - 0.5 height# - 0.25 convexity#;
+
+               define_pixels (height, yoffs_bt);
+
+               circle := fullcircle scaled linethickness;
+
+               x1 = x6;
+               x2 = x5;
+               x3 = x4;
+               y1 + height = y6;
+               y2 + height = y5;
+               y3 + height = y4;
+
+               save box_top, box_bt;
+
+               z1 = (0.00 wd + linethickness / 2, yoffs_bt - 2.5 convexity);
+               z2 = (0.06 wd, yoffs_bt + 1.4 convexity);
+               z3 = (0.42 wd - linethickness / 2, yoffs_bt - 1.0 convexity);
+               box_top# = height# + yoffs_bt# +
+                            max (-1.0 convexity#, 1.4 convexity#, 0);
+               box_bt# = yoffs_bt# +
+                            min (-1.0 convexity#, 1.4 convexity#, 0);
+               p = z1{-d_}
+                   .. {curl 1}z2{right}
+                   .. z3
+                   -- z4
+                   .. {left}z5{curl 1}
+                   .. {d_}z6
+                   -- cycle;
+
+               labels (1, 2, 3, 4, 5, 6);
+
+               save dirs;
+               pair dirs[];
+
+               dirs12 := direction (0 + epsilon) of p;
+               dirs21 := direction (1 - epsilon) of p;
+               dirs23 := direction (1 + epsilon) of p;
+               dirs32 := direction (2 - epsilon) of p;
+               dirs45 := direction (3 + epsilon) of p;
+               dirs54 := direction (4 - epsilon) of p;
+               dirs56 := direction (4 + epsilon) of p;
+               dirs65 := direction (5 - epsilon) of p;
+
+               fill get_subpath (circle, down, dirs12, z1)
+                    .. get_subpath (circle, dirs21, dirs23, z2)
+                    .. get_subpath (circle, dirs32, up, z3)
+                    -- get_subpath (circle, up, dirs45, z4)
+                    .. get_subpath (circle, dirs54, dirs56, z5)
+                    .. get_subpath (circle, dirs65, down, z6)
+                    -- cycle;
+
+               save stem_bt;
+
+               if left_stem:
+                       pickup pencircle scaled 0.6 linethickness;
+
+                       lft x11 = x1 - linethickness / 2;
+                       bot y11 = yoffs - 1.1 ht - linethickness / 2;
+                       x12 = x11;
+                       y12 = y1;
+
+                       draw_rounded_block (bot lft z11, top rt z12,
+                                           0.6 linethickness);
+                       stem_bt# = yoffs# - 1.1 ht#;
+
+                       labels (11, 12);
+               else:
+                       stem_bt# = 0;
+               fi;
+
+               set_char_box (0.00 wd#, 0.42 wd#,
+                             max (0, -box_bt#, -stem_bt#) + linethickness# / 2,
+                             max (0, box_top#) + linethickness# / 2);
+       fet_endchar;
+enddef;
+
+
+def inclinatum_char (expr verbose_name, internal_name,
+                         small, stropha, auctum) =
+       fet_beginchar (verbose_name, "s" & internal_name);
+               save ht, alpha;
+
+               alpha := 35;
+
+               if small:
+                       ht# = 0.50 noteheight#;
+               else:
+                       ht# = 0.80 noteheight#;
+               fi;
+
+               draw_diamond_head (ht#, 0, 0, alpha, false);
+
+               save off_angle;
+
+               off_angle := alpha + 15;
+
+               save stropha_ellipse, auctum_hook, circle;
+               path stropha_ellipse, auctum_hook, circle;
+
+               circle := reverse fullcircle scaled linethickness;
+
+               stropha_ellipse := fullcircle xscaled 0.25 head_height
+                                             yscaled 0.55 head_height
+                                             rotated alpha;
+
+               z11 = z12
+                     + linethickness / 2 * dir (180 - off_angle)
+                     - directionpoint dir (90 - off_angle)
+                         of stropha_ellipse;
+               z12 = directionpoint -dir (90 - off_angle) of diamond_shape +
+                       linethickness / 2 * dir (180 - off_angle);
+               z13 = (0, -0.5 head_height + linethickness);
+
+               auctum_hook := z12{-dir (90 - off_angle)}
+                              .. {dir (90 + alpha)}z13;
+
+               labels (12);
+
+               if (stropha and not auctum):
+                       clearit;
+
+                       save t_in, t_out;
+
+                       t_in := xpart ((stropha_ellipse shifted z11)
+                                      intersectiontimes
+                                      get_subpath (diamond_shape,
+                                                   left, up,
+                                                   (0, 0)));
+                       t_out := xpart ((stropha_ellipse shifted z11)
+                                       intersectiontimes
+                                       get_subpath (diamond_shape,
+                                                    up, right,
+                                                    (0, 0)));
+
+                       % the addition or subtraction of `1' is necessary
+                       % so that we get the right starting point
+                       fill get_subpath_i (diamond_shape,
+                                           dir (angle (z2 - z1) - 1),
+                                           dir (angle (z1 - z4) + 1),
+                                           (0, 0))
+                            -- get_subpath (stropha_ellipse,
+                                            direction t_in of stropha_ellipse,
+                                            direction t_out of stropha_ellipse,
+                                            z11)
+                            -- cycle;
+
+                       labels (11);
+               fi;
+
+               if (auctum and not stropha):
+                       clearit;
+
+                       fill get_subpath (diamond_shape,
+                                         left,
+                                         -dir (90 - off_angle),
+                                         (0, 0))
+                            .. get_subpath (circle,
+                                            dir (90 + alpha),
+                                            -dir (90 + alpha),
+                                            z13)
+                            .. get_subpath (circle,
+                                            dir (90 - off_angle),
+                                            right,
+                                            z12)
+                            -- cycle;
+
+                       labels (13);
+               fi;
+
+               if (auctum and stropha):
+                       clearit;
+
+                       save t;
+
+                       t := xpart ((stropha_ellipse shifted z11)
+                                   intersectiontimes
+                                   get_subpath (diamond_shape, up, right,
+                                                (0, 0)));
+
+                       % the addition or subtraction of `1' is necessary
+                       % so that we get the right starting point
+                       fill get_subpath_i (diamond_shape,
+                                           dir (angle (z2 - z1) - 1),
+                                           -dir (90 - off_angle),
+                                           (0, 0))
+                            .. get_subpath (circle,
+                                            dir (90 + alpha),
+                                            -dir (90 + alpha),
+                                            z13)
+                            .. get_subpath (stropha_ellipse,
+                                            dir (90 - off_angle),
+                                            direction t of stropha_ellipse,
+                                            z11)
+                            -- cycle;
+
+                       labels (11, 13);
+               fi;
+       fet_endchar;
+enddef;
+
+
+% punctum
+vat_punctum_char ("Ed. Vat. punctum", "vaticana.punctum",
+                 false, false, false, false,
+                 false, false, false, 1.0);
+
+
+% punctum cavum (for OpusTeX compatibility)
+vat_punctum_char ("Ed. Vat. punctum cavum", "vaticana.punctum.cavum",
+                 false, true, false, false,
+                 false, false, false, 1.0);
+
+
+% linea punctum (for OpusTeX compatibility)
+vat_punctum_char ("Ed. Vat. linea punctum", "vaticana.linea.punctum",
+                 true, false, false, false,
+                 false, false, false, 1.0);
+
+
+% linea punctum cavum (for OpusTeX compatibility)
+vat_punctum_char ("Ed. Vat. linea punctum cavum", "vaticana.linea.punctum.cavum",
+                 true, true, false, false,
+                 false, false, false, 1.0);
+
+
+% punctum inclinatum
+inclinatum_char ("Ed. Vat. inclinatum", "vaticana.inclinatum",
+                false, false, false);
+
+
+% pes lower punctum
+vat_punctum_char ("Ed. Vat. pes lower punctum", "vaticana.lpes",
+                 false, false, true, false,
+                 true, false, false, 1.0);
+
+
+% pes lower punctum
+vat_punctum_char ("Ed. Vat. pes var lower punctum", "vaticana.vlpes",
+                 false, false, true, false,
+                 true, false, true, 1.0);
+
+
+% pes upper punctum
+vat_punctum_char ("Ed. Vat. pes upper punctum", "vaticana.upes",
+                 false, false, true, false,
+                 false, false, false, 1.0);
+
+
+% pes upper punctum (shifted variation)
+%
+% This note head is used instead of the regular pes upper punctum to
+% avoid collision with the lower punctum note of the pes when the upper
+% punctum sits directly on top of the lower punctum.
+%
+vat_punctum_char ("Ed. Vat. var pes upper punctum", "vaticana.vupes",
+                 false, false, true, false,
+                 false, true, false, 1.0);
+
+
+% small punctum as used in epiphonus
+vat_punctum_char ("Ed. Vat. plica", "vaticana.plica",
+                 false, false, false, false,
+                 false, false, false, 0.6);
+
+
+% small punctum as used in epiphonus
+plica_char ("Ed. Vat. var plica", "vaticana.vplica",
+           false, 0.6);
+
+
+% eccentric punctum as used in epiphonus
+epiphonus_char ("Ed. Vat. epiphonus", "vaticana.epiphonus",
+               false, true, false, 1.0);
+
+
+% eccentric punctum as used in epiphonus (shifted variation)
+%
+% This note head is used instead of the regular epiphonus punctum to
+% avoid collision with the plica head when the plica sits directly on
+% top of the lower head.
+%
+epiphonus_char ("Ed. Vat. var epiphonus", "vaticana.vepiphonus",
+               false, true, true, 1.0);
+
+
+% small punctum as used in cephalicus
+vat_punctum_char ("Ed. Vat. rev. plica", "vaticana.reverse.plica",
+                 false, false, false, false,
+                 true, false, false, 0.6);
+
+
+% small punctum as used in cephalicus
+plica_char ("Ed. Vat. rev. var plica", "vaticana.reverse.vplica",
+           true, 0.6);
+
+
+% eccentric punctum as used in cephalicus; without left stem
+epiphonus_char ("Ed. Vat. inner cephalicus", "vaticana.inner.cephalicus",
+               false, false, false, 1.0);
+
+
+% eccentric punctum as used in cephalicus; with left stem
+epiphonus_char ("Ed. Vat. cephalicus", "vaticana.cephalicus",
+               true, false, false, 1.0);
+
+
+% quilisma
+fet_beginchar ("Ed. Vat. quilisma", "svaticana.quilisma");
+       save a_b, b_h, a_w;
+
+       a_b := 1.54; % b_h * a_b / a_w = wd / ht
+       b_h := 0.85;
+       a_w := 1.09;
+
+       save a, beta, ht, wd;
+
+       ht# = noteheight#;
+       2 beta = ht# * b_h;
+       a = beta * a_b;
+       wd# = 2 a / a_w;
+
+       set_char_box (0, 0.42 wd#, 0.28 ht#, 0.36 ht#);
+
+       black_notehead_width# := wd#;
+
+       define_pixels (ht, wd);
+
+       save ellipse, T;
+       path ellipse;
+       transform T;
+
+       T := identity xscaled linethickness
+                     yscaled 0.44 ht;
+       pickup pencircle transformed T;
+       ellipse := reverse fullcircle transformed T;
+
+       z1 = (rt 0.00 wd, top -0.28 ht);
+       z2 = (0.11 wd, -0.14 ht);
+       z3 = (0.12 wd, +0.03 ht);
+       z4 = (0.25 wd, -0.09 ht);
+       z5 = (0.25 wd, +0.08 ht);
+       z6 = (lft 0.42 wd, -0.04 ht);
+       z7 = (lft 0.40 wd, bot +0.36 ht);
+
+       fill get_subpath (ellipse, z1 - z2, z2 - z1, z1)
+            -- get_subpath (ellipse, z2 - z1, z1 - z2, z2)
+            -- cycle;
+       fill get_subpath (ellipse, z3 - z4, z4 - z3, z3)
+            -- get_subpath (ellipse, z4 - z3, z3 - z4, z4)
+            -- cycle;
+       fill get_subpath (ellipse, z5 - z6, z6 - z5, z5)
+            -- point 0 of get_subpath (ellipse, z6 - z5, z5 - z6, z6)
+            -- get_subpath (ellipse, z7 - z6, z6 - z7, z7)
+            -- get_subpath (ellipse, z6 - z7, z5 - z6, z6)
+            -- cycle;
+
+       labels (1, 2, 3, 4, 5, 6, 7);
+fet_endchar;
+
+
+% solesmes punctum inclinatum parvum
+inclinatum_char ("Solesmes punctum inclinatum parvum", "solesmes.incl.parvum",
+                true, false, false);
+
+
+% solesmes punctum auctum ascendens
+vat_punctum_char ("Solesmes punctum auctum ascendens", "solesmes.auct.asc",
+                 false, false, false, true,
+                 true, false, false, 1.0);
+
+
+% solesmes punctum auctum descendens
+vat_punctum_char ("Solesmes punctum auctum descendens", "solesmes.auct.desc",
+                 false, false, false, true,
+                 false, false, false, 1.0);
+
+
+% solesmes punctum inclinatum auctum
+inclinatum_char ("Solesmes punctum incl. auctum", "solesmes.incl.auctum",
+                false, false, true);
+
+
+% solesmes stropha
+inclinatum_char ("Solesmes stropha", "solesmes.stropha",
+                false, true, false);
+
+
+% solesmes stropha aucta
+inclinatum_char ("Solesmes stropha aucta", "solesmes.stropha.aucta",
+                false, true, true);
+
+
+% solesmes oriscus
+fet_beginchar ("Solesmes oriscus", "ssolesmes.oriscus");
+       save a_b, b_h, a_w;
+
+       a_b := 1.54; % b_h * a_b / a_w = wd / ht
+       b_h := 0.85;
+       a_w := 1.09;
+
+       save a, beta, ht, wd;
+
+       ht# = noteheight#;
+       2 beta = ht# * b_h;
+       a = beta * a_b;
+       wd# = 2 a / a_w;
+       black_notehead_width# := wd#;
+
+       save convexity;
+
+       convexity# = +0.05 ht#;
+
+       define_pixels (ht, wd, convexity);
+
+       set_char_box (0.00 wd#, 0.50 wd#,
+                     0.25 ht# + convexity#, 0.25 ht# + convexity#);
+
+       z1 = (0.00 wd + blot_diameter / 2, -convexity);
+       z2 = (1/6 wd, +convexity);
+       z3 = (2/6 wd, -convexity);
+       z4 = (0.50 wd - blot_diameter / 2, +convexity);
+
+
+       save height;
+
+       height = 2 ypart (directionpoint right of (z1
+                                                  .. z2
+                                                  .. z3
+                                                  .. z4));
+
+       save ellipse, T;
+       path ellipse;
+       transform T;
+
+       T := identity xscaled blot_diameter
+                     yscaled (h + d - height);
+       pickup pencircle transformed T;
+       ellipse := fullcircle transformed T;
+
+       % Adjust vertical coordinates to touch bounding box.
+       y1 := top -d;
+       y4 := bot h;
+
+       save d_;
+       pair d_;
+
+       d_ := direction 0 of (z1
+                             .. z2
+                             .. z3
+                             .. z4);
+
+       fill get_subpath (ellipse, -d_, d_, z1)
+            .. bot z2
+            .. bot z3
+            .. get_subpath (ellipse, d_, -d_, z4)
+            .. top z3
+            .. top z2
+            .. cycle;
+
+       labels (1, 2, 3, 4);
+fet_endchar;
+
+
+%%%%%%%%
+%
+%
+%
+% EDITIO MEDICAEA
+%
+%
+%
+
+% inclinatum
+fet_beginchar ("Ed. Med. inclinatum", "smedicaea.inclinatum");
+       draw_diamond_head (1.2 staff_space#, 0, 0, 35, false);
+fet_endchar;
+
+
+def med_punctum_char (expr verbose_name, internal_name,
+                          left_up_stem, left_down_stem) =
+       fet_beginchar (verbose_name, "s" & internal_name);
+               save a, ht, wd;
+
+               ht# = 2 staff_space#;
+               wd# = ht#;
+               black_notehead_width# := wd#;
+
+               define_pixels (ht, wd);
+
+               save ellipse;
+               path ellipse;
+
+               ellipse := fullcircle xscaled blot_diameter
+                                     yscaled 0.50 ht;
+
+               z1 = (0.00 wd + blot_diameter / 2, 0);
+               z2 = (0.4 wd - blot_diameter / 2, 0);
+
+               labels (1, 2);
+
+               pickup pencircle scaled linethickness;
+
+               if left_down_stem:
+                       z4 = (0.00 wd + linethickness / 2, -1.25 ht);
+
+                       fill get_subpath (ellipse, left, down, z1)
+                            -- top lft z4{down}
+                            .. z4{right}
+                            .. top rt z4{up}
+                            -- (rt x4, -.5 ht / 2)
+                            -- get_subpath (ellipse, right, left, z2)
+                            -- cycle;
+
+                       labels (4);
+
+                       set_char_box (0.0, 0.4 wd#, 1.25 ht#, 0.25 ht#);
+               elseif left_up_stem:
+                       z4 = (0.00 wd + linethickness / 2, +1.25 ht);
+
+                       fill get_subpath (ellipse, down, right, z1)
+                            -- get_subpath (ellipse, right, left, z2)
+                            -- (rt x4, .5 ht / 2)
+                            -- bot rt z4{up}
+                            .. z4{left}
+                            .. bot lft z4{down}
+                            -- cycle;
+
+                       labels (4);
+
+                       set_char_box (0.0, 0.4 wd#, 0.25 ht#, 1.25 ht#);
+               else:
+                       fill get_subpath (ellipse, left, right, z1)
+                            -- get_subpath (ellipse, right, left, z2)
+                            -- cycle;
+
+                       set_char_box (0.0, 0.4 wd#, 0.25 ht#, 0.25 ht#);
+               fi;
+
+       fet_endchar;
+enddef;
+
+
+% punctum
+med_punctum_char ("Ed. Med. punctum", "medicaea.punctum",
+                 false, false);
+
+
+% left up-stemmed punctum
+med_punctum_char ("Ed. Med. reverse virga", "medicaea.rvirga",
+                 true, false);
+
+
+% virga (i.e. left down-stemmed punctum)
+med_punctum_char ("Ed. Med. virga", "medicaea.virga",
+                 false, true);
+
+
+%%%%%%%%
+%
+%
+%
+% HUFNAGEL
+%
+%
+%
+
+def huf_punctum_char (expr verbose_name, internal_name,
+                          down_stem) =
+       fet_beginchar (verbose_name, "s" & internal_name);
+               save alpha;
+
+               alpha = 55;
+
+               draw_diamond_head (staff_space#, 0, 0, alpha, false);
+
+               if down_stem:
+                       set_char_box (0, head_width#,
+                                     1.5 staff_space#, head_height# / 2);
+
+                       save ellipse;
+                       path ellipse;
+
+                       ellipse := reverse fullcircle xscaled blot_diameter
+                                                     yscaled 0.7 staff_space
+                                                     rotated -alpha;
+
+                       z11 = (head_width / 2, 0);
+                       z12 = find_tangent_shift (((0, -d) -- (w, -d)), ellipse,
+                                                 (w / 2, -d), (w / 2, 0));
+
+                       fill get_subpath (ellipse, up, down, z11)
+                            -- get_subpath (ellipse, down, up, z12)
+                            -- cycle;
+
+                       labels (11, 12);
+               fi;
+       fet_endchar;
+enddef;
+
+
+% punctum
+huf_punctum_char ("Hufnagel punctum", "hufnagel.punctum", false)
+
+
+% virga
+huf_punctum_char ("Hufnagel virga", "hufnagel.virga", true)
+
+
+% pes lower punctum
+fet_beginchar ("Hufnagel pes lower punctum", "shufnagel.lpes")
+       save width, height, alpha;
+
+       width# = 2 * staff_space#;
+       height# = 0.7 * staff_space#;
+       alpha = 35;
+
+       set_char_box (0, width#, height# / 2, height# / 2);
+
+       define_pixels (width, height);
+
+       save circle;
+       path circle;
+
+       circle := reverse fullcircle scaled linethickness;
+
+       pickup pencircle scaled linethickness;
+
+       rt x3 = -lft x1 = width / 2;
+       y2 = y3 = height / 2;
+       y1 = y4 = -height / 2;
+
+       tand (alpha) * (y2 - y1) = x2 - x1 = x3 - x4;
+
+       fill get_subpath (circle, left, z2 - z1, z1)
+            -- get_subpath (circle, z2 - z1, right, z2)
+            -- get_subpath (circle, right, z4 - z3, z3)
+            -- get_subpath (circle, z4 - z3, left, z4)
+            -- cycle;
+
+       currentpicture := currentpicture shifted (width/2, 0);
+
+%      labels (1, 2, 3, 4);
+fet_endchar;
+
+
+fet_endgroup ("noteheads");
diff --git a/mf/parmesan-timesig.mf b/mf/parmesan-timesig.mf
deleted file mode 100644 (file)
index faafe0f..0000000
+++ /dev/null
@@ -1,406 +0,0 @@
-% Feta (not the Font-En-Tja) music font --  ancient time signatures
-% This file is part of LilyPond, the GNU music typesetter.
-%
-% Copyright (C) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
-%               Christian Mondrup <scancm@biobase.dk>
-% Copyright (C) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
-% 
-%
-% LilyPond 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.
-%
-% 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 ("timesig");
-
-
-path threequartercircle;
-
-threequartercircle := halfcircle & quartercircle rotated 180;
-
-save mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin;
-
-mensural_Cdiameter# := 3/2 staff_space#;
-mensural_Cthickness# := 2 linethickness#;
-mensural_Chairpin# := 0.5 linethickness#;
-
-define_pixels (mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin);
-
-
-%%%%%%%%
-%
-%
-%
-% MENSURAL NOTATION
-%
-%
-%
-
-def draw_nail (expr bottom_left, top_right) =
-       save round;
-
-       round = floor min (blot_diameter,
-                          xpart (top_right-bottom_left),
-                          ypart (top_right-bottom_left));
-
-       pickup pencircle scaled round;
-
-       z2 + (round / 2, round / 2) = top_right +
-                                       (mensural_Cthickness / 2, 0);
-       z4 - (round / 2,round / 2) = bottom_left;
-       y3 = y2;
-       y4 = y1;
-       x2 = x1 + mensural_Cthickness / 2;
-       x2 - x1 = x4 - x3;
-       x5 = x1;
-       x6 = x4;
-       y5 = y6 = y2 - 2 mensural_Cthickness;
-
-       fill bot z1{right}
-            .. rt z1{up}
-            -- rt z5{up}
-            .. rt z2
-            .. top z2{left}
-            -- top z3{left}
-            .. lft z3
-            .. lft z6{down}
-            -- lft z4{down}
-            .. bot z4{right}
-            -- cycle;
-
-%      labels (1, 2, 3, 4, 5, 6);
-enddef;
-
-
-def mensural_timesig (expr verbose_name, internal_name,
-                          full_circle, reverse_circle, slashed, dotted) =
-       fet_beginchar (verbose_name, internal_name);
-               if slashed:
-                       set_char_box (
-                         0,
-                         mensural_Cdiameter# + mensural_Cthickness#,
-                         .75 (mensural_Cdiameter# + mensural_Cthickness#),
-                         .75 (mensural_Cdiameter# + mensural_Cthickness#));
-
-                       if (full_circle or dotted):
-                               draw_nail ((-mensural_Cthickness / 2, -d),
-                                          (mensural_Cthickness / 2, h));
-                       elseif reverse_circle:
-                               draw_nail ((0, -d), (mensural_Cthickness, h));
-                       else:
-                               draw_nail ((-mensural_Cthickness, -d), (0, h));
-                       fi;
-               else:
-                       set_char_box (
-                         0,
-                         mensural_Cdiameter# + mensural_Cthickness#,
-                         .5 (mensural_Cdiameter# + mensural_Cthickness#),
-                         .5 (mensural_Cdiameter# + mensural_Cthickness#));
-               fi;
-
-               save ellipse, pat;
-               path ellipse, pat;
-
-               ellipse := fullcircle xscaled mensural_Cthickness
-                                     yscaled mensural_Chairpin;
-
-               save rot;
-
-               if reverse_circle:
-                       rot := 225;
-               else:
-                       rot := 45;
-               fi;
-
-               if full_circle:
-                       pat := fullcircle scaled mensural_Cdiameter;
-
-                       fill get_subpoint (ellipse,
-                                          direction 0 of pat,
-                                          point 0 of pat)
-                            for i = 1 step 1 until length pat:
-                                    .. get_subpoint (ellipse,
-                                                     direction i of pat,
-                                                     point i of pat)
-                            endfor
-                            .. cycle;
-                       unfill get_subpoint (ellipse,
-                                            -direction 0 of pat,
-                                            point 0 of pat)
-                              for i = 1 step 1 until length pat:
-                                      .. get_subpoint (ellipse,
-                                                       -direction i of pat,
-                                                       point i of pat)
-                              endfor
-                              .. cycle;
-               else:
-                       pat := threequartercircle rotated rot
-                                                 scaled mensural_Cdiameter;
-
-                       fill get_subpath (ellipse,
-                                         -direction 0 of pat,
-                                         direction 0 of pat,
-                                         point 0 of pat)
-                            for i = 1 step 1 until (length pat - 1):
-                                    .. get_subpoint (ellipse,
-                                                     direction i of pat,
-                                                     point i of pat)
-                            endfor
-                            .. get_subpath (ellipse,
-                                            direction infinity of pat,
-                                            -direction infinity of pat,
-                                            point infinity of pat)
-                            for i = (length pat - 1) step -1 until 1:
-                                    .. get_subpoint (ellipse,
-                                                     -direction i of pat,
-                                                     point i of pat)
-                            endfor
-                            .. cycle;
-               fi;
-
-               if dotted:
-                       pickup pencircle scaled 4 linethickness;
-                       drawdot (0, 0);
-               fi;
-
-               currentpicture := currentpicture
-                                   shifted 0.5 (mensural_Cdiameter
-                                                + mensural_Cthickness, 0);
-       fet_endchar;
-enddef;
-
-
-%% tempus imperfectum cum prolatione imperfecta
-mensural_timesig ("Mensural 4/4 meter", "mensural44",
-                 false, false, false, false);
-
-
-%% tempus imperfectum cum prolatione imperfecta proportio dupla
-mensural_timesig ("Mensural 2/2 meter", "mensural22",
-                 false, false, true, false);
-
-
-%% tempus perfectum cum prolatione imperfecta
-mensural_timesig ("Mensural 3/2 meter", "mensural32",
-                 true, false, false, false);
-
-
-%% tempus imperfectum cum prolatione perfecta
-mensural_timesig ("Mensural 6/4 meter", "mensural64",
-                 false, false, false, true);
-
-
-%% tempus perfectum cum prolatione perfecta
-mensural_timesig ("Mensural 9/4 meter", "mensural94",
-                 true, false, false, true);
-
-
-%% tempus perfectum cum prolatione imperfecta proportio dupla
-mensural_timesig ("Mensural 3/4 meter", "mensural34",
-                 true, false, true, false);
-
-
-%% tempus imperfectum cum prolatione perfecta proportio dupla
-mensural_timesig ("Mensural 6/8 meter", "mensural68",
-                 false, false, true, true);
-
-
-%% tempus perfectum cum prolatione perfecta proportio dupla
-mensural_timesig ("Mensural 9/8 meter", "mensural98",
-                 true, false, true, true);
-
-       
-%% tempus imperfectum cum prolatione imperfecta diminutio simplex
-mensural_timesig ("Mensural 4/8 meter", "mensural48",
-                 false, true, false, false);
-
-
-%% tempus imperfectum cum prolatione perfecta diminutio simplex
-mensural_timesig ("Mensural 6/8 meter", "mensural68alt",
-                 false, true, false, true);
-
-
-%% tempus imperfectum cum prolatione imperfecta diminutio duplex
-mensural_timesig ("Mensural 2/4 meter", "mensural24",
-                 false, true, true, false);
-
-
-%%%%%%%%
-%
-%
-%
-% NEO-MENSURAL NOTATION
-%
-%
-%
-
-save neomensural_Cdiameter, neomensural_Cthickness;
-
-neomensural_Cdiameter# := 3/2 staff_space#;
-neomensural_Cthickness# := 2 linethickness#;
-
-define_pixels (neomensural_Cdiameter, neomensural_Cthickness);
-
-
-def neomensural_timesig (expr verbose_name, internal_name,
-                             full_circle, reverse_circle, slashed, dotted) =
-       fet_beginchar (verbose_name, internal_name);
-               set_char_box (
-                 0,
-                 neomensural_Cdiameter# + neomensural_Cthickness#,
-                 .5 (neomensural_Cdiameter# + neomensural_Cthickness#),
-                 .5 (neomensural_Cdiameter# + neomensural_Cthickness#));
-
-               if slashed:
-                       pickup penrazor scaled neomensural_Cthickness;
-
-                       save t;
-                       t := neomensural_Cthickness / 2;
-
-                       if (full_circle or dotted):
-                               draw (0, -d + t)
-                                    -- (0, h - t);
-                       elseif reverse_circle:
-                               draw (t, -d + t)
-                                    -- (t, h - t);
-                       else:
-                               draw (-t, -d + t)
-                                    -- (-t, h - t);
-                       fi;
-               fi;
-
-               save ellipse, pat;
-               path ellipse, pat;
-
-               ellipse := fullcircle scaled neomensural_Cthickness;
-
-               save rot;
-
-               if reverse_circle:
-                       rot := 225;
-               else:
-                       rot := 45;
-               fi;
-
-               if full_circle:
-                       pat := fullcircle scaled neomensural_Cdiameter;
-
-                       fill get_subpoint (ellipse,
-                                          direction 0 of pat,
-                                          point 0 of pat)
-                            for i = 1 step 1 until length pat:
-                                    .. get_subpoint (ellipse,
-                                                     direction i of pat,
-                                                     point i of pat)
-                            endfor
-                            .. cycle;
-                       unfill get_subpoint (ellipse,
-                                            -direction 0 of pat,
-                                            point 0 of pat)
-                              for i = 1 step 1 until length pat:
-                                      .. get_subpoint (ellipse,
-                                                       -direction i of pat,
-                                                       point i of pat)
-                              endfor
-                              .. cycle;
-               else:
-                       pat := threequartercircle rotated rot
-                                                 scaled neomensural_Cdiameter;
-
-                       fill get_subpath (ellipse,
-                                         -direction 0 of pat,
-                                         direction 0 of pat,
-                                         point 0 of pat)
-                            for i = 1 step 1 until (length pat - 1):
-                                    .. get_subpoint (ellipse,
-                                                     direction i of pat,
-                                                     point i of pat)
-                            endfor
-                            .. get_subpath (ellipse,
-                                            direction infinity of pat,
-                                            -direction infinity of pat,
-                                            point infinity of pat)
-                            for i = (length pat - 1) step -1 until 1:
-                                    .. get_subpoint (ellipse,
-                                                     -direction i of pat,
-                                                     point i of pat)
-                            endfor
-                            .. cycle;
-               fi;
-
-               if dotted:
-                       pickup pencircle scaled 4 linethickness;
-                       drawdot (0, 0);
-               fi;
-
-               currentpicture := currentpicture
-                                    shifted 0.5 (neomensural_Cdiameter
-                                                 + neomensural_Cthickness, 0);
-       fet_endchar;
-enddef;
-
-
-%% tempus imperfectum cum prolatione imperfecta
-neomensural_timesig ("Mensural 4/4 meter", "neomensural44",
-                    false, false, false, false);
-
-
-%% tempus imperfectum cum prolatione imperfecta proportio dupla
-neomensural_timesig ("Mensural 2/2 meter", "neomensural22",
-                    false, false, true, false);
-
-
-%% tempus perfectum cum prolatione imperfecta
-neomensural_timesig ("Mensural 3/2 meter", "neomensural32",
-                    true, false, false, false);
-
-
-%% tempus imperfectum cum prolatione perfecta
-neomensural_timesig ("Mensural 6/4 meter", "neomensural64",
-                    false, false, false, true);
-
-
-%% tempus perfectum cum prolatione perfecta
-neomensural_timesig ("Mensural 9/4 meter", "neomensural94",
-                    true, false, false, true);
-
-
-%% tempus perfectum cum prolatione imperfecta proportio dupla
-neomensural_timesig ("Mensural 3/4 meter", "neomensural34",
-                    true, false, true, false);
-
-
-%% tempus imperfectum cum prolatione perfecta proportio dupla
-neomensural_timesig ("Mensural 6/8 meter", "neomensural68",
-                    false, false, true, true);
-
-
-%% tempus perfectum cum prolatione perfecta proportio dupla
-neomensural_timesig ("Mensural 9/8 meter", "neomensural98",
-                    true, false, true, true);
-
-       
-%% tempus imperfectum cum prolatione imperfecta diminutio simplex
-neomensural_timesig ("Mensural 4/8 meter", "neomensural48",
-                    false, true, false, false);
-
-
-%% tempus imperfectum cum prolatione perfecta diminutio simplex
-neomensural_timesig ("Mensural 6/8 meter", "neomensural68alt",
-                    false, true, false, true);
-
-
-%% tempus imperfectum cum prolatione imperfecta diminutio duplex
-neomensural_timesig ("Mensural 2/4 meter", "neomensural24",
-                    false, true, true, false);
-
-
-fet_endgroup ("timesig");
diff --git a/mf/parmesan-timesignatures.mf b/mf/parmesan-timesignatures.mf
new file mode 100644 (file)
index 0000000..c4e7937
--- /dev/null
@@ -0,0 +1,406 @@
+% Feta (not the Font-En-Tja) music font --  ancient time signatures
+% This file is part of LilyPond, the GNU music typesetter.
+%
+% Copyright (C) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
+%               Christian Mondrup <scancm@biobase.dk>
+% Copyright (C) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
+%
+%
+% LilyPond 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.
+%
+% 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 ("timesig");
+
+
+path threequartercircle;
+
+threequartercircle := halfcircle & quartercircle rotated 180;
+
+save mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin;
+
+mensural_Cdiameter# := 3/2 staff_space#;
+mensural_Cthickness# := 2 linethickness#;
+mensural_Chairpin# := 0.5 linethickness#;
+
+define_pixels (mensural_Cdiameter, mensural_Cthickness, mensural_Chairpin);
+
+
+%%%%%%%%
+%
+%
+%
+% MENSURAL NOTATION
+%
+%
+%
+
+def draw_nail (expr bottom_left, top_right) =
+       save round;
+
+       round = floor min (blot_diameter,
+                          xpart (top_right-bottom_left),
+                          ypart (top_right-bottom_left));
+
+       pickup pencircle scaled round;
+
+       z2 + (round / 2, round / 2) = top_right +
+                                       (mensural_Cthickness / 2, 0);
+       z4 - (round / 2,round / 2) = bottom_left;
+       y3 = y2;
+       y4 = y1;
+       x2 = x1 + mensural_Cthickness / 2;
+       x2 - x1 = x4 - x3;
+       x5 = x1;
+       x6 = x4;
+       y5 = y6 = y2 - 2 mensural_Cthickness;
+
+       fill bot z1{right}
+            .. rt z1{up}
+            -- rt z5{up}
+            .. rt z2
+            .. top z2{left}
+            -- top z3{left}
+            .. lft z3
+            .. lft z6{down}
+            -- lft z4{down}
+            .. bot z4{right}
+            -- cycle;
+
+%      labels (1, 2, 3, 4, 5, 6);
+enddef;
+
+
+def mensural_timesig (expr verbose_name, internal_name,
+                          full_circle, reverse_circle, slashed, dotted) =
+       fet_beginchar (verbose_name, internal_name);
+               if slashed:
+                       set_char_box (
+                         0,
+                         mensural_Cdiameter# + mensural_Cthickness#,
+                         .75 (mensural_Cdiameter# + mensural_Cthickness#),
+                         .75 (mensural_Cdiameter# + mensural_Cthickness#));
+
+                       if (full_circle or dotted):
+                               draw_nail ((-mensural_Cthickness / 2, -d),
+                                          (mensural_Cthickness / 2, h));
+                       elseif reverse_circle:
+                               draw_nail ((0, -d), (mensural_Cthickness, h));
+                       else:
+                               draw_nail ((-mensural_Cthickness, -d), (0, h));
+                       fi;
+               else:
+                       set_char_box (
+                         0,
+                         mensural_Cdiameter# + mensural_Cthickness#,
+                         .5 (mensural_Cdiameter# + mensural_Cthickness#),
+                         .5 (mensural_Cdiameter# + mensural_Cthickness#));
+               fi;
+
+               save ellipse, pat;
+               path ellipse, pat;
+
+               ellipse := fullcircle xscaled mensural_Cthickness
+                                     yscaled mensural_Chairpin;
+
+               save rot;
+
+               if reverse_circle:
+                       rot := 225;
+               else:
+                       rot := 45;
+               fi;
+
+               if full_circle:
+                       pat := fullcircle scaled mensural_Cdiameter;
+
+                       fill get_subpoint (ellipse,
+                                          direction 0 of pat,
+                                          point 0 of pat)
+                            for i = 1 step 1 until length pat:
+                                    .. get_subpoint (ellipse,
+                                                     direction i of pat,
+                                                     point i of pat)
+                            endfor
+                            .. cycle;
+                       unfill get_subpoint (ellipse,
+                                            -direction 0 of pat,
+                                            point 0 of pat)
+                              for i = 1 step 1 until length pat:
+                                      .. get_subpoint (ellipse,
+                                                       -direction i of pat,
+                                                       point i of pat)
+                              endfor
+                              .. cycle;
+               else:
+                       pat := threequartercircle rotated rot
+                                                 scaled mensural_Cdiameter;
+
+                       fill get_subpath (ellipse,
+                                         -direction 0 of pat,
+                                         direction 0 of pat,
+                                         point 0 of pat)
+                            for i = 1 step 1 until (length pat - 1):
+                                    .. get_subpoint (ellipse,
+                                                     direction i of pat,
+                                                     point i of pat)
+                            endfor
+                            .. get_subpath (ellipse,
+                                            direction infinity of pat,
+                                            -direction infinity of pat,
+                                            point infinity of pat)
+                            for i = (length pat - 1) step -1 until 1:
+                                    .. get_subpoint (ellipse,
+                                                     -direction i of pat,
+                                                     point i of pat)
+                            endfor
+                            .. cycle;
+               fi;
+
+               if dotted:
+                       pickup pencircle scaled 4 linethickness;
+                       drawdot (0, 0);
+               fi;
+
+               currentpicture := currentpicture
+                                   shifted 0.5 (mensural_Cdiameter
+                                                + mensural_Cthickness, 0);
+       fet_endchar;
+enddef;
+
+
+%% tempus imperfectum cum prolatione imperfecta
+mensural_timesig ("Mensural 4/4 meter", "mensural44",
+                 false, false, false, false);
+
+
+%% tempus imperfectum cum prolatione imperfecta proportio dupla
+mensural_timesig ("Mensural 2/2 meter", "mensural22",
+                 false, false, true, false);
+
+
+%% tempus perfectum cum prolatione imperfecta
+mensural_timesig ("Mensural 3/2 meter", "mensural32",
+                 true, false, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta
+mensural_timesig ("Mensural 6/4 meter", "mensural64",
+                 false, false, false, true);
+
+
+%% tempus perfectum cum prolatione perfecta
+mensural_timesig ("Mensural 9/4 meter", "mensural94",
+                 true, false, false, true);
+
+
+%% tempus perfectum cum prolatione imperfecta proportio dupla
+mensural_timesig ("Mensural 3/4 meter", "mensural34",
+                 true, false, true, false);
+
+
+%% tempus imperfectum cum prolatione perfecta proportio dupla
+mensural_timesig ("Mensural 6/8 meter", "mensural68",
+                 false, false, true, true);
+
+
+%% tempus perfectum cum prolatione perfecta proportio dupla
+mensural_timesig ("Mensural 9/8 meter", "mensural98",
+                 true, false, true, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio simplex
+mensural_timesig ("Mensural 4/8 meter", "mensural48",
+                 false, true, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta diminutio simplex
+mensural_timesig ("Mensural 6/8 meter", "mensural68alt",
+                 false, true, false, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio duplex
+mensural_timesig ("Mensural 2/4 meter", "mensural24",
+                 false, true, true, false);
+
+
+%%%%%%%%
+%
+%
+%
+% NEO-MENSURAL NOTATION
+%
+%
+%
+
+save neomensural_Cdiameter, neomensural_Cthickness;
+
+neomensural_Cdiameter# := 3/2 staff_space#;
+neomensural_Cthickness# := 2 linethickness#;
+
+define_pixels (neomensural_Cdiameter, neomensural_Cthickness);
+
+
+def neomensural_timesig (expr verbose_name, internal_name,
+                             full_circle, reverse_circle, slashed, dotted) =
+       fet_beginchar (verbose_name, internal_name);
+               set_char_box (
+                 0,
+                 neomensural_Cdiameter# + neomensural_Cthickness#,
+                 .5 (neomensural_Cdiameter# + neomensural_Cthickness#),
+                 .5 (neomensural_Cdiameter# + neomensural_Cthickness#));
+
+               if slashed:
+                       pickup penrazor scaled neomensural_Cthickness;
+
+                       save t;
+                       t := neomensural_Cthickness / 2;
+
+                       if (full_circle or dotted):
+                               draw (0, -d + t)
+                                    -- (0, h - t);
+                       elseif reverse_circle:
+                               draw (t, -d + t)
+                                    -- (t, h - t);
+                       else:
+                               draw (-t, -d + t)
+                                    -- (-t, h - t);
+                       fi;
+               fi;
+
+               save ellipse, pat;
+               path ellipse, pat;
+
+               ellipse := fullcircle scaled neomensural_Cthickness;
+
+               save rot;
+
+               if reverse_circle:
+                       rot := 225;
+               else:
+                       rot := 45;
+               fi;
+
+               if full_circle:
+                       pat := fullcircle scaled neomensural_Cdiameter;
+
+                       fill get_subpoint (ellipse,
+                                          direction 0 of pat,
+                                          point 0 of pat)
+                            for i = 1 step 1 until length pat:
+                                    .. get_subpoint (ellipse,
+                                                     direction i of pat,
+                                                     point i of pat)
+                            endfor
+                            .. cycle;
+                       unfill get_subpoint (ellipse,
+                                            -direction 0 of pat,
+                                            point 0 of pat)
+                              for i = 1 step 1 until length pat:
+                                      .. get_subpoint (ellipse,
+                                                       -direction i of pat,
+                                                       point i of pat)
+                              endfor
+                              .. cycle;
+               else:
+                       pat := threequartercircle rotated rot
+                                                 scaled neomensural_Cdiameter;
+
+                       fill get_subpath (ellipse,
+                                         -direction 0 of pat,
+                                         direction 0 of pat,
+                                         point 0 of pat)
+                            for i = 1 step 1 until (length pat - 1):
+                                    .. get_subpoint (ellipse,
+                                                     direction i of pat,
+                                                     point i of pat)
+                            endfor
+                            .. get_subpath (ellipse,
+                                            direction infinity of pat,
+                                            -direction infinity of pat,
+                                            point infinity of pat)
+                            for i = (length pat - 1) step -1 until 1:
+                                    .. get_subpoint (ellipse,
+                                                     -direction i of pat,
+                                                     point i of pat)
+                            endfor
+                            .. cycle;
+               fi;
+
+               if dotted:
+                       pickup pencircle scaled 4 linethickness;
+                       drawdot (0, 0);
+               fi;
+
+               currentpicture := currentpicture
+                                    shifted 0.5 (neomensural_Cdiameter
+                                                 + neomensural_Cthickness, 0);
+       fet_endchar;
+enddef;
+
+
+%% tempus imperfectum cum prolatione imperfecta
+neomensural_timesig ("Mensural 4/4 meter", "neomensural44",
+                    false, false, false, false);
+
+
+%% tempus imperfectum cum prolatione imperfecta proportio dupla
+neomensural_timesig ("Mensural 2/2 meter", "neomensural22",
+                    false, false, true, false);
+
+
+%% tempus perfectum cum prolatione imperfecta
+neomensural_timesig ("Mensural 3/2 meter", "neomensural32",
+                    true, false, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta
+neomensural_timesig ("Mensural 6/4 meter", "neomensural64",
+                    false, false, false, true);
+
+
+%% tempus perfectum cum prolatione perfecta
+neomensural_timesig ("Mensural 9/4 meter", "neomensural94",
+                    true, false, false, true);
+
+
+%% tempus perfectum cum prolatione imperfecta proportio dupla
+neomensural_timesig ("Mensural 3/4 meter", "neomensural34",
+                    true, false, true, false);
+
+
+%% tempus imperfectum cum prolatione perfecta proportio dupla
+neomensural_timesig ("Mensural 6/8 meter", "neomensural68",
+                    false, false, true, true);
+
+
+%% tempus perfectum cum prolatione perfecta proportio dupla
+neomensural_timesig ("Mensural 9/8 meter", "neomensural98",
+                    true, false, true, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio simplex
+neomensural_timesig ("Mensural 4/8 meter", "neomensural48",
+                    false, true, false, false);
+
+
+%% tempus imperfectum cum prolatione perfecta diminutio simplex
+neomensural_timesig ("Mensural 6/8 meter", "neomensural68alt",
+                    false, true, false, true);
+
+
+%% tempus imperfectum cum prolatione imperfecta diminutio duplex
+neomensural_timesig ("Mensural 2/4 meter", "neomensural24",
+                    false, true, true, false);
+
+
+fet_endgroup ("timesig");