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