]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-bolletjes.mf
* mf/feta-bolletjes.mf (overdone_heads): cleanup triangle
[lilypond.git] / mf / feta-bolletjes.mf
1 %  -*-Fundamental-*-
2 % feta-bolletjes.mf --  implement noteheads
3
4 % source file of LilyPond's pretty-but-neat music font
5
6 % (c) 1997--2004 Jan Nieuwenhuizen <janneke@gnu.org>
7 % & Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 % & Juergen Reuter <reuter@ipd.uka.de>
9
10
11 test_outlines := 0;
12
13
14 % most beautiful noteheads are pronounced, not circular, 
15 % and not even symmetric.
16 % These examples are inspired by [Wanske], see literature list
17
18
19
20 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21 % NOTE HEAD VARIABLES
22 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23 save black_notehead_width, noteheight,
24         slash_thick, slash_slope, overdone_heads;
25 numeric black_notehead_width, noteheight, slash_thick;
26
27
28 fet_begingroup("noteheads");
29
30
31
32 % slope of slash. From scm/grob-description.scm. How to auto-copy?
33 slash_slope := 1.7; 
34
35 % thickness of slash lines. quarter notes get 1.5slt width.
36 slash_thick# := 2/3*0.48staff_space#;
37
38
39 %
40 % Hand-engraved music often has balls extending above and below
41 % the lines.  If you like that, modify overdone heads (unit:
42 % stafflinethickness)
43 %
44 overdone_heads = 0.0;
45 noteheight#:=staff_space#+ (1 + overdone_heads) *stafflinethickness#;
46
47 define_pixels(slash_thick, noteheight);
48
49
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 %
52 % SLANT moves both extremes on the long axis (by SLANT * ELLIPSIDITY,
53 % so SLANT = -1, puts the extreme on the long axis next to the short axis one.)
54 %
55
56 def draw_outside_ellipse (expr ellipsidity, tilt, superness,
57                           slant) =
58         save attachment_y;
59         save p;
60         path p;
61
62         p := superellipse ((ellipsidity, 0), (-slant * ellipsidity, 1.0),
63                         (- ellipsidity, 0), (slant * ellipsidity, -1.0), superness);
64
65         p := p rotated tilt;
66
67         save top_point, right_point;
68         pair top_point, right_point;
69
70         top_point := directionpoint left of p;
71         right_point := directionpoint up of p;
72
73         save scaling, width, height;
74
75         scaling# = noteheight# /(2 ypart (top_point));
76         width# := 2 xpart (right_point) * scaling#;
77
78         define_pixels (width, scaling);
79         
80         set_char_box (0, width#, noteheight#/2, noteheight#/2);
81
82         % attachment Y
83         charwy := ypart (right_point) * scaling#;
84         charwx := width# ;
85
86         p := p scaled scaling shifted (width/2, 0) ;
87         if test_outlines = 1:
88                 pickup pencircle scaled 1 ; draw p;
89         else:
90                 fill p;
91         fi;
92 enddef;
93
94
95 def undraw_inside_ellipse (expr ellipsidity, tilt, superness, clearance,
96                         center) =
97 begingroup
98         save p;
99         path p;
100
101         p := superellipse ((ellipsidity, 0), (0, 1.0),
102                         (- ellipsidity, 0), (0, -1.0), superness);
103
104         p := p rotated tilt;
105
106         save top_point, right_point;
107         pair top_point, right_point;
108
109         top_point := directionpoint left of p;
110         right_point := directionpoint up of p;
111
112         save height, scaling;
113
114         height# = staff_space# + stafflinethickness# - clearance;
115         scaling# = height# /(2 ypart (top_point));
116
117         define_pixels (scaling);
118         p := (p scaled scaling) shifted center;
119
120         if test_outlines = 1:
121                 pickup pencircle scaled 1; draw p;
122         else:
123                 unfill p;
124         fi
125 endgroup;
126 enddef;
127
128
129
130
131
132 %
133 % dimensions aren't entirely right.
134 %
135 fet_beginchar ("Brevis notehead", "s-1", "brevishead");
136         save stemthick, fudge;
137         define_pixels (stemthick);
138         fudge = blot_diameter / 2;
139         stemthick# = 2 stafflinethickness#;
140
141         draw_outside_ellipse (1.80, 0, 0.707, 0);
142         undraw_inside_ellipse (1.30, 125, 0.68, 2 stafflinethickness#,
143                                 (w /2, 0));
144
145         pickup pencircle scaled stemthick;
146
147         bot y1 = -d;
148         top y2 = h;
149         rt x1 - fudge = 0;
150         x1 = x2;
151
152         fudge + lft x3 = w;
153         x4 = x3;
154         y4 = y2;
155         y3 = y1;
156
157         draw_gridline(z1,z2,stemthick);
158         draw_gridline(z3,z4,stemthick);
159
160 fet_endchar;
161
162
163
164 fet_beginchar("Whole notehead", "s0", "wholehead")
165         draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0, 0.707, 0);
166         undraw_inside_ellipse (1.30, 125 - puff_up_factor *10,
167                         0.68, 2 stafflinethickness#,
168                         (w /2, 0));
169
170 %       draw_staff_outline (-2, 2, 0.5);
171
172 fet_endchar;
173
174
175 fet_beginchar("Half notehead", "s1", "halfhead")
176         draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, 0.66, 0.17);
177         undraw_inside_ellipse (3.25, 33, 0.81,
178                 2.5 stafflinethickness#, (w/2, 0));
179
180 fet_endchar;
181         
182 fet_beginchar("Quart notehead", "s2", "quarthead")
183
184         % used to have 32. With 31, they are slightly bolder.
185         draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0);
186         black_notehead_width# := charwd;
187 fet_endchar;
188
189 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
190
191
192 fet_beginchar("Whole diamondhead", "s0diamond", "wholediamondhead")
193         draw_outside_ellipse (1.80, 0, 0.495, 0);
194         undraw_inside_ellipse (1.30, 125, 0.6,
195                         .4 staff_space# +  stafflinethickness#,
196                                 (w /2, 0));
197
198 fet_endchar;
199
200 fet_beginchar("Half diamondhead", "s1diamond", 
201         "halfdiamondhead")
202
203         draw_outside_ellipse (1.50, 34, 0.49, 0.17);
204         undraw_inside_ellipse (3.5, 33, 0.80,
205                 .3 staff_space# + 1.5 stafflinethickness#, (w/2, 0));
206
207 fet_endchar;
208
209 fet_beginchar("Quart diamondhead", "s2diamond", "diamondhead")
210         draw_outside_ellipse (1.80, 35, 0.495, -0.25);
211 fet_endchar;
212
213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
214
215
216
217
218
219 def define_triangle_shape(expr stemdir) =
220         save triangle,kern; path triangle;
221         save width, depth, height;
222         save left_point, height, width, origin;
223         save left_up_dir, exact_right_point, exact_down_point;
224         pair exact_down_point, exact_left_point, origin, left_up_dir, exact_right_point;
225         save pen_thick;
226
227         pen_thick# = stafflinethickness#  + .1 staff_space#;
228         define_pixels(pen_thick, llap);
229
230         left_up_dir = llap# * dir (90 + tilt);
231
232         xpart (left_up_dir) * xs - (pen_thick# * xs)/2 + xpart origin = 0;
233         ypart origin = 0;
234
235         exact_left_point := origin + (left_up_dir xscaled xs);
236         exact_down_point := origin + (left_up_dir rotated 120 xscaled xs);
237         exact_right_point := origin + (left_up_dir rotated 240 xscaled xs);
238
239         height# = ypart (exact_left_point + origin) + pen_thick#/2;
240         depth# = -ypart (exact_down_point + origin) + pen_thick#/2;
241         width# = xpart (exact_right_point - exact_left_point) + pen_thick# * xs;
242
243         set_char_box(0, width#, depth#, height#);
244         
245         z0 = (hround_pixels (xpart origin), 0);
246         z1 = z0 + llap * dir(90+tilt) xscaled xs;  
247         z2 = z0 + (llap * dir(90+tilt + 120) xscaled xs);
248         z3 = z0 + (llap * dir(90+tilt + 240) xscaled xs);
249
250         z12 = caveness[.5[z1,z2],z3];
251         z23 = caveness[.5[z2,z3],z1];
252         z31 = caveness[.5[z3,z1],z2];
253
254         triangle = z1 .. z12 .. z2 ..
255                     z2 .. z23 .. z3 ..
256                     z3 .. z31 .. z1 ..
257                     cycle;
258         pickup pencircle scaled pen_thick xscaled xs;
259         labels(1,2,12,23,31,3);
260
261
262         % attachment Y
263         if stemdir = 1:
264                 charwy := ypart exact_right_point;
265                 charwx := xpart exact_right_point;
266         else:
267                 charwy := ypart exact_down_point;
268                 charwx := xpart exact_down_point;
269         fi
270 enddef;
271
272 fet_beginchar("Whole trianglehead", "0triangle", "wholetrianglehead")
273         save hei,xs;
274         save llap;
275         save tilt;
276
277         tilt = 40;
278         llap# = 3/4noteheight#;
279
280         xs = 1.5;
281         caveness:=0.1;
282         define_triangle_shape(1);
283         draw triangle;
284 fet_endchar;
285
286
287 def draw_closed_triangle_head(expr dir) =
288         save hei,xs;
289         save llap;
290         save tilt;
291
292         tilt = 40;
293         llap# = 2/3noteheight#;
294         xs = 1.2;
295         caveness:=0.1;
296         define_triangle_shape(dir);
297         draw triangle;
298 enddef;
299
300 fet_beginchar("Half trianglehead", "d1triangle", "dhalftrianglehead")
301         draw_closed_triangle_head(-1);
302 fet_endchar;
303
304 fet_beginchar("Half trianglehead", "u1triangle", "uhalftrianglehead")
305         draw_closed_triangle_head(1);
306 fet_endchar;
307
308 def draw_closed_triangle_head(expr dir) = 
309         save hei,xs;
310         save llap;
311         save tilt;
312         tilt = 40;
313         llap# = 2/3noteheight#;
314         xs = 1.0;
315         caveness:=0.1;
316         define_triangle_shape(dir);
317         filldraw triangle;
318 enddef;
319
320 fet_beginchar("Quart trianglehead", "u2triangle", "utrianglehead")
321         draw_closed_triangle_head(1);
322 fet_endchar;
323
324 fet_beginchar("Quart trianglehead", "d2triangle", "dtrianglehead")
325         draw_closed_triangle_head(-1);
326 fet_endchar;
327
328 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
329 %
330 % slash heads are for indicating improvisation. They are  
331 % twice as high as normal heads.
332 %
333 def draw_slash(expr hwid_hash) =
334         save exact_height;
335         save ne_dir;
336         pair ne_dir;
337         exact_height =  staff_space# + stafflinethickness#/2;
338
339         set_char_box (0, 2 exact_height / slash_slope + hwid_hash,
340                         exact_height, exact_height);
341
342         charwx := charwd;
343         charwy := charht;
344
345         clearxy;
346         pickup pencircle scaled blot_diameter;
347
348         bot y1 = - d;
349         top y2 = h;
350         lft x1 = 0;
351         lft x2 = 2 h / slash_slope;
352         
353         rt x3 = w;
354         y3 = y2;
355         y4 = y1;
356         x3- x2 = x4 - x1;
357
358         ne_dir := unitvector( z3  - z4);
359         filldraw z1 --- z2 --- z3 --- z4 --- cycle;
360
361         if hwid_hash > 2 slash_thick#:
362                 save th;
363
364                 th = slash_thick - blot_diameter;
365                 y6 = y7;
366                 y5 = y8;
367                 y3 - y7 = th;
368                 y5 - y1 = th;
369                 z6 - z5 = whatever * ne_dir;
370                 z8 - z7 = whatever * ne_dir;
371
372                 z5  = z1 + whatever * ne_dir + th * (ne_dir rotated -90);
373                 z8  = z4 + whatever * ne_dir + th * (ne_dir rotated 90);
374
375                 unfill
376                         z5 -- z6 -- z7 -- z8 -- cycle;
377         fi
378         labels (range 1 thru 10);
379 enddef;
380
381 fet_beginchar("Whole slashhead","s0slash","wholeslashhead")
382         draw_slash(4 slash_thick# + 0.5 staff_space#);
383 fet_endchar;
384
385 fet_beginchar("Half slashhead","s1slash","halfslashhead")
386         draw_slash(3.0 slash_thick# + 0.15 staff_space#);
387 fet_endchar;
388
389 fet_beginchar("Quart slashhead","s2slash","quartslashhead")
390         draw_slash(1.5 slash_thick#);
391 fet_endchar;
392
393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
394 % thick is the distance between the NE/SW parallel lines in the cross
395 % (distance between centres of lines)
396 % in stafflinethickness def
397 %
398 def draw_cross(expr thick) =
399         save pent, slant, ne_dir;
400         pair ne_dir;
401         save crz; path crz;
402
403         pen_thick# := 1.2 stafflinethickness#;
404         define_pixels (pen_thick);
405         pickup pencircle scaled pen_thick;
406
407         top y3 = h;
408         ne_dir := unitvector ((1, (2 h -pen_thick)/(w - pen_thick)));
409         rt x4 = w/2;
410         y5 = 0;
411         z4 - z5 = whatever * ne_dir;
412         x6 = 0;
413         z6 - z3 = whatever * ne_dir;
414         z3 - z4 = whatever * (ne_dir yscaled -1);
415
416         z4 - z3 = whatever * (ne_dir) + (ne_dir rotated -90) * thick * stafflinethickness;
417
418         x1 = charwd/2 - .5 pen_thick#;
419         z1 = whatever * ne_dir + thick/2 * stafflinethickness# * (ne_dir rotated -90);
420
421         
422         labels (1,2,3,4,5,6);
423
424         crz = (z6 -- z3 -- z4 -- z5) ;
425
426         draw crz shifted(w/2,0);
427         draw crz xscaled -1 shifted(w/2,0);
428         draw crz yscaled -1 shifted(w/2,0);
429         draw crz scaled -1 shifted(w/2,0);
430
431         charwx := charwd;
432         charwy := y1;
433                 message (decimal charwx);
434                 message (decimal charwy);
435         z12 = (charwx * hppp, y1 * vppp);
436         labels (12);
437 enddef;
438
439 fet_beginchar("Whole Crossed notehead", "s0cross", "wholecrossedhead")
440         wid# := black_notehead_width#+4stafflinethickness#;
441         hei# := noteheight#+stafflinethickness#;
442         set_char_box(0, wid#,hei#/2,hei#/2);
443         
444         draw_cross (3.75);
445 fet_endchar;
446
447 fet_beginchar("Half Crossed notehead", "1scross", "halfcrossedhead")
448         wid# := black_notehead_width#+2 stafflinethickness#;
449         hei# := noteheight#+stafflinethickness#/2;
450         set_char_box(0, wid#,hei#/2,hei#/2);
451         draw_cross(3.0);
452 fet_endchar;
453
454 fet_beginchar("Crossed notehead", "s2cross", "crossedhead")
455         wid# := black_notehead_width#;
456         hei# := noteheight#;
457         set_char_box(0, wid#,hei#/2,hei#/2);
458         draw_cross(1.0);
459 fet_endchar;
460
461 fet_beginchar("X-Circled notehead", "s2xcircle", "xcircledhead")
462         wid# := black_notehead_width#*sqrt(sqrt2);
463         hei# := noteheight#*sqrt(sqrt2);
464         set_char_box(0, wid#,hei#/2,hei#/2);
465         cthick := (1.2+1/4)*stafflinethickness;
466         cxr := w/2-cthick/2;
467         cyr := h-cthick/2;
468         pickup pencircle scaled cthick;
469         draw fullcircle xscaled 2cxr yscaled 2cyr shifted (w/2,0);
470         xpos := cxr/sqrt2;
471         ypos := cyr/sqrt2;
472         draw (-xpos+w/2,-ypos) -- (xpos+w/2,ypos);
473         draw (-xpos+w/2,ypos) -- (xpos+w/2,-ypos);
474
475         charwx := charwd ; 
476         charwy := 0 ;
477
478         z12 = (charwx * hppp , charwy * vppp );
479         labels (12);
480 fet_endchar;
481
482
483
484
485 %%%%%%%%
486 %
487 %
488 % SOLFA SHAPED NOTES
489 %
490 %
491
492
493 def generic_draw_solfa_note_shape =
494   save a,beta,black,white;
495   path black, white;
496
497   pickup pencircle scaled stafflinethickness;
498   2 beta# = noteheight#;
499   a# = a_b*beta#;
500   wid# := 2a#+stafflinethickness#;
501   hei# := noteheight#+stafflinethickness#;
502   set_char_box(0, wid#,0.5 hei#, 0.5 hei#);
503
504   define_pixels(a,beta);
505
506   black = noteshape xscaled a yscaled beta shifted (a+stafflinethickness/2,0);
507   filldraw black;
508
509   if (solid=false):
510     white = noteishape xscaled (a*ai_a) yscaled (beta*bi_b)
511                        shifted ((dx+1)*(a+stafflinethickness/2),dy*(beta+stafflinethickness/2));
512     unfill white;
513   fi;
514 enddef;  
515
516 def draw_solfa_note_shape =
517   save solid; boolean solid;
518   solid=false;
519   generic_draw_solfa_note_shape;
520 enddef;
521 def draw_solfa_quarter_note_shape =
522   save solid; boolean solid;
523   solid=true;
524   generic_draw_solfa_note_shape;
525 enddef;
526
527 % do - equilateral triangle: (0,-h/2) -- (w/2,h/2) -- (w,-h/2) -- cycle;
528 % stem attachment: -h/2
529
530 save triangle; path triangle;
531 triangle := (-1,-1) -- (0,1) -- (1,-1) -- cycle;
532
533 def drawdoshape =
534   save noteshape, noteishape, dx, dy, ai_a, bi_b;
535   path noteshape, noteishape;
536   noteshape = noteishape = triangle;
537   (dx,dy)=(0,0.05);
538   (ai_a,bi_b)=(i_o,i_o);
539   draw_solfa_note_shape;
540 enddef;
541
542 fet_beginchar("Whole dohead", "s0do", "wholedohead")
543   pickup pencircle scaled blot_diameter;
544   save a_b, i_o;
545   a_b = 1.8;
546   i_o = 0.6;
547
548   drawdoshape;
549 fet_endchar;
550   
551 fet_beginchar("Half dohead", "s1do", "halfdohead")
552   save a_b, i_o;
553   a_b = 1.5;
554   i_o = 0.6;
555
556   drawdoshape;
557 fet_endchar;
558   
559 fet_beginchar("Quart dohead", "s2do", "dohead")
560   save a_b, noteshape;
561   path noteshape;
562   a_b = 1.54;
563   
564   noteshape = triangle;
565   draw_solfa_quarter_note_shape;
566
567 fet_endchar;
568   
569 % re - flat top, curved bottom:
570 %                (0,h/2) {dir -90} .. (w/2,-h/2) .. {dir 90} (w,h/2) -- cycle;
571 % (broader along the base and with more vertical sides for half and
572 % whole notes)
573 % stem attachment: h/2
574
575 save reshape; path reshape;
576 reshape = (-1,1)--(-1,0.2){down} ... (0,-1) ... {up}(1,0.2)--(1,1)--cycle;
577
578 fet_beginchar("Whole rehead", "s0re", "wholerehead")
579   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
580   path noteshape, noteishape;
581   noteshape = reshape;
582   noteishape = reshape;
583   a_b = 1.8;
584   bi_b = 0.65;
585   ai_a = 0.8;
586   (dx,dy)=(0,-0.1);
587   draw_solfa_note_shape;
588 fet_endchar;
589
590 fet_beginchar("Half rehead", "s1re", "halfrehead")
591   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
592   path noteshape, noteishape;
593   noteshape = reshape;
594   noteishape = reshape;
595   a_b = 1.5;
596   bi_b = 0.65;
597   ai_a = 0.8;
598   (dx,dy)=(0,-0.1);
599   draw_solfa_note_shape;
600 fet_endchar;
601
602 fet_beginchar("Quart rehead", "s2ro", "rehead")
603   save a_b, noteshape;
604   path noteshape;
605   a_b = 1.54;
606   
607   noteshape = reshape;
608   draw_solfa_quarter_note_shape;
609 fet_endchar;
610   
611 % me - diamond: (0,0) -- (w/2,h/2) -- (w,0) -- (w/2,-h/2) -- cycle;
612 % similar to existing diamond shaped head, but not quite the same
613 % stem attachment: 0
614
615 save mishape; path mishape;
616 mishape = (-1,0)--(0,1)--(1,0)--(0,-1)--cycle;
617
618 fet_beginchar("Whole mihead", "s0mi", "wholemihead")
619   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
620   path noteshape, noteishape;
621   noteshape = mishape;
622   noteishape = (mishape slanted -0.35) rotated -10.5;
623   a_b = 1.8;
624   bi_b = 0.65;
625   ai_a = 0.7;
626   (dx,dy)=(0,0);
627   draw_solfa_note_shape;
628 fet_endchar;
629
630 fet_beginchar("Half mihead", "s1mi", "halfmihead")
631   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
632   path noteshape, noteishape;
633   noteshape = mishape;
634   noteishape =  (mishape slanted -0.35) rotated -10.5;
635   a_b = 1.5;
636   bi_b = 0.65;
637   ai_a = 0.7;
638   (dx,dy)=(0,0);
639   draw_solfa_note_shape;
640 fet_endchar;
641
642 fet_beginchar("Quart mihead", "s2mi", "mihead")
643   save a_b, noteshape;
644   path noteshape;
645   a_b = 1.54;
646   
647   noteshape = mishape;
648   draw_solfa_quarter_note_shape;
649 fet_endchar;
650
651
652 % fa - scalene triangle:
653 %         for stem up: (0,h/2) -- (w,h/2) -- (w,-h/2) -- cycle;
654 %       for stem down: (w,-h/2) -- (0,1h/2) -- (0,h/2) -- cycle;
655 %       (one is a 180 degree rotation of the other)
656 % stem attachment: (doesn't much matter)
657
658 save fashape; path fashape;
659 fashape = (-1,1)--(1,1)--(1,-1)--cycle;
660
661 fet_beginchar("Whole fahead", "s0fa", "wholefahead")
662   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
663   path noteshape, noteishape;
664   noteshape = fashape;
665   noteishape = fashape;
666   a_b = 1.8;
667   bi_b = 0.6;
668   ai_a = 0.6;
669   (dx,dy)=(0.2,.05);
670   draw_solfa_note_shape;
671 fet_endchar;
672
673 fet_beginchar("Half stemup fahead", "u1fa", "halffauhead")
674   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
675   path noteshape, noteishape;
676   noteshape = fashape;
677   noteishape =  fashape;
678   a_b = 1.5;
679   bi_b = 0.6;
680   ai_a = 0.6;
681   (dx,dy)=(0.2,.05);
682   draw_solfa_note_shape;
683 fet_endchar;
684
685 fet_beginchar("Quart stemup fahead", "u2fa", "fauhead")
686   save a_b, noteshape;
687   path noteshape;
688   a_b = 1.54;
689   
690   noteshape = fashape;
691   draw_solfa_quarter_note_shape;
692 fet_endchar;
693
694 fet_beginchar("Half stemdn fahead", "d1fa", "halffadhead")
695   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
696   path noteshape, noteishape;
697   noteshape = fashape rotated 180;
698   noteishape =  fashape rotated 180;
699   a_b = 1.5;
700   bi_b = 0.6;
701   ai_a = 0.6;
702   (dx,dy)=(-0.2,-.05);
703   draw_solfa_note_shape;
704 fet_endchar;
705
706 fet_beginchar("Quart stemdn fahead", "d2fa", "fadhead")
707   save a_b, noteshape;
708   path noteshape;
709   a_b = 1.54;
710   
711   noteshape = fashape rotated 180;
712   draw_solfa_quarter_note_shape;
713 fet_endchar;
714
715
716 % sol - oval ... the standard "round" note
717
718 % la - rectangle: (0,h/2)--(w,h.2)--(w,-h/2)--(0,-h/2)--cycle;
719 % stem attachment: (doesn't much matter)
720 save lashape; path lashape;
721 lashape = (-1,-1)--(-1,1)--(1,1)--(1,-1)--cycle;
722
723 fet_beginchar("Whole lahead", "s0la", "wholelahead")
724   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
725   path noteshape, noteishape;
726   noteshape = lashape;
727   noteishape = lashape;
728   a_b = 1.8;
729   bi_b = 0.6;
730   ai_a = 0.85;
731   (dx,dy)=(0,0);
732   draw_solfa_note_shape;
733 fet_endchar;
734
735 fet_beginchar("Half lahead", "s1la", "halflahead")
736   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
737   path noteshape, noteishape;
738   noteshape = lashape;
739   noteishape =  lashape;
740   a_b = 1.5;
741   bi_b = 0.6;
742   ai_a = 0.85;
743   (dx,dy)=(0,0);
744   draw_solfa_note_shape;
745 fet_endchar;
746
747 fet_beginchar("Quart lahead", "s2la", "lahead")
748   save a_b, noteshape;
749   path noteshape;
750   a_b = 1.54;
751   
752   noteshape = lashape;
753   draw_solfa_quarter_note_shape;
754 fet_endchar;
755
756
757 % ti - an "icecream cone" with about 2/3 of
758 % the height in the cone and only 1/3 in the curved top:
759 %      (0,h/6)--(w/2,-h/2)--(w,h/6)..(w/2,h/2)..cycle;
760 % stem attachment: h/6
761 save tishape; path tishape;
762 tishape = (0,-1)--(-1,0.3)..(0,1)..(1,0.3)--cycle;
763
764 fet_beginchar("Whole tihead", "s0ti", "wholetihead")
765   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
766   path noteshape, noteishape;
767   noteshape = tishape;
768   noteishape = tishape;
769   a_b = 1.8;
770   bi_b = 0.75;
771   ai_a = 0.75;
772   (dx,dy)=(0,-.02);
773   draw_solfa_note_shape;
774 fet_endchar;
775
776 fet_beginchar("Half tihead", "s1ti", "halftihead")
777   save a_b, ai_a, bi_b, dx, dy, noteshape, noteishape;
778   path noteshape, noteishape;
779   noteshape = tishape;
780   noteishape =  tishape;
781   a_b = 1.5;
782   bi_b = 0.75;
783   ai_a = 0.75;
784   (dx,dy)=(0,-.02);
785   draw_solfa_note_shape;
786 fet_endchar;
787
788 fet_beginchar("Quart tihead", "2ti", "tihead")
789   save a_b, noteshape;
790   path noteshape;
791   a_b = 1.54;
792   
793   noteshape = tishape;
794   draw_solfa_quarter_note_shape;
795 fet_endchar;
796
797
798
799 fet_endgroup("noteheads");
800
801
802 %
803 % we derive black_notehead_width# from the quarter head,
804 % so we have to define black_notehead_width (pixel qty)  
805 % after the black_notehead_width# itself. Let's keep it outside the group as well.
806
807 define_pixels(black_notehead_width);
808
809
810
811