]> git.donarmstrong.com Git - lilypond.git/blobdiff - mf/feta-din-code.mf
Run `make grand-replace'.
[lilypond.git] / mf / feta-din-code.mf
index db4d7f17c9b4bd2fee8237af94602c899ad56569..ea6569acda54847eddb99fff4883a5e57d5c0a83 100644 (file)
+% feta-din-code.mf -- implement dynamic signs
 %
-% piano p, grabbed from Ed Breitkopf Mozart horn concerto 3.
+% part of LilyPond's pretty-but-neat music font
 %
-% 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'sitcalled) is a slightly darker than the serif
+% source file of the Feta (not the Font-En-Tja) music font
 %
-% * The hole in the cheek has a straight right side.
-%
-% * Corners are filled up.
+% (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+
+
+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.
 %
 
-code := 111;
-save slant;
-slant := 20;
-currenttransform := identity;
-
+save serif_thick, med_thick, bottom_blot;
 
-save serif_thick;
-serif_thick# = 1.1 stafflinethickness#;
+serif_thick# = 1.1 linethickness#;
 define_blacker_pixels (serif_thick);
-med_thick = round (1.5 stafflinethickness);
 
-fet_beginchar("dynamic p", "p", "dynp")
-       set_char_box (0, 13/12 ex#, descender#, 1.0 ex#);
+med_thick = round (1.5 linethickness);
+bottom_blot = 1.3 serif_thick;
 
-       save twiddle_thick, stem_thick, cheek_thick;
-       save updir, fill_up;
-       save serif, dishing_angle, p, q;
-       save cheek_medium, left_serif_protude, right_serif_protude;
 
-       pair updir;
-       path serif,q,p;
+code := 32;
 
-       updir := dir (90 - slant );
-       twiddle_thick = med_thick;
-       cheek_medium = 1/6 ex;
+fet_beginchar ("Space", "space");
+       set_char_box (0, horizontal_space#, 0, ex#);
+fet_endchar;
 
-       dishing_angle = 5;
-       fill_up := 1.5 serif_thick;
-       straigh_len = 0.5 ex;
 
-       stem_thick = 2/6 ex;
-       cheek_thick = 11/32 ex;
-       cheek_width = 0.72 ex;
-       left_serif_protude = 18/60 ex;
-       right_serif_protude= 15/60 ex;
-       
-       penpos1 (twiddle_thick, -slant - 5);
-       penpos2 (cheek_medium, 90 - slant );
-       penpos3 (cheek_medium, 90 - slant);
+%
+% Couldn't find many z examples.  This one is losely inspired
+% by a sfz from Mueller Etuden fuer Horn (Edition Hofmeister).
+%
 
-%      x4r - x4l = cheek_thick; 
-       penpos4 (cheek_thick, -slant);
-       penpos5 (cheek_medium, -55);
-       penpos6 (stem_thick, 0);
-       penpos17 (straigh_len, 90 -slant);
-       z17 = z4l;
+code := 121;
 
-       x6l = 0;
-       y6l = - descender + serif_thick/2;
-       x1l = x6l;
-       y1r = 0.5 ex;
-       y2r = ex;
-       z7 = whatever * updir + z6l;
-       y7 = 43/60  ex;
-       
-       z2l = whatever *updir + 0.3 [z7, z1r];
-       y8 = ypart (0.9 [z7, z2l]);
-       z8 = 2/3 [z6l, z6r] + whatever * updir;
+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#);
 
-       y3r = ex;
-       z3l = 0.58 [(stem_thick, -descender), (stem_thick + cheek_width - cheek_thick, -descender)] + whatever * updir;
-       y4r = 1/3 ex;
-       z4r = whatever*updir + (stem_thick+  cheek_width, -descender);
-
-       z5l = whatever*updir  + z3l;
-       y5l = 1/12 ex;
-
-       z9 = z6r + whatever*updir;
-       y9 = y5l;
-
-       p :=
-               z2r{right} .. {dir( -60)}z8 & z8{dir 35} .. z3r{right}
-               .. tension 0.9 .. z4r{-updir} .. z5r{left} .. z9
-               & z9 -- z6r -- z6l -- z7{updir} 
-               ..  z2l{left} .. tension 1.2 ..
-               % z1r & z1r -- z1l & z1l
-               simple_serif (z1r, z1l, -90)
-               .. cycle;
-       pickup pencircle scaled 1;
-       fill p;
-
-       y12  = 0.5 ex;
-       z12 = z6r + whatever*updir;
-
-       save inner_tension;
-       inner_tension = 1.4;
-       q :=
-               z17l --- z17r  .. z3l{left}.. tension 1.05 .. z12{-updir} .. tension 1.05 .. z5l{right} .. cycle; 
-       unfill q;
-       penlabels (1, 2, 3, 4, 5, 6, 17);
+       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;
 
-       pickup pencircle scaled serif_thick;
-       lft x11 = -left_serif_protude;
-       rt x10 = stem_thick+ right_serif_protude;
-       bot y10 = bot y11 = -descender;
+       y3 = h - .7 thin_thick;
+       x3 = w - .6 top_narrow - .5 thin_thick;
+       y4 = .5 thin_thick;
+       x4 = .5 thin_thick;
 
-       
-       serif := simple_serif (z10, z11, dishing_angle);
-       draw serif;
+       penpos3 (thin_thick, angle (z3 - z4) + 90);
+       penpos4 (thin_thick, angle (z3 - z4) + 90);
 
-       labels(7,8, 9, 10, 11,12);
+       penpos5 (bot_thick, 70);
+       x5l =.25 ex;
+       y5l = .4 bot_overshoot;
 
-       
-       z13 = point 0.05 of serif;
-       z14 = point 0.85 of serif;
-       z15 = z6l + updir * fill_up +( serif_thick/2, 0);
-       z16 = z6r + updir * 1.2fill_up- +( serif_thick/2, 0);
-       labels(13,14, 15, 16);
+       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 z13{direction 0.05 of serif} .. z16{updir};
-       draw z14{-(direction 0.85 of serif)} .. z15{updir};
+
+%      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.
+% * the bulbs are open
 %
 % * blotting around the serif
 %
-%
-%
 % TODO: insert blots around the serif
 %
-%
-%
 
+slant_angle = 20;
 code := 101;
-fet_beginchar("dynamic f", "f", "dynf");
-       set_char_box (0, 1.25 ex#, descender#, ex# + ascender#);
 
+fet_beginchar ("dynamic f", "f");
        save left_angle, right_angle;
-       save serif_length, serif_excentricity;
+       save serif_length, serif_eccentricity;
        save f_thick;
        save bulb_thick, bulb_diam, fill_up;
+       save slant;
        save p;
-       path 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  - 6;
-       right_angle = slant - 3;
-       f_thick = 3/8 ex;
-       bulb_thick = 8/40 ex;
+       left_angle = slant_angle - 6;
+       right_angle = slant_angle - 3;
+       f_thick = 7/16 ex;
        serif_length = 0.96 ex;
-       serif_excentricity = 0.01 ex;
+       serif_eccentricity = 0.01 ex;
+
+       % z1 is the `base point'
+       z1 = (0.2 ex, -serif_thick);
 
