]> git.donarmstrong.com Git - lilypond.git/blobdiff - mf/parmesan-custodes.mf
*** empty log message ***
[lilypond.git] / mf / parmesan-custodes.mf
index b4a0be94a056d2e4592a4c23e5a4621c8ad6fbc5..591ee9d2381b3857bd08f3a268d4ff2858c0a858 100644 (file)
@@ -1,9 +1,9 @@
-% -*-Fundamental-*-
+% -%-Fundamental-%- -*-Metafont-*-
 % parmesan-custodes.mf -- implement ancient custodes
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c)  2000--2003 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2000--2005 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 save black_notehead_width;
@@ -11,8 +11,28 @@ numeric black_notehead_width;
 
 fet_begingroup ("custodes")
 
-noteheight#:=staff_space#+ (1 + overdone_heads) *stafflinethickness#;
-define_pixels(noteheight);
+%
+% character aligment:
+%
+%   The custos is assumed to be vertically centered around (0, 0).
+%   The left-most edge of the custos 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 cover the horizontal range of the custos that is to
+%   be printed in the staff.  If the custos has an appendage that is
+%   supposed to reach beyond the right end of the staff, the width
+%   should be set such that the appendage is outside of the char box.
+%
+% * depth: Should match the bottom edge of the custos.  Affects
+%   vertical collision handling.
+%
+% * height: Should match the top edge of the custos.  Affects vertical
+%   collision handling.
+%
 
 save between_staff_lines, on_staff_line, anywhere;
 between_staff_lines = 0;
@@ -32,75 +52,75 @@ dir_down = -1;
 %
 
 % parameterized hufnagel custos
