]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-bolletjes.mf
3aac7752a9f2e12a563bb7de9a445f557c02b4f3
[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, 1998 Jan Nieuwenhuizen <janneke@gnu.org>
7 % & Han-Wen Nienhuys <hanwen@stack.nl>
8
9
10
11 % most beautiful noteheads are pronounced, not circular, 
12 % and not even symmetric.
13 % These examples are inspired by [Wanske], see literature list
14
15
16 save black_notehead_width;
17 numeric black_notehead_width;
18
19 fet_begingroup("noteheads");
20
21 noteheight#:=interline#+ (1 + overdone_heads) *stafflinethickness#;
22 define_pixels(noteheight);
23 brevis_wid# := 2 interline#;
24
25 def draw_brevis(expr brevwid) =
26         save beamheight, head_width;
27         save holeheight, stem_width;
28         save serif_size, serif_protrude;
29
30         head_width# = brevwid;
31         holeheight = 3 stafflinethickness;
32         stem_width = 1.4 stafflinethickness;
33
34
35         define_pixels(head_width);
36         set_char_box(0, head_width#, noteheight#/2, noteheight#/2);
37         
38         2 beamheight + holeheight = noteheight;
39         serif_size = (holeheight - stafflinethickness)/2;
40         serif_protrude = 1.5 serif_size;
41         penpos1(stem_width, 0);
42         penpos2(stem_width, 0);
43         penpos3(beamheight, 90);
44         penpos4(beamheight, 90);
45         penpos5(stem_width, 180);
46
47         z1l = (0, 0);
48         z2l = (0, -stafflinethickness/2);
49         z3r = z2r + serif_size *(1,-1);
50         y4r = y3r;
51         x4r = head_width/2;
52         z5l = z3l + (-serif_size, -serif_protrude);
53
54         penlabels(1,2,3,4, 5);
55         fill z1r -- z1l -- z5r{down} .. z5l{up} .. z3l{right}
56                 -- z4l -- z4r -- z3r{left} .. z2r{up} -- cycle;
57
58         addto currentpicture also currentpicture yscaled -1;
59         show z4r; show z4l;
60         addto currentpicture also currentpicture 
61                 shifted (-x4r,0) xscaled -1 shifted (x4l,0);
62
63 enddef;
64
65 save uitsteek;
66  uitsteek = .25;
67 def draw_ledger(expr wid)=      
68         set_char_box(uitsteek * wid, (1+ uitsteek)*wid, 
69                 ledgerlinethickness#/2,ledgerlinethickness#/2);
70         pickup pencircle scaled ledgerlinethickness;
71         rt x2 = w;
72         lft x1 = -b;
73         y1 = y2 = 0;
74         draw z1 .. z2;
75 enddef;
76
77 fet_beginchar("Ledger ending", "ledgerending", "ledgerending")
78 set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#,
79                 ledgerlinethickness#/2,ledgerlinethickness#/2);
80         pickup pencircle scaled ledgerlinethickness;
81         lft x1 = -b;
82         rt x2 = w;
83         y1 =0; y2 =0;
84         draw z1 .. z2;
85 fet_endchar;
86
87 fet_beginchar("Brevis notehead", "-1", "brevisball")
88         draw_brevis(brevis_wid#);
89 fet_endchar;
90
91 %
92 % Some sources (eg Musix/OpusTeX think that the appendage should be on
93 % the right, my only other ref [Willemze], shows an appendage to the left
94 %
95 fet_beginchar("Longa notehead", "-2", "longaball");
96         draw_brevis(brevis_wid#);
97         save theta;
98         z7 = z5;
99         z6 - z7 = (-stem_width/2, -interline);
100         theta = angle(z6-z7)+ 90;
101         penpos7(stem_width, theta);
102         penpos6(1.2 stem_width, theta);
103         
104         fill z7r .. z6r{z6-z7} .. {z7-z6} z6l -- z7l -- cycle;
105         penlabels(6,7);
106 fet_endchar;
107
108
109 % setup user vars
110 def setup_notehead_vars =
111         save a_b,err_y_a,tilt,superness;
112         save ai_a,ai_bi,err_y_ai,err_x_bi,inner_tilt,inner_superness;
113         save b_h,a_w;
114         enddef;
115
116 % setup addititional vars and calc them
117 def notehead_calc =
118         save a,beta,ai,bi, ht, wd;
119         ht# =noteheight#;
120         2beta#=ht#*b_h;
121         a# = beta#*a_b;
122         wd# = 2a# / a_w;
123         ai# = a# * ai_a;
124         bi# = ai#/ai_bi;
125         define_pixels(a,beta);
126         define_pixels(ai,bi);
127         set_char_box(0, wd#, .5 ht#, .5 ht#);
128         enddef;
129
130
131 % draw the outer and inner ellipse.
132 def notehead_draw =
133         path black,white;
134         black=distorted_ellipse(a,beta,a*err_y_a,0,superness);
135         white=distorted_ellipse(ai,bi,ai*err_y_ai,bi*err_x_bi,inner_superness);
136 if test>1: %fixme
137                 save x;
138                 x1=-x3=a; x2=x4=0; y1=y3=0; y2=-y4=b;
139                 penlabels(1,2,3,4);
140                 test_grid;
141 else:
142                 black:=black rotated tilt;
143                 black:=black shifted (w/2,0);
144                 white:=white rotated inner_tilt;
145                 white:=white shifted (w/2,0);
146 fi
147                 fill black;
148                 unfill white;
149
150                 
151         enddef;
152
153 % whole note
154 % Wanske, p.38
155 fet_beginchar("Whole notehead", "0", "wholeball")
156         setup_notehead_vars;
157         
158         a_b:=1.80;
159         err_y_a:=0; % no slant
160         tilt:=0;
161         superness:=0.707;
162         ai_a:=0.508;
163         % ai_bi:=1.23;
164         ai_bi:=1.30; % jcn
165         % err_y_ai:=0.0938;
166         % err_x_bi:=0;
167         err_y_ai:=0;
168         err_x_bi:=0.115;
169         % inner_tilt:=135;
170         inner_tilt:=125; % jcn
171         % inner_superness:=0.69;
172         inner_superness:=0.68; % jcn
173         b_h:=1; %no rotate-> no height correction
174         a_w:=1; % no rotate-> no width correction
175
176         notehead_calc;
177         whole_notehead_width# := wd#;
178         notehead_draw;
179 fet_endchar;
180
181
182
183 % half note
184 % Wanske, p.39
185 fet_beginchar("Half notehead", "1", 
186         "halfball")
187         setup_notehead_vars;
188                 % a_b:=1.49; % after text
189         a_b:=1.50; % after drawing
190         err_y_a:=0.157;
191         tilt:=34;
192         % superness:=0.66;
193         superness:=0.67; % jcn
194         % ai_a:=0.863;
195         ai_a:=0.850; % jcn
196         % ai_bi:=3.14;
197         ai_bi:=3.30; % jcn
198         err_y_ai:=0;
199         err_x_bi:=-0.12;
200         inner_tilt:=tilt;
201         inner_superness:=0.80;
202         b_h:=0.935;
203         a_w:=1.12;
204
205         notehead_calc;
206         half_notehead_width# := wd#;
207         notehead_draw;
208 fet_endchar;
209
210
211
212 % quarter note
213 % Wanske p.38
214 fet_beginchar("Quart notehead", "2", "quartball")
215         setup_notehead_vars;
216         % a_b:=1.57; % after text
217         a_b:=1.54; % after drawing
218         err_y_a:=0.044;
219         tilt:=32;
220         superness:=0.707;
221         ai_a:=0;
222         ai_bi:=1;
223         err_y_ai:=0;
224         err_x_bi:=0;
225         inner_tilt:=0;
226         inner_superness:=0.707;
227         b_h:=0.85;
228         a_w:=1.09;
229
230         notehead_calc;
231         black_notehead_width# := wd#;
232         notehead_draw;
233 fet_endchar;
234
235
236
237
238
239 %if test = 0:
240 %else:
241 def draw_harmonic_notehead(expr harmwid) =
242         save beamheight, head_width, head_char_width;
243         save holeheight, stem_width;
244         save serif_size, serif_protrude;
245         save stemthick;
246         save thin, thick;
247         save ht, schuif_op;
248         
249 %       setup_notehead_vars;
250         
251 %       a_b:=1.54;
252 %       ai_a:=0;
253 %       ai_bi:=1;
254 %       b_h:=0.85;
255 %       a_w:=1.09;
256
257 %       notehead_calc;
258         
259
260         head_width# = harmwid;
261
262         define_pixels(head_width);
263         
264 %       ht# = noteheight#;
265         head_char_width = 1.54 noteheight;
266         head_char_width# := 1.54 ht#;
267         %schuif_op = head_char_width - head_width; %ugh
268         %schuif_op# := head_char_width# - head_width#;
269 %       set_char_box(0, head_char_width#, noteheight#/2, noteheight#/2); 
270         set_char_box(0, head_width#, head_width#/2, head_width#/2);
271 %       2 beamheight + holeheight = noteheight;
272         thin = stafflinethickness;
273         thick = 2.2 stafflinethickness;
274 %       serif_size = (holeheight - stafflinethickness)/2;
275 %       serif_protrude = 1.5 serif_size;
276         penpos1(thick, 45);
277         penpos2(thin, 315);
278         penpos3(thin, 135);
279         penpos4(thick, 45);
280         penpos5(thick, 225);
281         penpos6(thin, 135);
282         penpos7(thin, 315);
283         penpos8(thick, 225);
284
285 %       1.5 noteheight = head_width;
286         z1l = (0, 0);
287         z2l = z1l;
288 %       z3l = (head_width/2,-head_width/2);
289         z3l = (head_width/2, -noteheight/2);
290         z4l = z3l;
291         z5l = (head_width, 0);
292         z6l = z5l;
293 %       z7l = (head_width/2, head_width/2);
294         z7l = (head_width/2, noteheight/2);
295         z8l = z7l;
296         
297         pickup pencircle; %scaled stemthick;
298         penlabels(1,2,3,4,5,6,7,8);
299         test_grid;
300         fill z1l -- z2r -- z7r -- z7l -- cycle;
301         fill z1l -- z1r -- z4r -- z4l -- cycle;
302         fill z3r -- z3l -- z6l -- z6r -- cycle;
303         fill z5r -- z5l -- z8l -- z8r -- cycle;
304 enddef;
305
306 %save uitsteek;
307 % uitsteek = .25;
308 harmonic_wid# := interline#;
309
310 fet_beginchar("Harmonic notehead","harmonic","harmonicball")
311         draw_harmonic_notehead(harmonic_wid#)
312 fet_endchar;
313
314 %fi
315
316 fet_endgroup("noteheads");
317
318 define_pixels(black_notehead_width);