]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-schrift.mf
release: 0.1.56
[lilypond.git] / mf / feta-schrift.mf
1 % -*- Fundamental -*-  (emacs-20 mf mode mucks
2 % feta-schrift.mf --  implement scripts
3
4 % source file of the Feta (defintively not an abbreviation for Font-En-Tja)
5 % music font
6
7 % (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
8 %       Jan Nieuwenhuizen <jan@digicash.com>
9
10
11
12 fet_begingroup("scripts")
13
14
15 def draw_fermata =
16   save alpha, radius, crook_thinness, crook_fatness, dot_diam;
17   
18         % [Wanske] and some  Baerenreiter editions
19         % suggest ca 80 degrees iso half-circle
20   alpha := 10;
21
22   radius# = 1.25 interline#;
23   crook_thinness# = 1.5stafflinethickness#;
24   crook_fatness# = 4 stafflinethickness#;
25
26   radius# + crook_fatness#/2 = h#;
27   radius# + crook_thinness#/2 = w#;
28   set_char_box(w#, w#, crook_thinness#/2, h#);
29   
30   define_pixels(radius, crook_thinness, crook_fatness);
31   dot_diam = 4/3 crook_fatness;
32
33
34   penpos1(crook_thinness, 0);
35   penpos2(crook_fatness, -90);
36   z1 = (-radius,0);
37   z2 = (0, radius);
38
39   fill z1l{dir (-alpha-90)}..{dir (90-alpha)}z1r..
40   {right}z2r -- z2l{left} .. cycle;
41
42   addto currentpicture also 
43   currentpicture xscaled -1;
44
45   pickup pencircle scaled dot_diam;
46   x4 =0;
47   bot y4 = - crook_thinness/2;
48   draw z4;
49 enddef;
50
51 fet_beginchar("fermata up", "ufermata", "ufermata")
52         draw_fermata;   
53         penlabels(1,2,4);
54 fet_endchar;
55
56 fet_beginchar("fermata down", "dfermata", "dfermata")
57         draw_fermata;
58         y_mirror_char;
59 fet_endchar;
60
61
62 %
63 % FIXME: rounded endings
64 %
65 % `\accent' is TeX reserved.
66 fet_beginchar("> accent", "sforzato", "sforzatoaccent")
67         set_char_box(.9 interline#, .9 interline#, .5 interline#, .5 interline#);
68         save thickness, diminish;
69
70         thickness = 3/2 stafflinethickness;
71         pickup pencircle scaled thickness;
72
73         % prevent blobs at crossing lines
74         diminish = .75;
75
76         top y1 = h;
77         lft x1 = -b;
78         rt x2 = w;
79         y2 = .25 thickness* diminish;
80
81         rt z4 = (w,0);
82         x3 =0;
83         z3 = whatever [z1, z4];
84
85         penpos2(thickness*(2 - diminish)/2 , 90);
86         penpos1(thickness, 90);
87         penpos3(thickness, 90);
88
89         draw z1 .. z3;
90         draw (z1 .. z3) yscaled -1;
91         draw z4;
92         penstroke z3e .. z2e;
93         penstroke (z3e .. z2e) yscaled -1;
94
95         penlabels(1,2,3);
96         labels(4);
97 fet_endchar;
98
99 fet_beginchar("staccato dot", "staccato", "staccato")
100         save radius;
101         radius# = 1.5 stafflinethickness#;
102         define_pixels(radius);
103         pickup pencircle scaled 2 radius;
104         draw (0,0);
105         set_char_box(radius#, radius#, radius#, radius#);
106 fet_endchar;
107
108 def draw_staccatissimo =
109         save radius, height;
110         height# = .8 interline#;
111         radius# = 2 stafflinethickness#;
112         define_pixels(radius, height);
113
114         draw_brush((0,0), stafflinethickness, (0, height),2 radius);
115         set_char_box(radius#,radius#, blot_diameter#/2, height# + radius#);
116 enddef;
117
118 fet_beginchar("staccatissimo/martellato up", "ustaccatissimo", 
119                 "ustaccatissimo")
120         draw_staccatissimo;
121 fet_endchar;
122
123 %
124 % FIXEM: scale labels too.
125 %
126 fet_beginchar("staccatissimo/martellato down", "dstaccatissimo", "dstaccatissimo")
127         draw_staccatissimo;
128         y_mirror_char;
129 fet_endchar;
130
131 fet_beginchar("portato/single tenuto", "tenuto", "tenuto")
132         save thick;
133         thick# = 1.2 stafflinethickness#;
134         define_pixels(thick);
135
136         set_char_box(.9 interline#, .9 interline#, thick#/2,thick#/2);
137         pickup pencircle scaled thick;
138         lft x1 = -b;
139         rt x2 = w;
140         y1 = y2 = 0;
141         draw z1 .. z2;
142 fet_endchar;
143
144
145 def draw_marcato = 
146         save fat_factor, thinness;
147         set_char_box(interline#/2, interline#/2, 0, 1.1 interline#);
148
149         fat_factor = .3;
150         thinness =  stafflinethickness;
151
152         pickup pencircle scaled thinness;
153         rt x2 = w;
154         lft x5 = -b;
155         bot y5 = 0;
156         top y3 = h;
157         y1 = y2 = y5;
158
159         x3 =0;
160         z1 - z4 = whatever * (charwd, -charht);
161         z4 = fat_factor [z3, z5];
162
163         filldraw z1 -- z2 -- z3 -- z4 -- cycle;
164         draw z3 .. z5;
165 enddef;
166
167 fet_beginchar("marcato up", "umarcato", "umarcato")
168         draw_marcato;
169         labels(1,2,3,4,5);
170 fet_endchar;
171
172
173 %
174 % The down marcato char (not very much used). 
175 % Contrary to what some MF/TeX `gurus' believe
176 % it is *point*-symmetric with the "up" version
177 fet_beginchar("marcato down", "dmarcato", "dmarcato")
178         draw_marcato;
179         xy_mirror_char;
180 fet_endchar;
181  
182 %
183 % used in french horn music todo
184 %
185 % TODO: too light at 20pt
186 fet_beginchar("open (unstopped)", "open", "ouvert")
187         save thin, height, width, thick;
188         height# = 5/4 width#;
189         height# = interline#;
190         thin = 1.2 stafflinethickness;
191         thick =  1.4 thin;
192         set_char_box(width#/2, width#/2, height#/2, height#/2);
193         
194         penpos1(thick, 0);
195         penpos2(thin, 90);
196         z1r = (w, 0);
197         z2r = (0, h);
198         penlabels(1,2);
199         penstroke z1e{up} .. {left}z2e;
200         addto currentpicture also currentpicture xscaled -1;
201         addto currentpicture also currentpicture yscaled -1;
202 fet_endchar;
203
204
205 fet_beginchar("plus (stopped)", "stopped", "plusstop")
206         save thick, size;
207         thick = 2 stafflinethickness;
208         size# = 1.1 interline#;
209
210         set_char_box(size#/2, size#/2, size#/2, size#/2);
211         pickup pencircle scaled thick;
212
213         rt x1 = w;
214         y1 = 0;
215         z2 = -z1;
216
217         draw z1 .. z2;
218         draw (z1 .. z2) rotated 90;
219 fet_endchar;
220
221 %
222 % FIXME: blotting 
223 %
224 fet_beginchar("Upbow", "upbow", "upbow")
225         save ht, wd, thick;
226
227         thick = 1.4 stafflinethickness;
228         wd# = 1.3 interline#;
229         ht# = 1.6 wd#; 
230
231         
232         set_char_box(wd#/2, wd#/2, 0, ht#);
233         pickup pencircle scaled thick;
234
235         x1 = 0;
236         bot y1 = 0;
237         rt x2 =  w;
238         top y2 = h;
239
240         labels(1,2);
241         draw z2 -- z1 -- (z2 xscaled -1);
242 fet_endchar;
243
244
245 fet_beginchar("Downbow", "downbow", "downbow")
246         save stemthick, beamheight;
247         save wd;
248         define_pixels(wd)
249
250         wd# = 1.5 interline#;
251         stemthick = 1.2 stafflinethickness;
252
253         set_char_box(wd#/2, wd#/2, 0, 4/3 interline#);
254
255         beamheight = 4/10 h;
256
257
258         pickup pencircle scaled blot_diameter;
259         top y2 - bot y1  = beamheight;
260         top y2 = h;
261         rt x1 = w;
262         x1 = x2;
263         y2 = y3;
264         y1 = y4;
265         x3 = 0;
266         x4 = x3;
267         save p;
268         path p;
269         filldraw z1 -- z2 -- z3 -- z4 --cycle;
270
271         pickup pencircle scaled stemthick;
272
273         bot y5 =0;
274         rt x5 = rt x6 = w;
275         y6 = h - beamheight;
276         draw z6 -- z5;
277         labels(1, 2,3,4,5,6);
278         addto currentpicture also currentpicture xscaled -1;
279 fet_endchar;
280
281 %
282 % Inspired by a computer-set version of Auf dem Strom by Baerenreiter. 
283 %
284
285 def draw_turn =
286         save thin, thick, ball_diam, darkness;
287         save wd, ht, thick_nibangle, ball_nib_thick;
288         save turndir;
289         pair turndir;
290
291         wd# = 35/16 interline#;
292         ht# = 18/17 interline#;
293         darkness = 1.20 stafflinethickness;
294
295         set_char_box(wd#/2, wd#/2, ht#/2, ht#/2);       
296
297         thick_nibangle = 60;
298         thick = 3 darkness;
299         thin = darkness;
300         ball_nib_thick = 2.7 darkness;
301         ball_diam = ball_nib_thick + (h - ball_nib_thick) / 10;
302
303         
304         x3l = w;
305         y3 = 0;
306         y4l = h;
307         x4 = x2;
308         x2l = w/2;
309         y2l = -d;
310         z1 = (0,0);
311
312         penpos1(1.1 thick, thick_nibangle);
313         penpos2(thick, thick_nibangle);
314         penpos3(thin, 180);
315         penpos4(ball_nib_thick, -90);
316
317         path swoosh, ploop;
318         swoosh :=  z1l{curl 0} .. z2l .. z3l{up} .. {left}z4l 
319           -- z4r .. z3r{down} .. z2r{left} ;
320         fill swoosh .. (swoosh scaled -1) .. cycle;
321
322         x5r = x4;
323         y5r = y4l - ball_diam /2;
324         z6r = z5r;
325
326         penpos5(1.6 ball_diam/2, 10);
327         penpos6(ball_diam/2, 150);
328
329         ploop := z4l{left} .. z5l .. z6l -- cycle;
330         fill ploop;
331         fill ploop scaled -1;
332
333
334 enddef;
335
336 fet_beginchar("Reverse turn","reverseturn","reverseturn")
337         draw_turn;
338         currentpicture := currentpicture yscaled -1;
339         penlabels(5,6,7);
340         penlabels(2,3,4);
341 fet_endchar;
342
343
344 fet_beginchar("Turn","turn","turn")
345         draw_turn;
346                 
347         penlabels(5,6,7);
348         penlabels(2,3,4);
349 fet_endchar;
350
351
352
353 %
354 % Inspired by a (by now) PD edition of Durand & C'ie edition of 
355 % Saint-Saens' Celloconcerto no. 1 
356 %
357 % FIXME take out hardcoded vars.
358 % FIXME the two loops on the `t' should be smoother (and the left one bigger).
359 % FIXME generic macros for serifs: top of the t and bottom of r
360 %
361
362
363 fet_beginchar("Trill (`tr')","trill","trill")
364         
365         save start_nib_angle,  ascender_extra, ex, hair_thick, fatness,
366           slant_angle, slant, t_fatness, r_fatness, kerning, t_overshoot, 
367           uitschieter, bulb_size;
368         ;
369         pair slant_vec;
370
371         ascender_extra# = 1/2 ex#;
372         ascender# = ascender_extra# + ex#;
373         ex# = 1.5 interline#;
374         kerning# = .75 ex#;
375         start_nib_angle = 20;
376         bulb_size = 0.47;
377         define_pixels(ex, ascender_extra, ascender, kerning);
378
379         t_overshoot = 0.03 ex;
380         fatness = 12/40 ex;
381         t_fatness = 8/10 fatness;
382         r_fatness = .75 fatness;
383         uitschieter = 21/40 ex;
384         hair_thick =  blot_diameter;
385
386         slant = .2;
387
388         local_copy(transform)(currenttransform);
389         currenttransform := currenttransform slanted slant shifted (- interline, 0)  ;
390
391         y1 = ascender;
392         x1l = 0;
393         x1r = t_fatness;
394         penpos1(start_nib_wid, start_nib_angle);
395         
396         z2 = (x1, 7/18 ex);
397         penpos2(start_nib_wid, start_nib_angle);
398
399         z3l = (11/10 t_fatness, - t_overshoot);
400
401         z4l = (13/6 t_fatness, 5/16 ex);
402         penpos4(hair_thick, 180);
403
404         1.9 [z3l, z3r] = z4r;
405         z3 = .5 [z3l, z3r];
406         
407         save t_p, krul_p;
408         path t_p, krul_p, r_p;
409
410
411         t_p := z1l -- z2l{down} .. tension (1 + .5 slant)
412                 .. z3l{right} 
413                 
414                 .. z4l{up} -- z4r{down} 
415                 .. z3r{left} .. z2r{up} .. z1r -- cycle;
416         fill t_p ;
417
418         krul_ang = 32;
419
420         pickup pencircle scaled hair_thick;
421
422         z5 = (t_fatness/2, 2/3 ex);
423         
424         lft x6 = - uitschieter;
425         y6 =  y5 - 1/20 ex;
426
427         z7 = z5 + whatever*dir krul_ang;
428         up_angle = krul_ang;
429         % angle (z7-z5)
430         x7 = 5/10 kerning + x5;
431         
432         penpos7(hair_thick, up_angle + 90);
433
434         
435         x8l = .7 [x9r, x7r];
436         y8l = y7l;
437         penpos8(2 hair_thick, (up_angle +90)/2);
438
439         y9 = 3/4 ex;
440         x9 = x1 + kerning;
441         penpos9(r_fatness, 0);
442
443         x10 = x9;
444         y10 = 0;
445         penpos10(r_fatness, 0);
446
447         krul_p := z4{up} .. tension 1.1  .. z5 
448                 .. tension 1 and .75 .. {down}z6
449                 .. tension .85 and 1.1 .. z5 --- z7;
450         draw krul_p;
451         r_p := z7l{z7-z5} .. z8l{right} .. z9l{down} --- z10l -- z10r
452                 --- z9r{up} 
453                 ..  z8r{left} ..  z7r{z5-z7} -- cycle;
454         fill r_p;
455         set_char_box(interline# , interline#, 0,ascender#);
456
457
458         penpos11(1/4 r_fatness, -20);
459         z11r = z9r;
460         
461         z13 = (x9 + 2 r_fatness, y11 );
462         penpos13(r_fatness, 180);
463         fill z11r{dir 70} .. z13r{down} -- z13l{up} .. z11l{dir 250} -- cycle;
464         penlabels(range 1 thru 15);
465
466
467         draw_bulb(-1, z13r, z13l, bulb_size * r_fatness, 1.5);
468 fet_endchar;
469
470
471 def draw_heel =
472         save radius, thickness, wall;
473
474         radius# := .5 interline#;
475
476         define_pixels(radius);
477         set_char_box(radius#, radius#, radius#, 2/3 interline#);
478
479         thickness := 1.5 stafflinethickness;    
480         pickup pencircle scaled thickness;
481         rt x1 = b;
482         top y1 = h;
483         
484         x2 =x1;
485         y2 = 0;
486
487         x3 = 0;
488         bot y3 = -d;
489
490         draw z1{down} .. z2{down} .. z3{left};
491         addto currentpicture also currentpicture xscaled -1;
492         
493 enddef;
494
495
496 fet_beginchar("left heel", "upedalheel", "upedalheel")
497         draw_heel;
498         labels(1,2,3);
499 fet_endchar;
500
501 fet_beginchar("right heel", "dpedalheel", "dpedalheel")
502         draw_heel;
503         y_mirror_char;
504 fet_endchar;
505
506 def draw_toe =
507         save ht,wd;
508
509         thickness := 1.5 stafflinethickness;
510         ht# := 1.5 interline#;
511         wd# := 1/3 ht#;
512         define_pixels(ht,wd);
513
514
515         set_char_box(wd#, wd#, 0, ht#);
516         
517         pickup pencircle scaled thickness;
518         lft x1 = -b;
519         bot y1 = 0;
520         x2 =0;
521         top y2 = h;
522         z3 = z1 xscaled -1;
523
524
525         draw z1 -- z2 -- z3;
526
527 enddef;
528         
529 fet_beginchar("left toe", "upedaltoe", "upedaltoe")
530         draw_toe;
531         labels(1,2,3);
532 fet_endchar;
533 fet_beginchar("right toe", "dpedaltoe", "dpedaltoe")
534         draw_toe;
535         y_mirror_char;
536 fet_endchar;
537
538 fet_beginchar("Flageolet", "flageolet", "flageolet")
539         save height,width,thickness;
540         height#=4/15 staffsize#;
541         width#=height#;
542         thickness#=blot_diameter#;
543         define_pixels(height,width,thickness);
544         set_char_box(width#/2,width#/2,height#/2,height#/2);
545         
546         pickup pencircle scaled thickness;
547         x1= .5 [x2, x4];
548         x1 = 0;
549         top y1=height/2;
550         rt x4  - lft x2 =width; 
551         y2 = 0;
552         y4=y2;
553         x3=x1;
554         bot y3=-height/2;
555
556         penlabels(1,2,3,4);
557         draw z1..z2..z3..z4..cycle;
558 fet_endchar;
559
560 input feta-slag;
561
562 fet_endgroup("scripts");
563