-       z1 = (0.375 ex,0);
-       y2 = y1 + ex;
-       z2l = z1 + whatever*dir (90 - left_angle);
        penpos2 (f_thick, 0);
+       y2 = y1 + ex;
+       z2l = z1 + whatever * dir (90 - left_angle);
 
-       y3l = ex + ascender;
-       x3l = x1 + 1 ex;
        penpos3 (med_thick, -90);
+       y3l = y1 + ex + ascender;
+       x3l = x1 + ex;
+
        penpos4 (bulb_thick, -20);
-       z3r = whatever [z4r,z4l];
+       z3r = whatever [z4r, z4l];
 
        x4l - x3l = 1/10 ex;
 
-       penpos5(bulb_thick, -45);
+       penpos5 (bulb_thick, -45);
        x5r = 0.1 [x4l, x4r];
        y5l = y4l - bulb_diam;
 
-       z6 = z2r + whatever* dir (90 - right_angle);
-       y6 = 3/8 ex;
+       z6 = z2r + whatever * dir (90 - right_angle);
+       y6 = y1 + 3/8 ex;
 
+       penpos7 (med_thick, -90);
        x7 = x1 - 1/4 ex;
-       y7r = -descender;
-       penpos7(med_thick, -90);
+       y7r = y1 -descender;
 
        penpos8 (bulb_thick, 160);
        x8l = x7l - 1/10 ex;
