]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-klef.mf
release: 1.5.33
[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--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8 % Jan Nieuwenhuizen <janneke@gnu.org>,
9 % Juergen Reuter <reuter@ipd.uka.de>
10
11
12 fet_begingroup("clefs");
13
14 %
15 % [Ross] says that clefs take 1 staff_space space on the left and right
16 %
17 def set_horizontal_spacing =
18         save left_space ,right_space;
19         left_space# = 0;
20         right_space# = 0;
21 enddef;
22
23
24 % [Wanske] says the bulbs should be positioned about 1/4 right of the
25 % "arrow"
26 def draw_c_clef (expr reduction) = 
27         save hair, norm, reduced_il, right_edge;
28         reduced_il#=staff_space#*reduction;
29         norm#:=2/3reduced_il#;
30         hair#:=1/6norm#;
31
32         set_horizontal_spacing;
33         right_edge# = 15/4norm#+2hair#;
34
35         set_char_box (left_space#, right_edge# + right_space#, 
36                 2 reduced_il#, 2 reduced_il#);
37         define_pixels (hair,norm,reduced_il, right_edge);
38
39         draw_block ((0,-d), (3/4norm+1/2hair,h));
40         draw_block ((3/4norm+2hair,-d), 
41                 (3/4norm+7/2hair,h));
42         
43         save xoff;
44         xoff=3/4norm+7/2hair;
45         penpos1(hair,-90);
46         z1l=(xoff+norm+hair,h);
47         penpos2(norm-3/2hair,180);
48         z2l=(right_edge,h/2);
49         penpos3(hair,90);
50         z3=(((right_edge -xoff)/2)+xoff,2hair);
51
52         penpos4(hair,0);
53         z4=(xoff+1/2norm+1/2hair,reduced_il-hair);
54         
55         penpos5(4hair,0);
56         z5=(xoff+5/4hair,0);
57
58         penpos6(norm-hair,90);
59         z6=(xoff+3/4norm,0);
60
61
62         save t; t=0.833;
63         save p; path p;
64         p = z5l..z4l{up}..z4r{down}..z3r{right}..tension t..z2r{up}
65                 ..tension t..
66                 flare_path(z1l,180,90,hair,norm-1/2hair, -1)
67 %z1r{left}..z1l{right}
68                 ..tension t..z2l{down}
69                 ..z3l{left}..z6r..z5r{down};
70         pickup pencircle scaled 1pt#;
71         filldraw p..(reverse p yscaled -1)..cycle;
72         penlabels (1,2,3,4,5,6);
73
74         % ugh, should be bulb, not flare?
75
76         enddef;
77
78 fet_beginchar ("C clef", "C", "altoclef")
79         if test = 1:
80                 draw_staff (-2,2, 0.0);
81         fi;
82         draw_c_clef (1.0);
83 fet_endchar;
84
85 fet_beginchar ("C clef", "C_change", "caltoclef")
86         if test = 1:
87                 draw_staff (-2,2, 0.0);
88         fi;
89         draw_c_clef (.8);
90 fet_endchar;
91
92 %
93 % Inspired by Baerenreiter and Breitkopf
94
95 % FIXME: dims
96 % FIXME: right vertical tangent seems to be lower than the F-line
97 % FIXME: bulb curve smoothly into "long curve" on the  inside
98 %
99 %
100 % [Wanske] says that the extreme x point should be exactly between 
101 % the dots, but her picture shows that the extreme is ~ 0.2 ss lower
102
103 def draw_bass_clef(expr exact_center, reduction) = 
104         save reduced_il, left_tilt, left_thick, ball_to_right;
105         reduced_il# = staff_space# * reduction;
106         
107         set_horizontal_spacing;
108         ball_to_right# = 2.1 reduced_il#;
109         set_char_box(left_space# +
110                 - xpart exact_center,
111                 right_space# +
112                 xpart exact_center + ball_to_right# + 7/12 reduced_il#, 
113                 - ypart exact_center + 2.5 reduced_il#, 
114                 ypart exact_center +reduced_il#);
115
116         define_pixels(reduced_il, ball_to_right);
117         left_tilt = 5;
118         left_thick = .25  reduced_il;
119
120         x1r - x1l = left_thick;
121         z1l = (hround_pixels(xpart exact_center), 
122                 vround_pixels(ypart exact_center));
123
124         y2 = reduced_il;
125
126         x3l - x1l =  ball_to_right;
127         x2 = .5 [x1,x3];
128         x3l - x3r = .48 reduced_il;
129         y3l = -0.05 staff_space;
130         x4 = x1l - stafflinethickness;
131         y4 = -2.2  reduced_il;
132         z5 = (x3l +  1/3 reduced_il, .5 reduced_il);
133
134         penpos1(whatever, left_tilt);
135         penpos2(1.2 stafflinethickness, -90);
136         penpos3(whatever,  185);
137         penpos4(stafflinethickness, 135);
138
139         draw_bulb(1, z1r,  z1l, .45 reduced_il, 1.0);
140
141
142         fill z1r{up} .. z2r{right} .. tension 1.0 .. z3r{down}  .. {curl 0} 
143                 simple_serif(z4r, z4l, 90) {curl 0}
144                 .. z3l{up} .. tension 0.9 .. z2l{left} 
145                 .. z1l{dir (-90 + left_tilt)} -- cycle;
146         labels(2,4);
147         penlabels(1,2,3,4);
148
149         save dot_diam;
150         2 dot_diam = round reduction* (staff_space - stafflinethickness);
151         pickup pencircle scaled dot_diam;
152         drawdot z5;
153         drawdot z5 yscaled -1;
154 enddef;
155
156
157
158
159 fet_beginchar("F clef ", "F", "bassclef")
160         if test = 1:
161                 draw_staff(-3,1, 0.0);
162         fi;
163         draw_bass_clef((.5 staff_space#, 0), 1.0);
164 fet_endchar;
165
166 fet_beginchar("F clef (reduced)", "F_change", "cbassclef")
167         draw_bass_clef((.4 staff_space#, 0),0.8);
168 fet_endchar;
169
170
171
172 %
173 % Inspired by Baerenreiter
174
175 % FIXME bulb should curve (see bass clef)
176 % FIXME start (inside) should be little thinner
177 % FIXME parametrise.
178 %
179
180 % Beste lezers, kijk,
181 %
182 % Een bolletje  hebben we bij toeval allemaal wel eens getekend, maar begint u
183 % toch eenvoudig.   Eerst een eenvoudig kruis of herstellingsteken
184 % en via de dubbelslag naar een voorzichtig vlaggetje, en heb geduld!
185 % Ikzelf heb bijvoorbeeld over mijn eerste gave G-sleutel
186 % 35 kilobyte metafont, 12 patchlevels, 0 vriendinnen en 45 dagen gedaan
187 %
188 %  -- vrij naar Van Kooten & De Bie
189 %
190
191 def draw_gclef (expr exact_center, reduction)=
192         save reduced_il, downstroke_dir, downstroke_angle, hair, center;
193         save breapth_factor, inner_thick_end, thinness, thickness, thinnib;
194         save inner_start_angle, thinness, thinpen;
195         reduced_il# = staff_space# * reduction;
196         define_pixels(reduced_il);
197         pair downstroke_dir, center;
198
199         center := (hround_pixels(xpart exact_center), 
200                 vround_pixels(ypart exact_center));
201
202         hair =  .3 stafflinethickness;
203         thinness = 1.3 stafflinethickness;
204         downstroke_dir = (14, -75);
205         breapth_factor = 11/7;
206         inner_thick_end = 45;
207         inner_start_angle = downstroke_angle - 43;
208         thickness = .4 reduced_il - hair;
209
210         thinnib = thinness - hair;
211         thinpen = thinness;
212         set_horizontal_spacing;
213         
214         set_char_box(
215                 left_space# +
216                 -xpart exact_center + 1.0 * breapth_factor* reduced_il#, 
217                 right_space# +
218                 xpart exact_center + .66 breapth_factor* reduced_il#,
219                 -ypart exact_center + 3 * reduced_il#,
220                 ypart exact_center + 5 * reduced_il#);
221         
222         pickup pencircle scaled hair;
223         downstroke_angle = angle downstroke_dir;
224
225         z1 = center + whatever * dir (inner_start_angle);
226         x1 = xpart center -.28 reduced_il;
227         
228         top z2r = center + (0,reduced_il + stafflinethickness/2);
229         
230         x4 = xpart center - .1 reduced_il;
231         bot y4r = -(reduced_il + .5 stafflinethickness);
232
233         z3 = (z4 - center) rotated inner_thick_end + center;
234         
235         z5r = (- breapth_factor, .37)* reduced_il + center;
236         penpos5(thickness, 135);
237
238         z6 = center + whatever * downstroke_dir;
239         y6 = ypart center + 2 reduced_il;
240
241         z7l - z6 = whatever *(z5- z6) ;
242         y7l = 3.5 reduced_il;
243         z8r = .4 [z9r, z7r] + 1.5 stafflinethickness * dir 52;
244
245         x9 = .7 [x10, x7r];
246         top y9l = 5 reduced_il;
247
248         y10 = 3. reduced_il;
249         y11 = -11/7 reduced_il;
250
251         y12 = ypart center - 18.5/7 reduced_il;
252         x12 = x11 - 5 /7 reduced_il;    
253
254         z13 = z12 + .6 reduced_il*(-1,1);
255
256         (z10r - z10l) dotprod (unitvector downstroke_dir rotated 90) = 
257                 thinnib;
258
259         center - z10= whatever * downstroke_dir;
260         center - z11 =  whatever * downstroke_dir;
261         center - z14 = .8 (center - z11);
262         penpos1(thinnib, inner_start_angle);
263         penpos2(thickness, 90);
264         penpos3(thinnib, -90 + inner_thick_end);
265         penpos4(thinnib, -90);
266
267
268         penpos7(thickness, 135);
269         penpos8(1.5 thinnib, - 70 + angle downstroke_dir);
270         penpos9(1.4 thickness, -80);  % ugh
271         penpos10(whatever, downstroke_angle + 10);
272         penpos11(thinnib, downstroke_angle + 90);
273         penpos14(thinnib, downstroke_angle + 90);
274         penpos12(thinnib, -90);
275         penpos13(3 thinnib, 180);
276
277         filldraw z2l{right}   .. z3l.. z4l{left} .. z5l{up}  .. z7l{up} 
278                 %.. z8l 
279                 .. tension 1.2 
280                 .. z9l & z9l ..
281                 {downstroke_dir}z10l --- z11l -- z11r --- z10r{- downstroke_dir} 
282                 .. tension .8 
283                 .. z9r & z9r{dir (downstroke_angle+ 40)} % ugh
284                 %.. z8r
285                 .. z7r{down} .. z5r{down} .. z4r{right}
286                 .. z3r .. z2r{left} .. 
287                 tension .95 .. 
288                 z1r -- z1l 
289                 .. tension 0.85 ..cycle;
290
291         filldraw simple_serif(z1r, z1l, 90)  -- cycle;
292
293         filldraw z12r{left} .. z13r{up} -- z13l{down} .. z12l{right} .. cycle;
294
295         draw_bulb(-1,  z13l, lft z13r, 6/14 reduced_il, 1.0);
296
297         pickup pencircle scaled (thinpen);
298         draw z10 --- z14 .. z11  .. tension 0.85 ..  z12{left};
299
300         penlabels(range 1 thru 15);
301 enddef;
302
303
304 fet_beginchar("G clef", "G", "trebleclef")
305         if test = 1:
306                 draw_staff(-1,3, 0.0);
307         fi;
308         draw_gclef((1.7 staff_space#,0), 1.0);
309 fet_endchar;
310 fet_beginchar("G clef", "G_change", "ctrebleclef")
311         draw_gclef((1.3 staff_space#,0), .8);
312 fet_endchar;
313
314 %%%%
315 % PERCUSSION
316 %
317 %
318
319
320 def draw_percussion_clef(expr reduction) =
321         save reduced_il;
322         reduced_il# = staff_space# * reduction;
323         define_pixels(reduced_il);
324         set_char_box(-.67reduced_il#,2.0reduced_il#,reduced_il#,reduced_il#);
325         razt := 0.45reduced_il;
326         draw_block((-b,-d),(-b+razt,h));
327         draw_block((w-razt,-d),(w,h));
328 enddef;
329
330 fet_beginchar("percussion clef", "percussion", "percussionclef")
331         draw_percussion_clef(1.0);
332 fet_endchar;
333
334 fet_beginchar("percussion clef (reduced)", "percussion_change", "cpercussionclef")
335         draw_percussion_clef(.8);
336 fet_endchar;
337
338 def draw_tab_T(expr pos, siz, slant) =
339         begingroup;
340         clearxy;
341         pair vx,vy;
342         vx=(xpart siz) * dir 0;
343         vy=(ypart siz) * dir 90;
344
345         penpos1(.75penh, 100);
346         z1=z2+(1/6*vx-.15*vy);
347         penpos2(.9penw, 0);
348         z2l = pos+.75vy;
349         penpos3(penh,-100);
350         z3l = pos+.4vx+vy;
351         penpos4(penh,-90);
352         z4=-.1vy+.5[z3,z5];
353         penpos5(.8penh,-30);
354         x5r=xpart (pos+siz);
355         y5l=ypart (pos+siz);
356
357         penpos10(penw,170);
358         z10=pos+.55vx+.85vy;
359         penpos11(.75[penh,penw],170);
360         z11=z10-.5vy+.025vx;
361         penpos12(penh,100);
362         z12l=(xpart .5[z13,z11],ypart (pos-.025*siz));
363         penpos13(.75penh,60);
364         z13=pos +.2vx+.15vy;
365         
366         % penlabels (1,2,3,4,5,10,11,12,13);
367
368         soft_penstroke (z1e..tension 1.1
369                 ..z2e
370                 ..z3e{right}..tension 1.5
371                 ..z4e
372                 ..z5e
373                 ) slanted slant shifted (slant*-ypart pos,0);
374
375         soft_penstroke (z10e..tension 1.5
376                 ..z11e
377                 ..z12e..tension 1.1
378                 ..z13e{(z13r-z13l) rotated 90}
379                 ) slanted slant shifted (slant*-ypart pos,0);
380         endgroup;
381 enddef;
382            
383 def draw_tab_A(expr pos, siz, slant) =
384         begingroup;
385         clearxy;
386         pair vx,vy;
387         vx=(xpart siz) * dir 0;
388         vy=(ypart siz) * dir 90;
389         
390         penpos1(.75penh,-110);
391         z1r=pos+.07vy;
392         penpos2(penh,-75);
393         z2r=(.5[x1,x3],ypart pos);
394         penpos3(.25[penh,penw],-30);
395         z3=(.45[x2,x4],.15[y2,y4]);
396         penpos4(1[penh,penw],0);
397         z4=pos+.5vx+.975vy;
398
399         penpos5(1[penh,penw],-180);
400         z5=z4;
401         penpos6(.2[penh,penw],-150);
402         z6l=(.8[x5l,x7l],.9[y5l,y7l]);
403         penpos7(penh,-90);
404         z7r=(.5[x6,x8],ypart pos);
405         penpos8(.75penh,-70);
406         z8r=(xpart(pos+siz),y7r+.075ypart(siz));
407
408         penpos10(penh,-105);
409         z10=.2[z3,z4];
410         penpos11(.9penh,-90);
411         z11=.4[z10,z6]-0.05vy;
412         penpos12(.75penh,-75);
413         z12=.3[z11,z6]+0.02vy;
414
415         % penlabels(1,2,3,4,5,6,7,8,10,11,12);
416
417         soft_penstroke (z1e {(z1r-z1l) rotated 90}
418                 ..z2e 
419                 ..z3e
420                 ..z4e
421                 ) slanted slant shifted (slant*-ypart pos,0);
422
423         soft_penstroke (z5e
424                 ..z6e 
425                 ..z7e
426                 ..z8e {(z8r-z8l) rotated 90}
427                 ) slanted slant shifted (slant*-ypart pos,0);
428
429         soft_penstroke (z10e
430                 ..z11e
431                 ..z12e
432                 ) slanted slant shifted (slant*-ypart pos,0);
433
434         endgroup;
435 enddef;
436
437 def draw_tab_B(expr pos, siz, slant) =
438         begingroup;
439         clearxy;
440         pair vx,vy;
441         vx=(xpart siz) * dir 0;
442         vy=(ypart siz) * dir 90;
443
444         penpos1(.75penh, 100);
445         z1=z2+(.15*vx-.1*vy);
446         penpos2(.9penw, 0);
447         z2l = pos+.75vy;
448         penpos3(penh,-100);
449         z3l = pos+.4vx+1.05vy;
450         penpos4(.8[penh,penw],-180);
451         z4=(xpart(pos+.75siz),.5[y3,y5]);
452         penpos5(.8penh,90);
453         z5=(.5[x10,x4],ypart (pos+.55siz));
454
455         penpos6(.8penh,270);
456         z6=z5;
457         penpos7(penw,180);
458         z7l=(xpart(pos+siz),.5[y6,y8]);
459         penpos8(.8penh,45);
460         z8=.5[z12l,z11l]+.15vx-.05vy;
461
462         penpos10(.75[penh,penw],170);
463         z10=pos+.375vx+.95vy;
464         penpos11(.8[penh,penw],150);
465         z11=z10-.5vy+.04vx;
466         penpos12(penh,100);
467         z12l=(xpart .5[z13,z11],ypart pos);
468         penpos13(.75penh,60);
469         z13=pos+.1vx+.15vy;
470         
471         % penlabels (1,2,3,4,5,6,7,8,10,11,12,13);
472
473         soft_penstroke (z1e..tension 1.1
474                 ..z2e
475                 ..z3e
476                 ..z4e
477                 ..z5e{left}
478                 ) slanted slant shifted (slant*-ypart pos,0);
479
480         soft_penstroke (z6e{right}
481                 ..z7e
482                 ..z8e{(z8r-z8l) rotated 90}
483                 ) slanted slant shifted (slant*-ypart pos,0);
484
485         soft_penstroke (z10e.. tension 1.5
486                 ..z11e
487                 ..z12e..tension 1.1
488                 ..z13e{(z13r-z13l) rotated 90}
489                 ) slanted slant shifted (slant*-ypart pos,0);
490         endgroup;
491 enddef;
492
493 def draw_tab_clef(expr reduction) =
494         save reduced_il,vx,vy,letterheight,penw,penh;
495         reduced_il# = staff_space# * reduction;
496         letterheight# = 1.8*reduced_il#;
497         define_pixels(reduced_il,letterheight);
498         set_char_box(-.2*reduced_il#,2.8*reduced_il#,1.6*letterheight#,1.6*letterheight#);
499
500                 %draw_staff (-3,2, 0.5);
501
502         penw = .45reduced_il;
503         penh = .2reduced_il;
504
505         draw_tab_T((-b+.15reduced_il,h-letterheight),
506           (2.1*reduced_il,letterheight),0.2);
507         draw_tab_A((-b-.05reduced_il,-.5letterheight +.15reduced_il),
508           (2.2*reduced_il,letterheight),0.4);
509         draw_tab_B((-b+.025reduced_il,-d),
510           (2.1*reduced_il,letterheight),0.25);
511 enddef;
512
513 fet_beginchar("tab clef", "tab", "tabclef")
514         draw_tab_clef(1.0);
515 fet_endchar;
516
517 fet_beginchar("tab clef (reduced)", "tab_change", "ctabclef")
518         draw_tab_clef(.8);
519 fet_endchar;
520
521 fet_endgroup("clefs");