-def custos_hufnagel(expr verbose_name, internal_name, ly_name,
+def custos_hufnagel(expr verbose_name, internal_name, 
                    direction, staffline_adjustment) =
 
-       fet_beginchar(verbose_name, internal_name, ly_name)
-
-               save 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;
+       fet_beginchar(verbose_name, internal_name)
+               save alpha, dalpha, ht, wd, stem_ht, pen_size;
                ht# = noteheight#;
-               2beta# = ht# * b_h;
-               a# = beta# * a_b;
-               wd# = 2a# / a_w;
-               black_notehead_width# := wd#;
-
-               save rh_width, rh_height, rh_edge; % rhombus dimensions
-               rh_width# / ht# = tand(35);
-               rh_height# = 1.0ht#;
-               rh_edge# * cosd(35) = ht# / 2;
+               wd#/ht# = 0.6;
+               alpha# = 35;
+               dalpha# = direction*alpha#;
 
-               save stem_size;
                if staffline_adjustment = between_staff_lines:
-                       stem_size = 0.25;
+                       stem_ht# = 1.00 staff_space#;
                elseif staffline_adjustment = on_staff_line:
-                       stem_size = 0.75;
+                       stem_ht# = 1.50 staff_space#;
                else: % staffline_adjustment = anywhere
-                       stem_size = 0.50;
+                       stem_ht# = 1.25 staff_space#;
                fi;
+               pen_size# = 0.5*sqrt(wd#*wd#+ht#*ht#);
 
-               define_pixels(rh_width, rh_height, rh_edge);
+               define_pixels(ht, wd, pen_size, stem_ht);
                pickup pencircle
-                 xscaled stafflinethickness
-                 yscaled rh_edge
-                 rotated (-35*direction);
-               z1=(0.0rh_width,+0.25direction*rh_height);
-               z2=(0.5rh_width,-0.25direction*rh_height);
-               z3-z2=(stem_size*rh_width,+0.75*stem_size*direction*rh_height);
+                 xscaled linethickness
+                 yscaled pen_size
+                 rotated -dalpha#;
+
+               if direction = dir_up:
+                       top y1 = ht/2;
+                       bot y2 = -ht/2;
+               else:
+                       bot y1 = -ht/2;
+                       top y2 = ht/2;
+               fi;
+               lft x1 = 0;
+               rt  x2 = wd;
+               y3 - y2 = direction*stem_ht;
+               (y3 - y2) = (x3 - x2) * tand(90-dalpha#);
                draw z1 -- z2 -- z3;
 
-               set_char_box(stafflinethickness#, wd# / 2,
-                            ht# / 2, ht# / 2);
-
+               % The stem is intentionally outside of the char box.
+               if direction > 0:
+                       set_char_box(0, wd#, ht#/2, stem_ht#);
+               else:
+                       set_char_box(0, wd#, stem_ht#, ht#/2);
+               fi;
        fet_endchar;
 enddef;
 
 % custos hufnagel, stem up, between staff lines
-custos_hufnagel("Custos Hufnagel", "hufnagel-u0", "hufnagelu0",
+custos_hufnagel("Custos Hufnagel", "hufnagel.u0", 
                dir_up, between_staff_lines);
 
 % custos hufnagel, stem up, on staff line
-custos_hufnagel("Custos Hufnagel", "hufnagel-u1", "hufnagelu1",
+custos_hufnagel("Custos Hufnagel", "hufnagel.u1", 
                dir_up, on_staff_line);
 
 % custos hufnagel, stem up, anywhere
-custos_hufnagel("Custos Hufnagel", "hufnagel-u2", "hufnagelu2",
+custos_hufnagel("Custos Hufnagel", "hufnagel.u2", 
                dir_up, anywhere);
 
 % custos hufnagel, stem down, between staff lines
-custos_hufnagel("Reverse Custos Hufnagel", "hufnagel-d0", "hufnageld0",
+custos_hufnagel("Reverse Custos Hufnagel", "hufnagel.d0",
                dir_down, between_staff_lines);
 
 % custos hufnagel, stem down, on staff line
-custos_hufnagel("Reverse Custos Hufnagel", "hufnagel-d1", "hufnageld1",
+custos_hufnagel("Reverse Custos Hufnagel", "hufnagel.d1",
                dir_down, on_staff_line);
 
 % custos hufnagel, stem down, anywhere
-custos_hufnagel("Reverse Custos Hufnagel", "hufnagel-d2", "hufnageld2",
+custos_hufnagel("Reverse Custos Hufnagel", "hufnagel.d2",
                dir_down, anywhere);
 
 %%%%%%%%
@@ -110,71 +130,69 @@ custos_hufnagel("Reverse Custos Hufnagel", "hufnagel-d2", "hufnageld2",
 %
 %
 
-def custos_medicaea(expr verbose_name, internal_name, ly_name,
+def custos_medicaea(expr verbose_name, internal_name, 
                    direction, staffline_adjustment) =
 
-       fet_beginchar(verbose_name, internal_name, ly_name)
-
-               save b_h, a_w;
-               a_b := 1.54; % b_h * a_b / a_w = wd / ht
-               b_h := 0.85;
-               a_w := 1.09;
+       fet_beginchar(verbose_name, internal_name)
 
-               save a, beta, ht, wd;
-               ht# = noteheight#; %%  * mag;
-               2beta# = ht# * b_h;
-               a# = beta# * a_b;
-               wd# = 0.4a# / a_w;      % width intentionally too small
-               black_notehead_width# := wd#;
-
-               define_pixels(ht, wd);
+               save ht, wd, stem_ht;
+               ht# = noteheight#;
+               wd#/ht# = 0.25;
 
-               save stem_size;
                if staffline_adjustment = between_staff_lines:
-                       stem_size = 0.90;
+                       stem_ht# = 1.00 staff_space#;
                elseif staffline_adjustment = on_staff_line:
-                       stem_size = 1.40;
+                       stem_ht# = 1.50 staff_space#;
                else: % staffline_adjustment = anywhere
-                       stem_size = 1.15;
+                       stem_ht# = 1.25 staff_space#;
                fi;
 
-               pickup pencircle xscaled blot_diameter yscaled 1.0ht;
-               z1 = (0.0wd, 0.0ht);
-               z2 = z1 + (1.0wd - blot_diameter/2, 0);
-               draw z1 .. z2;
+               define_pixels(ht, wd, stem_ht);
 
-               pickup pencircle scaled stafflinethickness;
-               z3 = (1.0wd - stafflinethickness/2, 0.0ht);
-               z4 = z3 + (0, +direction*stem_size*ht);
-               draw z3 .. z4;
+               pickup pencircle xscaled 0.6linethickness yscaled ht;
+               lft x1 = 0;
+               y1 = 0;
+               rt x2 = wd;
+               y2 = y1;
+               draw z1 -- z2;
 
-               set_char_box(0, wd#, ht# / 2, ht# / 2);
+               pickup pencircle scaled 0.6linethickness;
+               rt x3 = wd;
+               y3 = 0;
+               x4 = x3;
+               y4 = direction*stem_ht;
+               draw z3 -- z4;
 
+               if direction > 0:
+                       set_char_box(0, wd#, ht#/2, stem_ht#);
+               else:
+                       set_char_box(0, wd#, stem_ht#, ht#/2);
+               fi;
        fet_endchar;
 enddef;
 
 % custos medicaea, stem up, between staff lines
-custos_medicaea("Custos Med.", "medicaea-u0", "medicaea_u0",
+custos_medicaea("Custos Med.", "medicaea.u0", 
                dir_up, between_staff_lines);
 
 % custos medicaea, stem up, on staff line
-custos_medicaea("Custos Med.", "medicaea-u1", "medicaea_u1",
+custos_medicaea("Custos Med.", "medicaea.u1", 
                dir_up, on_staff_line);
 
 % custos medicaea, stem up, anywhere
-custos_medicaea("Custos Med.", "medicaea-u2", "medicaea_u2",
+custos_medicaea("Custos Med.", "medicaea.u2", 
                dir_up, anywhere);
 
 % custos medicaea, stem down, between staff lines
-custos_medicaea("Reverse Custos Med.", "medicaea-d0", "medicaead0",
+custos_medicaea("Reverse Custos Med.", "medicaea.d0", 
                dir_down, between_staff_lines);
 
 % custos medicaea, stem down, on staff line
-custos_medicaea("Reverse Custos Med.", "medicaea-d1", "medicaead1",
+custos_medicaea("Reverse Custos Med.", "medicaea.d1", 
                dir_down, on_staff_line);
 
 % custos medicaea, stem down, anywhere
-custos_medicaea("Reverse Custos Med.", "medicaea-d2", "medicaead2",
+custos_medicaea("Reverse Custos Med.", "medicaea.d2", 
                dir_down, anywhere);
 
 %%%%%%%%
@@ -184,72 +202,78 @@ custos_medicaea("Reverse Custos Med.", "medicaea-d2", "medicaead2",
 %
 %
 
-def custos_vaticana(expr verbose_name, internal_name, ly_name,
+def custos_vaticana(expr verbose_name, internal_name, 
                    direction, staffline_adjustment) =
 
-       fet_beginchar(verbose_name, internal_name, ly_name)
-
-               save 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;
-               2beta# = ht# * b_h;
-               a# = beta# * a_b;
-               wd# = 0.4a# / a_w;
-               black_notehead_width# := wd#;
+       fet_beginchar(verbose_name, internal_name)
+               save ht, wd, u_offs, l_offs, stem_size, stem_end;
+               save pen_ht, l_shift, curve_ht, bend_ht;
+               ht# = noteheight#;
+               wd# = 0.24ht#;
 
-               save stem_size;
                if staffline_adjustment = between_staff_lines:
-                       stem_size = 0.60;
+                       stem_size# = 1.00;
                elseif staffline_adjustment = on_staff_line:
-                       stem_size = 1.10;
+                       stem_size# = 1.50;
                else: % staffline_adjustment = anywhere
-                       stem_size = 0.85;
+                       stem_size# = 1.25;
+               fi;
+               curve_ht# = 0.6ht#;
+               bend_ht# = 0.10ht#;
+               l_shift# = 0.04ht#;
+               u_offs# = +direction*0.5*(bend_ht#+l_shift#);
+               l_offs# = -direction*0.5*(bend_ht#-l_shift#);
+               stem_end# = direction*stem_size#*staff_space#;
+               pen_ht# = curve_ht#-l_shift#;
+
+               define_pixels(u_offs, l_offs, stem_end, ht, wd, pen_ht);
+
+               pickup pencircle scaled 0.6linethickness;
+               z1 = (0, u_offs);
+               z2 = (0.7wd, l_offs);
+               z3 = (wd, l_offs);
+               penpos1(pen_ht, 90);
+               penpos2(pen_ht, 90);
+               penpos3(pen_ht, 90);
+               penstroke z1e{z2 - z1} .. {right}z2e .. z3e;
+
+               rt x4 = wd;
+               bot y4 = 0;
+               x5 = x4;
+               top y5 = stem_end;
+               draw z4 -- z5;
+
+               if direction > 0:
+                       set_char_box(0, wd#, -l_offs#+0.5pen_ht#, stem_end#);
+               else:
+                       set_char_box(0, wd#, -stem_end#, +l_offs#+0.5pen_ht#);
                fi;
-
-               define_pixels(ht, wd);
-               pickup pencircle scaled stafflinethickness;
-
-               z1 = (0.0wd, +direction*0.05ht);
-               z2 = (1.0wd + 0.5stafflinethickness, 0.0ht);
-               penpos1(0.5ht, 90);
-               penpos2(0.5ht, 90);
-               penstroke z1e{z2 - z1} .. {right}z2e;
-
-               z3=(1.0wd, +0.0ht);
-               z4=(1.0wd, +direction*stem_size*ht);
-               draw z3 -- z4;
-
-               set_char_box(0, wd#, 0.3 ht#, 0.3 ht#);
 
        fet_endchar;
 enddef;
 
 % custos vaticana, stem up, between staff lines
-custos_vaticana("Custos Ed. Vat.", "vaticana-u0", "vaticana_u0",
+custos_vaticana("Custos Ed. Vat.", "vaticana.u0", 
                dir_up, between_staff_lines);
 
 % custos vaticana, stem up, on staff line
-custos_vaticana("Custos Ed. Vat.", "vaticana-u1", "vaticana_u1",
+custos_vaticana("Custos Ed. Vat.", "vaticana.u1", 
                dir_up, on_staff_line);
 
 % custos vaticana, stem up, anywhere
-custos_vaticana("Custos Ed. Vat.", "vaticana-u2", "vaticana_u2",
+custos_vaticana("Custos Ed. Vat.", "vaticana.u2", 
                dir_up, anywhere);
 
 % custos vaticana, stem down, between staff lines
-custos_vaticana("Reverse Custos Ed. Vat.", "vaticana-d0", "vaticanad0",
+custos_vaticana("Reverse Custos Ed. Vat.", "vaticana.d0", 
                dir_down, between_staff_lines);
 
 % custos vaticana, stem down, on_staff_line
-custos_vaticana("Reverse Custos Ed. Vat.", "vaticana-d1", "vaticanad1",
+custos_vaticana("Reverse Custos Ed. Vat.", "vaticana.d1", 
                dir_down, on_staff_line);
 
 % custos vaticana, stem down, anywhere
-custos_vaticana("Reverse Custos Ed. Vat.", "vaticana-d2", "vaticanad2",
+custos_vaticana("Reverse Custos Ed. Vat.", "vaticana.d2", 
                dir_down, anywhere);
 
 %%%%%%%%
@@ -259,71 +283,75 @@ custos_vaticana("Reverse Custos Ed. Vat.", "vaticana-d2", "vaticanad2",
 %
 %
 
-def custos_mensural(expr verbose_name, internal_name, ly_name,
+def custos_mensural(expr verbose_name, internal_name, 
                    direction, staffline_adjustment) =
 
-       fet_beginchar(verbose_name, internal_name, ly_name)
-
-               save 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;
+       fet_beginchar(verbose_name, internal_name)
+               save alpha, dalpha, ht, wd, stem_ht;
                ht# = noteheight#;
-               2beta# = ht# * b_h;
-               a# = beta# * a_b;
-               wd# = 2a# / a_w;        % width intentionally too small
-               set_char_box(0, wd#, ht# / 2, ht# / 2);
-               black_notehead_width# := wd#;
+               wd#/ht# = 1.2;
+               alpha# = 35;
+               dalpha# = direction*alpha#;
 
-               save stem_size;
                if staffline_adjustment = between_staff_lines:
-                       stem_size = 0.85;
+                       stem_ht# = 1.00 staff_space#;
                elseif staffline_adjustment = on_staff_line:
-                       stem_size = 1.35;
+                       stem_ht# = 1.50 staff_space#;
                else: % staffline_adjustment = anywhere
-                       stem_size = 1.10;
+                       stem_ht# = 1.25 staff_space#;
                fi;
 
-               define_pixels(ht, wd);
+               define_pixels(ht, wd, stem_ht);
                pickup pencircle
-                 xscaled stafflinethickness
+                 xscaled linethickness
                  yscaled 0.4ht
-                 rotated (-35*direction);
-               z1=(0.0wd,-direction*0.2ht);
-               z2=(0.2wd,+direction*0.2ht);
-               z3=(0.4wd,-direction*0.2ht);
-               z4=(0.6wd,+direction*0.2ht);
-               z5=(0.8wd,-direction*0.2ht);
-               z6-z5=(stem_size*0.5wd,+direction*stem_size*ht);
+                 rotated -dalpha#;
+
+               if direction > 0:
+                       bot y1 = bot y3 = bot y5 = -direction*0.33ht;
+                       top y2 = top y4 = +direction*0.33ht;
+               else:
+                       top y1 = top y3 = top y5 = -direction*0.33ht;
+                       bot y2 = bot y4 = +direction*0.33ht;
+               fi;
+               lft x1 = 0.0wd; lft x2 = 0.2wd; lft x3 = 0.4wd;
+               lft x4 = 0.6wd; lft x5 = 0.8wd;
+               y6 - y5 = direction*stem_ht;
+               (y6 - y5) = (x6 - x5) * tand(90-dalpha#);
+
                draw z1 -- z2 -- z3 -- z4 -- z5 -- z6;
 
+               % The stem is intentionally outside of the char box.
+               if direction > 0:
+                       set_char_box(0, wd#, +direction*0.33ht#, stem_ht#);
+               else:
+                       set_char_box(0, wd#, stem_ht#, -direction*0.33ht#);
+               fi;
        fet_endchar;
 enddef;
 
 % custos mensural, stem up, between staff lines
-custos_mensural("Custos Mensural", "mensural-u0", "mensuralu0",
+custos_mensural("Custos Mensural", "mensural.u0", 
                dir_up, between_staff_lines);
 
 % custos mensural, stem up, on staff line
-custos_mensural("Custos Mensural", "mensural-u1", "mensuralu1",
+custos_mensural("Custos Mensural", "mensural.u1", 
                dir_up, on_staff_line);
 
 % custos mensural, stem up, anywhere
-custos_mensural("Custos Mensural", "mensural-u2", "mensuralu2",
+custos_mensural("Custos Mensural", "mensural.u2", 
                dir_up, anywhere);
 
 % custos mensural, stem down, between staff lines
-custos_mensural("Reverse Custos Mensural", "mensural-d0", "mensurald0",
+custos_mensural("Reverse Custos Mensural", "mensural.d0", 
                dir_down, between_staff_lines);
 
 % custos mensural, stem down, on staff line
-custos_mensural("Reverse Custos Mensural", "mensural-d1", "mensurald1",
+custos_mensural("Reverse Custos Mensural", "mensural.d1", 
                dir_down, on_staff_line);
 
 % custos mensural, stem down, anywhere
-custos_mensural("Reverse Custos Mensural", "mensural-d2", "mensurald2",
+custos_mensural("Reverse Custos Mensural", "mensural.d2", 
                dir_down, anywhere);
 
 fet_endgroup ("custodes")