X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mf%2Fparmesan-clefs.mf;h=a291e3613afc8f8604291c115ecf986c36dd5170;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=de7bb2af77b4f09b338f8c23b33c39852ee9031c;hpb=7cacca4ac9e71dc19ba1c1fc600d2bd4ac4b9b26;p=lilypond.git diff --git a/mf/parmesan-clefs.mf b/mf/parmesan-clefs.mf index de7bb2af77..a291e3613a 100644 --- a/mf/parmesan-clefs.mf +++ b/mf/parmesan-clefs.mf @@ -1,12 +1,54 @@ -% -*-Fundamental-*- -% parmesan-clefs.mf -- implement ancient clefs -% -% source file of LilyPond's pretty-but-neat music font +% Feta (not the Font-En-Tja) music font -- ancient clefs +% This file is part of LilyPond, the GNU music typesetter. % -% (c) 2001--2002 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % +% The LilyPond font is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version, or under the SIL Open Font License. +% +% LilyPond is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with LilyPond. If not, see . -fet_begingroup ("clefs") +fet_begingroup ("clefs"); + +% +% character aligment: +% +% Each clef is associated with a particular pitch: the treble clef +% with the `g', the alto clef with the `c', the bass clef with the +% `f', etc. The shape of each clef character defines a vertical +% position that is assumed to represent this pitch. For the treble +% clef, it is the vertical position of the center of the spiral +% ending that represents the `g' pitch. For the bass clef, it is +% the center between the two fat dots that define the vertical +% position of the `f' pitch. For the alto clef, it is the vertical +% center of the clef that is aligned with the `c' pitch. For each +% clef character, this center should be vertically aligned with the +% point (0, 0). The horizontal alignment of each clef character +% should be such that the vertical line through the point (0, 0) +% touches the left-most edge of the clef. +% +% TODO: document exact_center +% +% set_char_box() conventions: +% +% * breapth: Ignored (as far as I know). Should be set to 0. +% +% * width: Should match the clef's width. +% +% * depth: Should match the bottom edge of the clef. Affects vertical +% collision handling. +% +% * height: Should match the top edge of the clef. Affects vertical +% collision handling. +% %%%%%%%% @@ -17,88 +59,149 @@ fet_begingroup ("clefs") % % % -def draw_vaticana_do_clef(expr exact_center, reduction) = +def draw_vaticana_do_clef (expr exact_center, reduction) = save reduced_il; reduced_il# = staff_space# * reduction; - - set_char_box(0.4reduced_il#, 0.4reduced_il#, 0, reduced_il#); - define_pixels(reduced_il); + set_char_box (0 - xpart exact_center, + 0.5 reduced_il# + xpart exact_center, + 0.8 reduced_il# - ypart exact_center, + 0.8 reduced_il# + ypart exact_center); + + define_pixels (reduced_il); + + save pat, ellipse, clef, T; + path pat, ellipse, clef; + transform T; + + T := identity xscaled 0.6 linethickness + yscaled 0.6 reduced_il; + pickup pencircle transformed T; + ellipse := reverse fullcircle transformed T; - pickup pencircle xscaled stafflinethickness yscaled 0.6reduced_il; + save xoffs, yoffs; - save za, zb, zc, zd, ze, zf; - pair za, zb, zc, zd, ze, zf; + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; - za = exact_center + (-0.0reduced_il, -.45reduced_il); - zb = exact_center + (-0.2reduced_il, -.50reduced_il); - zc = exact_center + (-0.4reduced_il, -.25reduced_il); - zd = exact_center + (-0.4reduced_il, +.25reduced_il); - ze = exact_center + (-0.2reduced_il, +.50reduced_il); - zf = exact_center + (-0.0reduced_il, +.45reduced_il); - draw za .. zb .. zc -- % lower punctum - zd .. ze .. zf; % upper punctum + define_pixels (xoffs, yoffs); + + rt z11 = (xoffs + 0.50 reduced_il, yoffs - .45 reduced_il); + z12 = (xoffs + 0.25 reduced_il, yoffs - .50 reduced_il); + lft z13 = (xoffs + 0.00 reduced_il, yoffs - .28 reduced_il); + lft z14 = (xoffs, yoffs); + + pat := z11 + .. z12 + .. z13 + -- z14; + + save shift; + pair shift; + + % adjust vertically to fit into bounding box + shift = find_tangent_shift (((0, -d + 0.3 reduced_il) + -- (w, -d + 0.3 reduced_il)), pat, + (0, -d / 2), (0, d / 2)); + pat := pat shifted shift; + + clef := rt z14{down} + .. top (point 1 of pat) + .. get_subpath (ellipse, + -direction 0 of pat, direction 0 of pat, + point 0 of pat) + .. bot (point 1 of pat) + .. get_subpath (ellipse, + direction 2 of pat, up, + point 2 of pat); + + fill clef + -- reverse clef yscaled -1 + -- cycle; + + labels (11, 12, 13, 14); enddef; -fet_beginchar("Ed. Vat. do clef", "vaticana_do", "vatdoclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_vaticana_do_clef((0,0), 1.0); +fet_beginchar ("Ed. Vat. do clef", "vaticana.do"); + draw_staff_if_debugging (-1, 3); + draw_vaticana_do_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("Ed. Vat. do clef", "vaticana_do_change", "vatcdoclef") - draw_vaticana_do_clef((0,0), 1.0); % no reduction + + +fet_beginchar ("Ed. Vat. do clef", "vaticana.do_change"); + draw_vaticana_do_clef ((0, 0), 1.0); % no reduction fet_endchar; -def draw_vaticana_fa_clef(expr exact_center, reduction) = +def draw_vaticana_fa_clef (expr exact_center, reduction) = + save reduced_il, xoffs, yoffs; - save reduced_il, z; reduced_il# = staff_space# * reduction; - define_pixels(reduced_il); - - save za, zb, zc, zd, ze; - pair za, zb, zc, zd, ze; - - %stem - pickup pencircle scaled stafflinethickness; - xpart za = xpart zb = - xpart exact_center + 0.4reduced_il; - ypart za = ypart exact_center = ypart zb + 1.5reduced_il; - draw za .. zb; - - %left-handed punctum - pickup pencircle xscaled stafflinethickness yscaled 0.5reduced_il; - zc = exact_center + - (+0.4reduced_il, -0.05reduced_il); - zd = exact_center + - (+0.2reduced_il, +0.05reduced_il); - ze = exact_center + - (+0.0reduced_il, +0.00reduced_il); - draw zc .. zd .. ze; - - %right-handed puncta as in do clef - draw_vaticana_do_clef( - exact_center + - (+0.8reduced_il + 1.25stafflinethickness, 0), - reduction); - - set_char_box(0.5reduced_il#, 1.5reduced_il#, 0, reduced_il#); + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (reduced_il, xoffs, yoffs); + + % left-handed punctum + save ellipse, pat, T; + path ellipse, pat; + transform T; + + T := identity xscaled 0.6 linethickness + yscaled 0.5 reduced_il; + pickup pencircle transformed T; + ellipse := reverse fullcircle transformed T; + + lft z21 = (xoffs + 0.00 reduced_il, yoffs + 0.00 reduced_il); + z22 = (xoffs + 0.25 reduced_il, yoffs + 0.05 reduced_il); + rt z23 = (xoffs + 0.50 reduced_il, yoffs - 0.05 reduced_il); + + pat := z21 + .. z22 + .. z23; + + fill get_subpath (ellipse, + -direction 0 of pat, direction 0 of pat, z21) + .. top z22 + .. get_subpath (ellipse, + direction 2 of pat, -direction 2 of pat, z23) + .. bot z22 + .. cycle; + + % stem + pickup pencircle scaled 0.6 linethickness; + + x23 = x24; + yoffs = bot y24 + 1.5 reduced_il; + + draw_rounded_block (bot lft z24, top rt z23, 0.6 linethickness); + + labels (21, 22, 23, 24); + + % right-handed puncta as in do clef + draw_vaticana_do_clef (exact_center + (0.55 reduced_il#, 0), + reduction); + + set_char_box (0 - xpart exact_center, + 1.05 reduced_il# + xpart exact_center, + 1.5 reduced_il# - ypart exact_center, + 0.8 reduced_il# + ypart exact_center); enddef; -fet_beginchar("Ed. Vat. fa clef", "vaticana_fa", "vatfaclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_vaticana_fa_clef((0,0), 1.0); +fet_beginchar ("Ed. Vat. fa clef", "vaticana.fa"); + draw_staff_if_debugging (-1, 3); + draw_vaticana_fa_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("Ed. Vat. fa clef", "vaticana_fa_change", "vatcfaclef") - draw_vaticana_fa_clef((0,0), 1.0); % no reduction + + +fet_beginchar ("Ed. Vat. fa clef", "vaticana.fa_change"); + draw_vaticana_fa_clef ((0, 0), 1.0); % no reduction fet_endchar; + %%%%%%%% % % @@ -107,114 +210,149 @@ fet_endchar; % % % -def draw_medicaea_do_clef(expr exact_center, reduction) = +def draw_medicaea_do_clef (expr exact_center, reduction) = save reduced_il, reduced_slt; + reduced_il# = staff_space# * reduction; - reduced_slt# = stafflinethickness# * reduction; - define_pixels(reduced_il); - define_pixels(reduced_slt); + reduced_slt# = linethickness# * reduction; + + define_pixels (reduced_il); + define_pixels (reduced_slt); + + set_char_box (0 - xpart exact_center, + 1.0 reduced_il# + xpart exact_center, + 1.5 reduced_il# - ypart exact_center, + 1.5 reduced_il# + ypart exact_center); save flag_height; + flag_height# = 0.5 reduced_il#; - define_pixels(flag_height); - - %lower flag - save za, zb; - pair za, zb; - pickup pencircle xscaled reduced_slt yscaled flag_height; - xpart exact_center - = xpart za + 0.5 reduced_il - = xpart zb - 0.5 reduced_il; - ypart za = ypart exact_center - 0.5 flag_height - - 0.5 (staff_space - reduced_il); - ypart zb = ypart za - reduced_il + flag_height; - draw za .. zb; - - %upper flag - save za, zb; - pair za, zb; - pickup pencircle xscaled reduced_slt yscaled flag_height; - xpart exact_center - = xpart za + 0.5 reduced_il - = xpart zb - 0.5 reduced_il; - ypart za = ypart exact_center - 0.5 flag_height - - 0.5 (staff_space - reduced_il) - + staff_space; - ypart zb = ypart za - reduced_il + flag_height; - draw za .. zb; - - %stem - save za, zb; - pair za, zb; + + define_pixels (flag_height); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + % flags + save ellipse, T; + path ellipse; + transform T; + + T := identity xscaled reduced_slt + yscaled flag_height; + pickup pencircle transformed T; + ellipse := reverse fullcircle transformed T; + + xoffs = lft x1 = rt x2 - reduced_il; + y1 = yoffs + 0.5 (reduced_il - flag_height - staff_space); + y2 = y1 - reduced_il + flag_height; + + fill top z1 + -- get_subpath (ellipse, z2 - z1, z1 - z2, z2) + -- bot z1 + -- cycle; + + xoffs = lft x3 = rt x4 - reduced_il; + y3 = yoffs + 0.5 (reduced_il - flag_height + staff_space); + y4 = y3 - reduced_il + flag_height; + + fill top z3 + -- get_subpath (ellipse, z4 - z3, z3 - z4, z4) + -- bot z3 + -- cycle; + + % stem pickup pencircle scaled reduced_slt; - xpart za = xpart zb = xpart exact_center - 0.5 reduced_il; - ypart exact_center - = ypart za + 1.5 reduced_il - = ypart zb - 1.5 reduced_il; - draw za .. zb; - - set_char_box(0.5reduced_il#, 1.5reduced_il#, - 1.5reduced_il#, 1.5reduced_il#); + + lft x5 = lft x6 = xoffs; + yoffs = top y6 - 1.5 reduced_il = bot y5 + 1.5 reduced_il; + + draw_rounded_block (bot lft z5, top rt z6, reduced_slt); + + labels (1, 2, 3, 4, 5, 6); enddef; -fet_beginchar("Ed. Med. do clef", "medicaea_do", "meddoclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_medicaea_do_clef((0,0), 1.0); +fet_beginchar ("Ed. Med. do clef", "medicaea.do"); + draw_staff_if_debugging (-1, 3); + draw_medicaea_do_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("Ed. Med. do clef", "medicaea_do_change", "cmeddoclef") - draw_medicaea_do_clef((0,0), .8); + + +fet_beginchar ("Ed. Med. do clef", "medicaea.do_change"); + draw_medicaea_do_clef ((0, 0), .8); fet_endchar; -def draw_medicaea_fa_clef(expr exact_center, reduction) = +def draw_medicaea_fa_clef (expr exact_center, reduction) = % inspired by Regensburger Edition of Medicaea (1885/86), in: % MGG, volume 2, col. 1327 ("Choralreform"), fig. 2. save reduced_il, reduced_slt; + reduced_il# = staff_space# * reduction; - reduced_slt# = stafflinethickness# * reduction; - define_pixels(reduced_il); - define_pixels(reduced_slt); - - save za, zb, zc, zd, ze; - pair za, zb, zc, zd, ze; - - %stem - pickup pencircle scaled stafflinethickness; - xpart za = xpart zb = - xpart exact_center + 0.4reduced_il; - ypart za = ypart exact_center = ypart zb + 1.5reduced_il; - draw za -- zb; - - %left-handed punctum - pickup pencircle xscaled reduced_slt yscaled reduced_il; - zc = exact_center + - (+0.4reduced_il, 0); - zd = exact_center + - (+0.0reduced_il, 0); - draw zc -- zd; - - %right-handed puncta as in do clef - draw_medicaea_do_clef( - exact_center + - (+1.1reduced_il + 1.25stafflinethickness, 0), - reduction); - - set_char_box(reduced_il#/2, 2.6reduced_il#, 0, reduced_il#); + reduced_slt# = linethickness# * reduction; + + define_pixels (reduced_il); + define_pixels (reduced_slt); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + % stem + pickup pencircle scaled reduced_slt; + + x11 = x12 = xoffs + 0.4 reduced_il; + y11 = yoffs = bot y12 + 1.5 reduced_il; + + draw_rounded_block (bot lft z12, top rt z11, reduced_slt); + + % left-handed punctum + save ellipse, T; + path ellipse; + transform T; + + T := identity xscaled reduced_slt + yscaled reduced_il; + pickup pencircle transformed T; + ellipse := reverse fullcircle transformed T; + + lft z13 = (xoffs, yoffs); + rt z14 = z11 + (reduced_slt / 2, 0); + + fill get_subpath (ellipse, left, right, z13) + -- get_subpath (ellipse, right, left, z14) + -- cycle; + + labels (11, 12, 13, 14); + + % right-handed puncta as in do clef + draw_medicaea_do_clef (exact_center + (0.7 reduced_il#, 0), + reduction); + + set_char_box (0 - xpart exact_center, + 1.7 reduced_il# + xpart exact_center, + 1.5 reduced_il# - ypart exact_center, + 1.5 reduced_il# + ypart exact_center); enddef; -fet_beginchar("Ed. Med. fa clef", "medicaea_fa", "medfaclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_medicaea_fa_clef((0,0), 1.0); +fet_beginchar ("Ed. Med. fa clef", "medicaea.fa"); + draw_staff_if_debugging (-1, 3); + draw_medicaea_fa_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("Ed. Med. fa clef", "medicaea_fa_change", "cmedfaclef") - draw_medicaea_fa_clef((0,0), .8); + + +fet_beginchar ("Ed. Med. fa clef", "medicaea.fa_change"); + draw_medicaea_fa_clef ((0, 0), .8); fet_endchar; @@ -226,532 +364,1027 @@ fet_endchar; % % % -brevis_wid# := 2 staff_space#; -def draw_brevis(expr exact_center, reduction, small_width, small_height) = - % - % inspired by function draw_brevis of - % feta-bolletjes.mf - % - save reduced_slt, reduced_nht; - save stem_width, head_width; - save serif_size, serif_protrude; - save holeheight, beamheight; - - reduced_slt# = stafflinethickness# * reduction; - reduced_nht# = noteheight# * reduction; - stem_width# = 1.4 reduced_slt#; - if small_width: - head_width# = 0.5brevis_wid# * reduction; - else: - head_width# = brevis_wid# * reduction; - fi; - if small_height: - serif_size# = 0.64 reduced_slt#; - serif_protrude# = 0.96 serif_size#; - holeheight# = 3 reduced_slt#; - beamheight# = 0.32(reduced_nht# - holeheight#); - else: - serif_size# = 1.0 reduced_slt#; - serif_protrude# = 1.5 serif_size#; - holeheight# = 3 reduced_slt#; - beamheight# = 0.5(reduced_nht# - holeheight#); - fi; - define_pixels(reduced_slt); - define_pixels(stem_width); - define_pixels(head_width); - define_pixels(serif_size); - define_pixels(serif_protrude); - define_pixels(beamheight); - - penpos1(stem_width, 0); - penpos2(stem_width, 0); - penpos3(beamheight, 90); - penpos4(beamheight, 90); - penpos5(stem_width, 180); - - z1l = exact_center; - z2l = z1l + (0, -reduced_slt/2); - z3r = z2r + serif_size*(1,-1); - y4r = y3r; - x4l = x1l + head_width/2; - z5l = z3l + (-serif_size, -serif_protrude); - - penlabels(1,2,3,4,5); - fill z1r -- z1l -- z5r{down} .. z5l{up} .. z3l{right} - -- z4l -- z4r -- z3r{left} .. z2r{up} -- cycle; +% +% width: interval from left end to right end +% height: interval from bottom of lower beam to top of upper beam +% exact_center: the coordinates of the vertical center point of the +% left edge. +% +def draw_brevis (expr exact_center, bwidth, bheight, blinethickness) = + save brevis_width, brevis_height, linethickness; + + brevis_width# = bwidth; + brevis_height# = bheight; + linethickness# = blinethickness; + + save beam_width, beam_height; + save serif_size, serif_protrude, hole_height; + + beam_width# = 1.4 linethickness#; + hole_height# = 3 linethickness#; + 2 beam_height# + hole_height# = brevis_height#; + serif_size# = (hole_height# - linethickness#) / 2; + serif_protrude# = 1.5 serif_size#; + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + define_pixels (brevis_width, brevis_height, linethickness); + define_pixels (beam_width, beam_height, serif_size, serif_protrude); + + z1l = (xoffs, yoffs - linethickness); + z2r = z1r + serif_size * (1, -1); + z3l = z2l + (-serif_size, -serif_protrude); + + penpos1 (beam_width, 0); + penpos2 (beam_height, 90); + penpos3 (beam_width, 180); + + save pat_in, pat_out; + path pat_in, pat_out; + + pat_out := z3r{down} + .. z3l{up} + .. z2l{right}; + pat_out := pat_out + -- reverse pat_out xscaled -1 + shifted (2 xoffs + brevis_width, 0); + pat_out := pat_out + -- reverse pat_out yscaled -1 + shifted (0, 2 yoffs) + -- cycle; + + pat_in := z1r{down} + .. z2r{right}; + pat_in := pat_in + -- reverse pat_in xscaled -1 + shifted (2 xoffs + brevis_width, 0); + pat_in := pat_in + -- reverse pat_in yscaled -1 + shifted (0, 2 yoffs) + -- cycle; + + fill pat_out; + unfill pat_in; + + penlabels (1, 2, 3); enddef; -def draw_neo_mensural_c_clef(expr exact_center, reduction) = - draw_brevis(exact_center, reduction, false, false); +% +% Draw two brevis notes; the second one shifted down by `shift'. +% The other parameters are the same as with `draw_brevis'. +% +def draw_double_brevis (expr exact_center, bwidth, bheight, + blinethickness, shift) = + save brevis_width, brevis_height, linethickness; + + brevis_width# = bwidth; + brevis_height# = bheight; + linethickness# = blinethickness; + + save beam_width, beam_height; + save serif_size, serif_protrude, hole_height; + + beam_width# = 1.4 linethickness#; + hole_height# = 3 linethickness#; + 2 beam_height# + hole_height# = brevis_height#; + serif_size# = (hole_height# - linethickness#) / 2; + serif_protrude# = 1.5 serif_size#; + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + define_pixels (brevis_width, brevis_height, linethickness); + define_pixels (beam_width, beam_height, serif_size, serif_protrude); + + z1l = (xoffs, yoffs - linethickness); + z2r = z1r + serif_size * (1, -1); + z3l = z2l + (-serif_size, -serif_protrude); + + penpos1 (beam_width, 0); + penpos2 (beam_height, 90); + penpos3 (beam_width, 180); + + z4 = z1 shifted (0, -shift); + z5 = z2 shifted (0, -shift); + z6 = z3 shifted (0, -shift); + + penpos4 (beam_width, 0); + penpos5 (beam_height, 90); + penpos6 (beam_width, 180); + + save pat_in, pat_out; + path pat_in, pat_out; + + pat_out := z6r{down} + .. z6l{up} + .. z5l{right}; + pat_out := pat_out + -- reverse pat_out xscaled -1 + shifted (2 xoffs + brevis_width, 0); + pat_out := pat_out + -- reverse pat_out yscaled -1 + shifted (0, shift - 2 yoffs) + -- cycle; + + fill pat_out; + + pat_in := z1r{down} + .. z2r{right}; + pat_in := pat_in + -- reverse pat_in xscaled -1 + shifted (2 xoffs + brevis_width, 0); + pat_in := pat_in + -- reverse pat_in yscaled -1 + shifted (0, 2 yoffs) + -- cycle; + + unfill pat_in; + unfill pat_in shifted (0, -shift); + + penlabels (1, 2, 3, 4, 5, 6); +enddef; - save reduced_il, reduced_slt; - save stem_width; + +def draw_neomensural_c_clef (expr exact_center, reduction) = + save reduced_il, reduced_slt, stem_width; reduced_il# = staff_space# * reduction; - reduced_slt# = stafflinethickness# * reduction; + reduced_slt# = linethickness# * reduction; stem_width# = 1.4 reduced_slt#; - define_pixels(reduced_il); - define_pixels(reduced_slt); - define_pixels(stem_width); - - pickup pencircle xscaled stem_width yscaled blot_diameter; - z6 = exact_center + (stem_width/2, 0); - z7 = z6 + (0, -2reduced_il); - z8 = z6 + (-3reduced_slt, 0); - z9 - z8 = z7 - z6; - draw z6 .. z7; - draw z8 .. z9; - - addto currentpicture also currentpicture - yscaled -1 shifted (0, 2*(ypart exact_center)); - addto currentpicture also currentpicture - xscaled -1 shifted (2x4l,0); - - set_char_box(0, 2head_width#, - 6reduced_slt#*reduction, 6reduced_slt#*reduction); + define_pixels (reduced_il, reduced_slt, stem_width); + + set_char_box (0 - xpart exact_center, + 2 reduced_il# + 6 reduced_slt# + xpart exact_center, + 2 reduced_il# - ypart exact_center, + 2 reduced_il# + ypart exact_center); + + draw_brevis (exact_center + (3 reduced_slt#, 0), + 2 reduced_il#, reduced_il#, reduced_slt#); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + save ellipse, pat, T; + path ellipse, pat; + transform T; + + T := identity xscaled stem_width + yscaled blot_diameter; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + lft x11 = lft x12 = xoffs; + top y12 - bot y11 = 4 reduced_il; + top y12 + bot y11 = 2 yoffs; + x13 = x3; + y13 = y11; + rt x14 = rt x15 = w; + y14 = y11; + y15 = y12; + + pat := get_subpath (ellipse, down, up, z13) + -- z3l + -- z3r + -- cycle; + + fill get_subpath (ellipse, down, up, z11) + -- get_subpath (ellipse, up, down, z12) + -- cycle; + fill get_subpath (ellipse, down, up, z14) + -- get_subpath (ellipse, up, down, z15) + -- cycle; + + fill pat; + fill pat xscaled -1 + shifted (w, 0); + fill pat yscaled -1 + shifted (0, 2 yoffs); + fill pat scaled -1 + shifted (w, 2 yoffs); + + labels (11, 12, 13, 14, 15); enddef; -fet_beginchar("neo-mensural c clef", "neo_mensural_c", "neomenscclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_neo_mensural_c_clef((0,0), 1.0); +fet_beginchar ("neo-mensural c clef", "neomensural.c"); + draw_staff_if_debugging (-1, 3); + draw_neomensural_c_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("neo-mensural c clef", "neo_mensural_c_change", "cneomenscclef") - draw_neo_mensural_c_clef((1.3 staff_space#,0), .8); + + +fet_beginchar ("neo-mensural c clef", "neomensural.c_change"); + draw_neomensural_c_clef ((0, 0), .8); fet_endchar; -def draw_petrucci_c_clef(expr exact_center, flare_align, reduction) = +def draw_petrucci_c_clef (expr exact_center, flare_align, reduction) = % inspired by Josquin Desprez, "Stabat Mater", Libro tertio, % 1519, printed by Petrucci, in: MGG, volume 7, Table 11. - draw_brevis(exact_center, reduction, true, true); + % Also by Petrucci's Canti C, Venedig 1503. In: MGG, volume + % 9, p. 1681/1682. - save half_reduced_il, reduced_il, reduced_slt; - save stem_width, interline; + save reduced_il, reduced_slt; - half_reduced_il# = staff_space# * sqrt(reduction); reduced_il# = staff_space# * reduction; - reduced_slt# = stafflinethickness# * reduction; - stem_width# = 1.4 reduced_slt#; - interline# = staff_space#; + reduced_slt# = linethickness# * reduction; - define_pixels(half_reduced_il); - define_pixels(reduced_il); - define_pixels(reduced_slt); - define_pixels(stem_width); - define_pixels(interline); + define_pixels (reduced_il); - addto currentpicture also currentpicture - yscaled -1 shifted (0, 2*(ypart exact_center) - interline); + draw_double_brevis (exact_center + (0, 0.5 staff_space#), + reduced_il#, reduced_il#, reduced_slt#, + staff_space); - addto currentpicture also currentpicture - xscaled -1 shifted (reduction*2x4l,0); + save half_reduced_il, left_depth, left_height; - addto currentpicture also currentpicture - yscaled -1 shifted (0, 4*(ypart exact_center)); + half_reduced_il# = staff_space# * sqrt (reduction); + left_height# = half_reduced_il# * min (3.2, 3.2 + 0.2 + flare_align); + left_depth# = half_reduced_il# * min (3.2, 3.2 + 0.2 - flare_align); - pickup pencircle xscaled stem_width yscaled blot_diameter; + define_pixels (half_reduced_il); + define_pixels (left_depth, left_height); - xpart z6 = xpart z7 = xpart exact_center + stem_width/2; - ypart z6 = ypart exact_center + - min(3.2, 3.2 + 0.2 + flare_align)*half_reduced_il; - ypart z7 = ypart exact_center - - min(3.2, 3.2 + 0.2 - flare_align)*half_reduced_il; - draw z6 .. z7; + set_char_box (0 - xpart exact_center, + reduced_il# + xpart exact_center, + left_depth# - ypart exact_center, + left_height# + ypart exact_center); - xpart z8 = xpart z9 = reduction*2x4l - xpart exact_center - stem_width/2; - ypart z8 = min(ypart z6 - 0.2*half_reduced_il, - xpart exact_center + 2.2half_reduced_il); - ypart z9 = max(ypart z7 + 0.2*half_reduced_il, - xpart exact_center - 2.2half_reduced_il); - draw z8 .. z9; + save xoffs, yoffs; - set_char_box(0, 2head_width#, - noteheight#*4*reduction, noteheight#*4*reduction); -enddef; + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + define_pixels (xoffs, yoffs); -fet_beginchar("petrucci c1 clef", "petrucci_c1", "petruccic1clef") - if test = 1: - draw_staff(-1,3, 0.0); + save ellipse, T; + path ellipse; + transform T; + + T := identity xscaled 1.4 linethickness + yscaled blot_diameter; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + lft x11 = lft x13 = xoffs; + top y11 = yoffs + left_height; + bot y13 = yoffs - left_depth; + rt x15 = rt x17 = xoffs + brevis_width; + y15 = min (y11 - 0.2 half_reduced_il, yoffs + 2.2 half_reduced_il); + y17 = max (y13 + 0.2 half_reduced_il, yoffs - 2.2 half_reduced_il); + + z12 = z14 yscaled -1; + z14 = z6; + z16 = z18 yscaled -1; + rt z18 = lft z14 shifted (brevis_width, 0); + + penpos12 (1.4 linethickness, 0); + penpos14 (1.4 linethickness, 0); + penpos16 (1.4 linethickness, 0); + penpos18 (1.4 linethickness, 0); + + if top y11 > -y6 + 0.7 linethickness: + fill get_subpath (ellipse, up, down, z11) + -- z12l + -- z12r + -- cycle; + fi; + if bot y13 < y6 - 0.7 linethickness: + fill get_subpath (ellipse, down, up, z13) + -- z14r + -- z14l + -- cycle; + fi; + if top y15 > -y6 + 0.7 linethickness: + fill get_subpath (ellipse, up, down, z15) + -- z16l + -- z16r + -- cycle; fi; - draw_petrucci_c_clef((0,0), +2, 1.0); + if bot y17 < y6 - 0.7 linethickness: + fill get_subpath (ellipse, down, up, z17) + -- z18r + -- z18l + -- cycle; + fi; + + labels (11, 13, 15, 17); + penlabels (12, 14, 16, 18); +enddef; + + +fet_beginchar ("petrucci c1 clef", "petrucci.c1"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_c_clef ((0, 0), +2, 1.0); fet_endchar; -fet_beginchar("petrucci c1 clef", "petrucci_c1_change", "cpetruccic1clef") - draw_petrucci_c_clef((1.3 staff_space#,0), +2, .8); + + +fet_beginchar ("petrucci c1 clef", "petrucci.c1_change"); + draw_petrucci_c_clef ((0, 0), +2, .8); fet_endchar; -fet_beginchar("petrucci c2 clef", "petrucci_c2", "petruccic2clef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_petrucci_c_clef((0,0), +1, 1.0); + +fet_beginchar ("petrucci c2 clef", "petrucci.c2"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_c_clef ((0, 0), +1, 1.0); fet_endchar; -fet_beginchar("petrucci c2 clef", "petrucci_c2_change", "cpetruccic2clef") - draw_petrucci_c_clef((1.3 staff_space#,0), +1, .8); + + +fet_beginchar ("petrucci c2 clef", "petrucci.c2_change"); + draw_petrucci_c_clef ((0, 0), +1, .8); fet_endchar; -fet_beginchar("petrucci c3 clef", "petrucci_c3", "petruccic3clef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_petrucci_c_clef((0,0), 0, 1.0); + +fet_beginchar ("petrucci c3 clef", "petrucci.c3"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_c_clef ((0, 0), 0, 1.0); fet_endchar; -fet_beginchar("petrucci c3 clef", "petrucci_c3_change", "cpetruccic3clef") - draw_petrucci_c_clef((1.3 staff_space#,0), 0, .8); + + +fet_beginchar ("petrucci c3 clef", "petrucci.c3_change"); + draw_petrucci_c_clef ((0, 0), 0, .8); fet_endchar; -fet_beginchar("petrucci c4 clef", "petrucci_c4", "petruccic4clef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_petrucci_c_clef((0,0), -1, 1.0); + +fet_beginchar ("petrucci c4 clef", "petrucci.c4"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_c_clef ((0, 0), -1, 1.0); fet_endchar; -fet_beginchar("petrucci c4 clef", "petrucci_c4_change", "cpetruccic4clef") - draw_petrucci_c_clef((1.3 staff_space#,0), -1, .8); + + +fet_beginchar ("petrucci c4 clef", "petrucci.c4_change"); + draw_petrucci_c_clef ((0, 0), -1, .8); fet_endchar; -fet_beginchar("petrucci c5 clef", "petrucci_c5", "petruccic5clef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_petrucci_c_clef((0,0), -2, 1.0); + +fet_beginchar ("petrucci c5 clef", "petrucci.c5"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_c_clef ((0, 0), -2, 1.0); fet_endchar; -fet_beginchar("petrucci c5 clef", "petrucci_c5_change", "cpetruc5iceclef") - draw_petrucci_c_clef((1.3 staff_space#,0), -2, .8); + + +fet_beginchar ("petrucci c5 clef", "petrucci.c5_change"); + draw_petrucci_c_clef ((0, 0), -2, .8); fet_endchar; -def draw_mensural_c_clef(expr exact_center, reduction) = - % inspired by Ockeghem, "Missa Prolationum", in: MGG, volume - % 9, table 94. - draw_petrucci_c_clef(exact_center, 0, reduction); +def draw_mensural_c_clef (expr exact_center, reduction, fill_char) = + save reduced_il, vert_thick, hor_thick, blot_rad; - addto currentpicture also currentpicture - shifted (0, -interline); + reduced_il# = staff_space# * reduction; + vert_thick# = linethickness# * 1.4; + hor_thick# = staff_space# * reduction * 0.25; + + blot_rad = blot_diameter / 2; + + define_pixels (reduced_il, vert_thick, hor_thick); + + pickup pencircle scaled blot_diameter; + + penpos1 (vert_thick, 0); + penpos2 (vert_thick, 0); + penpos3 (hor_thick, 90); + penpos4 (hor_thick, 90); + penpos5 (hor_thick, 90); + penpos6 (hor_thick, 90); + penpos7 (vert_thick, 0); + penpos8 (hor_thick, 90); + + z1l = (0, 0); + x2l = 0; + top y2 = 2.2 reduced_il; + z3 = (vert_thick, 0.75 reduced_il); + z4 = z3 + (reduced_il - vert_thick, 0); + z5 = z4 + (vert_thick, -0.5 reduced_il); + z6 = z5 - (reduced_il, 0); + z7 = z4 + (0.5 vert_thick, 0.5 reduced_il); + z8 = z5 - (vert_thick, 0); + + save pat, pat_mid; + path pat, pat_mid; + + pat = z1l + -- z2l{up} + .. z2 + (0, blot_rad) + .. {down}z2r + -- top z3r{down} + .. {right}rt z3r + -- lft z4r{right} + .. {up}top z4r + -- z7l{up} + .. z7 + (0, blot_rad) + .. {down}z7r + -- top z5l{down} + .. {left}lft z5l + -- rt z6l{left} + .. {down}bot z6l + --z1r; + pat := pat + -- reverse pat yscaled -1 + -- cycle; + fill pat; + + if fill_char: + pat_mid = bot z3l{up} + .. {right}rt z3l + -- lft z4l{right} + .. {down}bot z4l + -- top z8r{down} + .. {left}lft z8r + -- rt z6r{left} + .. {up}top z6r + --cycle; + unfill pat_mid; + + pat_mid := pat_mid shifted (0, -reduced_il); + unfill pat_mid; + fi; + + set_char_box (0, reduced_il# + vert_thick#, + 2.2 reduced_il#, 2.2 reduced_il#); - set_char_box(0, 2head_width#, - noteheight#*6*reduction, noteheight#*6*reduction); + penlabels (1, 2, 3, 4, 5, 6, 7, 8); enddef; -fet_beginchar("mensural c clef", "mensural_c", "menscclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_mensural_c_clef((0,0), 1.0); +fet_beginchar ("mensural c clef", "mensural.c"); + draw_staff_if_debugging (-1, 3); + draw_mensural_c_clef ((0, 0), 1.0, true); fet_endchar; -fet_beginchar("mensural c clef", "mensural_c_change", "cmenscclef") - draw_mensural_c_clef((0,0), .8); + + +fet_beginchar ("mensural c clef", "mensural.c_change"); + draw_mensural_c_clef ((0, 0), .8, true); fet_endchar; -def draw_diamond(expr exact_center, reduction) = - save stem_width, reduced_il, reduced_nht, holeheight, beamheight; + +fet_beginchar ("black mensural c clef", "blackmensural.c"); + draw_staff_if_debugging (-1, 3); + draw_mensural_c_clef ((0, 0), 1.0, false); +fet_endchar; + + +fet_beginchar ("black mensural c clef", "blackmensural.c_change"); + draw_mensural_c_clef ((0, 0), 0.8, false); +fet_endchar; + + +def draw_diamond (expr exact_center, reduction) = + save stem_width, reduced_nht, holeheight, beamheight; save rh_height, rh_width; stem_width# = 1.4 reduced_slt#; - reduced_il# = staff_space# * reduction; reduced_nht# = noteheight# * reduction; holeheight# = 3 reduced_slt#; - beamheight# = 0.4(reduced_nht# - holeheight#); - - rh_height# = 1.2reduced_il#; - rh_width# / rh_height# = 0.58; % tan(30) - - define_pixels(beamheight); - define_pixels(stem_width); - define_pixels(rh_height); - define_pixels(rh_width); - - pickup pencircle - xscaled beamheight - yscaled stem_width - rotated 45; - - draw - exact_center + (-rh_width/2, 0) -- - exact_center + (0, rh_height/2) -- - exact_center + (+rh_width/2, 0) -- - exact_center + (0, -rh_height/2) -- - cycle; + beamheight# = 0.4 (reduced_nht# - holeheight#); + + rh_height# = 1.2 staff_space# * reduction; + rh_width# / rh_height# = tand (30); + + define_pixels (beamheight, stem_width); + define_pixels (rh_height, rh_width); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + save ellipse, T; + path ellipse; + transform T; + + T := identity xscaled beamheight + yscaled stem_width + rotated 45; + pickup pencircle transformed T; + ellipse := reverse fullcircle transformed T; + + x21 := xoffs - rh_width / 2; + y21 := yoffs; + x22 := xoffs; + y22 := yoffs + rh_height / 2; + x23 := xoffs + rh_width / 2; + y23 := yoffs; + x24 := xoffs; + y24 := yoffs - rh_height / 2; + + fill get_subpath (ellipse, z21 - z24, z22 - z21, z21) + -- get_subpath (ellipse, z22 - z21, z23 - z22, z22) + -- get_subpath (ellipse, z23 - z22, z24 - z23, z23) + -- get_subpath (ellipse, z24 - z23, z21 - z24, z24) + -- cycle; + + save l; + path l[]; + + l2122 := (directionpoint (z21 - z22) of ellipse) shifted z21 + -- (directionpoint (z21 - z22) of ellipse) shifted z22; + l2223 := (directionpoint (z22 - z23) of ellipse) shifted z22 + -- (directionpoint (z22 - z23) of ellipse) shifted z23; + l2324 := (directionpoint (z23 - z24) of ellipse) shifted z23 + -- (directionpoint (z23 - z24) of ellipse) shifted z24; + l2421 := (directionpoint (z24 - z21) of ellipse) shifted z24 + -- (directionpoint (z24 - z21) of ellipse) shifted z21; + + unfill l2122 intersectionpoint l2223 + -- l2223 intersectionpoint l2324 + -- l2324 intersectionpoint l2421 + -- l2421 intersectionpoint l2122 + -- cycle; + + labels (21, 22, 23, 24); enddef; -def draw_petrucci_f_clef(expr exact_center, reduction) = + +def draw_petrucci_f_clef (expr exact_center, reduction) = % inspired by L'homme arme super voces musicales in Misse % Josquin, 1502, Petrucci, in: MGG, volume 7, col. 200; also % inspired by Gaspar van Weerbeke, "Virgo Maria" (1502), in: % MGG, volume 9, col. 653 ("Motette"), fig. 3.; also by Andr'e % Campra, "Entr'ee des s'er'enades" (1710), in: MGG, volume 2, % col. 1649 ("Contredanse"), fig. 2. - % - draw_brevis(exact_center, reduction, true, false); - save reduced_il, reduced_slt; - save stem_width, interline; + save interline, reduced_il, reduced_slt; + interline# = staff_space#; reduced_il# = staff_space# * reduction; - reduced_slt# = stafflinethickness# * reduction; + reduced_slt# = linethickness# * reduction; + + draw_brevis (exact_center, reduced_il#, reduced_il#, reduced_slt#); + draw_diamond (exact_center + + (1.6 interline# * reduction, interline# / 2), + reduction); + draw_diamond (exact_center + + (1.6 interline# * reduction, -interline# / 2), + reduction); + + define_pixels (interline, reduced_il, reduced_slt); + + save stem_width; + stem_width# = 1.4 reduced_slt#; - interline# = staff_space#; - define_pixels(reduced_il); - define_pixels(reduced_slt); - define_pixels(stem_width); - define_pixels(interline); + define_pixels (stem_width); - addto currentpicture also currentpicture - yscaled -1 shifted (0, 2*(ypart exact_center)); - addto currentpicture also currentpicture - xscaled -1 shifted (2x4l,0); + save xoffs, yoffs; + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); % brevis stem - pickup pencircle xscaled stem_width yscaled blot_diameter; - z6 = exact_center + (2x4l - stem_width/2, 0); - z7 = z6 + (0, -4reduced_il); - draw z6 .. z7; + save ellipse, T; + path ellipse; + transform T; - % upper diamond - draw_diamond(exact_center + (1.6interline*reduction, interline/2), - reduction); - pickup pencircle xscaled stem_width yscaled blot_diameter; - z8 = exact_center + - (1.6interline*reduction + stem_width/2, interline*reduction); - z9 = z8 + (0, 1.5interline*reduction); - draw z8 .. z9; % diamond stem - - % lower diamond - draw_diamond(exact_center + (1.6interline*reduction, -interline/2), - reduction); - pickup pencircle xscaled stem_width yscaled blot_diameter; - z10 = exact_center + - (1.6interline*reduction - stem_width/2, -interline*reduction); - z11 = z10 + (0, -3.5interline*reduction); - draw z10 .. z11; % diamond stem - - set_char_box(0, 3head_width#, - 3.5noteheight#*reduction, 1.5noteheight#*reduction); + T := identity xscaled stem_width + yscaled blot_diameter; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + rt x8 = xoffs + reduced_il; + y8 = y3; + rt z9 = (xoffs + reduced_il, yoffs - 4 reduced_il); + + penpos8 (stem_width, 0); + + fill get_subpath (ellipse, down, up, z9) + -- z8r + -- z8l + -- cycle; + + % upper diamond's stem + z10 = (xoffs + 1.6 interline * reduction + stem_width / 2, + yoffs + interline * reduction); + top z11 = z10 + (0, 1.5 interline * reduction); + + penpos10 (stem_width, 0); + + fill get_subpath (ellipse, up, down, z11) + -- z10l + -- z10r + -- cycle; + + % lower diamond's stem + z12 = (xoffs + 1.6 interline * reduction - stem_width / 2, + yoffs - interline * reduction); + bot z13 = z12 + (0, -3.5 interline * reduction); + + penpos12 (stem_width, 0); + + fill get_subpath (ellipse, down, up, z13) + -- z12r + -- z12l + -- cycle; + + save reduced_il, rh_height, rh_width; + + reduced_il# = staff_space# * reduction; + rh_height# = 1.2 reduced_il#; + rh_width# / rh_height# = tand (30); + + set_char_box (0 - xpart exact_center, + 1.6 interline# * reduction + 0.5 rh_width# + + xpart exact_center, + 4.5 interline# * reduction - ypart exact_center, + 2.5 interline# * reduction + ypart exact_center); + + labels (9, 11, 13); + penlabels (8, 10, 12); enddef; -fet_beginchar("petrucci f clef", "petrucci_f", "petruccifclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_petrucci_f_clef((0,0), 1.0); +fet_beginchar ("petrucci f clef", "petrucci.f"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_f_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("petrucci f clef", "petrucci_f_change", "cpetruccifclef") - draw_petrucci_f_clef((0,0), .8); + + +fet_beginchar ("petrucci f clef", "petrucci.f_change"); + draw_petrucci_f_clef ((0, 0), .8); fet_endchar; -def draw_mensural_f_clef(expr exact_center, reduction) = - % +def draw_mensural_f_clef (expr exact_center, reduction) = % inspired by Philippe le Duc, "Dite Signori" (1590), in: MGG, % volume 3, col. 848 ("Duc"); also by John Dowland, "The First % Booke of Songes" (1597), in: MGG, volume 3, col. 721 % ("Dowland"), fig. 3. - save reduced_slt, stem_width, reduced_nht, holeheight, beamheight; + save width, reduced_slt, stem_width, dot_diameter; - reduced_slt# = stafflinethickness# * reduction; + width# = 1.2 staff_space# * reduction; + reduced_slt# = linethickness# * reduction; stem_width# = 1.4 reduced_slt#; - reduced_nht# = noteheight# * reduction; - holeheight# = 3 reduced_slt#; - beamheight# = 0.4(reduced_nht# - holeheight#); + dot_diameter# = 0.1 reduction * staff_space#; + + define_pixels (width, stem_width, staff_space, dot_diameter); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + save ellipse, T; + path ellipse; + transform T; + + T := identity xscaled 0.2 width + yscaled stem_width + rotated 45; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + % half circle + lft z10 = (0, 0); + + save pat; + path pat; + + pat := halfcircle scaled width + rotated -90 + shifted (z10 - (xoffs, yoffs)); + + z5 = point 0 of pat; + z6 = point 1 of pat; + z7 = point 2 of pat; + z8 = point 3 of pat; + z9 = point 4 of pat; + + save dirs; + pair dirs[]; + + dirs5 := direction 0 of pat; + dirs6 := direction 1 of pat; + dirs7 := direction 2 of pat; + dirs8 := direction 3 of pat; + dirs9 := direction 4 of pat; + + % we approximate `draw pat' + fill get_subpath (ellipse, -dirs5, dirs5, z5) + .. get_subpoint (ellipse, dirs6, z6) + .. get_subpoint (ellipse, dirs7, z7) + .. get_subpoint (ellipse, dirs8, z8) + .. get_subpath (ellipse, dirs9, -dirs9, z9) + .. get_subpoint (ellipse, -dirs8, z8) + .. get_subpoint (ellipse, -dirs7, z7) + .. get_subpoint (ellipse, -dirs6, z6) + .. cycle; + + % upper dot + rt x2 = xoffs + width; + top y1 = yoffs + 0.5 width; + z2 - z1 = (dot_diameter, -dot_diameter); + + fill get_subpath (ellipse, z1 - z2, z2 - z1, z1) + -- get_subpath (ellipse, z2 - z1, z1 - z2, z2) + -- cycle; + + % lower dot + x3 = x1; + top y1 - bot y4 = width; + z4 - z3 = (dot_diameter, -dot_diameter); + + fill get_subpath (ellipse, z3 - z4, z4 - z3, z3) + -- get_subpath (ellipse, z4 - z3, z3 - z4, z4) + -- cycle; + + set_char_box (0 - xpart exact_center, + width# + xpart exact_center, + 0.5 width# - ypart exact_center, + 0.5 width# + ypart exact_center); + + labels (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); +enddef; - define_pixels(beamheight, stem_width, staff_space); - pickup pencircle - xscaled beamheight - yscaled stem_width - rotated 45; +fet_beginchar ("mensural f clef", "mensural.f"); + draw_staff_if_debugging (-1, 3); + draw_mensural_f_clef ((0, 0), 1.0); +fet_endchar; - draw - exact_center + (1.0 staff_space, 0.6 staff_space) -- - exact_center + (1.25 staff_space, 0.4 staff_space); - draw - exact_center + (1.0 staff_space, -0.4 staff_space) -- - exact_center + (1.25 staff_space, -0.6 staff_space); +fet_beginchar ("mensural f clef", "mensural.f_change"); + draw_mensural_f_clef ((0, 0), .8); +fet_endchar; - draw halfcircle scaled 1.2 staff_space rotated -90 - shifted (-exact_center + (+0.1 staff_space, 0)); - set_char_box(0, 3staff_space#, 3staff_space#, 0); -enddef; +def draw_petrucci_g_clef (expr exact_center, reduction) = + % inspired by Josquin Desprez, "Stabat Mater", Libro tertio, + % 1519, printed by Petrucci, in: MGG, volume 7, Table 11. -fet_beginchar("mensural f clef", "mensural_f", "mensfclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_mensural_f_clef((0,0), 1.0); -fet_endchar; -fet_beginchar("mensural f clef", "mensural_f_change", "cmensfclef") - draw_mensural_f_clef((0,0), .8); -fet_endchar; - - -def draw_mensural_g_clef(expr exact_center, reduction) = - % - % inspired by Francisco Guerrero, "Lib. 1. Missarum" (1566), - % in: MGG, volume 3, col. 858 ("Ducis"); also by Stefano - % Fabri, "Quam speciosa veteranis" (1611), in: MGG, volume 3, - % col. 1698 ("Fabri"); also by Philippus Dulichius, - % "Fasciculus novus ..." (1598), in: MGG, volume 3, col. 919 - % ("Dulichius"), fig. 1; also by Noe Faignient, "Ic sal de - % Heer myn God gebenedye" (1568), in: MGG, volume 3, col. 1735 - % ("Faignient"). - % - % Metafont code partially inspired by Schwabacher 'G' of yswab - % font. - - save reduced_il, stem_width, height, width, apex_o, hair; - - reduced_il#=staff_space#*reduction; - - set_char_box(0.5reduced_il#, 1.5reduced_il#, - 1.5reduced_il#, 1.5reduced_il#); - - stem_width# = 0.17 reduced_il#; - height# = 1.5 reduced_il#; - width# = 1.13 reduced_il#; - apex_o# = 0.02 reduced_il#; - hair# = 3 stafflinethickness#; - define_pixels(reduced_il, stem_width, height, width, apex_o, hair); - - penpos1(2 stem_width, -142); - z1l = (0.715 width, 0.742 height); - penpos1'(hair, -90); - z1'l = z1r; - penpos2(1.179 stem_width, -142); - z2l = (width, 0.466 height); - penpos3(hair, 77); - z3 = (0.764 width, 0.067 height); - z4 = (0.59 width, -apex_o); - penpos5(1.179 stem_width, 32); - z5l=(0, 0.457 height); - penpos6(hair, -56.5); - z7 = (x4 - 0.843 stem_width, height + apex_o); - z7 - z6l = whatever * dir33.5; - penpos8(1.286 stem_width, -130); - z8r = (0.715 width, 0.742 height) + (-apex_o, apex_o); - z6r - z8r = whatever * (z7 - z8l); - filldraw - z1'r{dir45} .. z2r{down} .. z3r{dir207} .. z5r{up} .. - z6r{z7-z6l} & z6r -- z8r -- z8l -- z7 --- z6l ... - z5l{down} .. z4{right} .. z3l{dir27} .. z2l{up} .. - z1l{1/3[z6l,z7]-z1l} & z1l -- z1r -- z1'r & cycle - shifted (-exact_center + (0, -0.75reduced_il)); - - penpos9(stem_width, 0); - x9r = x4; y9 = 0.3 height; - - pickup pencircle - scaled stem_width - rotated 45; - draw z9 -- (z9 + (0, -0.4reduced_il)) - shifted (-exact_center + (0, -0.75reduced_il)); - - pickup pencircle - xscaled stem_width - yscaled hair - rotated 30; - - draw halfcircle - scaled 0.5 reduced_il - rotated -90 - shifted z8 - shifted (0, 0.25reduced_il) - shifted (-exact_center + (0, -0.75reduced_il)); - - draw halfcircle - scaled 0.4 reduced_il - rotated 90 - shifted (z8 + (0, 0.45 reduced_il)) - shifted (0, 0.25reduced_il) - shifted (-exact_center + (0, -0.75reduced_il)); -enddef; + save reduced_il, reduced_slt; + reduced_il# = staff_space# * reduction; + reduced_slt# = linethickness# * reduction; + define_pixels (reduced_il, reduced_slt); + + set_char_box (0 - xpart exact_center, + 1.25 reduced_il# + xpart exact_center, + 0.65 reduced_il# - ypart exact_center, + 3.80 reduced_il# + ypart exact_center); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + save ellipse, paths, sub_path, outlines, sub_outlines, T; + path ellipse, paths[], sub_path, outlines[], sub_outlines[]; + transform T; + + T := identity xscaled 0.5 reduced_slt + yscaled 0.22 reduced_il + rotated -35; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + lft z1 = (xoffs + 0.80 reduced_il, yoffs + 0.00 reduced_il); + lft z2 = (xoffs + 1.00 reduced_il, yoffs + 1.20 reduced_il); + lft z3 = (xoffs + 0.70 reduced_il, yoffs + 2.00 reduced_il); + lft z4 = (xoffs + 0.30 reduced_il, yoffs + 3.00 reduced_il); + lft z5 = (xoffs + 0.80 reduced_il, yoffs + 3.70 reduced_il); + lft z6 = (xoffs + 1.00 reduced_il, yoffs + 3.00 reduced_il); + lft z7 = (xoffs + 0.60 reduced_il, yoffs + 2.00 reduced_il); + lft z8 = (xoffs + 0.30 reduced_il, yoffs + 1.70 reduced_il); + lft z9 = (xoffs + 0.00 reduced_il, yoffs + 0.75 reduced_il); + lft z10 = (xoffs + 0.20 reduced_il, yoffs + 0.60 reduced_il); + + paths1 := z1{-1, 2} + .. z2 + .. z3 + .. z4 + .. z5 + .. z6 + .. z7 + .. z8 + .. z9 + .. z10; + + save dirs, s; + pair dirs[]; + + s := 1/4; + + % we approximate `draw paths1' + for i = 1 step s until (length paths1 + 1): + dirs[i] := direction (i - 1) of paths1; + endfor; + + outlines1 := get_subpath (ellipse, -dirs1, dirs1, z1) + for i = (1 + s) step s until (length paths1 + 1 - s): + .. get_subpoint (ellipse, dirs[i], + point (i - 1) of paths1) + endfor + .. get_subpath (ellipse, dirs10, -dirs10, z10) + for i = (length paths1 + 1 - s) step -s until (1 + s): + .. get_subpoint (ellipse, -dirs[i], + point (i - 1) of paths1) + endfor + .. cycle; + + save len; + + len := length outlines1; + + sub_outlines1 := subpath (0, + floor (1/4 len)) of outlines1; + sub_outlines2 := subpath (floor (1/4 len), + floor (2/4 len)) of outlines1; + sub_outlines3 := subpath (floor (2/4 len), + floor (3/4 len)) of outlines1; + sub_outlines4 := subpath (floor (3/4 len), + len) of outlines1; + + save times; + numeric times[]; + + (times12, times21) = sub_outlines1 intersectiontimes sub_outlines2; + (times13, times31) = sub_outlines1 intersectiontimes sub_outlines3; + (times42, times24) = sub_outlines4 intersectiontimes sub_outlines2; + (times43, times34) = sub_outlines4 intersectiontimes sub_outlines3; + + T := identity xscaled 0.75 reduced_slt + yscaled 0.33 reduced_il + rotated -35; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + lft z21 = (xoffs + 1.05 reduced_il, yoffs + 0.45 reduced_il); + lft z22 = (xoffs + 0.55 reduced_il, yoffs + 0.45 reduced_il); + lft z23 = (xoffs + 0.55 reduced_il, yoffs - 0.45 reduced_il); + lft z24 = (xoffs + 1.05 reduced_il, yoffs - 0.45 reduced_il); + lft z25 = (xoffs + 1.10 reduced_il, yoffs + 0.00 reduced_il); + lft z26 = (xoffs + 0.80 reduced_il, yoffs + 0.00 reduced_il); + + paths2 := z21 + .. z22 + .. z23 + .. z24 + .. {up}z25 + -- z26; + + sub_path := subpath (0, 1) of paths2; + + times1 = xpart (sub_outlines1 intersectiontimes sub_path); + times4 = xpart (sub_outlines4 intersectiontimes sub_path); + + % we have to find the envelope intersections (if any) + save t; + numeric t[]; + + t1 = find_envelope_cusp (reverse ellipse, + subpath (1, 2) of paths2, + 1/256) + 1; + if t1 < 1: + t1 := 1; + t2 := 1; + else: + t2 = find_envelope_cusp (ellipse, + subpath (3, 4) of reverse paths2, + 1/256) + 3; + t2 := length paths2 - t2; + fi; -fet_beginchar("mensural g clef", "mensural_g", "mensgclef") - if test = 1: - draw_staff(-1,3, 0.0); + t3 = find_envelope_cusp (reverse ellipse, + subpath (2, 4 - epsilon) of paths2, + 1/256) + 2; + if t3 < 2: + t3 := 3; + t4 := 3; + else: + t4 = find_envelope_cusp (ellipse, + subpath (1 + epsilon, 3) + of reverse paths2, + 1/256) + 1; + t4 := length paths2 - t4; fi; - draw_mensural_g_clef((0,0), 1.0); -fet_endchar; -fet_beginchar("mensural g clef", "mensural_g_change", "cmensgclef") - draw_mensural_g_clef((0,0), .8); -fet_endchar; + fill subpath (times1 + s / 4, times13) of sub_outlines1 + -- subpath (times31, infinity) of sub_outlines3 + & subpath (0, times42) of sub_outlines4 + -- subpath (times24, infinity) of sub_outlines2 + & subpath (0, times34) of sub_outlines3 + -- subpath (times43, times4 - s / 4) of sub_outlines4 + -- cycle; + unfill subpath (times12, infinity) of sub_outlines1 + & subpath (0, times21) of sub_outlines2 + -- cycle; + fill subpath (times4 + s / 4, infinity) of sub_outlines4 + & subpath (0, times1 - s / 4) of sub_outlines1 + -- cycle; + + + % we approximate `draw paths2' + for i = 1 step s until (length paths2 - s): + dirs[i + 20] := direction (i - 1) of paths2; + endfor; + + sub_outlines21 := get_subpath (ellipse, -dirs21, dirs21, z21) + for i = (1 + s) step s until (length paths2 - s): + .. get_subpoint (ellipse, dirs[i + 20], + point (i - 1) of paths2) + endfor + .. get_subpath (ellipse, up, z26 - z25, z25); + sub_outlines22 := get_subpath (ellipse, z26 - z25, z25 - z26, z26) + -- get_subpoint (ellipse, z25 - z26, z25); + sub_outlines23 := get_subpoint (ellipse, down, z25) + for i = (length paths2 - s) step -s until (t4 + 1): + .. get_subpoint (ellipse, -dirs[i + 20], + point (i - 1) of paths2) + endfor + .. get_subpoint (ellipse, -direction t4 of paths2, + point t4 of paths2); + sub_outlines24 := get_subpoint (ellipse, -direction t3 of paths2, + point t3 of paths2) + for i = (floor (t3 / s) * s + 1) step -s until (t2 + 1): + .. get_subpoint (ellipse, -dirs[i + 20], + point (i - 1) of paths2) + endfor + .. get_subpoint (ellipse, -direction t2 of paths2, + point t2 of paths2); + sub_outlines25 := get_subpoint (ellipse, -direction t1 of paths2, + point t1 of paths2) + for i = (floor (t1 / s) * s + 1) step -s until (1 + s): + .. get_subpoint (ellipse, -dirs[i + 20], + point (i - 1) of paths2) + endfor; + + (times2223, times2322) = sub_outlines22 intersectiontimes sub_outlines23; + (times2324, times2423) = sub_outlines23 intersectiontimes sub_outlines24; + (times2425, times2524) = sub_outlines24 intersectiontimes sub_outlines25; + + fill sub_outlines21 + -- subpath (0, times2223) of sub_outlines22 + -- subpath (times2322, times2324) of sub_outlines23 + -- subpath (times2423, times2425) of sub_outlines24 + -- subpath (times2524, infinity) of sub_outlines25 + .. cycle; + + labels (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + labels (21, 22, 23, 24, 25, 26); +enddef; -def draw_petrucci_g_clef(expr exact_center, reduction) = - % inspired by Josquin Desprez, "Stabat Mater", Libro tertio, - % 1519, printed by Petrucci, in: MGG, volume 7, Table 11. +fet_beginchar ("petrucci g clef", "petrucci.g"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_g_clef ((0, 0), 1.0); +fet_endchar; - set_char_box(0.6 staff_space#, 0.8 staff_space#, 0.6 staff_space#, - 4.0 staff_space#); - save reduced_il, reduced_slt; +fet_beginchar ("petrucci g clef", "petrucci.g_change"); + draw_petrucci_g_clef ((0, 0), .8); +fet_endchar; - reduced_il# = staff_space# * reduction; - reduced_slt# = stafflinethickness# * reduction; - define_pixels(reduced_il, reduced_slt); - - save za, zb, zc, zd, ze, zf, zg, zh, zi, zj; - pair za, zb, zc, zd, ze, zf, zg, zh, zi, zj; - - pickup pencircle - xscaled 0.50 reduced_slt - yscaled 0.22 reduced_il - rotated -35; - - za = exact_center + (+0.00 reduced_il, +0.00 reduced_il); - zb = exact_center + (+0.20 reduced_il, +1.20 reduced_il); - zc = exact_center + (-0.10 reduced_il, +2.00 reduced_il); - zd = exact_center + (-0.50 reduced_il, +3.00 reduced_il); - ze = exact_center + (+0.00 reduced_il, +3.70 reduced_il); - zf = exact_center + (+0.20 reduced_il, +3.00 reduced_il); - zg = exact_center + (-0.20 reduced_il, +2.00 reduced_il); - zh = exact_center + (-0.50 reduced_il, +1.70 reduced_il); - zi = exact_center + (-0.80 reduced_il, +0.75 reduced_il); - zj = exact_center + (-0.60 reduced_il, +0.60 reduced_il); - - draw za{-1,2} .. zb .. zc .. zd .. ze .. zf .. zg .. zh .. zi .. zj; - - save za, zb, zc, zd, ze, zf; - pair za, zb, zc, zd, ze, zf; - - pickup pencircle - xscaled 0.75 reduced_slt - yscaled 0.33 reduced_il - rotated -35; - - za = exact_center + (+0.25 reduced_il, +0.45 reduced_il); - zb = exact_center + (-0.25 reduced_il, +0.45 reduced_il); - zc = exact_center + (-0.25 reduced_il, -0.45 reduced_il); - zd = exact_center + (+0.25 reduced_il, -0.45 reduced_il); - ze = exact_center + (+0.30 reduced_il, +0.00 reduced_il); - zf = exact_center + (+0.00 reduced_il, +0.00 reduced_il); - - draw za .. zb .. zc .. zd .. {up}ze -- zf; + +def draw_mensural_g_clef (expr exact_center, reduction) = + % TODO: Rewrite me. The former mensural g clef looked ugly, and the + % code was removed when it broke for small font sizes after some + % global changes in the font. Currently, the character is mapped to + % a copy of the petrucci g clef (which, after all, *is* a mensural g + % clef, but not the one that we have in mind here). -- jr + % + % Possible sources of inspiration for this clef include: Francisco + % Guerrero, "Lib. 1. Missarum" (1566), in: MGG, volume 3, col. 858 + % ("Ducis"); Stefano Fabri, "Quam speciosa veteranis" (1611), in: + % MGG, volume 3, col. 1698 ("Fabri"); Philippus Dulichius, + % "Fasciculus novus ..." (1598), in: MGG, volume 3, col. 919 + % ("Dulichius"), fig. 1; Noe Faignient, "Ic sal de Heer myn God + % gebenedye" (1568), in: MGG, volume 3, col. 1735 ("Faignient"). enddef; -fet_beginchar("petrucci g clef", "petrucci_g", "petruccigclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_petrucci_g_clef((0,0), 1.0); +% +% FIXME: This clef is preliminarily mapped to the petrucci g clef +% until the code for the mensural g clef will be rewritten. +% +fet_beginchar ("mensural g clef", "mensural.g"); + draw_staff_if_debugging (-1, 3); + draw_petrucci_g_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("petrucci g clef", "petrucci_g_change", "cpetruccigclef") - draw_petrucci_g_clef((0,0), .8); + + +fet_beginchar ("mensural g clef", "mensural.g_change"); + draw_petrucci_g_clef ((0, 0), .8); fet_endchar; @@ -764,112 +1397,257 @@ fet_endchar; % % % -def draw_hufnagel_do_clef(expr exact_center, reduction) = - % +def draw_hufnagel_do_clef (expr exact_center, reduction) = % inspired by Graduale of Friedrich Zollner (1442), in: MGG, % volume 9, col. 1413 ("Neustift"), fig. 1. - % + save reduced_il; reduced_il# = staff_space# * reduction; - define_pixels(reduced_il); - - pickup pencircle - xscaled (0.60reduced_il) - yscaled (0.10reduced_il) - rotated 40; - save za, zb, zc, zd, ze, zf; - pair za, zb, zc, zd, ze, zf; - - za = exact_center + (+0.30reduced_il, +.45reduced_il); - zb = exact_center + (+0.20reduced_il, +.45reduced_il); - zc = exact_center + (-0.10reduced_il, +.60reduced_il); - zd = exact_center + (-0.40reduced_il, +.45reduced_il); - ze = exact_center + (-0.40reduced_il, -.45reduced_il); - zf = exact_center + (-0.20reduced_il, -.55reduced_il); - draw za .. zb .. zc -- zd -- ze -- zf; - - set_char_box(0.5reduced_il#, 0.5reduced_il#, 0, reduced_il#); + define_pixels (reduced_il); + + set_char_box (0 - xpart exact_center, + 1.10 reduced_il# + xpart exact_center, + 0.70 reduced_il# - ypart exact_center, + 0.75 reduced_il# + ypart exact_center); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + save ellipse, pat, T; + path ellipse, pat; + transform T; + + T := identity xscaled 0.6 reduced_il + yscaled 0.1 reduced_il + rotated 40; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + z1 = (xoffs + 0.90 reduced_il, yoffs + .45 reduced_il); + z2 = (xoffs + 0.80 reduced_il, yoffs + .45 reduced_il); + z3 = (xoffs + 0.50 reduced_il, yoffs + .60 reduced_il); + z4 = (xoffs + 0.20 reduced_il, yoffs + .45 reduced_il); + z5 = (xoffs + 0.20 reduced_il, yoffs - .45 reduced_il); + z6 = (xoffs + 0.40 reduced_il, yoffs - .55 reduced_il); + + pat := z1 + .. z2 + .. z3 + -- z4 + -- z5 + -- z6; + + fill get_subpath (ellipse, + -direction 0 of pat, direction 0 of pat, z1) + .. get_subpoint (ellipse, direction 1 of pat, z2) + .. get_subpath (ellipse, + direction (2 - epsilon) of pat, z4 - z3, z3) + -- get_subpath (ellipse, + z4 - z3, z5 - z4, z4) + -- get_subpath (ellipse, + z5 - z4, z6 - z5, z5) + -- get_subpath (ellipse, + z6 - z5, z5 - z6, z6) + -- get_subpoint (ellipse, z5 - z6, z5) + -- get_subpoint (ellipse, z4 - z5, z5) + -- get_subpoint (ellipse, z4 - z5, z4) + -- get_subpoint (ellipse, -direction (2 - epsilon) of pat, z3) + .. get_subpath (ellipse, + -direction 1 of pat, -direction 1 of pat, z2) + .. cycle; + + labels (1, 2, 3, 4, 5, 6); enddef; -fet_beginchar("Hufnagel do clef", "hufnagel_do", "hufnageldoclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_hufnagel_do_clef((0,0), 1.0); +fet_beginchar ("Hufnagel do clef", "hufnagel.do"); + draw_staff_if_debugging (-1, 3); + draw_hufnagel_do_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("Hufnagel do clef", "hufnagel_do_change", "chufnageldoclef") - draw_hufnagel_do_clef((1.3 staff_space#,0), .8); + + +fet_beginchar ("Hufnagel do clef", "hufnagel.do_change"); + draw_hufnagel_do_clef ((0, 0), .8); fet_endchar; -def draw_hufnagel_fa_clef(expr exact_center, reduction) = - % +def draw_hufnagel_fa_clef (expr exact_center, reduction) = % inspired by Bamberger Manuscript (15th century), in: % MGG, volume 2, table 59. - % + save reduced_il; reduced_il# = staff_space# * reduction; - define_pixels(reduced_il); + define_pixels (reduced_il); + + set_char_box (0 - xpart exact_center, + 1.20 reduced_il# + xpart exact_center, + 1.15 reduced_il# - ypart exact_center, + 1.00 reduced_il# + ypart exact_center); + + save xoffs, yoffs; + + xoffs# = xpart exact_center; + yoffs# = ypart exact_center; + + define_pixels (xoffs, yoffs); + + save ellipse, pat, T; + path ellipse, pat; + transform T; + + T := identity xscaled 0.6 reduced_il + yscaled 0.1 reduced_il + rotated 40; + pickup pencircle transformed T; + ellipse := fullcircle transformed T; + + z11 = (xoffs + 0.90 reduced_il, yoffs + 0.70 reduced_il); + z12 = (xoffs + 0.80 reduced_il, yoffs + 0.70 reduced_il); + z13 = (xoffs + 0.50 reduced_il, yoffs + 0.85 reduced_il); + z14 = (xoffs + 0.20 reduced_il, yoffs + 0.70 reduced_il); + z15 = (xoffs + 0.20 reduced_il, yoffs - 1.10 reduced_il); + + pat := z11 + .. z12 + .. z13 + -- z14 + -- z15; + + fill get_subpath (ellipse, + -direction 0 of pat, direction 0 of pat, z11) + .. get_subpoint (ellipse, direction 1 of pat, z12) + .. get_subpath (ellipse, + direction (2 - epsilon) of pat, z14 - z13, z13) + -- get_subpath (ellipse, + z14 - z13, z15 - z14, z14) + -- get_subpath (ellipse, + z15 - z14, z14 - z15, z15) + -- get_subpoint (ellipse, z14 - z15, z14) + -- get_subpoint (ellipse, -direction (2 - epsilon) of pat, z13) + .. get_subpath (ellipse, + -direction 1 of pat, -direction 1 of pat, z12) + .. cycle; + + z16 = (xoffs + 0.90 reduced_il, yoffs - 0.05 reduced_il); + z17 = (xoffs + 0.80 reduced_il, yoffs - 0.05 reduced_il); + z18 = (xoffs + 0.50 reduced_il, yoffs + 0.10 reduced_il); + z19 = (xoffs + 0.20 reduced_il, yoffs - 0.05 reduced_il); + + pat := z16 + .. z17 + .. z18 + -- z19; + + fill get_subpath (ellipse, + -direction 0 of pat, direction 0 of pat, z16) + .. get_subpoint (ellipse, direction 1 of pat, z17) + .. get_subpath (ellipse, + direction (2 - epsilon) of pat, z19 - z18, z18) + -- get_subpoint (ellipse, z19 - z18, z19) + -- get_subpoint (ellipse, -direction (2 - epsilon) of pat, z18) + .. get_subpoint (ellipse, -direction 1 of pat, z17) + .. cycle; + + labels (11, 12, 13, 14, 15, 16, 17, 18, 19); +enddef; + + +fet_beginchar ("Hufnagel fa clef", "hufnagel.fa"); + draw_staff_if_debugging (-1, 3); + draw_hufnagel_fa_clef ((0, 0), 1.0); +fet_endchar; - pickup pencircle - xscaled (0.60reduced_il) - yscaled (0.10reduced_il) - rotated 40; - save za, zb, zc, zd, ze, zf; - pair za, zb, zc, zd, ze, zf; - za = exact_center + (+0.30reduced_il, +0.70reduced_il); - zb = exact_center + (+0.20reduced_il, +0.70reduced_il); - zc = exact_center + (-0.10reduced_il, +0.85reduced_il); - zd = exact_center + (-0.40reduced_il, +0.70reduced_il); - ze = exact_center + (-0.40reduced_il, -1.10reduced_il); - draw za .. zb .. zc -- zd -- ze; +fet_beginchar ("Hufnagel fa clef", "hufnagel.fa_change"); + draw_hufnagel_fa_clef ((0, 0), .8); +fet_endchar; - save zg, zh, zi, zj; - pair zg, zh, zi, zj; - zg = exact_center + (+0.30reduced_il, -0.05reduced_il); - zh = exact_center + (+0.20reduced_il, -0.05reduced_il); - zi = exact_center + (-0.10reduced_il, +0.10reduced_il); - zj = exact_center + (-0.40reduced_il, -0.05reduced_il); - draw zg .. zh .. zi -- zj; +def draw_hufnagel_do_fa_clef (expr exact_center, reduction) = + draw_hufnagel_do_clef (exact_center, reduction); + draw_hufnagel_fa_clef (exact_center + (0, -2 staff_space#), reduction); - set_char_box(0.5reduced_il#, 0.5reduced_il#, 0, reduced_il#); + set_char_box (0 - xpart exact_center, + 1.20 reduced_il# + xpart exact_center, + 1.15 reduced_il# + 2 staff_space# - ypart exact_center, + 0.75 reduced_il# + ypart exact_center); enddef; -fet_beginchar("Hufnagel fa clef", "hufnagel_fa", "hufnagelfaclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_hufnagel_fa_clef((0,0), 1.0); +fet_beginchar ("Hufnagel do/fa clef", "hufnagel.do.fa"); + draw_staff_if_debugging (-1, 3); + draw_hufnagel_do_fa_clef ((0, 0), 1.0); fet_endchar; -fet_beginchar("Hufnagel fa clef", "hufnagel_fa_change", "chufnagelfaclef") - draw_hufnagel_fa_clef((0,0), .8); + + +fet_beginchar ("Hufnagel do/fa clef", "hufnagel.do.fa_change"); + draw_hufnagel_do_fa_clef ((0, 0), .8); fet_endchar; -def draw_hufnagel_do_fa_clef(expr exact_center, reduction) = - draw_hufnagel_do_clef(exact_center, reduction); - draw_hufnagel_fa_clef(exact_center + (0, -2staff_space), reduction); +%%%%%%%% +%% +%% Medieval East-Slavic (Kievan) Notation clefs +%% Code by Aleksandr Andreev +%% +%%%%%%%% + +def draw_kievan_do_clef = + z1 = (1.108 staff_space, 0.554 staff_space); + z2 = (1.063 staff_space, -0.122 staff_space); + z3 = (1.467 staff_space, -1.621 staff_space); + z4 = (1.002 staff_space, -2.253 staff_space); + + y5 = y3; + x4 - x5 = x3 - x4; + + z6 = (0.917 staff_space, -0.383 staff_space); + z7 = (0.012 staff_space, -0.448 staff_space); + z8 = (0, -0.167 staff_space); + z9 = (0.057 staff_space, 0.464 staff_space); + z10 = (0.994 staff_space, 0.387 staff_space); + z11 = (1.023 staff_space, 0.554 staff_space); + + fill z1 + .. z2{down} + .. z3 + -- z4 + -- z5 + .. {up}z6 + & z6{left} + .. z7 + & z7 + .. z8{up} + .. z9 + & z9 + .. {right}z10 + & z10 + .. z11 + -- cycle; + + set_char_box (0, 1.5 staff_space#, + 2.25 staff_space#, 0.55 staff_space#); enddef; -fet_beginchar("Hufnagel do/fa clef", "hufnagel_do_fa", "hufnageldofaclef") - if test = 1: - draw_staff(-1,3, 0.0); - fi; - draw_hufnagel_do_fa_clef((0,0), 1.0); -fet_endchar; -fet_beginchar("Hufnagel do/fa clef", "hufnagel_do_fa_change", - "chufnageldofaclef") - draw_hufnagel_do_fa_clef((0,0), .8); +fet_beginchar ("Kievan tsefaut clef", "kievan.do"); + % This draws the Tse-Fa-Ut clef; it is a variant alto clef that + % always occurs on the third line of the staff. + draw_kievan_do_clef; fet_endchar; -fet_endgroup ("clefs") +fet_beginchar ("Kievan tsefaut clef", "kievan.do_change"); + % This is the same thing as a do clef? + draw_kievan_do_clef; +fet_endchar; + +fet_endgroup ("clefs");