]> git.donarmstrong.com Git - lilypond.git/blob - mf/parmesan-clefs.mf
* lily/auto-change-iterator.cc: move contents from
[lilypond.git] / mf / parmesan-clefs.mf
1 % -%-Fundamental-%- -*-Metafont-*-
2 % parmesan-clefs.mf -- implement ancient clefs
3
4 % source file of LilyPond's pretty-but-neat music font
5 %
6 % (c)  2001--2004 Juergen Reuter <reuter@ipd.uka.de>
7 %
8
9 fet_begingroup ("clefs")
10
11 %
12 % character aligment:
13 %
14 %   Each clef is associated with a particular pitch: the treble clef
15 %   with the 'g', the alto clef with the 'c', the bass clef with the
16 %   'f', etc.  The shape of each clef character defines a vertical
17 %   position that is assumed to represent this pitch.  For the treble
18 %   clef, it is the vertical position of the center of the spiral
19 %   ending that represents the 'g' pitch.  For the bass clef, it is
20 %   the center between the two fat dots that define the vertical
21 %   position of the 'f' pitch.  For the alto clef, it is the vertical
22 %   center of the clef that is aligned with the 'c' pitch.  For each
23 %   clef character, this center should be vertically aligned with the
24 %   point (0, 0).  The horizontal alignment of each clef character
25 %   should be such that the vertical line through the point (0, 0)
26 %   touches the left-most edge of the clef.
27 %
28 %   TODO: document exact_center
29 %
30 % set_char_box() conventions:
31 %
32 % * breapth: Ignored (as far as I know).  Should be set to 0.
33 %
34 % * width: Should match the head's width.
35 %
36 % * depth: Should match the bottom edge of the head.  Affects vertical
37 %   collision handling.
38 %
39 % * height: Should match the top edge of the head.  Affects vertical
40 %   collision handling.
41 %
42
43
44 %%%%%%%%
45 %
46 %
47 %
48 % Editio Vaticana
49 %
50 %
51 %
52 def draw_vaticana_do_clef(expr exact_center, reduction) = 
53         save reduced_il;
54
55         reduced_il# = staff_space# * reduction;
56         set_char_box(0 - xpart exact_center,
57                      0.5reduced_il# + xpart exact_center,
58                      0.8reduced_il# - ypart exact_center,
59                      0.8reduced_il# + ypart exact_center);
60
61         define_pixels(reduced_il);
62
63         pickup pencircle xscaled 0.6linethickness yscaled 0.6 reduced_il;
64
65         save za, zb, zc, zd, ze, zf;
66         pair za, zb, zc, zd, ze, zf;
67
68         save xoffs, yoffs;
69         xoffs# = xpart exact_center;
70         yoffs# = ypart exact_center;
71         define_pixels(xoffs, yoffs);
72
73         rt  za = (xoffs + 0.50reduced_il, yoffs - .45reduced_il);
74             zb = (xoffs + 0.25reduced_il, yoffs - .50reduced_il);
75         lft zc = (xoffs + 0.00reduced_il, yoffs - .25reduced_il);
76         lft zd = (xoffs + 0.00reduced_il, yoffs + .25reduced_il);
77             ze = (xoffs + 0.25reduced_il, yoffs + .50reduced_il);
78         rt  zf = (xoffs + 0.50reduced_il, yoffs + .45reduced_il);
79         draw za .. zb .. zc --  % lower punctum
80              zd .. ze .. zf;    % upper punctum
81 enddef;
82
83
84 fet_beginchar("Ed. Vat. do clef", "vaticana_do", "vatdoclef")
85         if test = 1:
86                 draw_staff(-1,3, 0.0);
87         fi;
88         draw_vaticana_do_clef((0,0), 1.0);
89 fet_endchar;
90 fet_beginchar("Ed. Vat. do clef", "vaticana_do_change", "vatcdoclef")
91         draw_vaticana_do_clef((0,0), 1.0); % no reduction
92 fet_endchar;
93
94
95 def draw_vaticana_fa_clef(expr exact_center, reduction) = 
96
97         save reduced_il, z;
98         reduced_il# = staff_space# * reduction;
99         define_pixels(reduced_il);
100
101         save za, zb, zc, zd, ze;
102         pair za, zb, zc, zd, ze;
103
104         save xoffs, yoffs;
105         xoffs# = xpart exact_center;
106         yoffs# = ypart exact_center;
107         define_pixels(xoffs, yoffs);
108
109         %left-handed punctum
110         pickup pencircle xscaled 0.6linethickness yscaled 0.5reduced_il;
111         lft za = (xoffs + 0.00reduced_il, xoffs + 0.00reduced_il);
112             zb = (xoffs + 0.25reduced_il, xoffs + 0.05reduced_il);
113         rt  zc = (xoffs + 0.50reduced_il, xoffs - 0.05reduced_il);
114         draw za .. zb .. zc;
115
116         %stem
117         pickup pencircle scaled 0.6linethickness;
118         xpart zc = xpart zd = xpart ze;
119         ypart zd = yoffs = bot ypart ze + 1.5reduced_il;
120         draw zd -- ze;
121
122         %right-handed puncta as in do clef
123         draw_vaticana_do_clef(exact_center + (0.55reduced_il#, 0), reduction);
124
125         set_char_box(0 - xpart exact_center,
126                      1.05reduced_il# + xpart exact_center,
127                      1.5reduced_il# - ypart exact_center,
128                      0.8reduced_il# + ypart exact_center);
129 enddef;
130
131
132 fet_beginchar("Ed. Vat. fa clef", "vaticana_fa", "vatfaclef")
133         if test = 1:
134                 draw_staff(-1,3, 0.0);
135         fi;
136         draw_vaticana_fa_clef((0,0), 1.0);
137 fet_endchar;
138 fet_beginchar("Ed. Vat. fa clef", "vaticana_fa_change", "vatcfaclef")
139         draw_vaticana_fa_clef((0,0), 1.0); % no reduction
140 fet_endchar;
141
142 %%%%%%%%
143 %
144 %
145 %
146 % Editio Medicaea
147 %
148 %
149 %
150 def draw_medicaea_do_clef(expr exact_center, reduction) = 
151         save reduced_il, reduced_slt;
152         reduced_il# = staff_space# * reduction;
153         reduced_slt# = linethickness# * reduction;
154         define_pixels(reduced_il);
155         define_pixels(reduced_slt);
156
157         save flag_height;
158         flag_height# = 0.5 reduced_il#;
159         define_pixels(flag_height);
160
161         save xoffs, yoffs;
162         xoffs# = xpart exact_center;
163         yoffs# = ypart exact_center;
164         define_pixels(xoffs, yoffs);
165
166         %upper flag
167         save za, zb;
168         pair za, zb;
169         pickup pencircle xscaled reduced_slt yscaled flag_height;
170         xoffs = lft xpart za = rt xpart zb - reduced_il;
171         ypart za = yoffs + 0.5 (reduced_il - flag_height - staff_space);
172         ypart zb = ypart za - reduced_il + flag_height;
173         draw za -- zb;
174
175         %lower flag
176         save za, zb;
177         pair za, zb;
178         pickup pencircle xscaled reduced_slt yscaled flag_height;
179         xoffs = lft xpart za = rt xpart zb - reduced_il;
180         ypart za = yoffs + 0.5 (reduced_il - flag_height + staff_space);
181         ypart zb = ypart za - reduced_il + flag_height;
182         draw za -- zb;
183
184         %stem
185         save za, zb;
186         pair za, zb;
187         pickup pencircle scaled reduced_slt;
188         lft xpart za = lft xpart zb = xoffs;
189         yoffs = top ypart zb - 1.5 reduced_il = bot ypart za + 1.5 reduced_il;
190         draw za -- zb;
191
192         set_char_box(0 - xpart exact_center,
193                      1.0reduced_il# + xpart exact_center,
194                      1.5reduced_il# - ypart exact_center,
195                      1.5reduced_il# + ypart exact_center);
196 enddef;
197
198
199 fet_beginchar("Ed. Med. do clef", "medicaea_do", "meddoclef")
200         if test = 1:
201                 draw_staff(-1,3, 0.0);
202         fi;
203         draw_medicaea_do_clef((0,0), 1.0);
204 fet_endchar;
205 fet_beginchar("Ed. Med. do clef", "medicaea_do_change", "cmeddoclef")
206         draw_medicaea_do_clef((0,0), .8);
207 fet_endchar;
208
209
210 def draw_medicaea_fa_clef(expr exact_center, reduction) = 
211         % inspired by Regensburger Edition of Medicaea (1885/86), in:
212         % MGG, volume 2, col. 1327 ("Choralreform"), fig. 2.
213
214         save reduced_il, reduced_slt;
215         reduced_il# = staff_space# * reduction;
216         reduced_slt# = linethickness# * reduction;
217         define_pixels(reduced_il);
218         define_pixels(reduced_slt);
219
220         save za, zb, zc, zd, ze;
221         pair za, zb, zc, zd, ze;
222
223         save xoffs, yoffs;
224         xoffs# = xpart exact_center;
225         yoffs# = ypart exact_center;
226         define_pixels(xoffs, yoffs);
227
228         %stem
229         pickup pencircle scaled linethickness;
230         xpart za = xpart zb = xoffs + 0.4reduced_il;
231         ypart za = yoffs = bot ypart zb + 1.5reduced_il;
232         draw za -- zb;
233
234         %left-handed punctum
235         pickup pencircle xscaled reduced_slt yscaled reduced_il;
236         lft zc = (xoffs, yoffs);
237         zd = lft zc + (0.4reduced_il, 0);
238         draw zc -- zd;
239
240         %right-handed puncta as in do clef
241         draw_medicaea_do_clef(exact_center + (0.7reduced_il#, 0), reduction);
242
243         set_char_box(0 - xpart exact_center,
244                      1.7reduced_il# + xpart exact_center,
245                      1.5reduced_il# - ypart exact_center,
246                      1.5reduced_il# + ypart exact_center);
247 enddef;
248
249
250 fet_beginchar("Ed. Med. fa clef", "medicaea_fa", "medfaclef")
251         if test = 1:
252                 draw_staff(-1,3, 0.0);
253         fi;
254         draw_medicaea_fa_clef((0,0), 1.0);
255 fet_endchar;
256 fet_beginchar("Ed. Med. fa clef", "medicaea_fa_change", "cmedfaclef")
257         draw_medicaea_fa_clef((0,0), .8);
258 fet_endchar;
259
260
261 %%%%%%%%
262 %
263 %
264 %
265 % Mensural Notation
266 %
267 %
268 %
269
270 %
271 % width:        interval from left end to right end
272 % height:       interval from bottom of lower beam to top of upper beam
273 % exact_center: the coordinates of the vertical center point of the
274 %               left edge.
275 %
276 def draw_brevis(expr exact_center, bwidth, bheight, blinethickness) =
277
278         save brevis_width, brevis_height, linethickness;
279         brevis_width# = bwidth; brevis_height# = bheight;
280         linethickness# = blinethickness;
281
282         save beam_width, beam_height, serif_size, serif_protrude, hole_height;
283         beam_width# = 1.4 linethickness#;
284         hole_height# = 3 linethickness#;
285         2 beam_height# + hole_height# = brevis_height#;
286         serif_size# = (hole_height# - linethickness#)/2;
287         serif_protrude# = 1.5 serif_size#;
288
289         save xoffs, yoffs;
290         xoffs# = xpart exact_center;
291         yoffs# = ypart exact_center;
292         define_pixels(xoffs, yoffs);
293
294         define_pixels(brevis_width, brevis_height, linethickness);
295         define_pixels(beam_width, beam_height, serif_size, serif_protrude);
296
297         penpos1(beam_width, 0);
298         penpos2(beam_width, 0);
299         penpos3(beam_height, 90);
300         penpos4(beam_height, 90);
301         penpos5(beam_width, 180);
302         z1l = (xoffs, yoffs);
303         z2l = z1l + (0, -linethickness);
304         z3r = z2r + serif_size*(1,-1);
305         y4r = y3r;
306         x4l = x1l + brevis_width/2;
307         z5l = z3l + (-serif_size, -serif_protrude);
308         fill z1r -- z1l -- z5r{down} .. z5l{up} .. z3l{right}
309                 -- z4l -- z4r -- z3r{left} .. z2r{up} -- cycle;
310
311         addto currentpicture also currentpicture
312                 yscaled -1 shifted (0, 2*yoffs);
313
314         pickup pencircle scaled linethickness;
315         top y6 = yoffs + brevis_height/2;
316         bot y7 = yoffs - brevis_height/2;
317         lft x6 = lft x7 = xoffs;
318         draw z6 -- z7;
319
320         addto currentpicture also currentpicture
321                 xscaled -1 shifted (2xoffs + brevis_width, 0);
322 enddef;
323
324
325 def draw_neo_mensural_c_clef(expr exact_center, reduction) = 
326         save reduced_il, reduced_slt, stem_width;
327         reduced_il# = staff_space# * reduction;
328         reduced_slt# = linethickness# * reduction;
329         stem_width# = 1.4 reduced_slt#;
330         define_pixels(reduced_il, reduced_slt, stem_width);
331
332         draw_brevis(exact_center + (3reduced_slt#, 0),
333                     2reduced_il#, reduced_il#, reduced_slt#);
334
335         save xoffs, yoffs;
336         xoffs# = xpart exact_center;
337         yoffs# = ypart exact_center;
338         define_pixels(xoffs, yoffs);
339
340         pickup pencircle xscaled stem_width yscaled blot_diameter;
341         lft x8  = lft x9  = xoffs;
342         lft x10 = lft x11 = lft x8  + 3reduced_slt;
343         rt  x12 = rt  x13 = lft x10 + 2reduced_il;
344         rt  x14 = rt  x15 = rt  x12 + 3reduced_slt;
345         top y9 - bot y8 = 4reduced_il;
346         top y9 + bot y8 = 2yoffs;
347         y12 = y14 = y10 = y8; y13 = y15 = y11 = y9;
348         draw z8 -- z9;
349         draw z10 -- z11;
350         draw z12 -- z13;
351         draw z14 -- z15;
352
353         set_char_box(0 - xpart exact_center,
354                      2reduced_il# + 6reduced_slt# + xpart exact_center,
355                      2reduced_il# - ypart exact_center,
356                      2reduced_il# + ypart exact_center);
357 enddef;
358
359
360 fet_beginchar("neo-mensural c clef", "neo_mensural_c", "neomenscclef")
361         if test = 1:
362                 draw_staff(-1,3, 0.0);
363         fi;
364         draw_neo_mensural_c_clef((0,0), 1.0);
365 fet_endchar;
366 fet_beginchar("neo-mensural c clef", "neo_mensural_c_change", "cneomenscclef")
367         draw_neo_mensural_c_clef((0,0), .8);
368 fet_endchar;
369
370
371 def draw_petrucci_c_clef(expr exact_center, flare_align, reduction) = 
372         % inspired by Josquin Desprez, "Stabat Mater", Libro tertio,
373         % 1519, printed by Petrucci, in: MGG, volume 7, Table 11.
374         % Also by Petrucci's Canti C, Venedig 1503.  In: MGG, volume
375         % 9, p. 1681/1682.
376
377         save reduced_il, reduced_slt;
378         reduced_il# = staff_space# * reduction;
379         reduced_slt# = linethickness# * reduction;
380         define_pixels(reduced_il);
381
382         draw_brevis(exact_center + (0, 0.5staff_space#),
383                     reduced_il#, reduced_il#, reduced_slt#);
384
385         addto currentpicture also currentpicture shifted (0, -staff_space);
386
387         save half_reduced_il, left_depth, left_height;
388         half_reduced_il# = staff_space# * sqrt(reduction);
389         left_height# = half_reduced_il# * min(3.2, 3.2 + 0.2 + flare_align);
390         left_depth# = half_reduced_il# * min(3.2, 3.2 + 0.2 - flare_align);
391
392         define_pixels(half_reduced_il);
393         define_pixels(left_depth, left_height);
394
395         save xoffs, yoffs;
396         xoffs# = xpart exact_center;
397         yoffs# = ypart exact_center;
398         define_pixels(xoffs, yoffs);
399
400         pickup pencircle xscaled 1.4 linethickness yscaled blot_diameter;
401         lft x8 = lft x9 = xoffs;
402         top y8 = yoffs + left_height;
403         bot y9 = yoffs - left_depth;
404         draw z8 .. z9;
405
406         rt x10 = rt x11 = xoffs + brevis_width;
407         y10 = min(y8 - 0.2*half_reduced_il, yoffs + 2.2half_reduced_il);
408         y11 = max(y9 + 0.2*half_reduced_il, yoffs - 2.2half_reduced_il);
409         draw z10 .. z11;
410
411         set_char_box(0 - xpart exact_center,
412                      reduced_il# + xpart exact_center,
413                      left_depth# - ypart exact_center,
414                      left_height# + ypart exact_center);
415 enddef;
416
417
418 fet_beginchar("petrucci c1 clef", "petrucci_c1", "petruccic1clef")
419         if test = 1:
420                 draw_staff(-1,3, 0.0);
421         fi;
422         draw_petrucci_c_clef((0,0), +2, 1.0);
423 fet_endchar;
424 fet_beginchar("petrucci c1 clef", "petrucci_c1_change", "cpetruccic1clef")
425         draw_petrucci_c_clef((0,0), +2, .8);
426 fet_endchar;
427
428 fet_beginchar("petrucci c2 clef", "petrucci_c2", "petruccic2clef")
429         if test = 1:
430                 draw_staff(-1,3, 0.0);
431         fi;
432         draw_petrucci_c_clef((0,0), +1, 1.0);
433 fet_endchar;
434 fet_beginchar("petrucci c2 clef", "petrucci_c2_change", "cpetruccic2clef")
435         draw_petrucci_c_clef((0,0), +1, .8);
436 fet_endchar;
437
438 fet_beginchar("petrucci c3 clef", "petrucci_c3", "petruccic3clef")
439         if test = 1:
440                 draw_staff(-1,3, 0.0);
441         fi;
442         draw_petrucci_c_clef((0,0), 0, 1.0);
443 fet_endchar;
444 fet_beginchar("petrucci c3 clef", "petrucci_c3_change", "cpetruccic3clef")
445         draw_petrucci_c_clef((0,0), 0, .8);
446 fet_endchar;
447
448 fet_beginchar("petrucci c4 clef", "petrucci_c4", "petruccic4clef")
449         if test = 1:
450                 draw_staff(-1,3, 0.0);
451         fi;
452         draw_petrucci_c_clef((0,0), -1, 1.0);
453 fet_endchar;
454 fet_beginchar("petrucci c4 clef", "petrucci_c4_change", "cpetruccic4clef")
455         draw_petrucci_c_clef((0,0), -1, .8);
456 fet_endchar;
457
458 fet_beginchar("petrucci c5 clef", "petrucci_c5", "petruccic5clef")
459         if test = 1:
460                 draw_staff(-1,3, 0.0);
461         fi;
462         draw_petrucci_c_clef((0,0), -2, 1.0);
463 fet_endchar;
464 fet_beginchar("petrucci c5 clef", "petrucci_c5_change", "cpetruc5iceclef")
465         draw_petrucci_c_clef((0,0), -2, .8);
466 fet_endchar;
467
468
469 def draw_mensural_c_clef(expr exact_center, reduction) =
470         % inspired by Ockeghem, "Missa Prolationum", in: MGG, volume
471         % 9, table 94.
472
473         save reduced_il;
474         reduced_il# = staff_space# * reduction;
475         draw_brevis(exact_center + (0, 0.5staff_space#),
476                     2reduced_il#, 0.8staff_space#, 0.8linethickness#);
477         define_pixels(reduced_il);
478         addto currentpicture also currentpicture shifted (0, -staff_space);
479         addto currentpicture also currentpicture shifted (0, -staff_space);
480
481         save half_reduced_il;
482         half_reduced_il# = staff_space# * sqrt(reduction);
483         define_pixels(half_reduced_il);
484
485         save xoffs, yoffs;
486         xoffs# = xpart exact_center;
487         yoffs# = ypart exact_center;
488         define_pixels(xoffs, yoffs);
489
490         pickup pencircle xscaled 1.4 linethickness yscaled blot_diameter;
491         lft x8 = lft x9 = xoffs;
492         top y8 = yoffs + 2.2 half_reduced_il;
493         bot y9 = yoffs - 2.2 half_reduced_il - staff_space;
494         draw z8 .. z9;
495
496         rt x10 = rt x11 = xoffs + brevis_width;
497         y10 = yoffs + 1.4half_reduced_il;
498         y11 = yoffs - 1.4half_reduced_il - staff_space;
499         draw z10 .. z11;
500
501         set_char_box(0 - xpart exact_center,
502                      2reduced_il# + xpart exact_center,
503                      2.2 half_reduced_il# + staff_space# - 2 ypart exact_center,
504                      2.2 half_reduced_il# + 2 ypart exact_center);
505 enddef;
506
507
508 fet_beginchar("mensural c clef", "mensural_c", "menscclef")
509         if test = 1:
510                 draw_staff(-1,3, 0.0);
511         fi;
512         draw_mensural_c_clef((0,0), 1.0);
513 fet_endchar;
514 fet_beginchar("mensural c clef", "mensural_c_change", "cmenscclef")
515         draw_mensural_c_clef((0,0), .8);
516 fet_endchar;
517
518 def draw_diamond(expr exact_center, reduction) =
519         save stem_width, reduced_nht, holeheight, beamheight;
520         save rh_height, rh_width;
521
522         stem_width# = 1.4 reduced_slt#;
523         reduced_nht# = noteheight# * reduction;
524         holeheight# = 3 reduced_slt#;
525         beamheight# = 0.4(reduced_nht# - holeheight#);
526
527         rh_height# = 1.2 staff_space# * reduction;
528         rh_width# / rh_height# = tand(30);
529
530         define_pixels(beamheight);
531         define_pixels(stem_width);
532         define_pixels(rh_height);
533         define_pixels(rh_width);
534
535         save xoffs, yoffs;
536         xoffs# = xpart exact_center;
537         yoffs# = ypart exact_center;
538         define_pixels(xoffs, yoffs);
539
540         pickup pencircle
541                 xscaled beamheight
542                 yscaled stem_width
543                 rotated 45;
544
545         draw
546                 (xoffs - rh_width/2, yoffs) --
547                 (xoffs, yoffs + rh_height/2) --
548                 (xoffs + rh_width/2, yoffs) --
549                 (xoffs, yoffs - rh_height/2) --
550                 cycle;
551 enddef;
552
553 def draw_petrucci_f_clef(expr exact_center, reduction) =
554         % inspired by L'homme arme super voces musicales in Misse
555         % Josquin, 1502, Petrucci, in: MGG, volume 7, col. 200; also
556         % inspired by Gaspar van Weerbeke, "Virgo Maria" (1502), in:
557         % MGG, volume 9, col. 653 ("Motette"), fig. 3.; also by Andr'e
558         % Campra, "Entr'ee des s'er'enades" (1710), in: MGG, volume 2,
559         % col. 1649 ("Contredanse"), fig. 2.
560         %
561
562         save interline, reduced_il, reduced_slt;
563         interline# = staff_space#;
564         reduced_il# = staff_space# * reduction;
565         reduced_slt# = linethickness# * reduction;
566
567         draw_brevis(exact_center, reduced_il#, reduced_il#, reduced_slt#);
568         draw_diamond(exact_center + (1.6interline#*reduction, interline#/2),
569                      reduction);
570         draw_diamond(exact_center + (1.6interline#*reduction, -interline#/2),
571                      reduction);
572
573         define_pixels(interline);
574         define_pixels(reduced_il);
575         define_pixels(reduced_slt);
576
577         save stem_width;
578         stem_width# = 1.4 reduced_slt#;
579         define_pixels(stem_width);
580
581         save xoffs, yoffs;
582         xoffs# = xpart exact_center;
583         yoffs# = ypart exact_center;
584
585         define_pixels(xoffs, yoffs);
586
587         % brevis stem
588         pickup pencircle xscaled stem_width yscaled blot_diameter;
589         rt z8 = (xoffs + reduced_il, yoffs);
590         z9 = z8 + (0, -4reduced_il);
591         draw z8 .. z9;
592
593         % upper diamond's stem
594         pickup pencircle xscaled stem_width yscaled blot_diameter;
595         z10 = (xoffs + 1.6interline*reduction + stem_width/2,
596           yoffs + interline*reduction);
597         top z11 = z10 + (0, 1.5interline*reduction);
598         draw z10 .. z11;
599
600         % lower diamond's stem
601         pickup pencircle xscaled stem_width yscaled blot_diameter;
602         z12 = (xoffs + 1.6interline*reduction - stem_width/2,
603           yoffs - interline*reduction);
604         bot z13 = z12 + (0, -3.5interline*reduction);
605         draw z12 .. z13;
606
607         save reduced_il, rh_height, rh_width;
608         reduced_il# = staff_space# * reduction;
609         rh_height# = 1.2reduced_il#;
610         rh_width# / rh_height# = tand(30);
611         set_char_box(0 - xpart exact_center,
612                      1.6interline#*reduction + 0.5rh_width# + xpart exact_center,
613                      4.5*interline#*reduction - ypart exact_center,
614                      2.5*interline#*reduction + ypart exact_center);
615 enddef;
616
617
618 fet_beginchar("petrucci f clef", "petrucci_f", "petruccifclef")
619         if test = 1:
620                 draw_staff(-1,3, 0.0);
621         fi;
622         draw_petrucci_f_clef((0,0), 1.0);
623 fet_endchar;
624 fet_beginchar("petrucci f clef", "petrucci_f_change", "cpetruccifclef")
625         draw_petrucci_f_clef((0,0), .8);
626 fet_endchar;
627
628
629 def draw_mensural_f_clef(expr exact_center, reduction) =
630         %
631         % inspired by Philippe le Duc, "Dite Signori" (1590), in: MGG,
632         % volume 3, col. 848 ("Duc"); also by John Dowland, "The First
633         % Booke of Songes" (1597), in: MGG, volume 3, col. 721
634         % ("Dowland"), fig. 3.
635
636         save width, reduced_slt, stem_width, dot_diameter;
637
638         width# = 1.2staff_space# * reduction;
639         reduced_slt# = linethickness# * reduction;
640         stem_width# = 1.4 reduced_slt#;
641         dot_diameter# = 0.1 reduction * staff_space#;
642         define_pixels(width, stem_width, staff_space, dot_diameter);
643
644         save xoffs, yoffs;
645         xoffs# = xpart exact_center;
646         yoffs# = ypart exact_center;
647         define_pixels(xoffs, yoffs);
648
649         pickup pencircle
650                 xscaled 0.2width
651                 yscaled stem_width
652                 rotated 45;
653
654         % half circle
655         lft z5 = (0, 0);
656         draw    halfcircle scaled width rotated -90
657                 shifted (z5-(xoffs, yoffs));
658
659
660         % upper dot
661         rt x2 = xoffs + width;
662         top y1 = yoffs + 0.5width;
663         z2 - z1 = (dot_diameter, -dot_diameter);
664         draw z1 -- z2;
665
666         % lower dot
667         x3 = x1;
668         top y1 - bot y4 = width;
669         z4 - z3 = (dot_diameter, -dot_diameter);
670         draw z3 -- z4;
671
672         set_char_box(0 - xpart exact_center,
673                      width# + xpart exact_center,
674                      0.5width# - ypart exact_center,
675                      0.5width# + ypart exact_center);
676 enddef;
677
678 fet_beginchar("mensural f clef", "mensural_f", "mensfclef")
679         if test = 1:
680                 draw_staff(-1,3, 0.0);
681         fi;
682         draw_mensural_f_clef((0,0), 1.0);
683 fet_endchar;
684 fet_beginchar("mensural f clef", "mensural_f_change", "cmensfclef")
685         draw_mensural_f_clef((0,0), .8);
686 fet_endchar;
687
688
689 def draw_petrucci_g_clef(expr exact_center, reduction) =
690         % inspired by Josquin Desprez, "Stabat Mater", Libro tertio,
691         % 1519, printed by Petrucci, in: MGG, volume 7, Table 11.
692
693         save reduced_il, reduced_slt;
694
695         reduced_il# = staff_space# * reduction;
696         reduced_slt# = linethickness# * reduction;
697         define_pixels(reduced_il, reduced_slt);
698
699         set_char_box(0 - xpart exact_center,
700                      1.25 reduced_il# + xpart exact_center,
701                      0.65 reduced_il# - ypart exact_center,
702                      3.80 reduced_il# + ypart exact_center);
703
704         save za, zb, zc, zd, ze, zf, zg, zh, zi, zj;
705         pair za, zb, zc, zd, ze, zf, zg, zh, zi, zj;
706
707         save xoffs, yoffs;
708         xoffs# = xpart exact_center;
709         yoffs# = ypart exact_center;
710         define_pixels(xoffs, yoffs);
711
712         pickup pencircle
713                 xscaled 0.50 reduced_slt
714                 yscaled 0.22 reduced_il
715                 rotated -35;
716
717         lft za = (xoffs + 0.80 reduced_il, yoffs + 0.00 reduced_il);
718         lft zb = (xoffs + 1.00 reduced_il, yoffs + 1.20 reduced_il);
719         lft zc = (xoffs + 0.70 reduced_il, yoffs + 2.00 reduced_il);
720         lft zd = (xoffs + 0.30 reduced_il, yoffs + 3.00 reduced_il);
721         lft ze = (xoffs + 0.80 reduced_il, yoffs + 3.70 reduced_il);
722         lft zf = (xoffs + 1.00 reduced_il, yoffs + 3.00 reduced_il);
723         lft zg = (xoffs + 0.60 reduced_il, yoffs + 2.00 reduced_il);
724         lft zh = (xoffs + 0.30 reduced_il, yoffs + 1.70 reduced_il);
725         lft zi = (xoffs + 0.00 reduced_il, yoffs + 0.75 reduced_il);
726         lft zj = (xoffs + 0.20 reduced_il, yoffs + 0.60 reduced_il);
727
728         draw za{-1,2} .. zb .. zc .. zd .. ze .. zf .. zg .. zh .. zi .. zj;
729
730         save za, zb, zc, zd, ze, zf;
731         pair za, zb, zc, zd, ze, zf;
732
733         pickup pencircle
734                 xscaled 0.75 reduced_slt
735                 yscaled 0.33 reduced_il
736                 rotated -35;
737
738         lft za = (xoffs + 1.05 reduced_il, yoffs + 0.45 reduced_il);
739         lft zb = (xoffs + 0.55 reduced_il, yoffs + 0.45 reduced_il);
740         lft zc = (xoffs + 0.55 reduced_il, yoffs - 0.45 reduced_il);
741         lft zd = (xoffs + 1.05 reduced_il, yoffs - 0.45 reduced_il);
742         lft ze = (xoffs + 1.10 reduced_il, yoffs + 0.00 reduced_il);
743         lft zf = (xoffs + 0.80 reduced_il, yoffs + 0.00 reduced_il);
744
745         draw za .. zb .. zc .. zd .. {up}ze -- zf;
746 enddef;
747
748
749 fet_beginchar("petrucci g clef", "petrucci_g", "petruccigclef")
750         if test = 1:
751                 draw_staff(-1,3, 0.0);
752         fi;
753         draw_petrucci_g_clef((0,0), 1.0);
754 fet_endchar;
755 fet_beginchar("petrucci g clef", "petrucci_g_change", "cpetruccigclef")
756         draw_petrucci_g_clef((0,0), .8);
757 fet_endchar;
758
759
760 def draw_mensural_g_clef(expr exact_center, reduction) =
761   % TODO: Rewrite me.  The former mensural g clef looked ugly, and the
762   % code was removed when it broke for small font sizes after some
763   % global changes in the font.  Currently, the character is mapped to
764   % a copy of the petrucci g clef (which, after all, *is* a mensural g
765   % clef, but not the one that we have in mind here). -- jr
766   %
767   % Possible sources of inspiration for this clef include: Francisco
768   % Guerrero, "Lib. 1.  Missarum" (1566), in: MGG, volume 3, col. 858
769   % ("Ducis"); Stefano Fabri, "Quam speciosa veteranis" (1611), in:
770   % MGG, volume 3, col. 1698 ("Fabri"); Philippus Dulichius,
771   % "Fasciculus novus ..."  (1598), in: MGG, volume 3, col. 919
772   % ("Dulichius"), fig. 1; Noe Faignient, "Ic sal de Heer myn God
773   % gebenedye" (1568), in: MGG, volume 3, col. 1735 ("Faignient").
774 enddef;
775
776 %
777 % FIXME: This clef is preliminarily mapped to the petrucci g clef
778 % until the code for the mensural g clef will be rewritten.
779 %
780 fet_beginchar("mensural g clef", "mensural_g", "mensgclef")
781         if test = 1:
782                 draw_staff(-1,3, 0.0);
783         fi;
784         draw_petrucci_g_clef((0,0), 1.0);
785 fet_endchar;
786 fet_beginchar("mensural g clef", "mensural_g_change", "cmensgclef")
787         draw_petrucci_g_clef((0,0), .8);
788 fet_endchar;
789
790
791
792 %%%%%%%%
793 %
794 %
795 %
796 % Hufnagel
797 %
798 %
799 %
800 def draw_hufnagel_do_clef(expr exact_center, reduction) =
801         %
802         % inspired by Graduale of Friedrich Zollner (1442), in: MGG,
803         % volume 9, col. 1413 ("Neustift"), fig. 1.
804         %
805         save reduced_il;
806
807         reduced_il# = staff_space# * reduction;
808
809         define_pixels(reduced_il);
810
811         pickup pencircle
812                 xscaled (0.60reduced_il)
813                 yscaled (0.10reduced_il)
814                 rotated 40;
815         save za, zb, zc, zd, ze, zf;
816         pair za, zb, zc, zd, ze, zf;
817
818         save xoffs, yoffs;
819         xoffs# = xpart exact_center;
820         yoffs# = ypart exact_center;
821         define_pixels(xoffs, yoffs);
822
823         za = (xoffs + 0.90reduced_il, yoffs + .45reduced_il);
824         zb = (xoffs + 0.80reduced_il, yoffs + .45reduced_il);
825         zc = (xoffs + 0.50reduced_il, yoffs + .60reduced_il);
826         zd = (xoffs + 0.20reduced_il, yoffs + .45reduced_il);
827         ze = (xoffs + 0.20reduced_il, yoffs - .45reduced_il);
828         zf = (xoffs + 0.40reduced_il, yoffs - .55reduced_il);
829         draw za .. zb .. zc -- zd -- ze -- zf;
830
831         set_char_box(0 - xpart exact_center,
832                      1.10reduced_il# + xpart exact_center,
833                      0.70reduced_il# - ypart exact_center,
834                      0.75reduced_il# + ypart exact_center);
835 enddef;
836
837
838 fet_beginchar("Hufnagel do clef", "hufnagel_do", "hufnageldoclef")
839         if test = 1:
840                 draw_staff(-1,3, 0.0);
841         fi;
842         draw_hufnagel_do_clef((0,0), 1.0);
843 fet_endchar;
844 fet_beginchar("Hufnagel do clef", "hufnagel_do_change", "chufnageldoclef")
845         draw_hufnagel_do_clef((0,0), .8);
846 fet_endchar;
847
848
849 def draw_hufnagel_fa_clef(expr exact_center, reduction) =
850         %
851         % inspired by Bamberger Manuscript (15th century), in:
852         % MGG, volume 2, table 59.
853         %
854         save reduced_il;
855
856         reduced_il# = staff_space# * reduction;
857
858         define_pixels(reduced_il);
859
860         pickup pencircle
861                 xscaled (0.60reduced_il)
862                 yscaled (0.10reduced_il)
863                 rotated 40;
864         save za, zb, zc, zd, ze, zf;
865         pair za, zb, zc, zd, ze, zf;
866
867         save xoffs, yoffs;
868         xoffs# = xpart exact_center;
869         yoffs# = ypart exact_center;
870         define_pixels(xoffs, yoffs);
871
872         za = (xoffs + 0.90reduced_il, yoffs + 0.70reduced_il);
873         zb = (xoffs + 0.80reduced_il, yoffs + 0.70reduced_il);
874         zc = (xoffs + 0.50reduced_il, yoffs + 0.85reduced_il);
875         zd = (xoffs + 0.20reduced_il, yoffs + 0.70reduced_il);
876         ze = (xoffs + 0.20reduced_il, yoffs - 1.10reduced_il);
877         draw za .. zb .. zc -- zd -- ze;
878
879         save zg, zh, zi, zj;
880         pair zg, zh, zi, zj;
881
882         zg = (xoffs + 0.90reduced_il, yoffs - 0.05reduced_il);
883         zh = (xoffs + 0.80reduced_il, yoffs - 0.05reduced_il);
884         zi = (xoffs + 0.50reduced_il, yoffs + 0.10reduced_il);
885         zj = (xoffs + 0.20reduced_il, yoffs - 0.05reduced_il);
886         draw zg .. zh .. zi -- zj;
887
888         set_char_box(0 - xpart exact_center,
889                      1.20reduced_il# + xpart exact_center,
890                      1.15reduced_il# - ypart exact_center,
891                      1.00reduced_il# + ypart exact_center);
892 enddef;
893
894
895 fet_beginchar("Hufnagel fa clef", "hufnagel_fa", "hufnagelfaclef")
896         if test = 1:
897                 draw_staff(-1,3, 0.0);
898         fi;
899         draw_hufnagel_fa_clef((0,0), 1.0);
900 fet_endchar;
901 fet_beginchar("Hufnagel fa clef", "hufnagel_fa_change", "chufnagelfaclef")
902         draw_hufnagel_fa_clef((0,0), .8);
903 fet_endchar;
904
905
906 def draw_hufnagel_do_fa_clef(expr exact_center, reduction) =
907         draw_hufnagel_do_clef(exact_center, reduction);
908         draw_hufnagel_fa_clef(exact_center + (0, -2staff_space#), reduction);
909         set_char_box(0 - xpart exact_center,
910                      1.20reduced_il# + xpart exact_center,
911                      1.15reduced_il# + 2staff_space# - ypart exact_center,
912                      0.75reduced_il# + ypart exact_center);
913 enddef;
914
915
916 fet_beginchar("Hufnagel do/fa clef", "hufnagel_do_fa", "hufnageldofaclef")
917         if test = 1:
918                 draw_staff(-1,3, 0.0);
919         fi;
920         draw_hufnagel_do_fa_clef((0,0), 1.0);
921 fet_endchar;
922 fet_beginchar("Hufnagel do/fa clef", "hufnagel_do_fa_change",
923               "chufnageldofaclef")
924         draw_hufnagel_do_fa_clef((0,0), .8);
925 fet_endchar;
926
927
928 fet_endgroup ("clefs")