]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-klef.mf
release: 1.3.104
[lilypond.git] / mf / feta-klef.mf
1 % feta-klef.mf --  implement Clefs -*-Fundamental-*-
2
3 % part of LilyPond's pretty-but-neat music font
4 %
5 % source file of the Feta (not the Font-En-Tja) music font
6
7 % (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8 % Jan Nieuwenhuizen <janneke@gnu.org>
9
10
11 fet_begingroup("clefs");
12
13 %
14 % [Ross] says that clefs take 1 staff_space space on the left and right
15 %
16 def set_horizontal_spacing =
17         save left_space ,right_space;
18         left_space# = 0;
19         right_space# = 0;
20 enddef;
21
22
23 % [Wanske] says the bulbs should be positioned about 1/4 right of the
24 % "arrow"
25 def draw_c_clef (expr reduction) = 
26         save hair, norm, reduced_il, right_edge;
27         reduced_il#=staff_space#*reduction;
28         norm#:=2/3reduced_il#;
29         hair#:=1/6norm#;
30
31         set_horizontal_spacing;
32         right_edge# = 15/4norm#+2hair#;
33
34         set_char_box (left_space#, right_edge# + right_space#, 
35                 2 reduced_il#, 2 reduced_il#);
36         define_pixels (hair,norm,reduced_il, right_edge);
37
38         draw_block ((0,-d), (3/4norm+1/2hair,h));
39         draw_block ((3/4norm+2hair,-d), 
40                 (3/4norm+7/2hair,h));
41         
42         save xoff;
43         xoff=3/4norm+7/2hair;
44         penpos1(hair,-90);
45         z1l=(xoff+norm+hair,h);
46         penpos2(norm-3/2hair,180);
47         z2l=(right_edge,h/2);
48         penpos3(hair,90);
49         z3=(((right_edge -xoff)/2)+xoff,2hair);
50
51         penpos4(hair,0);
52         z4=(xoff+1/2norm+1/2hair,reduced_il-hair);
53         
54         penpos5(4hair,0);
55         z5=(xoff+5/4hair,0);
56
57         penpos6(norm-hair,90);
58         z6=(xoff+3/4norm,0);
59
60         penpos7(hair,-90);
61         z7r=(x1,-d);
62
63         save t; t=0.833;
64         save p; path p;
65         p = z5l..z4l{up}..z4r{down}..z3r{right}..tension t..z2r{up}
66                 ..tension t..z1r{left}..z1l{right}..tension t..z2l{down}
67                 ..z3l{left}..z6r..z5r{down};
68         pickup pencircle scaled 1pt#;
69         filldraw p..(reverse p yscaled -1)..cycle;
70         penlabels (1,2,3,4,5,6);
71
72         % ugh, should be bulb, not flare?
73         draw_flare(z1l,180,90,hair,norm-1/2hair);
74         draw_flare(z7r,180,-90,hair,norm-1/2hair);
75         enddef;
76
77 fet_beginchar ("C clef", "C", "altoclef")
78         if test = 1:
79                 draw_staff (-2,2, 0.0);
80         fi;
81         draw_c_clef (1.0);
82 fet_endchar;
83
84 fet_beginchar ("C clef", "C_change", "caltoclef")
85         if test = 1:
86                 draw_staff (-2,2, 0.0);
87         fi;
88         draw_c_clef (.8);
89 fet_endchar;
90
91 %
92 % Inspired by Baerenreiter and Breitkopf
93
94 % FIXME: dims
95 % FIXME: right vertical tangent seems to be lower than the F-line
96 % FIXME: bulb curve smoothly into "long curve" on the  inside
97 %
98 %
99 % [Wanske] says that the extreme x point should be exactly between 
100 % the dots, but her picture shows that the extreme is ~ 0.2 ss lower
101
102 def draw_bass_clef(expr exact_center, reduction) = 
103         save reduced_il, left_tilt, left_thick, ball_to_right;
104         reduced_il# = staff_space# * reduction;
105         
106         set_horizontal_spacing;
107         ball_to_right# = 2.1 reduced_il#;
108         set_char_box(left_space# +
109                 - xpart exact_center,
110                 right_space# +
111                 xpart exact_center + ball_to_right# + 7/12 reduced_il#, 
112                 - ypart exact_center + 2.5 reduced_il#, 
113                 ypart exact_center +reduced_il#);
114
115         define_pixels(reduced_il, ball_to_right);
116         left_tilt = 5;
117         left_thick = .25  reduced_il;
118
119         x1r - x1l = left_thick;
120         z1l = (hround_pixels(xpart exact_center), 
121                 vround_pixels(ypart exact_center));
122
123         y2 = reduced_il;
124
125         x3l - x1l =  ball_to_right;
126         x2 = .5 [x1,x3];
127         x3l - x3r = .48 reduced_il;
128         y3l = -0.05 staff_space;
129         x4 = x1l - stafflinethickness;
130         y4 = -2.2  reduced_il;
131         z5 = (x3l +  1/3 reduced_il, .5 reduced_il);
132
133         penpos1(whatever, left_tilt);
134         penpos2(1.2 stafflinethickness, -90);
135         penpos3(whatever,  185);
136         penpos4(stafflinethickness, 135);
137
138         draw_bulb(1, z1r,  z1l, .45 reduced_il, 1.0);
139
140
141         fill z1r{up} .. z2r{right} .. tension 1.0 .. z3r{down}  .. {curl 0} 
142                 simple_serif(z4r, z4l, 90) {curl 0}
143                 .. z3l{up} .. tension 0.9 .. z2l{left} 
144                 .. z1l{dir (-90 + left_tilt)} -- cycle;
145         labels(2,4);
146         penlabels(1,2,3,4);
147
148         save dot_diam;
149         2 dot_diam = reduction* (staff_space - stafflinethickness);
150         pickup pencircle scaled dot_diam;
151         draw z5;
152         draw z5 yscaled -1;
153 enddef;
154
155
156
157 fet_beginchar("F clef ", "F", "bassclef")
158         if test = 1:
159                 draw_staff(-3,1, 0.0);
160         fi;
161         draw_bass_clef((.5 staff_space#, 0), 1.0);
162 fet_endchar;
163 fet_beginchar("F clef (reduced)", "F_change", "cbassclef")
164         draw_bass_clef((.4 staff_space#, 0),0.8);
165 fet_endchar;
166
167
168
169 %
170 % Inspired by Baerenreiter
171
172 % FIXME bulb should curve (see bass clef)
173 % FIXME start (inside) should be little thinner
174 % FIXME parametrise.
175 %
176
177 % Beste lezers, kijk,
178 %
179 % Een bolletje  hebben we bij toeval allemaal wel eens getekend, maar begint u
180 % toch eenvoudig.   Eerst een eenvoudig kruis of herstellingsteken
181 % en via de dubbelslag naar een voorzichtig vlaggetje, en heb geduld!
182 % Ikzelf heb bijvoorbeeld over mijn eerste gave G-sleutel
183 % 35 kilobyte metafont, 12 patchlevels, 0 vriendinnen en 45 dagen gedaan
184 %
185 %  -- vrij naar Van Kooten & De Bie
186 %
187
188 def draw_gclef (expr exact_center, reduction)=
189         save reduced_il, downstroke_dir, downstroke_angle, hair, center;
190         save breapth_factor, inner_thick_end, thinness, thickness, thinnib;
191         save inner_start_angle, thinness, thinpen;
192         reduced_il# = staff_space# * reduction;
193         define_pixels(reduced_il);
194         pair downstroke_dir, center;
195
196         center := (hround_pixels(xpart exact_center), 
197                 vround_pixels(ypart exact_center));
198
199         hair =  .3 stafflinethickness;
200         thinness = 1.3 stafflinethickness;
201         downstroke_dir = (14, -75);
202         breapth_factor = 11/7;
203         inner_thick_end = 45;
204         inner_start_angle = downstroke_angle - 43;
205         thickness = .4 reduced_il - hair;
206
207         thinnib = thinness - hair;
208         thinpen = thinness;
209         set_horizontal_spacing;
210         
211         set_char_box(
212                 left_space# +
213                 -xpart exact_center + 1.0 * breapth_factor* reduced_il#, 
214                 right_space# +
215                 xpart exact_center + .66 breapth_factor* reduced_il#,
216                 -ypart exact_center + 3 * reduced_il#,
217                 ypart exact_center + 5 * reduced_il#);
218         
219         pickup pencircle scaled hair;
220         downstroke_angle = angle downstroke_dir;
221
222         z1 = center + whatever * dir (inner_start_angle);
223         x1 = xpart center -.28 reduced_il;
224         
225         top z2r = center + (0,reduced_il + stafflinethickness/2);
226         
227         x4 = xpart center - .1 reduced_il;
228         bot y4r = -(reduced_il + .5 stafflinethickness);
229
230         z3 = (z4 - center) rotated inner_thick_end + center;
231         
232         z5r = (- breapth_factor, .37)* reduced_il + center;
233         penpos5(thickness, 135);
234
235         z6 = center + whatever * downstroke_dir;
236         y6 = ypart center + 2 reduced_il;
237
238         z7l - z6 = whatever *(z5- z6) ;
239         y7l = 3.5 reduced_il;
240         z8r = .4 [z9r, z7r] + 1.5 stafflinethickness * dir 52;
241
242         x9 = .7 [x10, x7r];
243         top y9l = 5 reduced_il;
244
245         y10 = 3. reduced_il;
246         y11 = -11/7 reduced_il;
247
248         y12 = ypart center - 18.5/7 reduced_il;
249         x12 = x11 - 5 /7 reduced_il;    
250
251         z13 = z12 + .6 reduced_il*(-1,1);
252
253         (z10r - z10l) dotprod (unitvector downstroke_dir rotated 90) = 
254                 thinnib;
255
256         center - z10= whatever * downstroke_dir;
257         center - z11 =  whatever * downstroke_dir;
258         center - z14 = .8 (center - z11);
259         penpos1(thinnib, inner_start_angle);
260         penpos2(thickness, 90);
261         penpos3(thinnib, -90 + inner_thick_end);
262         penpos4(thinnib, -90);
263
264
265         penpos7(thickness, 135);
266         penpos8(1.5 thinnib, - 70 + angle downstroke_dir);
267         penpos9(1.4 thickness, -80);  % ugh
268         penpos10(whatever, downstroke_angle + 10);
269         penpos11(thinnib, downstroke_angle + 90);
270         penpos14(thinnib, downstroke_angle + 90);
271         penpos12(thinnib, -90);
272         penpos13(3 thinnib, 180);
273
274         filldraw z2l{right}   .. z3l.. z4l{left} .. z5l{up}  .. z7l{up} 
275                 %.. z8l 
276                 .. tension 1.2 
277                 .. z9l & z9l ..
278                 {downstroke_dir}z10l --- z11l -- z11r --- z10r{- downstroke_dir} 
279                 .. tension .8 
280                 .. z9r & z9r{dir (downstroke_angle+ 40)} % ugh
281                 %.. z8r
282                 .. z7r{down} .. z5r{down} .. z4r{right}
283                 .. z3r .. z2r{left} .. 
284                 tension .95 .. 
285                 z1r -- z1l 
286                 .. tension 0.85 ..cycle;
287
288         filldraw simple_serif(z1r, z1l, 90)  -- cycle;
289
290         filldraw z12r{left} .. z13r{up} -- z13l{down} .. z12l{right} .. cycle;
291
292         draw_bulb(-1,  z13l, lft z13r, 6/14 reduced_il, 1.0);
293
294         pickup pencircle scaled (thinpen);
295         draw z10 --- z14 .. z11  .. tension 0.85 ..  z12{left};
296
297         penlabels(range 1 thru 15);
298 enddef;
299
300
301 fet_beginchar("G clef", "G", "trebleclef")
302         if test = 1:
303                 draw_staff(-1,3, 0.0);
304         fi;
305         draw_gclef((1.7 staff_space#,0), 1.0);
306 fet_endchar;
307 fet_beginchar("G clef", "G_change", "ctrebleclef")
308         draw_gclef((1.3 staff_space#,0), .8);
309 fet_endchar;
310
311 %%%%%%%%
312 %
313 %
314 %
315 % Editio Vaticana
316 %
317 %
318 %
319 def draw_vaticana_do_clef(expr exact_center, reduction) = 
320         save reduced_il;
321
322         reduced_il# = staff_space# * reduction;
323         
324         set_char_box(0.4reduced_il#, 0.4reduced_il#, 0, reduced_il#);
325
326         define_pixels(reduced_il);
327
328         pickup pencircle xscaled stafflinethickness yscaled 0.6reduced_il;
329
330         save za, zb, zc, zd, ze, zf;
331         pair za, zb, zc, zd, ze, zf;
332
333         za = exact_center + (-0.0reduced_il, -.45reduced_il);
334         zb = exact_center + (-0.2reduced_il, -.50reduced_il);
335         zc = exact_center + (-0.4reduced_il, -.25reduced_il);
336         zd = exact_center + (-0.4reduced_il, +.25reduced_il);
337         ze = exact_center + (-0.2reduced_il, +.50reduced_il);
338         zf = exact_center + (-0.0reduced_il, +.45reduced_il);
339         draw za .. zb .. zc --  % lower punctum
340              zd .. ze .. zf;    % upper punctum
341 enddef;
342
343
344 fet_beginchar("Ed. Vat. do clef", "vaticana_do", "vatdoclef")
345         if test = 1:
346                 draw_staff(-1,3, 0.0);
347         fi;
348         draw_vaticana_do_clef((0,0), 1.0);
349 fet_endchar;
350 fet_beginchar("Ed. Vat. do clef", "vaticana_do_change", "vatcdoclef")
351         draw_vaticana_do_clef((0,0), 1.0); % no reduction
352 fet_endchar;
353
354
355 def draw_vaticana_fa_clef(expr exact_center, reduction) = 
356
357         save reduced_il, z;
358         reduced_il# = staff_space# * reduction;
359         define_pixels(reduced_il);
360
361         save za, zb, zc, zd, ze;
362         pair za, zb, zc, zd, ze;
363
364         %stem
365         pickup pencircle scaled stafflinethickness;
366         xpart za = xpart zb =
367                 xpart exact_center + 0.4reduced_il;
368         ypart za = ypart exact_center = ypart zb + 1.5reduced_il;
369         draw za .. zb;
370
371         %left-handed punctum
372         pickup pencircle xscaled stafflinethickness yscaled 0.5reduced_il;
373         zc = exact_center +
374                 (+0.4reduced_il, -0.05reduced_il);
375         zd = exact_center +
376                 (+0.2reduced_il, +0.05reduced_il);
377         ze = exact_center +
378                 (+0.0reduced_il, +0.00reduced_il);
379         draw zc .. zd .. ze;
380
381         %right-handed puncta as in do clef
382         draw_vaticana_do_clef(
383                 exact_center +
384                 (+0.8reduced_il + 1.25stafflinethickness, 0),
385                 reduction);
386
387         set_char_box(0.5reduced_il#, 1.5reduced_il#, 0, reduced_il#);
388 enddef;
389
390
391 fet_beginchar("Ed. Vat. fa clef", "vaticana_fa", "vatfaclef")
392         if test = 1:
393                 draw_staff(-1,3, 0.0);
394         fi;
395         draw_vaticana_fa_clef((0,0), 1.0);
396 fet_endchar;
397 fet_beginchar("Ed. Vat. fa clef", "vaticana_fa_change", "vatcfaclef")
398         draw_vaticana_fa_clef((0,0), 1.0); % no reduction
399 fet_endchar;
400
401 %%%%%%%%
402 %
403 %
404 %
405 % Editio Medicaea
406 %
407 %
408 %
409 def draw_medicaea_do_clef(expr exact_center, reduction) = 
410         save reduced_il, reduced_slt;
411         reduced_il# = staff_space# * reduction;
412         reduced_slt# = stafflinethickness# * reduction;
413         define_pixels(reduced_il);
414         define_pixels(reduced_slt);
415
416         save flag_height;
417         flag_height# = 0.5 reduced_il#;
418         define_pixels(flag_height);
419
420         %lower flag
421         save za, zb;
422         pair za, zb;
423         pickup pencircle xscaled reduced_slt yscaled flag_height;
424         xpart exact_center
425                 = xpart za + 0.5 reduced_il
426                 = xpart zb - 0.5 reduced_il;
427         ypart za = ypart exact_center - 0.5 flag_height
428                         - 0.5 (staff_space - reduced_il);
429         ypart zb = ypart za - reduced_il + flag_height;
430         draw za .. zb;
431
432         %upper flag
433         save za, zb;
434         pair za, zb;
435         pickup pencircle xscaled reduced_slt yscaled flag_height;
436         xpart exact_center
437                 = xpart za + 0.5 reduced_il
438                 = xpart zb - 0.5 reduced_il;
439         ypart za = ypart exact_center - 0.5 flag_height
440                         - 0.5 (staff_space - reduced_il)
441                         + staff_space;
442         ypart zb = ypart za - reduced_il + flag_height;
443         draw za .. zb;
444
445         %stem
446         save za, zb;
447         pair za, zb;
448         pickup pencircle scaled reduced_slt;
449         xpart za = xpart zb = xpart exact_center - 0.5 reduced_il;
450         ypart exact_center
451                 = ypart za + 1.5 reduced_il
452                 = ypart zb - 1.5 reduced_il;
453         draw za .. zb;
454
455         set_char_box(0.5reduced_il#, 1.5reduced_il#,
456                      1.5reduced_il#, 1.5reduced_il#);
457 enddef;
458
459
460 fet_beginchar("Ed. Med. do clef", "medicaea_do", "meddoclef")
461         if test = 1:
462                 draw_staff(-1,3, 0.0);
463         fi;
464         draw_medicaea_do_clef((0,0), 1.0);
465 fet_endchar;
466 fet_beginchar("Ed. Med. do clef", "medicaea_do_change", "cmeddoclef")
467         draw_medicaea_do_clef((0,0), .8);
468 fet_endchar;
469
470
471 def draw_medicaea_fa_clef(expr exact_center, reduction) = 
472         % inspired by Regensburger Edition of Medicaea (1885/86), in:
473         % MGG, volume 2, col. 1327 ("Choralreform"), fig. 2.
474
475         save reduced_il, reduced_slt;
476         reduced_il# = staff_space# * reduction;
477         reduced_slt# = stafflinethickness# * reduction;
478         define_pixels(reduced_il);
479         define_pixels(reduced_slt);
480
481         save za, zb, zc, zd, ze;
482         pair za, zb, zc, zd, ze;
483
484         %stem
485         pickup pencircle scaled stafflinethickness;
486         xpart za = xpart zb =
487                 xpart exact_center + 0.4reduced_il;
488         ypart za = ypart exact_center = ypart zb + 1.5reduced_il;
489         draw za -- zb;
490
491         %left-handed punctum
492         pickup pencircle xscaled reduced_slt yscaled reduced_il;
493         zc = exact_center +
494                 (+0.4reduced_il, 0);
495         zd = exact_center +
496                 (+0.0reduced_il, 0);
497         draw zc -- zd;
498
499         %right-handed puncta as in do clef
500         draw_medicaea_do_clef(
501                 exact_center +
502                 (+1.1reduced_il + 1.25stafflinethickness, 0),
503                 reduction);
504
505         set_char_box(reduced_il#/2, 2.6reduced_il#, 0, reduced_il#);
506 enddef;
507
508
509 fet_beginchar("Ed. Med. fa clef", "medicaea_fa", "medfaclef")
510         if test = 1:
511                 draw_staff(-1,3, 0.0);
512         fi;
513         draw_medicaea_fa_clef((0,0), 1.0);
514 fet_endchar;
515 fet_beginchar("Ed. Med. fa clef", "medicaea_fa_change", "cmedfaclef")
516         draw_medicaea_fa_clef((0,0), .8);
517 fet_endchar;
518
519
520 %%%%%%%%
521 %
522 %
523 %
524 % Mensural Notation
525 %
526 %
527 %
528 brevis_wid# := 2 staff_space#;
529
530 def draw_brevis(expr exact_center, reduction, small_width, small_height) =
531         %
532         % inspired by function draw_brevis of
533         % feta-bolletjes.mf
534         %
535         save reduced_slt, reduced_nht;
536         save stem_width, head_width;
537         save serif_size, serif_protrude;
538         save holeheight, beamheight;
539
540         reduced_slt# = stafflinethickness# * reduction;
541         reduced_nht# = noteheight# * reduction;
542         stem_width# = 1.4 reduced_slt#;
543         if small_width:
544                 head_width# = 0.5brevis_wid# * reduction;
545         else:
546                 head_width# = brevis_wid# * reduction;
547         fi;
548         if small_height:
549                 serif_size# = 0.64 reduced_slt#;
550                 serif_protrude# = 0.96 serif_size#;
551                 holeheight# = 3 reduced_slt#;
552                 beamheight# = 0.32(reduced_nht# - holeheight#);
553         else:
554                 serif_size# = 1.0 reduced_slt#;
555                 serif_protrude# = 1.5 serif_size#;
556                 holeheight# = 3 reduced_slt#;
557                 beamheight# = 0.5(reduced_nht# - holeheight#);
558         fi;
559         define_pixels(reduced_slt);
560         define_pixels(stem_width);
561         define_pixels(head_width);
562         define_pixels(serif_size);
563         define_pixels(serif_protrude);
564         define_pixels(beamheight);
565
566         penpos1(stem_width, 0);
567         penpos2(stem_width, 0);
568         penpos3(beamheight, 90);
569         penpos4(beamheight, 90);
570         penpos5(stem_width, 180);
571
572         z1l = exact_center;
573         z2l = z1l + (0, -reduced_slt/2);
574         z3r = z2r + serif_size*(1,-1);
575         y4r = y3r;
576         x4l = x1l + head_width/2;
577         z5l = z3l + (-serif_size, -serif_protrude);
578
579         penlabels(1,2,3,4,5);
580         fill z1r -- z1l -- z5r{down} .. z5l{up} .. z3l{right}
581                 -- z4l -- z4r -- z3r{left} .. z2r{up} -- cycle;
582 enddef;
583
584
585 def draw_mensural_i_c_clef(expr exact_center, reduction) = 
586         draw_brevis(exact_center, reduction, false, false);
587
588         save reduced_il, reduced_slt;
589         save stem_width;
590
591         reduced_il# = staff_space# * reduction;
592         reduced_slt# = stafflinethickness# * reduction;
593         stem_width# = 1.4 reduced_slt#;
594
595         define_pixels(reduced_il);
596         define_pixels(reduced_slt);
597         define_pixels(stem_width);
598
599         penpos6(stem_width, 0);
600         penpos7(stem_width, 0);
601         z6l = exact_center;
602         z7l = z6l + (0, -2reduced_il);
603         fill z6l -- z7l -- z7r -- z6r -- cycle;
604         penpos8(stem_width, 0);
605         penpos9(stem_width, 0);
606         z8l = z6l + (-3reduced_slt, 0);
607         z9l = z8l + (0, -2reduced_il);
608         fill z8l -- z9l -- z9r -- z8r -- cycle;
609
610         addto currentpicture also currentpicture
611                 yscaled -1 shifted (0, 2*(ypart exact_center));
612         addto currentpicture also currentpicture 
613                 xscaled -1 shifted (2x4l,0);
614
615         set_char_box(0, 2head_width#,
616                      6reduced_slt#*reduction, 6reduced_slt#*reduction);
617 enddef;
618
619
620 fet_beginchar("mensural c clef", "mensural1_c", "mens1cclef")
621         if test = 1:
622                 draw_staff(-1,3, 0.0);
623         fi;
624         draw_mensural_i_c_clef((0,0), 1.0);
625 fet_endchar;
626 fet_beginchar("mensural c clef", "mensural1_c_change", "cmens1cclef")
627         draw_mensural_i_c_clef((1.3 staff_space#,0), .8);
628 fet_endchar;
629
630
631 def draw_mensural_ii_c_clef(expr exact_center, reduction) = 
632         draw_brevis(exact_center, reduction, false, true);
633
634         save reduced_il, reduced_slt;
635         save stem_width, interline;
636
637         reduced_il# = staff_space# * reduction;
638         reduced_slt# = stafflinethickness# * reduction;
639         stem_width# = 1.4 reduced_slt#;
640         interline# = staff_space#;
641
642         define_pixels(reduced_il);
643         define_pixels(reduced_slt);
644         define_pixels(stem_width);
645         define_pixels(interline);
646
647         penpos6(stem_width, 0);
648         penpos7(stem_width, 0);
649         z6l = exact_center + (0, -interline/2);
650         z7l = z6l + (0, -1.5reduced_il);
651         fill z6l -- z7l -- z7r -- z6r -- cycle;
652
653         addto currentpicture also currentpicture
654                 yscaled -1 shifted (0, 2*(ypart exact_center) - interline);
655         addto currentpicture also currentpicture
656                 yscaled -1 shifted (0, 4*(ypart exact_center));
657         addto currentpicture also currentpicture 
658                 xscaled -1 shifted (2x4l,0);
659
660         set_char_box(0, 2head_width#,
661                      noteheight#*4*reduction, noteheight#*4*reduction);
662 enddef;
663
664
665 fet_beginchar("mensural c clef", "mensural2_c", "mens2cclef")
666         if test = 1:
667                 draw_staff(-1,3, 0.0);
668         fi;
669         draw_mensural_ii_c_clef((0,0), 1.0);
670 fet_endchar;
671 fet_beginchar("mensural c clef", "mensural2_c_change", "cmens2cclef")
672         draw_mensural_ii_c_clef((1.3 staff_space#,0), .8);
673 fet_endchar;
674
675
676 def draw_mensural_iii_c_clef(expr exact_center, reduction) =
677         % inspired by Ockeghem, "Missa Prolationum", in: MGG, volume
678         % 9, table 94.
679         draw_mensural_ii_c_clef(exact_center, reduction);
680
681         addto currentpicture also currentpicture
682                 shifted (0, -interline);
683
684         set_char_box(0, 2head_width#,
685                      noteheight#*6*reduction, noteheight#*6*reduction);
686 enddef;
687
688
689 fet_beginchar("mensural c clef", "mensural3_c", "mens3cclef")
690         if test = 1:
691                 draw_staff(-1,3, 0.0);
692         fi;
693         draw_mensural_iii_c_clef((0,0), 1.0);
694 fet_endchar;
695 fet_beginchar("mensural c clef", "mensural3_c_change", "cmens3cclef")
696         draw_mensural_iii_c_clef((0,0), .8);
697 fet_endchar;
698
699 def draw_diamond(expr exact_center, reduction) =
700         save stem_width, reduced_il, reduced_nht, holeheight, beamheight;
701         save rh_height, rh_width;
702
703         stem_width# = 1.4 reduced_slt#;
704         reduced_il# = staff_space# * reduction;
705         reduced_nht# = noteheight# * reduction;
706         holeheight# = 3 reduced_slt#;
707         beamheight# = 0.4(reduced_nht# - holeheight#);
708
709         rh_height# = 1.2reduced_il#;
710         rh_width# / rh_height# = 0.58; % tan(30)
711
712         define_pixels(beamheight);
713         define_pixels(stem_width);
714         define_pixels(rh_height);
715         define_pixels(rh_width);
716
717         pickup pencircle
718                 xscaled beamheight
719                 yscaled stem_width
720                 rotated 45;
721
722         draw
723                 exact_center + (-rh_width/2, 0) --
724                 exact_center + (0, rh_height/2) --
725                 exact_center + (+rh_width/2, 0) --
726                 exact_center + (0, -rh_height/2) --
727                 cycle;
728 enddef;
729
730 def draw_mensural_f_clef(expr exact_center, reduction) =
731         %
732         % inspired by Gaspar van Weerbeke, "Virgo Maria" (1502), in:
733         % MGG, volume 9, col. 653 ("Motette"), fig. 3.; also by
734         % Andr'e Campra, "Entr'ee des s'er'enades" (1710), in: MGG,
735         % volume 2, col. 1649 ("Contredanse"), fig. 2.
736         %
737         draw_brevis(exact_center, reduction, true, false);
738
739         save reduced_il, reduced_slt;
740         save stem_width, interline;
741
742         reduced_il# = staff_space# * reduction;
743         reduced_slt# = stafflinethickness# * reduction;
744         stem_width# = 1.4 reduced_slt#;
745         interline# = staff_space#;
746
747         define_pixels(reduced_il);
748         define_pixels(reduced_slt);
749         define_pixels(stem_width);
750         define_pixels(interline);
751
752         addto currentpicture also currentpicture
753                 yscaled -1 shifted (0, 2*(ypart exact_center));
754         addto currentpicture also currentpicture 
755                 xscaled -1 shifted (2x4l,0);
756
757         penpos6(stem_width, 0);
758         penpos7(stem_width, 0);
759         z6r = exact_center + (2x4l, 0);
760         z7r = z6r + (0, -4reduced_il);
761         fill z6l -- z7l -- z7r -- z6r -- cycle;
762
763         draw_diamond(exact_center +
764                      (1.6interline*reduction, interline/2), reduction);
765         %% some editions put a stem on top of the upper note head:
766         % penpos8(stem_width, 0);
767         % penpos9(stem_width, 0);
768         % z8l = exact_center + (1.6interline*reduction, interline*reduction);
769         % z9l = z8l + (0, 1.5interline*reduction);
770         % fill z8l -- z9l -- z9r -- z8r -- cycle;
771
772         draw_diamond(exact_center +
773                      (1.6interline*reduction, -interline/2), reduction);
774         penpos10(stem_width, 0);
775         penpos11(stem_width, 0);
776         z10r = exact_center + (1.6interline*reduction, -interline*reduction);
777         z11r = z10r + (0, -3.5interline*reduction);
778         fill z10l -- z11l -- z11r -- z10r -- cycle;
779
780         set_char_box(0, 3head_width#,
781                      3.5noteheight#*reduction, 1.5noteheight#*reduction);
782 enddef;
783
784
785 fet_beginchar("mensural f clef", "mensural_f", "mensfclef")
786         if test = 1:
787                 draw_staff(-1,3, 0.0);
788         fi;
789         draw_mensural_f_clef((0,0), 1.0);
790 fet_endchar;
791 fet_beginchar("mensural f clef", "mensural_f_change", "cmensfclef")
792         draw_mensural_f_clef((0,0), .8);
793 fet_endchar;
794
795
796 %%%%%%%%
797 %
798 %
799 %
800 % Hufnagel
801 %
802 %
803 %
804 def draw_hufnagel_do_clef(expr exact_center, reduction) =
805         %
806         % inspired by Graduale of Friedrich Zollner (1442), in: MGG,
807         % volume 9, col. 1413 ("Neustift"), fig. 1.
808         %
809         save reduced_il;
810
811         reduced_il# = staff_space# * reduction;
812
813         define_pixels(reduced_il);
814
815         pickup pencircle
816                 xscaled (0.60reduced_il)
817                 yscaled (0.10reduced_il)
818                 rotated 40;
819         save za, zb, zc, zd, ze, zf;
820         pair za, zb, zc, zd, ze, zf;
821
822         za = exact_center + (+0.30reduced_il, +.45reduced_il);
823         zb = exact_center + (+0.20reduced_il, +.45reduced_il);
824         zc = exact_center + (-0.10reduced_il, +.60reduced_il);
825         zd = exact_center + (-0.40reduced_il, +.45reduced_il);
826         ze = exact_center + (-0.40reduced_il, -.45reduced_il);
827         zf = exact_center + (-0.20reduced_il, -.55reduced_il);
828         draw za .. zb .. zc -- zd -- ze -- zf;
829
830         set_char_box(0.5reduced_il#, 0.5reduced_il#, 0, reduced_il#);
831 enddef;
832
833
834 fet_beginchar("Hufnagel do clef", "hufnagel_do", "hufnageldoclef")
835         if test = 1:
836                 draw_staff(-1,3, 0.0);
837         fi;
838         draw_hufnagel_do_clef((0,0), 1.0);
839 fet_endchar;
840 fet_beginchar("Hufnagel do clef", "hufnagel_do_change", "chufnageldoclef")
841         draw_hufnagel_do_clef((1.3 staff_space#,0), .8);
842 fet_endchar;
843
844
845 def draw_hufnagel_fa_clef(expr exact_center, reduction) =
846         %
847         % inspired by Bamberger Manuscript (15th century), in:
848         % MGG, volume 2, table 59.
849         %
850         save reduced_il;
851
852         reduced_il# = staff_space# * reduction;
853
854         define_pixels(reduced_il);
855
856         pickup pencircle
857                 xscaled (0.60reduced_il)
858                 yscaled (0.10reduced_il)
859                 rotated 40;
860         save za, zb, zc, zd, ze, zf;
861         pair za, zb, zc, zd, ze, zf;
862
863         za = exact_center + (+0.30reduced_il, +0.70reduced_il);
864         zb = exact_center + (+0.20reduced_il, +0.70reduced_il);
865         zc = exact_center + (-0.10reduced_il, +0.85reduced_il);
866         zd = exact_center + (-0.40reduced_il, +0.70reduced_il);
867         ze = exact_center + (-0.40reduced_il, -1.10reduced_il);
868         draw za .. zb .. zc -- zd -- ze;
869
870         save zg, zh, zi, zj;
871         pair zg, zh, zi, zj;
872
873         zg = exact_center + (+0.30reduced_il, -0.05reduced_il);
874         zh = exact_center + (+0.20reduced_il, -0.05reduced_il);
875         zi = exact_center + (-0.10reduced_il, +0.10reduced_il);
876         zj = exact_center + (-0.40reduced_il, -0.05reduced_il);
877         draw zg .. zh .. zi -- zj;
878
879         set_char_box(0.5reduced_il#, 0.5reduced_il#, 0, reduced_il#);
880 enddef;
881
882
883 fet_beginchar("Hufnagel fa clef", "hufnagel_fa", "hufnagelfaclef")
884         if test = 1:
885                 draw_staff(-1,3, 0.0);
886         fi;
887         draw_hufnagel_fa_clef((0,0), 1.0);
888 fet_endchar;
889 fet_beginchar("Hufnagel fa clef", "hufnagel_fa_change", "chufnagelfaclef")
890         draw_hufnagel_fa_clef((0,0), .8);
891 fet_endchar;
892
893
894 def draw_hufnagel_do_fa_clef(expr exact_center, reduction) =
895         draw_hufnagel_do_clef(exact_center, reduction);
896         draw_hufnagel_fa_clef(exact_center + (0, -2staff_space), reduction);
897 enddef;
898
899
900 fet_beginchar("Hufnagel do/fa clef", "hufnagel_do_fa", "hufnageldofaclef")
901         if test = 1:
902                 draw_staff(-1,3, 0.0);
903         fi;
904         draw_hufnagel_do_fa_clef((0,0), 1.0);
905 fet_endchar;
906 fet_beginchar("Hufnagel do/fa clef", "hufnagel_do_fa_change",
907               "chufnageldofaclef")
908         draw_hufnagel_do_fa_clef((0,0), .8);
909 fet_endchar;
910
911
912 fet_endgroup("clefs");