2 % feta-accordion.mf -- draw accordion symbols
4 % source file of the GNU LilyPond music typesetter
6 % (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
8 fet_begingroup ("accordion");
11 % These dimensions are the same for all register symbols.
12 % The different symbols should calculate their other dimensions from them.
15 accreg_dot_size# := .5 staff_space#;
16 accreg_linethickness# := 1.3 stafflinethickness#;
17 accreg_lh# := 1.0 staff_space#;
19 define_pixels (accreg_dot_size, accreg_linethickness, accreg_lh);
22 fet_beginchar ("accDiscant", "accDiscant")
29 set_char_box (r# + accreg_linethickness# / 2,
30 r# + accreg_linethickness# / 2,
31 0, 2 r# + 0.7 accreg_linethickness#);
34 lt = vround (0.7 accreg_linethickness);
37 b := w := (3 lh + hround accreg_linethickness) / 2;
39 penpos1 (hround accreg_linethickness, 0);
41 penpos3 (hround accreg_linethickness, 180);
49 penlabels (1, 2, 3, 4);
51 % mf doesn't handle pixel dropouts in outline objects, so we use
52 % `draw' if not called by mpost
65 pickup pencircle xscaled accreg_linethickness yscaled lt;
77 pickup penrazor scaled lt rotated 90;
79 top z5 = pat intersectionpoint ((0, lh + lt) -- (w, lh + lt));
81 bot z7 = pat intersectionpoint ((0, 2 lh) -- (w, 2 lh));
93 fet_beginchar ("accDot", "accDot")
94 set_char_box (accreg_dot_size# / 2, accreg_dot_size# / 2,
95 accreg_dot_size# / 2, accreg_dot_size# / 2);
97 pickup pencircle scaled accreg_dot_size;
99 rt x0 = hround (accreg_dot_size / 2);
100 top y0 = vround (accreg_dot_size / 2);
106 fet_beginchar ("accFreebase", "accFreebase")
112 set_char_box (r# + accreg_linethickness# / 2,
113 r# + accreg_linethickness# / 2,
114 0, 2 r# + 0.7 accreg_linethickness#);
117 lt = vround (0.7 accreg_linethickness);
120 b := w := (2 lh + hround accreg_linethickness) / 2;
122 penpos1 (hround accreg_linethickness, 0);
124 penpos3 (accreg_linethickness, 180);
132 penlabels (1, 2, 3, 4);
134 % mf doesn't handle pixel dropouts in outline objects, so we use
135 % `draw' if not called by mpost
148 pickup pencircle xscaled accreg_linethickness yscaled lt;
156 pickup penrazor scaled lt rotated 90;
163 fet_beginchar ("accStdbase", "accStdbase")
170 set_char_box (r# + accreg_linethickness# / 2,
171 r# + accreg_linethickness# / 2,
172 0, 2 r# + 0.7 accreg_linethickness#);
175 lt = vround (0.7 accreg_linethickness);
178 b := w := (4 lh + hround accreg_linethickness) / 2;
180 penpos1 (hround accreg_linethickness, 0);
182 penpos3 (hround accreg_linethickness, 180);
190 penlabels (1, 2, 3, 4);
192 % mf doesn't handle pixel dropouts in outline objects, so we use
193 % `draw' if not called by mpost
206 pickup pencircle xscaled accreg_linethickness yscaled lt;
218 pickup penrazor scaled lt rotated 90;
220 top z5 = pat intersectionpoint ((0, lh + lt) -- (w, lh + lt));
222 bot z7 = pat intersectionpoint ((0, 3 lh) -- (w, 3 lh));
236 fet_beginchar ("accBayanbase", "accBayanbase")
239 lh = vround accreg_lh;
240 lt = vround accreg_linethickness;
242 set_char_box (accreg_lh# + accreg_linethickness# / 2,
243 accreg_lh# + accreg_linethickness# / 2,
244 0, 3 accreg_lh# + accreg_linethickness#);
248 draw_rounded_block ((-w, 0), (-w + lt, h), lt);
249 draw_rounded_block ((w - lt, 0), (w, h), lt);
251 pickup penrazor scaled lt rotated 90;
253 bot z1 = (-w + lt / 2, 0);
254 bot z2 = (-w + lt / 2, lh);
255 bot z3 = (-w + lt / 2, 2 lh);
256 bot z4 = (-w + lt / 2, 3 lh);
258 bot z5 = (w - lt / 2, 0);
259 bot z6 = (w - lt / 2, lh);
260 bot z7 = (w - lt / 2, 2 lh);
261 bot z8 = (w - lt / 2, 3 lh);
274 def def_B (expr w, h) =
275 pickup pencircle scaled 0.15 linethickness;
277 penpos10 (thin, -90);
278 penpos11 (thin, -90);
283 penpos15 (thick, 180);
284 penpos16 (thin, -90);
285 penpos17 (thin, -90);
291 z12 = (w, .5 mb * h);
292 z13 = (cTwo * w, mb * h);
293 z14 = (2 thick, mb * h);
294 z15 = (.94 w, h - .5 mt * h);
295 z16 = z13 + (0, mt * h);
297 z18 = (1.5 thick, 0);
298 z19 = (1.5 thick, h);
302 def def_S (expr w, h) =
303 pickup pencircle scaled 0.03 linethickness;
308 penpos4 (.5 thick, 90);
317 z3 = (w - .5 thick, .5 mb * h);
318 z4 = (w / 2, mb * h);
319 z5 = (.5 thick, h - .5 mt * h);
330 t := xpart (bue intersectiontimes (z8l -- z7l));
332 bueoverst := z6{right}
338 save hs, mb, mt, thin, thick, height, width, cOne, cTwo;
341 width = .8 (4 staff_space);
342 height = 2.4 staff_space;
343 % URG. smaller sizes should be wider and fatter
344 % thin = 0.05 staff_space;
345 % thick = 0.2 staff_space;
349 fatten := designsize * hx + bx * 1.2;
350 thick := 0.2 staff_space * fatten;
352 % urg: mustn't ever go thinner than blot!
353 thin# := blot_diameter#;
354 define_pixels (thin);
356 hs = 0.4 staff_space;
364 fet_beginchar ("accOldEE", "accOldEE")
365 save r, pp, ir, lh, lt, stroke_width;
370 lr = .4 staff_space - linethickness;
372 stroke_width = .05 staff_space + .5 linethickness;
374 set_char_box (r# + accreg_linethickness# / 2,
375 r# + accreg_linethickness# / 2,
376 0, 2 r# + 0.7 accreg_linethickness#);
382 penpos1 (blot_diameter, 0);
383 penpos2 (stroke_width + blot_diameter, 0);
384 penpos3 (stroke_width + blot_diameter, 0);
386 pickup pencircle scaled (lr + blot_diameter);
388 for pp := 0 step 45 until 135:
389 drawdot z2 rotated pp;
390 drawdot z3 rotated pp;
397 pickup pencircle scaled lr;
401 currentpicture := currentpicture shifted (0, h / 2);
404 lt = vround (0.7 accreg_linethickness);
407 b := w := (lh + hround accreg_linethickness) / 2;
409 penpos10 (hround accreg_linethickness, 0);
411 penpos12 (hround accreg_linethickness, 180);
419 % penlabels (1, 2, 10, 11, 12, 13);
421 % mf doesn't handle pixel dropouts in outline objects, so we use
422 % `draw' if not called by mpost
435 pickup pencircle xscaled accreg_linethickness yscaled lt;
445 fet_endgroup ("accordion");