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