]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-sharps.mf
Add '-dcrop' option to ps and svg backends
[lilypond.git] / mf / feta-sharps.mf
1
2 %
3 % The beams of most sharps have horizontal endings (as if drawn with
4 % a square pen).  [Wanske] does not mention this, so we'll just ignore
5 % this fact.
6 %
7
8 save default_width, default_height, onestemmed_height;
9 save default_interbeam_dist, triples_interbeam_dist;
10 save default_beam_thickness, stem_thickness;
11
12 default_width# := 1.1 staff_space#;
13 default_height# := 3 staff_space#;
14 onestemmed_height# := 2.66 staff_space#;
15 define_pixels (default_width);
16
17 default_interbeam_dist := 1.05 staff_space_rounded;
18 triples_interbeam_dist := 1.2 staff_space_rounded;
19
20 default_beam_thickness# := 0.3 staff_space# + stafflinethickness#;
21 stem_thickness# := stafflinethickness# + .05 staff_space#;
22 define_whole_blacker_pixels (stem_thickness);
23
24
25 def draw_sharp_beam (expr length, y_offset) =
26         save beam_length;
27         save ne_beam_dir, nw_dist;
28         pair ne_beam_dir, nw_dist;
29
30         beam_length := length;
31
32         define_whole_vertical_blacker_pixels (default_beam_thickness);
33
34         clearxy;
35
36         pickup pencircle scaled 2 blot_diameter;
37
38         rt x2 - lft x1 = beam_length;
39         z2 = z1 + whatever * (beam_length, default_beam_thickness);
40         .5 [z1, z3] = (.5 w, y_offset);
41         x3 = x2;
42         top y2 - bot y3 = default_beam_thickness;
43         x4 = x1;
44         top y1 - bot y4 = default_beam_thickness;
45
46         ne_beam_dir = unitvector (z2 - z1);
47         nw_dist = (ne_beam_dir rotated 90) * blot_diameter;
48
49         fill lft z1{up}
50              ... (z1 + nw_dist){ne_beam_dir}
51              -- (z2 + nw_dist){ne_beam_dir}
52              ... rt z2{down}
53              -- rt z3{down}
54              ... (z3 - nw_dist){-ne_beam_dir}
55              -- (z4 - nw_dist){-ne_beam_dir}
56              ... lft z4{up}
57              -- cycle;
58
59         labels (1, 2, 3, 4);
60 enddef;
61
62
63 def draw_sharp (expr arrowup, arrowdown) =
64         save dist_between_stems;
65         save outer_space;
66         save half_height, interbeam_dist;
67
68         half_height# := 0.5 default_height#;
69         define_pixels (half_height);
70         interbeam_dist := default_interbeam_dist;
71
72         set_char_box (0, default_width#, half_height#, half_height#);
73         d := d - feta_space_shift;
74
75         dist_between_stems := hround (7 / 16 * default_width);
76         outer_space := hround ((w - dist_between_stems - stem_thickness) / 2);
77
78         w := 2 outer_space + dist_between_stems + stem_thickness;
79
80         draw_sharp_beam (w, -.5 interbeam_dist);
81         draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist);
82
83         % expand the charbox so that it encloses the whole arrow;
84         % this must not happen earlier because some commands above
85         % still rely on the old width
86         if arrowup:
87                 w := w + 1.5 stafflinethickness;
88                 h := h + 1.2 staff_space;
89         fi;
90         if arrowdown:
91                 b := b + 1.5 stafflinethickness;
92                 d := d + 1.2 staff_space;
93         fi;
94
95         pickup pencircle scaled stem_thickness;
96
97         lft x5 = lft x6 = outer_space;
98         lft x7 = lft x8 = outer_space + dist_between_stems;
99         bot y5 = -half_height;
100         top y8 = half_height;
101         z6 = z8 + whatever * ne_beam_dir;
102         bot y7 = -top y6 + feta_space_shift;
103
104         draw_gridline (z5, z6, stem_thickness);
105         draw_gridline (z7, z8, stem_thickness);
106
107         if arrowup:
108                 draw_arrow (z8, stem_thickness, up,
109                             stafflinethickness / 2 + stem_thickness / 2, false);
110         fi;
111         if arrowdown:
112                 draw_arrow (z5, stem_thickness, up,
113                             stafflinethickness / 2 + stem_thickness / 2, true);
114         fi;
115
116         labels (5, 6, 7, 8);
117         draw_staff_if_debugging (-2, 2);
118 enddef;
119
120
121 fet_beginchar ("Sharp", "sharp");
122         draw_sharp (false, false);
123 fet_endchar;
124
125
126 fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup");
127         draw_sharp (true, false);
128 fet_endchar;
129
130
131 fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown");
132         draw_sharp (false, true);
133 fet_endchar;
134
135
136 fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth");
137         draw_sharp (true, true);
138 fet_endchar;
139
140
141 fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem");
142         save outer_space;
143         save half_height, interbeam_dist;
144
145         half_height# := 0.5 onestemmed_height#;
146         define_pixels (half_height);
147         interbeam_dist := default_interbeam_dist;
148
149         set_char_box (0, 0.7 staff_space#, half_height#, half_height#);
150         d := d - feta_space_shift;
151
152         outer_space := hround ((w - stem_thickness) / 2);
153
154         w := 2 outer_space + stem_thickness;
155
156         draw_sharp_beam (w, -.5 interbeam_dist);
157         draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist);
158
159         pickup pencircle scaled stem_thickness;
160
161         lft x5 = lft x6 = outer_space;
162         top y6 = half_height;
163         bot y5 = -top y6 + feta_space_shift;
164
165         draw_gridline (z5, z6, stem_thickness);
166
167         labels (5, 6);
168         draw_staff_if_debugging (-2, 2);
169 fet_endchar;
170
171
172 fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem");
173         save dist_between_stems;
174         save outer_space;
175         save half_height, interbeam_dist;
176         save default_beam_thickness;
177
178         half_height# := 0.5 default_height#;
179         define_pixels (half_height);
180         interbeam_dist := triples_interbeam_dist;
181
182         default_beam_thickness# := 0.22 staff_space# + stafflinethickness#;
183
184         set_char_box (0, default_width#, half_height#, half_height#);
185
186         dist_between_stems := hround (7 / 16 * default_width);
187         outer_space := hround ((w - dist_between_stems - stem_thickness) / 2);
188
189         w := 2 outer_space + dist_between_stems + stem_thickness;
190         d := d - feta_space_shift;
191
192         draw_sharp_beam (.88 w, -.5 interbeam_dist);
193         draw_sharp_beam (.88 w, -.5 interbeam_dist + vround interbeam_dist);
194         default_beam_thickness# := 1/.88 default_beam_thickness#;
195         draw_sharp_beam (w, 0);
196
197         pickup pencircle scaled stem_thickness;
198
199         lft x5 = lft x6 = outer_space;
200         lft x7 = lft x8 = outer_space + dist_between_stems;
201         bot y5 = -half_height;
202         top y8 = half_height;
203         z6 = z8 + whatever * ne_beam_dir;
204         bot y7 = -top y6 + feta_space_shift;
205
206         draw_gridline (z5, z6, stem_thickness);
207         draw_gridline (z7, z8, stem_thickness);
208
209         labels (5, 6, 7, 8);
210         draw_staff_if_debugging (-2, 2);
211 fet_endchar;
212
213
214 fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem");
215         save outer_space;
216         save half_height, interbeam_dist;
217         save default_beam_thickness;
218
219         half_height# := 0.5 onestemmed_height#;
220         define_pixels (half_height);
221         interbeam_dist := triples_interbeam_dist;
222
223         default_beam_thickness# := 0.22 staff_space# + stafflinethickness#;
224
225         set_char_box (0, 0.95 staff_space#, half_height#, half_height#);
226
227         outer_space := hround ((w - stem_thickness) / 2);
228
229         w := 2 outer_space + stem_thickness;
230         d := d - feta_space_shift;
231
232         draw_sharp_beam (.8 w, -.5 interbeam_dist);
233         draw_sharp_beam (.8 w, -.5 interbeam_dist + vround interbeam_dist);
234         default_beam_thickness# := 1/.8 default_beam_thickness#;
235         draw_sharp_beam (w, 0);
236
237         pickup pencircle scaled stem_thickness;
238
239         lft x5 = lft x6 = outer_space;
240         top y6 = half_height;
241         bot y5 = -top y6 + feta_space_shift;
242
243         draw_gridline (z5, z6, stem_thickness);
244
245         labels (5, 6);
246         draw_staff_if_debugging (-2, 2);
247 fet_endchar;
248
249
250 fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem");
251         save dist_between_stems;
252         save outer_space;
253         save half_height, interbeam_dist;
254
255         half_height# := 0.5 default_height#;
256         define_pixels (half_height);
257         interbeam_dist := default_interbeam_dist;
258
259         set_char_box (0, 1.6 staff_space#, half_height#, half_height#);
260         d := d - feta_space_shift;
261
262         dist_between_stems := hround (9 / 32 * w);
263         outer_space := hround ((w - 2 dist_between_stems - stem_thickness) / 2);
264
265         w := 2 outer_space + 2 dist_between_stems + stem_thickness;
266
267         draw_sharp_beam (w, -.5 interbeam_dist);
268         draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist);
269
270         pickup pencircle scaled stem_thickness;
271
272         lft x5 = lft x6 = outer_space;
273         lft x9 = lft x10 = outer_space + dist_between_stems;
274         lft x7 = lft x8 = outer_space + 2 dist_between_stems;
275         bot y5 = -half_height;
276         top y8 = half_height;
277         z6 = z8 + whatever * ne_beam_dir;
278         bot y7 = -top y6 + feta_space_shift;
279         y9 = .5 [y5, y7];
280         y10 = .5 [y6, y8];
281
282         draw_gridline (z5, z6, stem_thickness);
283         draw_gridline (z7, z8, stem_thickness);
284         draw_gridline (z9, z10, stem_thickness);
285
286         labels (5, 6, 7, 8, 9, 10);
287         draw_staff_if_debugging (-2, 2);
288 fet_endchar;
289
290
291 fet_beginchar ("Double Sharp", "doublesharp");
292         save klaverblad, klaversteel;
293         save pat;
294         path pat;
295
296         klaversteel = 1/15 staff_space;
297         klaverblad = .4 staff_space - .5 stafflinethickness;
298
299         set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#);
300
301         z1 = (klaversteel, 0);
302         z2 = (w / 2 - klaverblad / 10, h - klaverblad);
303         z3 = (w / 2, h);
304         z4 = z2 reflectedabout ((0, 0), (1, 1));
305         z5 = z1 reflectedabout ((0, 0), (1, 1));
306
307         pickup pencircle scaled blot_diameter;
308
309         x2 := hfloor (rt x2) - blot_diameter / 2;
310         x3 := hfloor (rt x3) - blot_diameter / 2;
311         y3 := vfloor (top y3) - blot_diameter / 2;
312         y4 := vfloor (top y4) - blot_diameter / 2;
313
314         pat = (rt z1){dir45}
315               .. {right}(bot z2)
316               .. rt z2
317               -- rt z3{z3 - z2}
318               .. top z3{z4 - z3}
319               -- top z4{z4 - z3}
320               .. (lft z4){down}
321               .. {dir 225}(top z5);
322         pat := pat
323                -- reverse pat xscaled -1 shifted (-feta_eps, 0);
324
325         % assure symmetry -- it's more important to center the glyph on the
326         % staff line than centering it between staff lines, so we use
327         % feta_shift, not feta_space_shift.
328         h := h + feta_shift;
329
330         fill pat shifted (0, feta_shift)
331              -- reverse pat yscaled -1 shifted (0, -feta_eps)
332              -- cycle;
333
334         % ugh
335         currentpicture := currentpicture shifted (hround (w / 2), 0);
336
337         labels (1, 2, 3, 4, 5);
338         draw_staff_if_debugging (-2, 2);
339 fet_endchar;