]> git.donarmstrong.com Git - lilypond.git/blob - mf/parmesan-heads.mf
release: 1.5.33
[lilypond.git] / mf / parmesan-heads.mf
1 % -*-Fundamental-*-
2 % parmesan-heads.mf -- implement ancient note heads
3
4 % source file of LilyPond's pretty-but-neat music font
5
6 % (c) 2001--2002 Juergen Reuter <reuter@ipd.uka.de>
7
8
9 save black_notehead_width;
10 numeric black_notehead_width;
11
12 fet_begingroup ("noteheads")
13
14 noteheight#:=staff_space# + (1 + overdone_heads)*stafflinethickness#;
15 define_pixels(noteheight);
16
17
18 %%%%%%%%
19 %
20 %
21 %
22 % MENSURAL NOTATION
23 %
24 %
25 %
26 brevis_wid# := 2 staff_space#;
27
28 def draw_brevis(expr brevwid) =
29         save beamheight, head_width;
30         save holeheight, stem_width;
31         save serif_size, serif_protrude;
32
33         head_width# = brevwid;
34         holeheight = 3 stafflinethickness;
35         stem_width = 1.4 stafflinethickness;
36
37
38         define_pixels(head_width);
39         set_char_box(0, head_width#, noteheight#/2, noteheight#/2);
40         
41         2 beamheight + holeheight = noteheight;
42         serif_size = (holeheight - stafflinethickness)/2;
43         serif_protrude = 1.5 serif_size;
44         penpos1(stem_width, 0);
45         penpos2(stem_width, 0);
46         penpos3(beamheight, 90);
47         penpos4(beamheight, 90);
48         penpos5(stem_width, 180);
49
50         z1l = (0, 0);
51         z2l = (0, -stafflinethickness/2);
52         z3r = z2r + serif_size *(1,-1);
53         y4r = y3r;
54         x4r = head_width/2;
55         z5l = z3l + (-serif_size, -serif_protrude);
56
57         penlabels(1,2,3,4, 5);
58         fill z1r -- z1l -- z5r{down} .. z5l{up} .. z3l{right}
59                 -- z4l -- z4r -- z3r{left} .. z2r{up} -- cycle;
60
61         addto currentpicture also currentpicture yscaled -1;
62         show z4r; show z4l;
63         addto currentpicture also currentpicture 
64                 shifted (-x4r,0) xscaled -1 shifted (x4l,0);
65
66 enddef;
67
68
69 %
70 % Some sources (eg Musix/OpusTeX think that the appendage should be on
71 % the left, some say right. Right wins democratically.
72 %
73 def draw_longa (expr wid) =
74         draw_brevis(wid);
75         save theta;
76
77         x7r = head_width;
78         y7 = y5;
79 %       z7 = z5;
80         z6 - z7 = (stem_width/2, -staff_space);
81         theta = angle(z6-z7)+ 90;
82         penpos7(stem_width, theta);
83         penpos6(1.2 stem_width, theta);
84         
85         fill z7r .. z6r{z6-z7} .. {z7-z6} z6l -- z7l -- cycle;
86         penlabels(6,7);
87 enddef;
88
89 %
90 % En wij presenteren U: de opvolgster van Emily
91 %
92 % (ze is wel breed)
93
94 fet_beginchar("Maxima notehead", "-3mensural", "mensuralmaximahead");
95         draw_longa (1.3 brevis_wid#)
96 fet_endchar;
97
98 fet_beginchar("Longa notehead", "-2mensural", "mensurallongahead");
99         draw_longa (brevis_wid#)
100 fet_endchar;
101
102 fet_beginchar("Brevis notehead", "-1mensural", "mensuralbrevishead")
103         draw_brevis(brevis_wid#);
104 fet_endchar;
105
106 def draw_neo_mensural_black_head (expr wid) =
107         save head_width;
108         head_width# = wid;
109         set_char_box (0, head_width#, noteheight#/2, noteheight#/2);
110
111
112         y3 = y1 =0;
113         x2 = x4 = (x1 + x3) /2;
114         define_pixels (head_width);
115         pickup pencircle scaled blot_diameter;
116         top y2 = h;
117         bot y4 = -d;
118         lft x1 = 0;
119         rt x3 = w;
120
121         filldraw z1 -- z2 -- z3 -- z4 -- cycle;
122 enddef;
123
124 def draw_neo_mensural_open_head (expr wid)=
125         draw_neo_mensural_black_head (wid);
126         save diamNW, diamSW;
127         diamNW = length (z2 - z1) + blot_diameter;
128         diamSW = length (z4 - z1) + blot_diameter;
129         
130         save hole_widthNW, hole_widthSW;
131         hole_widthNW = 0.34 diamNW ;
132         hole_widthSW + 2.6 stafflinethickness = diamSW;
133
134         (z7 + z5)/2 = (w/2, 0);
135         (z8 + z6)/2 = (w/2, 0);
136         (z6 - z5) = hole_widthNW * unitvector (z2 - z1);
137         (z7 - z6) = hole_widthSW * unitvector (z4 - z1);
138
139         labels (1,2,3,4,5,6,7,8);
140
141         unfill z5 -- z6 -- z7 -- z8 --cycle;
142 enddef;
143
144 fet_beginchar("Neo-mensural open head","0neo_mensural","neomensuralminimhead")
145       draw_neo_mensural_open_head (staff_space#);
146 fet_endchar;
147
148 fet_beginchar("Neo-mensural open head","1neo_mensural","neomensuralsemiminimhead")
149       draw_neo_mensural_open_head (staff_space#);
150 fet_endchar;
151
152 fet_beginchar("Neo-mensural black head","2neo_mensural","neofusahead")
153       draw_neo_mensural_black_head (staff_space#);
154 fet_endchar;
155
156
157 def draw_mensural_head (expr wid, open) =
158       save head_width;
159       head_width# = wid;
160       set_char_box (head_width#/2, head_width#/2,
161                     noteheight#/2, noteheight#/2);
162
163       define_pixels(head_width, noteheight);
164
165       x1 = -x3;
166       y1 = x2 = y3 = x4 = 0;
167       y4 = -y2;
168       y2 = 1.4 noteheight/2;
169       tand(30) = x3 / y2;
170
171       pickup pencircle
172              xscaled 0.15 head_width
173              yscaled 0.30 head_width
174              rotated -30;
175
176       % pencircle width correction
177       save zc, zd; pair zc, zd;
178       zc = (+0.150 head_width * sind(30), +0.150 head_width * cosd(30));
179       zd = (+0.075 head_width * sind(30), -0.075 head_width * cosd(30));
180
181       if open:
182               draw (z1+zc+zd) -- (z2-zc+zd) --
183                    (z3-zc-zd) -- (z4+zc-zd) -- cycle;
184       else:
185               filldraw (z1+zc+zd) -- (z2-zc+zd) --
186                        (z3-zc-zd) -- (z4+zc-zd) -- cycle;
187       fi;
188 enddef;
189
190
191 fet_beginchar("Mensural open head","0mensural","mensuralminimhead")
192         draw_mensural_head (staff_space#, true);
193 fet_endchar;
194
195 fet_beginchar("Mensural open head","1mensural","mensuralsemiminimhead")
196         draw_mensural_head (staff_space#, true);
197 fet_endchar;
198
199 fet_beginchar("Mensural black head","2mensural","fusahead")
200         draw_mensural_head (staff_space#, false);
201 fet_endchar;
202
203
204 %%%%%%%%%%%%
205 %
206 %
207 % ledger (leger) lines
208 %
209 %
210 fet_beginchar("Ledger ending", "ledgerending", "ledgerending")
211 set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#,
212                 ledgerlinethickness#/2,ledgerlinethickness#/2);
213         pickup pencircle scaled 1.3 blot_diameter;
214
215         rt x2 = w;
216         lft x1 = -b;
217         x3 = x2;
218         bot y1 = -d;
219         y2 = y1;
220
221         top y3 = h;
222         y4 = y3;
223         x4 = x1;
224
225         filldraw z1 --- z2 --- z3 --- z4 --- cycle ;
226 fet_endchar;
227
228
229 %%%%%%%%
230 %
231 %
232 %
233 % EDITIO VATICANA (including solesmes extensions)
234 %
235 %
236 %
237
238 % parameterized punctum
239 def punctum_char (expr verbose_name, internal_name, mudela_name,
240                   left_stem, right_stem, linea, cavum,
241                   straight, auctum, direction_up, excentric, up_shift, mag) =
242
243         fet_beginchar(verbose_name, internal_name, mudela_name)
244                 save b_h, a_w;
245                 a_b := 1.54; % b_h*a_b/a_w = wd/ht
246                 b_h := 0.85;
247                 a_w := 1.09;
248
249                 save a, beta, ht, wd;
250                 ht# = noteheight# * mag;
251                 2beta# = ht# * b_h;
252                 a# = beta# * a_b;
253                 wd# = 2a# / a_w;
254                 set_char_box(0.50wd#, 0.10wd#, 0.5ht#, 0);
255                 black_notehead_width# := wd#;
256
257                 % direction
258                 save direction, direction_sign;
259                 pair direction;
260                 if direction_up:
261                         direction = up;
262                         direction_sign# = 1;
263                 else:
264                         direction = down;
265                         direction_sign# = -1;
266                 fi;
267
268                 % convexity and excentricity
269                 save u_convexity, u_excentricity;
270                 if straight:
271                         u_convexity# = -0.01ht#;
272                         u_excentricity# = 0.0ht#; % dummy
273                 elseif auctum:
274                         u_convexity# = -0.03ht#;
275                         u_excentricity# = +0.25ht#;
276                 else:
277                         u_convexity# = -0.05ht#;
278                         u_excentricity# = 0.0ht#; % dummy
279                 fi;
280                 save convexity, excentricity;
281                 convexity# = direction_sign# * u_convexity#;
282                 excentricity# = direction_sign# * u_excentricity#;
283
284                 % y shift offset
285                 save yoffs;
286                 if up_shift:
287                         yoffs# = 0.08ht#;
288                 else:
289                         yoffs# = 0.00ht#;
290                 fi
291
292                 define_pixels(convexity, excentricity, yoffs, ht, wd);
293                 pickup pencircle scaled stafflinethickness;
294
295                 path p;
296                 save height, yoffs_bt;
297                 define_pixels (height, yoffs_bt);
298                 height# = max (0.5ht# - stafflinethickness#, 0);
299                 yoffs_bt# = yoffs# - (height# - stafflinethickness#)/2 -
300                             convexity#;
301                 xpart z1a = xpart z1b;
302                 xpart z2a = xpart z2b;
303                 xpart z3a = xpart z3b;
304                 ypart z1a + height = ypart z1b;
305                 ypart z2a + height = ypart z2b;
306                 ypart z3a + height = ypart z3b;
307
308                 if auctum:
309                         z1a = (0.00wd + stafflinethickness/2, yoffs_bt);
310                         z2a = (0.20wd, yoffs_bt + 1.0*convexity);
311                         z3a = (0.40wd - stafflinethickness/2,
312                                yoffs_bt + 1.0*excentricity);
313                         p = z1a .. {right}z2a .. {direction}z3a --
314                             z3b{-direction} .. z2b{left} .. z1b -- cycle;
315                 elseif excentric:
316                         z1a = (0.00wd + stafflinethickness/2,
317                                yoffs_bt - 1.0*convexity);
318                         z2a = (0.08wd, yoffs_bt + 1.4*convexity);
319                         z3a = (0.40wd - stafflinethickness/2, yoffs_bt);
320                         p = z1a{direction} .. z2a{right} .. z3a --
321                             z3b .. {left}z2b .. {-direction}z1b -- cycle;
322                 else:
323                         z1a = (0.00wd + stafflinethickness/2, yoffs_bt);
324                         z2a = (0.20wd, yoffs_bt + 1.0*convexity);
325                         z3a = (0.40wd - stafflinethickness/2, yoffs_bt);
326                         p = z1a .. z2a .. z3a --
327                             z3b .. z2b .. z1b -- cycle;
328                 fi;
329
330                 if cavum:
331                         draw p;
332                 else:
333                         filldraw p;
334                 fi;
335
336
337                 pickup pencircle scaled stafflinethickness;
338
339                 if left_stem:
340                         z5=(0.00wd + stafflinethickness/2, yoffs);
341                         z6=(0.00wd + stafflinethickness/2, yoffs - 1.5ht);
342                         draw z5 -- z6;
343                 fi;
344
345                 if right_stem:
346                         z5=(0.40wd - stafflinethickness/2, yoffs);
347                         z6=(0.40wd - stafflinethickness/2, yoffs - 1.5ht);
348                         draw z5 -- z6;
349                 fi;
350
351                 if linea:
352                         save linea_width, linea_height;
353                         linea_width# = stafflinethickness#;
354                         linea_height# = 0.85 ht#;
355                         define_pixels (linea_width, linea_height);
356                         draw_block ((-0.10wd - linea_width/2,
357                                      yoffs - linea_height/2),
358                                     (-0.10wd + linea_width/2,
359                                      yoffs + linea_height/2));
360                         draw_block ((+0.50wd - linea_width/2,
361                                      yoffs - linea_height/2),
362                                     (+0.50wd + linea_width/2,
363                                      yoffs + linea_height/2));
364                 fi;
365         fet_endchar;
366 enddef;
367
368 % parameterized punctum inclinatum
369 def inclinatum_char(expr verbose_name, internal_name, mudela_name,
370                     small, stropha, auctum) =
371
372         fet_beginchar(verbose_name, internal_name, mudela_name)
373
374                 save b_h, a_w;
375                 a_b := 1.54; % b_h*a_b/a_w = wd/ht
376                 b_h := 0.85;
377                 a_w := 1.09;
378
379                 save a, beta, ht, wd;
380                 ht# = noteheight#;
381                 2beta# = ht# * b_h;
382                 a# = beta# * a_b;
383                 wd# = 2a# / a_w;
384                 set_char_box(0.3wd#, 0.3wd#, 0.5 ht#, 0.5 ht#);
385                 black_notehead_width# := wd#;
386
387                 save za, alpha, size;
388                 pair za;
389                 alpha = 35;
390                 define_pixels(ht, wd);
391
392                 if small:
393                         size# = 0.23ht#;
394                 else:
395                         size# = 0.45ht#;
396                 fi;
397
398                 define_pixels(size);
399
400                 pickup pencircle
401                         xscaled blot_diameter
402                         yscaled size rotated -alpha;
403                 za = (0, size - blot_diameter/2) / 2 rotated alpha;
404                 draw -za .. za;
405
406                 if stropha:
407                         pickup pencircle
408                                 xscaled (size/3)
409                                 yscaled size rotated alpha;
410                         save za, off_angle; pair za;
411                         off_angle := 15;
412                         za = (0, -size) / 2 rotated -(alpha + off_angle);
413                         undraw za;
414                 fi;
415
416                 if auctum:
417                         pickup pencircle scaled stafflinethickness;
418                         save za, zb;
419                         pair za, zb;
420                         za = ((0, -size) rotated -alpha) +
421                              (0, stafflinethickness/2);
422                         xpart zb = 0;
423                         ypart zb = ypart za;
424                         draw za{(0,-1) rotated alpha} ..
425                              {(0,1) rotated -alpha}zb;
426                 fi;
427         fet_endchar;
428 enddef;
429
430 % punctum
431 punctum_char("Ed. Vat. punctum", "0vaticana_punctum", "vatpunctumhead",
432              false, false, false, false, false,
433              false, false, false, false, 1.0);
434
435 % punctum cavum (for OpusTeX compatibility)
436 punctum_char("Ed. Vat. punctum cavum", "0vaticana_punctum_cavum",
437              "vatpunctumcavumhead",
438              false, false, false, true, false,
439              false, false, false, false, 1.0);
440
441 % linea punctum (for OpusTeX compatibility)
442 punctum_char("Ed. Vat. linea punctum", "0vaticana_linea_punctum",
443              "vatlineapunctumhead",
444              false, false, true, false, false,
445              false, false, false, false, 1.0);
446
447 % linea punctum cavum (for OpusTeX compatibility)
448 punctum_char("Ed. Vat. linea punctum cavum", "0vaticana_linea_punctum_cavum",
449              "vatlineapunctumcavumhead",
450              false, false, true, true, false,
451              false, false, false, false, 1.0);
452
453 % punctum inclinatum
454 inclinatum_char("Ed. Vat. inclinatum", "0vaticana_inclinatum",
455                 "vatinclinatumhead",
456                 false, false, false);
457
458 % virga (i.e. right stemmed punctum)
459 punctum_char("Ed. Vat. virga", "0vaticana_virga", "vatvirgahead",
460              false, true, false, false, false,
461              false, false, false, false, 1.0);
462
463 % left stemmed punctum as used in clivis (flexa) ligature
464 punctum_char("Ed. Vat. reverse virga", "0vaticana_rvirga", "vatrvirgahead",
465              true, false, false, false, false,
466              false, false, false, false, 1.0);
467
468 % pes lower punctum
469 punctum_char("Ed. Vat. pes lower punctum", "0vaticana_lpes", "vatlpeshead",
470              false, false, false, false, true,
471              false, true, false, false, 1.0);
472
473 % pes upper punctum
474 punctum_char("Ed. Vat. pes upper punctum", "0vaticana_upes", "vatupeshead",
475              false, false, false, false, true,
476              false, false, false, false, 1.0);
477
478 % pes upper punctum (shifted variation)
479 %
480 % Note: This note head is used instead of the regular pes upper
481 % punctum to avoid collision with the lower punctum note of the pes when
482 % the upper punctum sits directly on top of the lower punctum.
483 %
484 punctum_char("Ed. Vat. var pes upper punctum", "0vaticana_vupes",
485              "vatvupeshead",
486              false, false, false, false, true,
487              false, false, false, true, 1.0);
488
489 % small punctum as used in epiphonus/cephalicus
490 punctum_char("Ed. Vat. plica", "0vaticana_plica", "vatplicahead",
491              false, false, false, false, true,
492              false, false, false, false, 0.5);
493
494 % excentric punctum as used in epiphonus
495 punctum_char("Ed. Vat. epiphonus", "0vaticana_epiphonus", "vatepiphonushead",
496              false, false, false, false, false,
497              false, true, true, false, 1.0);
498
499 % excentric punctum as used in cephalicus
500 punctum_char("Ed. Vat. cephalicus", "0vaticana_cephalicus",
501              "vatcephalicushead",
502              false, false, false, false, false,
503              false, false, true, false, 1.0);
504
505 % quilisma
506 fet_beginchar("Ed. Vat. quilisma", "0vaticana_quilisma", "vatquilismahead")
507         save b_h,a_w;
508         a_b:=1.54; % b_h*a_b/a_w = wd/ht
509         b_h:=0.85;
510         a_w:=1.09;
511
512         save a, beta, ht, wd;
513         ht# = noteheight#;
514         2beta# = ht#*b_h;
515         a# = beta#*a_b;
516         wd# = 2a# / a_w;
517         set_char_box(0.4wd#, 0.00wd#, 0.5 ht#, 0.5 ht#);
518         black_notehead_width# := wd#;
519
520         define_pixels(ht, wd);
521         pickup pencircle xscaled stafflinethickness yscaled 0.4ht;
522         z1 = (0.00wd, -0.11ht);
523         z2 = (0.00wd, +0.06ht);
524         z3 = (0.10wd, -0.05ht);
525         z4 = (0.16wd, +0.11ht);
526         z5 = (0.24wd, -0.01ht);
527         z6 = (0.30wd, +0.15ht);
528         z7 = (0.40wd, +0.04ht);
529         z8 = (0.40wd, +0.21ht);
530         draw z1 -- z2 -- z3 -- z4 -- z5 -- z6 -- z7 -- z8;
531 fet_endchar;
532
533 % solesmes punctum inclinatum parvum
534 inclinatum_char("Solesmes punctum inclinatum parvum", "0solesmes_incl_parvum",
535                 "solinclparvumhead",
536                 true, false, false);
537
538 % solesmes punctum auctum ascendens
539 punctum_char("Solesmes punctum auctum ascendens", "0solesmes_auct_asc",
540              "solauctaschead",
541              false, false, false, false, false,
542              true, true, false, false, 1.0);
543
544 % solesmes punctum auctum descendens
545 punctum_char("Solesmes punctum auctum descendens", "0solesmes_auct_desc",
546              "solauctdeschead",
547              false, false, false, false, false,
548              true, false, false, false, 1.0);
549
550 % solesmes punctum inclinatum auctum
551 inclinatum_char("Solesmes punctum incl. auctum", "0solesmes_incl_auctum",
552                 "solpunctuminclinatumauctumhead",
553                 false, false, true);
554
555 % solesmes stropha
556 inclinatum_char("Solesmes stropha", "0solesmes_stropha",
557                 "solstrophahead",
558                 false, true, false);
559
560 % solesmes stropha aucta
561 inclinatum_char("Solesmes stropha aucta", "0solesmes_stropha_aucta",
562                 "solstrophaauctahead",
563                 false, true, true);
564
565 % solesmes oriscus
566 fet_beginchar("Solesmes oriscus", "0solesmes_oriscus",
567         "soloriscushead")
568         save b_h, a_w;
569         a_b := 1.54; % b_h*a_b/a_w = wd/ht
570         b_h := 0.85;
571         a_w := 1.09;
572
573         save a, beta, ht, wd;
574         ht# = noteheight# * mag;
575         2beta# = ht# * b_h;
576         a# = beta# * a_b;
577         wd# = 2a# / a_w;
578         set_char_box(0.5wd#, 0.0wd#, 0.5ht#, 0.5ht#);
579         black_notehead_width# := wd#;
580
581         save convexity;
582         convexity# = +0.05ht#;
583
584         define_pixels(ht, wd, convexity);
585         pickup pencircle xscaled blot_diameter yscaled 0.50ht;
586         z1 = (0.00wd, -convexity);
587         z2 = (0.16wd, +convexity);
588         z3 = (0.33wd, -convexity);
589         z4 = (0.50wd, +convexity);
590         draw z1 .. z2 .. z3 .. z4;
591 fet_endchar;
592
593 %%%%%%%%
594 %
595 %
596 %
597 % EDITIO MEDICAEA
598 %
599 %
600 %
601
602 % inclinatum
603 fet_beginchar("Ed. Med. inclinatum", "0medicaea_inclinatum",
604         "medinclinatumhead")
605         save b_h, a_w;
606         a_b := 1.54; % b_h*a_b/a_w = wd/ht
607         b_h := 0.85;
608         a_w := 1.09;
609
610         save a, beta, ht, wd;
611         ht# = noteheight#;
612         2beta# = ht# * b_h;
613         a# = beta# * a_b;
614         wd# = 2a# / a_w;
615         set_char_box(wd#/2, wd#/2, 0.5 ht#, 0.5 ht#);
616         black_notehead_width# := wd#;
617
618         save za, alpha, size;
619         pair za;
620         define_pixels(ht, wd);
621         alpha = 35;
622         size = 0.7ht;
623         pickup pencircle
624                 xscaled blot_diameter
625                 yscaled size rotated -alpha;
626         za = (0, size) / 2 rotated alpha;
627         draw -za .. za;
628
629 fet_endchar;
630
631 % parametrized punctum
632 def punctum_char (expr verbose_name, internal_name, mudela_name,
633         left_up_stem, left_down_stem) =
634
635         fet_beginchar(verbose_name, internal_name, mudela_name)
636
637                 save a, beta, ht, wd;
638                 ht# = 2 staff_space#;
639                 wd# = ht#;
640                 set_char_box(0.0, 0.4wd#, 0.5ht#, 0.5ht#);
641                 black_notehead_width# := wd#;
642
643                 define_pixels(ht, wd);
644                 pickup pencircle
645                         xscaled blot_diameter
646                         yscaled 0.50ht;
647                 z1 = (0.00wd + blot_diameter/2, 0);
648                 z2 = (0.40wd - blot_diameter/2, 0);
649                 draw z1 .. z2;
650
651                 pickup pencircle
652                         xscaled stafflinethickness
653                         yscaled blot_diameter;
654
655                 if left_down_stem:
656                         z4=(0.00wd + stafflinethickness/2, blot_diameter/2);
657                         z5=(0.00wd + stafflinethickness/2, - 1.25ht);
658                         draw z4 .. z5;
659                 elseif left_up_stem:
660                         z4=(0.00wd + stafflinethickness/2, blot_diameter/2);
661                         z5=(0.00wd + stafflinethickness/2, + 1.25ht);
662                         draw z4 .. z5;
663                 fi;
664
665         fet_endchar;
666 enddef;
667
668 % punctum
669 punctum_char("Ed. Med. punctum", "0medicaea_punctum", "medpunctumhead",
670         false, false);
671
672 % left up-stemmed punctum
673 punctum_char("Ed. Med. reverse virga", "0medicaea_rvirga", "medrvirgahead",
674         true, false);
675
676 % virga (i.e. left down-stemmed punctum)
677 punctum_char("Ed. Med. virga", "0medicaea_virga", "medvirgahead",
678         false, true);
679
680 %%%%%%%%
681 %
682 %
683 %
684 % HUFNAGEL
685 %
686 %
687 %
688
689 % punctum
690 % parametrized punctum
691 def punctum_char (expr verbose_name, internal_name, mudela_name,
692         down_stem) =
693
694         fet_beginchar(verbose_name, internal_name, mudela_name)
695                 save b_h, a_w;
696                 a_b := 1.54; % b_h*a_b/a_w = wd/ht
697                 b_h := 0.85;
698                 a_w := 1.09;
699
700                 save a, beta, ht, wd;
701                 ht# = noteheight#;
702                 2beta# = ht# * b_h;
703                 a# = beta# * a_b;
704                 wd# = 2a# / a_w;
705                 set_char_box(wd#/2, wd#/2, 0.5 ht#, 0.5 ht#);
706                 black_notehead_width# := wd#;
707
708                 save za, zb, zc, alpha, size;
709                 pair za, zb, zc;
710                 define_pixels(ht, wd);
711                 alpha = 55;
712                 size = 0.7ht;
713                 pickup pencircle
714                         xscaled blot_diameter
715                         yscaled size rotated -alpha;
716                 za = (0, size) / 2 rotated alpha;
717                 draw -za .. za;
718
719                 if down_stem:
720                         zb = (0.00wd, 0);
721                         zc = (0.00wd, - 1.25ht);
722                         draw zb -- zc;
723                 fi;
724         fet_endchar;
725 enddef;
726
727 % punctum
728 punctum_char("Hufnagel punctum", "0hufnagel_punctum", "hufpunctumhead", false)
729
730 % virga
731 punctum_char("Hufnagel virga", "0hufnagel_virga", "hufvirgahead", true)
732
733 % pes lower punctum
734 fet_beginchar("Hufnagel pes lower punctum", "0hufnagel_lpes", "huflpeshead")
735         save b_h, a_w;
736         a_b := 1.54; % b_h*a_b/a_w = wd/ht
737         b_h := 0.85;
738         a_w := 1.09;
739
740         save a, beta, ht, wd;
741         ht# = noteheight#;
742         2beta# = ht# * b_h;
743         a# = beta# * a_b;
744         wd# = 2a# / a_w;
745         set_char_box(wd#, wd#, 0.7 ht#, 0.7 ht#);
746         black_notehead_width# := wd#;
747
748         save za, alpha, size;
749         pair za;
750         define_pixels(ht, wd);
751         alpha = 35;
752         size = 0.7ht;
753         pickup pencircle
754                 xscaled blot_diameter
755                 yscaled size rotated -alpha;
756         za = (size, 0);
757         draw -za .. za;
758 fet_endchar;
759
760 fet_endgroup ("noteheads")