-       z7l = whatever [z8r,z8l];
+
+       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);
-
-       p := z1 --- z2l 
-               .. tension 1.1
-               .. z3l{right} .. z4r{down}
-               .. z5r{left} .. z5l{up}
-               .. tension 0.8
-               .. z4l{up} .. z3r{left}
-               .. tension 1.1
-               .. z2r --- z6 .. tension 1.25 ..  z7r{left}
-               .. z8r{up} .. z9r{right} .. z9l{down} .. tension 0.8
-               .. z8l{down} .. z7l{right} .. cycle;
-       pickup pencircle scaled 1;
-       fill p;
-%      draw p;
-
-       pickup pencircle scaled 1.1 serif_thick;
-       (rt x13) - (lft x14) = serif_length;
+
+       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_excentricity;
+       0.5 [x13, x14] = x2 + serif_eccentricity;
 
-       draw z13 .. z14;
+       draw_rounded_block (z14 - (0, 0.7 serif_thick),
+                           z13 + (0, 0.7 serif_thick),
+                           1.4 serif_thick);
 
-       penlabels(16);
-       labels(13,14,15);
+       labels (13, 14);
 fet_endchar;
 
+
 %
-% NOTES:
+% Notes:
 %
-% * right stem is fatter and more straight than the left 2 two  stems.
+% - The `s' is trapezoidal (i.e., narrower at the top).
 %
-% * The twiddle  at the left is similar to the p twiddle 
+% - The white space is differently shaped at the top (the bulb's inner
+%   curve is filled up).
 %
-% * The bottoms of the stems are blotted. 
+% - 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.
 %
-% This is cut & paste programming. Somehow 3 i shapes in two chars (p and m)
-% Doesn't seem worth the trouble of writing a macro.
+% 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 := 108;
-fet_beginchar("dynamic m", "m", "dynm");
-       set_char_box (0, 1.3 ex#, 0, 1.0 ex#);
 
-       % should share code with p for twiddle.
+code := 111;
 
-       save i_thick, i_angle, i_twiddle_thick,
-               i_twiddle_start_angle, i_twiddle_start_y, 
-               i_left_space;
-       save p;
+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;
 
-       i_thick := 21 / 80 ex;
-       i_angle := 20;
-       idir := dir(90- i_angle);
+       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;
-       i_twiddle_thick = serif_thick;
-       i_twiddle_start_y =  1/2 ex;
-       i_twiddle_start_angle = 20;
-       bottom_blot = serif_thick;
 
        penpos1 (i_twiddle_thick, -i_twiddle_start_angle);
-       center =(0,0);
-
        y1 = i_twiddle_start_y;
-       z1r = center - (i_left_space,0)  + whatever * idir;
+       z1r = center - (i_left_space, 0) + whatever * idir;
 
-       y3 = bottom_blot + ypart center; 
-       penpos3(i_thick, 0);
+       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;
-       penpos4(i_thick - bottom_blot, 0);
        z4 - z3 = whatever * idir;
 
-       y2l = 1 ex;
-       z2l = .25 [z3l, z3r] + whatever * idir;
-       z2r = 3/4 [z1r, z3l] + whatever * idir;
-       y2r = y5l + 1/9 ex;
-       z2 = 1/2 [z2l, z2r] ;
-       penpos5(i_thick, 0);
+       penpos5 (i_thick, 0);
        z5 = z4 + whatever * idir;
-       y5 = 55 / 80 ex;
-
-       p := simple_serif (z1l, z1r, 90) .. tension 1.05 .. z2r{right} .. z5l --- z3l
-               ..  z4l --- z4r .. z3r --- z5r .. z2l{left} .. cycle;
+       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;
 
-       fill p;
        right_ending := z5r;
-%      penlabels (1, 2, 3 , 4,5);
+       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;
-       z5l = right_ending + (i_left_space,0);
-       penpos1(serif_thick, - i_twiddle_start_angle);
 
-       y3 = bottom_blot + ypart center; 
-       penpos3(i_thick, 0);
+       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;
-       penpos4(i_thick - bottom_blot, 0);
        z4 - z3 = whatever * idir;
 
-       y2l = 1 ex;
-       z2l = .25 [z3l, z3r] + whatever * idir;
-       z2r = 3/4 [z1r, z3l] + whatever * idir;
-       y2r = y5l + 1/9 ex;
-       z2 = 1/2 [z2l, z2r] ;
-       penpos5(i_thick, 0);
+       penpos5 (i_thick, 0);
+       z5l = right_ending + (i_left_space, 0);
 
-       p := simple_serif (z1l, z1r, 90) .. tension 1.05 .. z2r{right} .. z5l --- z3l
-               ..  z4l --- z4r .. z3r --- z5r .. z2l{left} .. cycle;
+       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;
 
-       fill p;
        right_ending := z5r;
-%      penlabels (1, 2, 3 , 4,5);
+       penlabels (1, 2, 3, 4, 5);
+
+       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
        clearxy;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-       i_thick := 25 / 80 ex;
-       i_angle := 15;
+       i_thick := 23/80 ex;
+       i_angle := -6;
+       idir := dir (90 - i_angle);
        i_left_space := 14/80 ex;
-       end_overshoot = 1/2 serif_thick;
 
-
-       idir := dir(90- i_angle);
+       penpos1 (serif_thick, -i_twiddle_start_angle);
        z1r = right_ending;
-       z5l = right_ending + (i_left_space,0);
-       penpos5 (whatever, 10);
-       penpos3 (whatever, 20);
 
-       y7 = 0; 
-       penpos7(i_thick ,0);
-       
-       penpos1(serif_thick, - i_twiddle_start_angle);
-       
+       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;
-       z5l = z7l + whatever * idir;
+
+       penpos5 (whatever, 10);
+       z5l = right_ending + (i_left_space, 0);
        z5r = z7r + whatever * idir;
 
-       save end_twiddle_angle;
-       end_twiddle_angle := 35;
-       penpos6(serif_thick, - end_twiddle_angle);
+       penpos6 (serif_thick, -i_twiddle_end_angle);
        y6l = 23/80 ex + ypart center;
-       z6l = 1.6 [z3l, z3r]  + whatever * idir;
-       
+       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;
 
 
-       y3l =  1/8 ex + ypart center; 
-       y2l = 1 ex+  end_overshoot;
-       z2l = .08 [z3l, z3r] + whatever * idir;
-       z2r = 3/4 [z1r, z3l] + whatever * idir;
-       y2r = y5l + 1/9 ex;
-       z2 = 1/2 [z2l, z2r] ;
-       z8 = z7 - (0, 2 end_overshoot);
-
-       p := simple_serif (z1l, z1r, 90) .. tension 1.05
-               .. z2r{right} .. z5l --- z3l
-               .. z8{right}
-               .. simple_serif(z6r, z6l, 90)
-               .. tension 0.85
-               .. z3r --- z5r
-               .. tension 1.09
-               .. z2l{left} .. cycle;
+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 p;
-       fill p;
-       right_ending := z5r;
-%      penlabels (1, 2, 3 , 4,5,6,7, 8);
-       clearxy;
 
+%      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;
 
-%% 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", and
-%  - 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"
+%%% KERNING
+
+ligtable "m":
+       "p" kern 0.2 ex#,
+       "f" kern -0.1 ex#;
 
-% "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".
+ligtable "f":
+       "f" kern -0.13 ex#;
 
+ligtable "r":
+       "f" kern 0.1 ex#;
 
-% Chester, Breitkopf suggest smaller sizes of these other chars,
+
+%% 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.