]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-bolletjes.mf
release: 1.0.1
[lilypond.git] / mf / feta-bolletjes.mf
1
2 % feta-bolletjes.mf --  implement noteheads
3
4 % source file of LilyPond's pretty-but-neat music font
5
6 % (c) 1997 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("balls");
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("Brevis notehead", "-1", "brevisball")
78         draw_brevis(brevis_wid#);
79 fet_endchar;
80 fet_beginchar("Brevis ledger", "-1l", "brevisledger")
81         draw_ledger(brevis_wid#);
82 fet_endchar;
83
84 %
85 % Some sources (eg Musix/OpusTeX think that the appendage should be on
86 % the right, my only other ref [Willemze], shows an appendage to the left
87 %
88 fet_beginchar("Longa notehead", "-2", "longaball");
89         draw_brevis(brevis_wid#);
90         save theta;
91         z7 = z5;
92         z6 - z7 = (-stem_width/2, -interline);
93         theta = angle(z6-z7)+ 90;
94         penpos7(stem_width, theta);
95         penpos6(1.2 stem_width, theta);
96         
97         fill z7r .. z6r{z6-z7} .. {z7-z6} z6l -- z7l -- cycle;
98         penlabels(6,7);
99 fet_endchar;
100 fet_beginchar("Longa ledger", "-2l", "longaledger")
101         draw_ledger(brevis_wid#);
102 fet_endchar;
103
104
105 % setup user vars
106 def setup_notehead_vars =
107         save a_b,err_y_a,tilt,superness;
108         save ai_a,ai_bi,err_y_ai,err_x_bi,inner_tilt,inner_superness;
109         save b_h,a_w;
110         enddef;
111
112 % setup addititional vars and calc them
113 def notehead_calc =
114         save a,beta,ai,bi, ht, wd;
115         ht# =noteheight#;
116         2beta#=ht#*b_h;
117         a# = beta#*a_b;
118         wd# = 2a# / a_w;
119         ai# = a# * ai_a;
120         bi# = ai#/ai_bi;
121         define_pixels(a,beta);
122         define_pixels(ai,bi);
123         set_char_box(0, wd#, .5 ht#, .5 ht#);
124         enddef;
125
126
127 % draw the outer and inner ellipse.
128 def notehead_draw =
129         path black,white;
130         black=distorted_ellipse(a,beta,a*err_y_a,0,superness);
131         white=distorted_ellipse(ai,bi,ai*err_y_ai,bi*err_x_bi,inner_superness);
132 if test>1: %fixme
133                 save x;
134                 x1=-x3=a; x2=x4=0; y1=y3=0; y2=-y4=b;
135                 penlabels(1,2,3,4);
136                 test_grid;
137 else:
138                 black:=black rotated tilt;
139                 black:=black shifted (w/2,0);
140                 white:=white rotated inner_tilt;
141                 white:=white shifted (w/2,0);
142 fi
143                 fill black;
144                 unfill white;
145
146                 
147         enddef;
148
149 % whole note
150 % Wanske, p.38
151 fet_beginchar("Whole notehead", "0", "wholeball")
152         setup_notehead_vars;
153         
154         a_b:=1.80;
155         err_y_a:=0; % no slant
156         tilt:=0;
157         superness:=0.707;
158         ai_a:=0.508;
159         % ai_bi:=1.23;
160         ai_bi:=1.30; % jcn
161         % err_y_ai:=0.0938;
162         % err_x_bi:=0;
163         err_y_ai:=0;
164         err_x_bi:=0.115;
165         % inner_tilt:=135;
166         inner_tilt:=125; % jcn
167         % inner_superness:=0.69;
168         inner_superness:=0.68; % jcn
169         b_h:=1; %no rotate-> no height correction
170         a_w:=1; % no rotate-> no width correction
171
172         notehead_calc;
173         whole_notehead_width# := wd#;
174         notehead_draw;
175 fet_endchar;
176
177
178 fet_beginchar("Whole ledger line", "0l", "wholeledger")
179         draw_ledger(whole_notehead_width#);
180 fet_endchar;
181
182 % half note
183 % Wanske, p.39
184 fet_beginchar("Half notehead", "1", 
185         "halfball")
186         setup_notehead_vars;
187                 % a_b:=1.49; % after text
188         a_b:=1.50; % after drawing
189         err_y_a:=0.157;
190         tilt:=34;
191         % superness:=0.66;
192         superness:=0.67; % jcn
193         % ai_a:=0.863;
194         ai_a:=0.850; % jcn
195         % ai_bi:=3.14;
196         ai_bi:=3.30; % jcn
197         err_y_ai:=0;
198         err_x_bi:=-0.12;
199         inner_tilt:=tilt;
200         inner_superness:=0.80;
201         b_h:=0.935;
202         a_w:=1.12;
203
204         notehead_calc;
205         half_notehead_width# := wd#;
206         notehead_draw;
207 fet_endchar;
208
209
210 fet_beginchar("Half ledger", "1l", "halfledger")
211         draw_ledger(half_notehead_width#);
212 fet_endchar;
213
214 % quarter note
215 % Wanske p.38
216 fet_beginchar("Quart notehead", "2", "quartball")
217         setup_notehead_vars;
218         % a_b:=1.57; % after text
219         a_b:=1.54; % after drawing
220         err_y_a:=0.044;
221         tilt:=32;
222         superness:=0.707;
223         ai_a:=0;
224         ai_bi:=1;
225         err_y_ai:=0;
226         err_x_bi:=0;
227         inner_tilt:=0;
228         inner_superness:=0.707;
229         b_h:=0.85;
230         a_w:=1.09;
231
232         notehead_calc;
233         black_notehead_width# := wd#;
234         notehead_draw;
235 fet_endchar;
236
237
238 fet_beginchar("Quart ledger", "2l", "quartledger")
239         draw_ledger(black_notehead_width#);
240 fet_endchar;
241
242 fet_endgroup("balls");
243
244 define_pixels(black_notehead_width);