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