]> git.donarmstrong.com Git - lilypond.git/blob - mf/feta-scripts.mf
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / mf / feta-scripts.mf
1 % Feta (not the Font-En-Tja) music font --  implement scripts
2 % This file is part of LilyPond, the GNU music typesetter.
3 %
4 % Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
5 %       Jan Nieuwenhuizen <janneke@gnu.org>
6 %
7 %
8 % LilyPond is free software: you can redistribute it and/or modify
9 % it under the terms of the GNU General Public License as published by
10 % the Free Software Foundation, either version 3 of the License, or
11 % (at your option) any later version.
12 %
13 % LilyPond is distributed in the hope that it will be useful,
14 % but WITHOUT ANY WARRANTY; without even the implied warranty of
15 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 % GNU General Public License for more details.
17 %
18 % You should have received a copy of the GNU General Public License
19 % along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
20
21
22 fet_begingroup ("scripts");
23
24 def draw_fermata =
25         save alpha, radius, crook_thinness, crook_fatness, dot_size;
26         save pat;
27         path pat;
28
29         % [Wanske] and some Baerenreiter editions
30         % suggest about 80 degrees instead of a half-circle
31         alpha := 10;
32
33         radius# = 1.25 staff_space#;
34         crook_thinness# = 1.5 linethickness#;
35         crook_fatness# = 0.25 staff_space# + 1.5 linethickness#;
36
37         radius# + crook_fatness# / 2 = h#;
38         radius# + crook_thinness# / 2 = w#;
39
40         set_char_box (w#, w#, crook_thinness# / 2, h#);
41
42         define_pixels (radius, crook_thinness, crook_fatness);
43
44         dot_size# = 8/6 crook_fatness#;
45         define_whole_blacker_pixels (dot_size);
46
47         penpos1 (crook_thinness, 0);
48         penpos2 (crook_fatness, -90);
49         z1 = (-radius, 0);
50         z2 = (0, radius);
51
52         pat := z2l{left}
53                .. z1l{dir (-alpha - 90)}
54                .. {dir (90 - alpha)}z1r
55                .. {right}z2r;
56         pat := pat
57                -- reverse pat xscaled -1 shifted (-feta_eps, 0)
58                -- cycle;
59         fill pat;
60
61         pickup pencircle scaled dot_size;
62         x4 = 0;
63         bot y4 = vround (-crook_thinness / 2);
64         drawdot z4;
65 enddef;
66
67
68 fet_beginchar ("fermata up", "ufermata");
69         draw_fermata;
70         penlabels (1, 2, 4);
71 fet_endchar;
72
73
74 fet_beginchar ("fermata down", "dfermata");
75         draw_fermata;
76         y_mirror_char;
77 fet_endchar;
78
79
80 def draw_short_fermata =
81         save fat_factor, thinness, dot_size;
82         save left_dist, right_dist, se, ne;
83         pair left_dist, right_dist, se, ne;
84
85         set_char_box (staff_space#, staff_space#, 0, 2.2 staff_space#);
86
87         dot_size# = 0.266 staff_space# + 2.666 linethickness#;
88         define_whole_blacker_pixels (dot_size);
89
90         fat_factor = .11;
91         thinness = 1.5 linethickness;
92
93         pickup pencircle scaled thinness;
94
95         rt x2 = w;
96         lft x5 = -b;
97         bot y5 = 0;
98         top y3 = h;
99         y1 = y2 = y5;
100
101         x3 = 0;
102         z1 - z4 = whatever * (charwd, -charht);
103         z4 = fat_factor [z3, z5];
104
105         ne = unitvector (z3 - z5);
106         se = unitvector (z2 - z3);
107
108         left_dist = (ne rotated 90) * 0.5 thinness;
109         right_dist = (se rotated 90) * 0.5 thinness;
110
111         fill bot z5{right}
112              .. (z5 - left_dist){ne}
113              -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
114                   ((z1 - right_dist) -- (z4 - right_dist)))
115              -- (z1 - right_dist){se}
116              .. bot z1{right}
117              -- bot z2{right}
118              .. (z2 + right_dist){-se}
119              -- (z3 + right_dist){-se}
120              .. top z3
121              .. (z3 + left_dist){-ne}
122              -- (z5 + left_dist){-ne}
123              .. cycle;
124
125         pickup pencircle scaled dot_size;
126
127         x1 - 2 x6 = x2;
128         x6 := vround (x6);
129         bot y6 = -d;
130
131         drawdot z6;
132 enddef;
133
134 fet_beginchar ("short fermata up", "ushortfermata");
135         draw_short_fermata;
136         labels (1, 2, 3, 4, 5, 6);
137 fet_endchar;
138
139
140 fet_beginchar ("short fermata down", "dshortfermata");
141         draw_short_fermata;
142         xy_mirror_char;
143 fet_endchar;
144
145
146 def draw_long_fermata =
147         save stemthick, beamheight, dot_size, wd;
148         save pat;
149         path pat;
150
151         wd# = 2.5 staff_space#;
152         stemthick = hround (1.5 linethickness);
153         beamheight = 0.3 staff_space + linethickness;
154         dot_size# = 0.266 staff_space# + 2.666 * linethickness#;
155         define_pixels (wd);
156         define_whole_blacker_pixels (dot_size);
157
158         set_char_box (wd# / 2, wd# / 2, 0, 3/2 staff_space#);
159
160         pickup pencircle scaled blot_diameter;
161
162         top y1 = h;
163         lft x1 = -b;
164
165         pat := top z1{left}
166                .. {down}lft z1;
167
168         pickup pencircle scaled stemthick;
169
170         x2 = -b + stemthick;
171         y2 = h - beamheight;
172         lft x3 = -b;
173         bot y3 = -d;
174
175         pat := pat
176                -- lft z3
177                .. bot z3
178                .. rt z3
179                -- z2;
180         pat := pat
181                -- reverse pat xscaled -1 shifted (-feta_eps, 0)
182                -- cycle;
183
184         fill pat;
185
186         pickup pencircle scaled dot_size;
187
188         x4 = 0;
189         bot y4 = -d;
190
191         drawdot z4;
192 enddef;
193
194
195 fet_beginchar ("long fermata up", "ulongfermata");
196         draw_long_fermata;
197         labels (1, 2, 3, 4);
198 fet_endchar;
199
200
201 fet_beginchar ("long fermata down", "dlongfermata");
202         draw_long_fermata;
203         y_mirror_char;
204 fet_endchar;
205
206
207 def draw_very_long_fermata =
208         save ibeamheight, obeamheight;
209         save ihwd, ohwd, iht, oht;      % inner/outer half_width/height
210         save stemthick, dot_size;
211         save opat, ipat;
212         path opat, ipat;
213
214         ihwd# = 1.0 staff_space#;
215         ohwd# = 1.5 staff_space#;
216         iht# = 0.9 staff_space#;
217         oht# = 1.6 staff_space#;
218         define_pixels (ihwd, ohwd, iht, oht)
219
220         stemthick = hround (1.5 linethickness);
221         ibeamheight# = 0.3 staff_space#;
222         obeamheight# = 0.5 staff_space#;
223         define_pixels (ibeamheight, obeamheight);
224
225         dot_size# = (iht# - ibeamheight#) * 8/10;
226         define_whole_blacker_pixels (dot_size);
227
228         set_char_box (ohwd#, ohwd#, 0, oht#);
229
230         pickup pencircle scaled blot_diameter;
231
232         top y1 = oht;
233         lft x1 = -ohwd;
234         top y11 = iht;
235         lft x11 = -ihwd;
236
237         opat := top z1{left}
238                 .. {down}lft z1;
239         ipat := top z11{left}
240                 .. {down}lft z11;
241
242         pickup pencircle scaled stemthick;
243
244         x2 = -ohwd + stemthick;
245         y2 = oht - obeamheight;
246         lft x3 = -ohwd;
247         bot y3 = 0;
248         x12 = -ihwd + stemthick;
249         y12 = iht - ibeamheight;
250         lft x13 = -ihwd;
251         bot y13 = 0;
252
253         opat := opat
254                 -- lft z3
255                 .. bot z3
256                 .. rt z3
257                 -- z2;
258         opat := opat
259                 -- reverse opat xscaled -1 shifted (-feta_eps, 0)
260                 -- cycle;
261         ipat := ipat
262                 -- lft z13
263                 .. bot z13
264                 .. rt z13
265                 -- z12;
266         ipat := ipat
267                 -- reverse ipat xscaled -1 shifted (-feta_eps, 0)
268                 -- cycle;
269
270         fill opat;
271         fill ipat;
272
273         pickup pencircle scaled dot_size;
274
275         x4 = 0;
276         bot y4 = -d;
277
278         drawdot z4;
279 enddef;
280
281
282 fet_beginchar ("very long fermata up", "uverylongfermata");
283         draw_very_long_fermata;
284         labels (1, 2, 3, 11, 12, 13, 4);
285 fet_endchar;
286
287
288 fet_beginchar ("very long fermata down", "dverylongfermata");
289         draw_very_long_fermata;
290         y_mirror_char;
291 fet_endchar;
292
293
294 %
295 % Thumbs are used in cello music.
296 % TODO : thumbs should look like the finger-font and should be placed in
297 % the same way in the score.
298 %
299
300 fet_beginchar ("Thumb", "thumb");
301         save thin, height, width, thick, depth;
302         height# = 5/4 width#;
303         height# = staff_space#;
304         depth# = 1.6 (height# / 2);
305
306         set_char_box (width# / 2, width# / 2, depth#, height# / 2);
307
308         define_pixels (height, width);
309
310         thin = .6 linethickness + 0.06 staff_space;
311         2 thick + 0.5 (height - 2 thin) = width;
312
313         penpos1 (thick, 0);
314         penpos2 (thin, 90);
315         penpos3 (thick, 180);
316         penpos4 (thin, 270);
317         z1r = (w, 0);
318         z2r = (0, h);
319         z3r = (-w, 0);
320         z4r = (0, -h);
321
322         penlabels (1, 2, 3, 4);
323
324         penstroke z1e{up}
325                   .. z2e{left}
326                   .. z3e{down}
327                   .. z4e{right}
328                   .. cycle;
329
330         save brush_thick;
331         y5 = -d + brush_thick / 2;
332         brush_thick = 0.9 thick;
333         x5 = 0;
334
335         labels (5);
336
337         draw_brush (z4r, 1.4 thin, z5, brush_thick);
338 fet_endchar;
339
340
341 %
342 % `\accent' is TeX reserved.
343 %
344
345 def draw_accent (expr bottom_left, top_right, thickness, diminish) =
346         save thinning_start;
347         thinning_start = 0.4;
348         pickup pencircle scaled thickness;
349
350         lft x1 = xpart bottom_left;
351         top y1 = ypart top_right;
352         lft x6 = xpart bottom_left;
353         bot y6 = ypart bottom_left;
354
355         rt z4 = (xpart top_right, (ypart top_right + ypart bottom_left) / 2);
356         x5 = x3 = thinning_start [xpart top_right, xpart bottom_left]
357                   - linethickness + 0.1 staff_space;
358         z3 = whatever [z1, z4];
359         z5 = whatever [z6, z4];
360
361         penpos1 (thickness, angle (z3 - z1) + 90);
362         penpos3 (thickness, angle (z3 - z1) + 90);
363         penpos4 (thickness, 90);
364         penpos5 (thickness, angle (z6 - z5) + 90);
365         penpos6 (thickness, angle (z6 - z5) + 90);
366
367         x4 - x7 = diminish * thickness;
368         y7 = y4;
369
370         fill z1l
371              -- z3l
372              -- z7
373              -- z5l
374              -- z6l
375              .. lft z6{down}
376              .. bot z6
377              .. z6r
378              -- z4l
379              ..tension 0.8.. rt z4
380              ..tension 0.8.. z4r
381              -- z1r
382              .. top z1
383              .. lft z1{down}
384              .. cycle;
385 enddef;
386
387
388 fet_beginchar ("> accent", "sforzato");
389         set_char_box (.9 staff_space#, .9 staff_space#,
390                       .5 staff_space#, .5 staff_space#);
391
392         draw_accent ((-w, -d), (w, h),
393                      0.05 staff_space + linethickness, 0.7);
394         penlabels (1, 3, 4, 5, 6);
395         labels (7);
396 fet_endchar;
397
398
399 fet_beginchar ("espr", "espr");
400         set_char_box (1.9 staff_space#, 1.9 staff_space#,
401                       .5 staff_space#, .5 staff_space#);
402
403         draw_accent ((w - 1.78 staff_space, -d), (w, h),
404                      0.05 staff_space + linethickness, 0.6);
405         addto currentpicture also currentpicture xscaled -1;
406 fet_endchar;
407
408
409 fet_beginchar ("staccato dot", "staccato");
410         save radius;
411         radius# = 0.20 * staff_space#;
412         define_whole_pixels (radius);
413
414         pickup pencircle scaled 2 radius;
415         drawdot (0, 0);
416
417         set_char_box (radius#, radius#, radius#, radius#);
418 fet_endchar;
419
420
421 def draw_staccatissimo =
422         save radius, height;
423         height# = .8 staff_space#;
424         radius# = linethickness# + .1 staff_space#;
425         define_whole_blacker_pixels (radius);
426         define_pixels (height);
427
428         draw_brush ((0, 0), linethickness, (0, height), 2 radius);
429
430         set_char_box (radius#, radius#,
431                       blot_diameter# / 2, height# + radius#);
432 enddef;
433
434
435 fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo");
436         draw_staccatissimo;
437 fet_endchar;
438
439
440 fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo");
441         draw_staccatissimo;
442         y_mirror_char;
443 fet_endchar;
444
445
446 fet_beginchar ("portato/single tenuto", "tenuto");
447         save thick;
448         thick# = 1.6 linethickness#;
449         define_whole_blacker_pixels (thick);
450
451         set_char_box (.6 staff_space#, .6 staff_space#,
452                       thick# / 2, thick# / 2);
453
454         draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
455 fet_endchar;
456
457
458 def draw_portato =
459         save thick, dot_size;
460         thick# = 1.4 linethickness#;
461         dot_size# = 2.4 linethickness# + 0.08 staff_space#;
462         define_whole_blacker_pixels (thick, dot_size);
463
464         set_char_box (.6 staff_space#, .6 staff_space#,
465                       thick# / 2, .5 staff_space# + .5 dot_size#);
466
467         draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
468
469         pickup pencircle scaled dot_size;
470         drawdot (0, h);
471 enddef;
472
473
474 fet_beginchar ("portato/tenuto with staccato", "uportato");
475         draw_portato;
476 fet_endchar;
477
478
479 fet_beginchar ("portato/tenuto with staccato", "dportato");
480         draw_portato;
481         y_mirror_char
482 fet_endchar;
483
484
485 def draw_marcato =
486         save fat_factor, thinness;
487         save left_dist, right_dist, ne, se;
488         pair left_dist, right_dist, ne, se;
489
490         set_char_box (staff_space# / 2, staff_space# / 2,
491                       0, 1.1 staff_space#);
492
493         fat_factor = .3;
494         thinness = linethickness;
495
496         pickup pencircle scaled thinness;
497
498         rt x2 = w;
499         lft x5 = -b;
500         bot y5 = 0;
501         top y3 = h;
502         y1 = y2 = y5;
503
504         x3 =0;
505         z1 - z4 = whatever * (charwd, -charht);
506         z4 = fat_factor [z3, z5];
507
508         ne = unitvector (z3 - z5);
509         se = unitvector (z2 - z3);
510
511         left_dist = (ne rotated 90) * 0.5 thinness;
512         right_dist = (se rotated 90) * 0.5 thinness;
513
514         fill bot z5{right}
515              .. (z5 - left_dist){ne}
516              -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
517                   ((z1 - right_dist) -- (z4 - right_dist)))
518              -- (z1 - right_dist){se}
519              .. bot z1{right}
520              -- bot z2{right}
521              .. (z2 + right_dist){-se}
522              -- (z3 + right_dist){-se}
523              .. top z3
524              .. (z3 + left_dist){-ne}
525              -- (z5 + left_dist){-ne}
526              .. cycle;
527 enddef;
528
529
530 fet_beginchar ("marcato up", "umarcato");
531         draw_marcato;
532         labels (1, 2, 3, 4, 5);
533 fet_endchar;
534
535
536 %
537 % The down marcato char (not very much used).
538 % Contrary to what some MF/TeX `gurus' believe
539 % it is *point*-symmetric with the "up" version
540 %
541
542 fet_beginchar ("marcato down", "dmarcato");
543         draw_marcato;
544         xy_mirror_char;
545 fet_endchar;
546
547
548 %
549 % used in french horn music todo
550 %
551 % TODO: too light at 20pt
552 %
553
554 fet_beginchar ("open (unstopped)", "open");
555         save thin, height, width, thick;
556
557         height# = 5/4 width#;
558         height# = staff_space#;
559         thin = .6 linethickness + 0.06 staff_space;
560
561         set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
562
563         define_pixels (width, height);
564
565         2 thick + 0.6 (height - 2 thin) = width;
566
567         penpos1 (thick, 0);
568         penpos2 (thin, 90);
569         penpos3 (thick, 180);
570         penpos4 (thin, 270);
571         z1r = (w, 0);
572         z2r = (0, h);
573         z3r = (-w, 0);
574         z4r = (0, -h);
575
576         penlabels (1, 2, 3, 4);
577
578         penstroke z1e{up}
579                   .. z2e{left}
580                   .. z3e{down}
581                   .. z4e{right}
582                   .. cycle;
583 fet_endchar;
584
585
586 fet_beginchar ("halfopen (unstopped)", "halfopen");
587         save thin, height, width, thick, factor, slash;
588
589         factor = 5/4;
590         height# = 5/4 width#;
591         height# = staff_space#;
592         thin = 0.6 linethickness + 0.06 staff_space;
593         slash# = 1.05 linethickness#;
594
595         set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
596
597         define_pixels (width, height, slash);
598
599         2 thick + 0.6 (height - 2 thin) = width;
600
601         penpos1 (thick, 0);
602         penpos2 (thin, 90);
603         penpos3 (thick, 180);
604         penpos4 (thin, 270);
605         z1r = (w, 0);
606         z2r = (0, h);
607         z3r = (-w, 0);
608         z4r = (0, -h);
609
610         penlabels (1, 2, 3, 4);
611
612         penstroke z1e{up}
613                   .. z2e{left}
614                   .. z3e{down}
615                   .. z4e{right}
616                   .. cycle;
617
618         draw_brush ((-w * factor, -h * factor), slash,
619                     (w * factor, h * factor), slash);
620 fet_endchar;
621
622
623 fet_beginchar ("plus (stopped)", "stopped");
624         save hthick, vthick, size, outer_hsize, outer_vsize;
625
626         hthick# = vthick# = 2 linethickness#;
627         size# = 1.1 staff_space#;
628         define_whole_blacker_pixels (vthick);
629         define_whole_vertical_blacker_pixels (hthick);
630
631         set_char_box (size# / 2, size# / 2, size# / 2, size# / 2);
632
633         outer_hsize = hround ((b + w - vthick) / 2);
634         outer_vsize = vround ((h + d - hthick) / 2);
635         w := b := (2 outer_hsize + vthick) / 2;
636         h := d := (2 outer_vsize + hthick) / 2;
637
638         draw_rounded_block ((-b, -d + outer_vsize),
639                             (w, -d + outer_vsize + hthick), hthick);
640         draw_rounded_block ((-b + outer_hsize, -d),
641                             (-b + outer_hsize + vthick, h), vthick);
642 fet_endchar;
643
644
645 fet_beginchar ("Upbow", "upbow");
646         save ht, wd, thick;
647
648         thick = 1.4 linethickness;
649         wd# = 1.3 staff_space#;
650         ht# = 1.6 wd#;
651
652         set_char_box (wd# / 2, wd# / 2, 0, ht#);
653
654         draw_accent ((-h, -w), (0, w), thick, 0.9);
655         currentpicture := currentpicture rotated -90;
656 fet_endchar;
657
658
659 fet_beginchar ("Downbow", "downbow");
660         save stemthick, beamheight, wd;
661         save pat;
662         path pat;
663
664         wd# = 1.5 staff_space#;
665         define_pixels (wd);
666
667         stemthick = hround (1.2 linethickness);
668
669         set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#);
670
671         beamheight = 4/10 h;
672
673         pickup pencircle scaled blot_diameter;
674
675         top y1 = h;
676         lft x1 = -b;
677
678         pat := top z1{left}
679                .. {down}lft z1;
680
681         pickup pencircle scaled stemthick;
682
683         x2 = -b + stemthick;
684         y2 = h - beamheight;
685         lft x3 = -b;
686         bot y3 = -d;
687
688         pat := pat
689                -- lft z3
690                .. bot z3
691                .. rt z3
692                -- z2;
693         pat := pat
694                -- reverse pat xscaled -1 shifted (-feta_eps, 0)
695                -- cycle;
696
697         fill pat;
698
699         labels (1, 2, 3);
700 fet_endchar;
701
702 %
703 % Inspired by a computer-set version of Auf dem Strom by Baerenreiter.
704 %
705
706 def draw_turn =
707         save thin, thick, ball_diam, darkness;
708         save wd, ht, thick_nibangle, ball_nib_thick;
709         save turndir;
710         pair turndir;
711
712         wd# = 35/16 staff_space#;
713         ht# = 18/17 staff_space#;
714         darkness = 0.3 linethickness + 0.09 staff_space;
715
716         set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
717
718         thick_nibangle = 60;
719         thick = 3 darkness;
720         thin = darkness;
721         ball_nib_thick = 2.7 darkness;
722         ball_diam = ball_nib_thick + (h - ball_nib_thick) / 10;
723
724         x3l = w;
725         y3 = 0;
726         y4l = h;
727         x4 = x2;
728         x2l = w / 2;
729         y2l = -d;
730         z1 = (0,0);
731
732         penpos1 (1.1 thick, thick_nibangle);
733         penpos2 (thick, thick_nibangle);
734         penpos3 (thin, 180);
735         penpos4 (ball_nib_thick, -90);
736
737         path swoosh, ploop;
738         swoosh := z1l{curl 0}
739                   .. z2l
740                   .. z3l{up}
741                   .. {left}z4l
742                   -- z4r
743                   .. z3r{down}
744                   .. z2r{left};
745         fill swoosh
746              .. swoosh scaled -1 shifted (-feta_eps, -feta_eps)
747              .. cycle;
748
749         x5r = x4;
750         y5r = y4l - ball_diam / 2;
751         z6r = z5r;
752
753         penpos5 (1.6 ball_diam / 2, 10);
754         penpos6 (ball_diam / 2, 150);
755
756         ploop := z4l{left}
757                  .. z5l
758                  .. z6l
759                  -- cycle;
760         fill ploop;
761         fill ploop scaled -1 shifted (-feta_eps, -feta_eps);
762 enddef;
763
764
765 fet_beginchar ("Reverse turn", "reverseturn");
766         draw_turn;
767         currentpicture := currentpicture yscaled -1;
768 fet_endchar;
769
770
771 fet_beginchar ("Turn", "turn");
772         draw_turn;
773         penlabels (1, 2, 3, 4, 5, 6, 7);
774 fet_endchar;
775
776
777 %
778 % Inspired by a (by now) PD edition of Durand & C'ie edition of
779 % Saint-Saens' Celloconcerto no. 1
780 %
781 % FIXME take out hardcoded vars.
782 % FIXME the two loops on the `t' should be smoother (and the left one bigger).
783 % FIXME generic macros for serifs: top of the t and bottom of r
784 %
785
786 fet_beginchar ("Trill (`tr')", "trill");
787         save start_nib_angle, ascender_extra, ex, hair_thick, fatness;
788         save slant, t_fatness, r_fatness, kerning, t_overshoot;
789         save uitschieter, bulb_size, krul_ang;
790         save u, v;
791
792         ascender_extra# = 1/2 ex#;
793         ascender# = ascender_extra# + ex#;
794         ex# = 1.4 staff_space#;
795         kerning# = 0.6 ex#;
796         start_nib_angle = 20;
797         bulb_size = 0.8;
798         define_pixels (ex, ascender_extra, ascender, kerning);
799
800         t_overshoot = 0.03 ex;
801         fatness = 12/40 ex;
802         t_fatness = 0.78 fatness;
803         t_width =  1.9 t_fatness;
804         r_fatness = 0.78 fatness;
805         uitschieter = 0.48 ex;
806         hair_thick = linethickness;
807         r_flare = .5 hair_thick + 0.25 r_fatness;
808         r_width =  2 r_fatness + 0.25 kerning;
809         slant = .2;
810
811         local_copy (transform)(currenttransform);
812         currenttransform := currenttransform slanted slant
813                                              shifted (-staff_space, 0);
814
815         set_char_box (.85 staff_space#, .85 staff_space#, 0, ascender#);
816
817         y1 = ascender;
818
819         % try to position in such a way that the center is the visual
820         % center
821
822         x1l = 0.2 staff_space;
823         x1r - x1l = t_fatness;
824         penpos1 (start_nib_wid, start_nib_angle);
825
826         z2 = (x1, 7/18 ex);
827         penpos2 (start_nib_wid, start_nib_angle);
828
829         z3l = (x2l + 0.5 t_width, - t_overshoot);
830
831         z4l = (x2l + t_width, 0.23 ex);
832         penpos4 (whatever, 180);        % 200
833         x4l - x4r = hair_thick;
834
835         x3r = 0.5 [x4r, x2r];
836 %       1.7 [x3l, x3r] = x4r;
837         y3r - y3l = 0.6 t_fatness;
838
839         save krul_p;
840         path krul_p;
841
842         krul_ang = 32;
843
844         pickup pencircle scaled hair_thick;
845
846         z5 = (x2l + t_fatness / 2, 2/3 ex);
847         lft x6 = x2l - uitschieter;
848         y6 = y5;                                % - 1/20 ex;
849         z7 = z5 + whatever * dir krul_ang;
850         up_angle = krul_ang;                    % = angle (z7-z5)
851         x7 = 5/10 kerning + x5;
852
853         krul_p := z4{up}
854                   ..tension 0.98.. z5
855                   .. z6
856                   .. z5{z7 - z5}
857                   -- z7;
858
859         z4' = point 0.85 of krul_p;
860         penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90);
861
862         % the body of the `t' and the bottom loop
863         fill z1r{dir (angle (z1l - z1r) + 30)}
864              .. z1l{-dir (angle (z1r - z1l) - 45)}
865              -- z2l{down}
866              ..tension (1 + .5 slant).. z3l{right}
867              .. z4l{up}
868              .. z4'l{direction 0.85 of krul_p}
869              -- z4'r{-direction 0.85 of krul_p}
870              .. z4r{down}
871              .. z3r{left}
872              ..tension (1.5 + .7 slant).. z2r{up}
873              -- cycle;
874
875         z5' = point 1.1 of krul_p;
876         penpos5' (hair_thick, angle (direction 1.1 of krul_p) + 90);
877         z5'' = point 1.5 of krul_p;
878         penpos5'' (hair_thick, angle (direction 1.5 of krul_p) + 90);
879         z5''' = point 1.8 of krul_p;
880         penpos5''' (hair_thick, angle (direction 1.8 of krul_p) + 90);
881         z6 = point 2 of krul_p;
882         penpos6 (hair_thick, angle (direction 2 of krul_p) + 90);
883         z6' = point 2.3 of krul_p;
884         penpos6' (hair_thick, angle (direction 2.3 of krul_p) + 90);
885         z6'' = point 2.6 of krul_p;
886         penpos6'' (hair_thick, angle (direction 2.6 of krul_p) + 90);
887         z6''' = point 2.9 of krul_p;
888         penpos6''' (hair_thick, angle (direction 2.9 of krul_p) + 90);
889         penpos7 (hair_thick, up_angle + 90);
890         z7' = point 3.2 of krul_p;
891         penpos7' (hair_thick, angle (direction 3.2 of krul_p) + 90);
892
893         % the left loop
894         penstroke z5'e{direction 1.1 of krul_p}
895                   .. z5''e{direction 1.5 of krul_p}
896                   .. z5'''e{direction 1.8 of krul_p}
897                   .. z6e{direction 2 of krul_p}
898                   .. z6'e{direction 2.3 of krul_p}
899                   .. z6''e{direction 2.6 of krul_p}
900                   .. {direction 2.9 of krul_p}z6'''e;
901
902         y9 = 3/4 ex;
903         x9 = x1 + kerning;
904         penpos9 (r_fatness, 0);
905
906         x10 = x9;
907         y10 = -0.3 linethickness;
908         penpos10 (r_fatness, 0);
909
910         penpos11 (hair_thick, -4);
911         z11r = z9r;
912
913         z13l = (x9l + r_width, y11 - linethickness);
914         penpos13 (r_flare, 180);
915
916         z15 = z13r - (bulb_size * r_fatness, 0);
917         z14 = 0.5 [z13l, z15] - (0, bulb_size * r_fatness);
918
919         save before, after;
920         path before, after;
921         before := z13l{up}
922                   .. {down}z11l;
923         after := z9r{up}
924                  .. z7r{z7' - z7}
925                  -- z7'r;
926         (u, v) = before intersectiontimes after;
927
928         save before_bulb, after_bulb;
929         path before_bulb, after_bulb;
930         before_bulb := z9r{up}
931                        ..tension 0.94.. z13r{down};
932         after_bulb := z13l{up}
933                       ..tension 1.06.. z15{down};
934         (u_bulb, v_bulb) = before_bulb intersectiontimes after_bulb;
935
936         % the connection between `t' and `r', the body of the `r',
937         % and the bulb
938         fill z7'l
939              -- z7l{z7 - z7'}
940              .. z9l{down}
941              -- simple_serif (z10l, z10r, -30)
942              -- z9r{up}
943              .. subpath (0, u_bulb) of before_bulb
944              .. subpath (v_bulb, infinity) of after_bulb
945              .. z14
946              .. z13l{up}
947              .. subpath (0, u) of before
948              .. subpath (v, infinity) of after
949              -- cycle;
950
951         penlabels (range 1 thru 15);
952         penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7');
953 fet_endchar;
954
955
956 def draw_heel =
957         save radius, thickness;
958         save pat;
959         path pat;
960
961         radius# := .5 staff_space#;
962
963         set_char_box (radius#, radius#, radius#, 2/3 staff_space#);
964
965         thickness := hround (1.5 linethickness);
966
967         pickup pencircle scaled thickness;
968
969         rt x1 = b;
970         top y1 = h;
971
972         x2 =x1;
973         y2 = 0;
974
975         x3 = 0;
976         bot y3 = -d;
977
978         pat := top z3{right}
979                .. lft z2{up}
980                -- lft z1
981                .. top z1
982                .. rt z1
983                -- rt z2{down}
984                .. bot z3{left};
985         pat := pat
986                -- reverse pat xscaled -1 shifted (-feta_eps, 0)
987                -- cycle;
988         fill pat;
989 enddef;
990
991
992 fet_beginchar ("left heel", "upedalheel");
993         draw_heel;
994         labels (1, 2, 3);
995 fet_endchar;
996
997
998 fet_beginchar ("right heel", "dpedalheel");
999         draw_heel;
1000         y_mirror_char;
1001 fet_endchar;
1002
1003
1004 def draw_toe =
1005         save ht, wd, thickness;
1006
1007         thickness := 1.5 linethickness;
1008         ht# := 1.5 staff_space#;
1009         wd# := 1/3 ht#;
1010         define_pixels (ht, wd);
1011
1012         set_char_box (wd#, wd#, 0, ht#);
1013         draw_accent ((-h, -w), (0, w), thickness, 0.9);
1014         currentpicture := currentpicture rotated -90;
1015 enddef;
1016
1017
1018 fet_beginchar ("left toe", "upedaltoe");
1019         draw_toe;
1020 fet_endchar;
1021
1022
1023 fet_beginchar ("right toe", "dpedaltoe");
1024         draw_toe;
1025         y_mirror_char;
1026 fet_endchar;
1027
1028
1029 fet_beginchar ("Flageolet", "flageolet");
1030         save height, width, thickness, superness;
1031
1032         height# = 4/15 staffsize#;
1033         width# = height#;
1034         thickness# = blot_diameter#;
1035         define_pixels (height, width);
1036         define_whole_blacker_pixels (thickness);
1037
1038         set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
1039
1040         penpos1 (thickness, 90);
1041         penpos2 (thickness, 180);
1042         penpos3 (thickness, 270);
1043         penpos4 (thickness, 0);
1044
1045         x1 = 0;
1046         y1r = h;
1047         x4r = w;
1048         x2r = -x4r;
1049         y2 = 0;
1050         y4 = y2;
1051         x3 = x1;
1052         y3r = -y1r;
1053
1054         penlabels (1, 2, 3, 4);
1055
1056         % mf doesn't handle pixel dropouts in outline objects, so we use
1057         % `draw' if not called by mpost
1058         if known miterlimit:
1059                 penstroke z1e
1060                           .. z2e
1061                           .. z3e
1062                           .. z4e
1063                           .. cycle;
1064         else:
1065                 pickup pencircle scaled thickness;
1066                 draw z1
1067                      .. z2
1068                      .. z3
1069                      .. z4
1070                      .. cycle;
1071         fi;
1072 fet_endchar;
1073
1074
1075 %
1076 % TODO:  ARGRGHGH code dup.
1077 %
1078
1079 fet_beginchar ("Segno", "segno");
1080         save thin, thick, ball_diam, darkness, pointheight;
1081         save wd, ht, thick_nibangle, ball_nib_thick;
1082         save turndir;
1083         pair turndir;
1084
1085         ht# = 3 staff_space#;
1086         wd# = 2 staff_space#;
1087         darkness = .08 staff_space + 0.4 linethickness;
1088
1089         set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2);
1090
1091         thick_nibangle = 30;
1092         thick = 3 darkness;
1093         thin = darkness;
1094         ball_nib_thick = 2.7 darkness;
1095         ball_diam = ball_nib_thick + (w - ball_nib_thick) / 10;
1096         pointheight = 2 linethickness;
1097
1098         y3l = h;
1099         2 x3 = x2 + x4;
1100         x4 = 0;
1101         y4 = y2;
1102         y2l = .6 h;
1103         x2l = -b;
1104         z1 = (0, 0);
1105
1106         penpos1 (thick, 2 thick_nibangle);
1107         penpos2 (thick, thick_nibangle);
1108         penpos3 (thin, -90);
1109         penpos4 (ball_nib_thick, 180 - thick_nibangle);
1110
1111         save swoosh, ploop;
1112         path swoosh, ploop;
1113
1114         swoosh := z1l{curl 0}
1115                   .. z2l
1116                   .. z3l{right}
1117                   .. {down}z4l
1118                   -- z4r
1119                   .. z3r{left}
1120                   .. z2r{down};
1121         fill swoosh
1122              .. (swoosh scaled -1)
1123              .. cycle;
1124
1125         y5r = y4;
1126         x5r = x4l - ball_diam / 2;
1127         z6r = z5r;
1128
1129         penpos5 (1.6 ball_diam / 2, 100);
1130         penpos6 (ball_diam / 2, 240);
1131
1132         ploop := z4l{down}
1133                  .. z5l
1134                  .. z6l
1135                  -- cycle;
1136         fill ploop;
1137         fill ploop scaled -1;
1138
1139         penpos7 (2 thin, 0);
1140         z7l = (-b, -d);
1141         penpos8 (2 thin, 0);
1142         z8r = (w, h);
1143
1144         penstroke z7e
1145                   -- z8e;
1146
1147         pickup pencircle scaled 2 thin;
1148         drawdot (-x2r, pointheight);
1149         drawdot (x2r, -pointheight);
1150
1151         penlabels (range 1 thru 8);
1152 fet_endchar;
1153
1154
1155 fet_beginchar ("Coda", "coda");
1156         save stickout, thin, thick, codawidth, codaheight;
1157
1158         stickout# = 0.35 staff_space#;
1159         codawidth# = 2/3 staff_space#;
1160         codaheight# = staff_space#;
1161         define_pixels (codawidth, codaheight);
1162
1163         set_char_box (codawidth# + stickout#, codawidth# + stickout#,
1164                       codaheight# + stickout#, codaheight# + stickout#);
1165
1166         thin = 1.2 linethickness;
1167         0.1 (codaheight - 2 thin) = (codawidth - 2 thick);
1168
1169         penpos1 (thick, 0);
1170         penpos2 (thin, -90);
1171         penpos3 (thick, -180);
1172         penpos4 (thin, -270);
1173
1174         x1l = -codawidth;
1175         y2l = codaheight;
1176         y1 = 0;
1177         x2 = 0;
1178         z3 = -z1;
1179         z4 = -z2;
1180
1181         penlabels (1, 2, 3, 4);
1182
1183         fill z1l{up}
1184              .. z2l{right}
1185              .. z3l{down}
1186              .. z4l{left}
1187              .. cycle;
1188         unfill z1r{up}
1189                .. z2r{right}
1190                .. z3r{down}
1191                .. z4r{left}
1192                .. cycle;
1193
1194         draw_gridline ((0, -h), (0, h), thin);
1195         draw_gridline ((-w, 0), (w, 0), thin);
1196 fet_endchar;
1197
1198
1199 fet_beginchar ("Varied Coda", "varcoda");
1200         save thin, thick, codawidth, codaheight;
1201         thin# = 1.2 linethickness#;
1202         thick# = 1.0 linethickness# + 0.25 staff_space#;
1203         codawidth# = 2/3 staff_space#;
1204         codaheight# = staff_space#;
1205         define_pixels (thin, thick, codawidth, codaheight);
1206
1207         set_char_box (codawidth# + thick#, codawidth# + thick#,
1208                       codaheight# + thick#, codaheight# + thick#);
1209
1210         x1 = -codawidth + thick - .5 blot_diameter;
1211         y1 = y2 - thin;
1212         x2 = codawidth - thick + .5 blot_diameter;
1213         y2 = codaheight;
1214         draw_square_block (z1, z2);
1215
1216         x3 = -codawidth;
1217         y3 = -codaheight;
1218         x4 = x3 + thick;
1219         y4 = y2;
1220         draw_block (z3, z4);
1221
1222         labels (1, 2, 3, 4);
1223
1224         addto currentpicture also currentpicture scaled -1;
1225
1226         draw_gridline ((0, -h), (0, h), thin);
1227         draw_gridline ((-w, 0), (w, 0), thin);
1228 fet_endchar;
1229
1230
1231 def draw_comma =
1232         save alpha, thick, thin, ht;
1233
1234         alpha := 35;
1235         thin# = 1.2 linethickness#;
1236         thick# = 3 linethickness#;
1237         ht# = .6 staff_space#;
1238         define_pixels (thin, thick, ht);
1239
1240         set_char_box (0, .5 staff_space#, ht#, ht#);
1241
1242         penpos1 (thick, alpha);
1243         penpos2 (thick, alpha + 90);
1244         penpos3 (thin, 180 - alpha);
1245         penpos4 (thin, 90 - alpha);
1246
1247         x3r = 0;
1248         x1l = x3l;
1249         y2r = -y4l = h;
1250         z1 = z2;
1251         z3 = z4;
1252
1253         fill z1l{dir (alpha + 90)}
1254              .. z2r{dir alpha}
1255              .. z1r{dir (alpha - 90)}
1256              .. z3l{dir (270 - alpha)}
1257              .. z4l{dir (180 - alpha)}
1258              .. z3r{dir (90-alpha)}
1259              .. cycle;
1260 enddef;
1261
1262
1263 fet_beginchar ("Right Comma", "rcomma");
1264         draw_comma;
1265         penlabels (1, 2, 3, 4);
1266 fet_endchar;
1267
1268
1269 fet_beginchar ("Left Comma", "lcomma");
1270         draw_comma;
1271         xy_mirror_char;
1272 fet_endchar;
1273
1274
1275 def draw_varcomma =
1276         save thick, thin, ht, wd, alpha;
1277
1278         alpha := 35;
1279         thin# = 1.2 linethickness#;
1280         thick# = 3 linethickness#;
1281         ht# = .6 staff_space#;
1282         wd# = .25 staff_space#;
1283         define_pixels (thin, thick, ht, alpha);
1284
1285         set_char_box (wd#, wd#, ht#, ht#);
1286
1287         z1 = (-b, -d);
1288         z2 = (w, h);
1289
1290         draw_brush (z1, thin, z2, thick);
1291 enddef;
1292
1293
1294 fet_beginchar ("Right Varied Comma", "rvarcomma");
1295         draw_varcomma;
1296         labels (1, 2);
1297 fet_endchar;
1298
1299
1300 fet_beginchar ("Left Varied Comma", "lvarcomma");
1301         draw_varcomma;
1302         xy_mirror_char;
1303 fet_endchar;
1304
1305
1306 thick# := 1/24 designsize;
1307 define_blacker_pixels (thick);
1308
1309 rthin := 0.075 * staff_space + 0.5 linethickness;
1310 rthick := 2 thick + rthin;
1311
1312
1313 def draw_arpeggio =
1314         save alpha;
1315         save ne, nw, se, sw;
1316         save x, y;
1317         pair ne, nw, se, sw;
1318
1319         alpha := -40;
1320
1321         nw = dir (alpha + 180);
1322         ne = dir (alpha + 90);
1323         se = dir alpha;
1324         sw = dir (alpha - 90);
1325
1326         penpos1 (rthin, alpha + 90);
1327         penpos2 (5/4 rthick, alpha);
1328         penpos3 (3/4 rthick, alpha);
1329         penpos4 (5/4 rthick, alpha);
1330         penpos5 (rthin, alpha + 90);
1331
1332         z1 = (width / 2, height) - overshoot * se;
1333         z2 = 2 [z4, (width / 2, height / 2)];
1334         z3 = 1/2 [z2, z4];
1335         x4 = 2/8 staff_space;
1336         y4 = rthin;
1337
1338         z5 = 2 [z1, (width / 2, height / 2)];
1339         z6 = z2l + 1/2 rthin * sw;
1340         z7 = z4l + 1/2 rthin * sw + 1/2 rthin * se;
1341         z8 = 2 [z6, (width / 2, height / 2)];
1342         z9 = 2 [z7, (width / 2, height / 2)];
1343
1344         fill z1l{se}
1345              -- z6
1346              .. z3l
1347              .. z7{se}
1348              -- z5l
1349              .. z5r{nw}
1350              -- z8
1351              .. z3r
1352              .. z9{nw}
1353              -- z1r
1354              .. cycle;
1355 enddef;
1356
1357
1358 fet_beginchar ("Arpeggio", "arpeggio");
1359         save height, overshoot, width;
1360         height# = staff_space#;
1361         width# = 0.8 height#;
1362         overshoot# = 0.25 staff_space#;
1363         define_pixels (height, overshoot, width);
1364
1365         set_char_box (0, width#, 0, height#);
1366         draw_arpeggio;
1367         penlabels (range 1 thru 9);
1368
1369         draw_staff (-2, 2, 0.0);
1370 fet_endchar;
1371
1372
1373 %
1374 % Extendable Trill symbol.
1375 % Not yet used
1376 % Rename me to Trill, rename Trill to Tr?
1377 %
1378
1379 fet_beginchar ("Trill_element", "trill_element");
1380         save height, overshoot;
1381         height# = staff_space#;
1382         width# = 0.8 height#;
1383         overshoot# = 0.25 staff_space#;
1384         define_pixels (height, overshoot, width);
1385
1386         set_char_box (0, height#, 0, width#);
1387         draw_arpeggio;
1388
1389         currentpicture := currentpicture shifted -(width / 2, height / 2);
1390         currentpicture := currentpicture rotated 90;
1391         currentpicture := currentpicture shifted (height / 2, width / 2);
1392 fet_endchar;
1393
1394
1395 %
1396 % Arpeggio arrow by Chris Jackson <chris@fluffhouse.org.uk>
1397 %
1398
1399 def draw_arpeggio_arrow =
1400         save thinness, height, width, overshoot;
1401         save nw, ne, se, sw;
1402         save alpha;
1403         save before_left, before_right, after_left, after_right;
1404         save u_left, v_left, u_right, v_right;
1405         pair nw, ne, se, sw;
1406         path before_left, before_right, after_left, after_right;
1407
1408         height# = staff_space#;
1409         width# = 0.8 height#;
1410         overshoot# = 0.25 staff_space#;
1411         define_pixels (height, overshoot, width);
1412
1413         set_char_box (0, width#, 0, height#);
1414
1415         alpha := -40;
1416         nw = dir (alpha + 180);
1417         ne = dir (alpha + 90);
1418         se = dir alpha;
1419         sw = dir (alpha - 90);
1420
1421         penpos1 (rthin, alpha + 90);
1422         penpos2 (5/4 rthick, alpha);
1423         penpos3 (5/4 rthick, 0);
1424
1425         z1 = (width / 2, height) - overshoot * se; % numbering is consistent
1426                                                    % with the arpeggio symbol
1427         z2 = 2 [z4, (width / 2, height / 2)];
1428         z3 = (0.5 width, 0.5 height);
1429         z4 = (0.25 staff_space, rthin);
1430         z6 = z2l + 1/2 rthin * sw;
1431         z9 = (width / 2, height) + overshoot * se;
1432
1433         pickup pencircle scaled vround (0.5 rthin);
1434
1435         bot z10 = (0.5 w, 0);
1436         lft z11 = (0.5 w - hround (0.8 w), 0.8 h);
1437         rt z12 = (0.5 w + hround (0.8 w), 0.8 h);
1438
1439         before_left := z1l
1440                        -- z6{z6 - z1l}
1441                        .. {down}z3l;
1442         after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw))))
1443                       -- (z11 + 0.25 rthin * ne);
1444         (u_left, v_left) = before_left intersectiontimes after_left;
1445
1446         before_right := (z12 + 0.25 rthin * nw)
1447                         -- (z3 + (0, -0.25 rthin / cosd (angle (nw))));
1448         after_right := z3r{up}
1449                        .. z9{z1r - z9}
1450                        -- z1r;
1451         (u_right, v_right) = before_right intersectiontimes after_right;
1452
1453         fill subpath (0, u_left) of before_left
1454              .. subpath (v_left, infinity) of after_left
1455              .. top z11
1456              .. lft z11
1457              .. {dir -50}(z11 + 0.25 rthin * sw)
1458              .. (z10 + 0.25 rthin * sw){dir -70}
1459              .. bot z10
1460              .. {dir 70}(z10 + 0.25 rthin * se)
1461              .. (z12 + 0.25 rthin * se){dir 50}
1462              .. rt z12
1463              .. top z12
1464              .. subpath (0, u_right) of before_right
1465              .. subpath (v_right, infinity) of after_right
1466              .. cycle;
1467
1468         % mf doesn't handle pixel dropouts in outline objects, so we use
1469         % `draw' if not called by mpost
1470         if not known miterlimit:
1471                 pickup pencircle scaled 0.7 rthin;
1472                 draw z1
1473                      -- (z9 + 0.5 rthin * dir (alpha - 90));
1474         fi;
1475 enddef;
1476
1477
1478 fet_beginchar ("Arpeggio arrow down", "arpeggio.arrow.M1");
1479         draw_arpeggio_arrow;
1480         penlabels (range 1 thru 12);
1481 fet_endchar;
1482
1483
1484 fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1");
1485         draw_arpeggio_arrow;
1486         currentpicture := currentpicture scaled -1
1487                                          shifted (w - feta_eps, h - feta_eps);
1488 fet_endchar;
1489
1490
1491 % Hmm
1492 input feta-trills;
1493
1494
1495 %
1496 % Railroad tracks.  We define two variants of these -- both as slightly
1497 % tapered, comma-shaped curves and as two straight parallel slashes.
1498 %
1499
1500 fet_beginchar ("Curved caesura", "caesura.curved");
1501         save slant, space_between, clearance;
1502         save alpha, pat;
1503         save botthick, topthick;
1504         save krom;
1505         path pat;
1506
1507         botthick = 1.5 linethickness;
1508         topthick = 2.5 linethickness;
1509
1510         pickup pencircle scaled botthick;
1511
1512         slant = 3.5;
1513         space_between# = 0.6 staff_space#;
1514         clearance# = 0.2 staff_space#;
1515         height# = 1.2 staff_space#;
1516
1517         set_char_box (0, 2.0 staff_space#,
1518                       staff_space# - clearance#, height#);
1519         define_pixels (clearance, height);
1520         define_whole_pixels (space_between);
1521
1522         bot y1 = -d;
1523         top y2 = h;
1524
1525         lft x1 = 0;
1526         x2 = (y2 - y1) / slant;
1527
1528         krom = 10;
1529
1530         alpha = angle (z2 - z1);
1531         penpos1 (botthick, alpha - krom);
1532         penpos3 (botthick, alpha - krom + 90);
1533
1534         penpos2 (topthick, alpha + krom);
1535         penpos4 (topthick, alpha + krom + 90);
1536
1537         z3 = z1;
1538         z4 = z2;
1539
1540         penlabels (1, 2, 3, 4);
1541
1542         pat := z3r{(z1r - z1l)}
1543                .. z4r{z2r-z2l}
1544                .. z2r{z4l-z4r}
1545                .. z4l{z2l-z2r}
1546                .. z3l{z1l-z1r}
1547                .. z1l{z3r-z3l}
1548                .. cycle;
1549         fill pat;
1550         fill pat shifted (space_between, 0);
1551 fet_endchar;
1552
1553
1554 fet_beginchar ("Straight caesura", "caesura.straight");
1555         save slant, space_between, clearance;
1556         save thick, ne, pat;
1557         path pat;
1558         pair ne;
1559
1560         slant = 2.0;
1561         thick = 2.88 linethickness;
1562
1563         space_between# = 0.56 staff_space#;
1564         clearance# = 0.2 staff_space#;
1565
1566         set_char_box (0, 2.0 staff_space#,
1567                       staff_space# - clearance#, 1.2 staff_space#);
1568         define_whole_pixels (space_between);
1569
1570         x1 = 0;
1571         x2 = x1 + thick;
1572         y1 = y2 = -d;
1573
1574         x3 = x4 + thick;
1575         x4 = x1 + (h + d) / slant;
1576         y3 = y4 = h;
1577
1578         ne = unitvector (z4 - z1);
1579
1580         z1a = z1 + blot_diameter * ne;
1581         z1b = z1 + blot_diameter * right;
1582         z2a = z2 + blot_diameter * ne;
1583         z2b = z2 + blot_diameter * left;
1584
1585         z3a = z3 - blot_diameter * ne;
1586         z3b = z3 + blot_diameter * left;
1587         z4a = z4 - blot_diameter * ne;
1588         z4b = z4 + blot_diameter * right;
1589
1590         pat = z1a{-ne}
1591               .. {right}z1b
1592               -- z2b{right}
1593               .. {ne}z2a
1594               -- z3a{ne}
1595               .. {left}z3b
1596               -- z4b{left}
1597               .. {-ne}z4a
1598               -- cycle;
1599
1600         fill pat;
1601         fill pat shifted (space_between, 0);
1602
1603         labels(range 1 thru 4);
1604         labels(1a, 1b, 2a, 2b, 3a, 3b, 4a, 4b);
1605 fet_endchar;
1606
1607
1608 fet_beginchar ("snap pizzicato (Bartok pizzicato)", "snappizzicato");
1609         save height, width, thickness, superness;
1610
1611         height# = 4/15 staffsize#;
1612         width# = height#;
1613         thickness# = 1.3 linethickness#;
1614         define_pixels (height, width);
1615         define_whole_blacker_pixels (thickness);
1616
1617         set_char_box (width# / 2, width# / 2, height# / 2, height# * 3 / 4);
1618
1619         penpos1 (thickness, 90);
1620         penpos2 (thickness, 180);
1621         penpos3 (thickness, 270);
1622         penpos4 (thickness, 0);
1623
1624         x1 = 0;
1625         y1r = height / 2;
1626         x3 = x1;
1627         y3r = -y1r;
1628         x4r = width / 2;
1629         y4 = 0;
1630         x2r = -x4r;
1631         y2 = y4;
1632
1633         penlabels (1, 2, 3, 4);
1634
1635         % mf doesn't handle pixel dropouts in outline objects, so we use
1636         % `draw' if not called by mpost
1637         if known miterlimit:
1638                 penstroke z1e
1639                           .. z2e
1640                           .. z3e
1641                           .. z4e
1642                           .. cycle;
1643         else:
1644                 pickup pencircle scaled thickness;
1645                 draw z1
1646                      .. z2
1647                      .. z3
1648                      .. z4
1649                      .. cycle;
1650         fi;
1651
1652         z5 = (0, 0);
1653         z6 = (x5, 1.5 y1r);
1654
1655         draw_gridline (z5, z6, thickness);
1656
1657         labels (5, 6);
1658 fet_endchar;
1659
1660 fet_endgroup ("scripts");