X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mf%2Ffeta-schrift.mf;h=6c003c4685ba09ccbe5ca3490dcb167ef40e0759;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=0ce139e2dd36da413706e040be062fdc7e2f605e;hpb=670a98f23a2561c6a4a4a19bb72c776189715541;p=lilypond.git diff --git a/mf/feta-schrift.mf b/mf/feta-schrift.mf index 0ce139e2dd..6c003c4685 100644 --- a/mf/feta-schrift.mf +++ b/mf/feta-schrift.mf @@ -1,183 +1,490 @@ % -*- Fundamental -*- (emacs-20 mf mode mucks % feta-schrift.mf -- implement scripts -% +% % source file of the Feta (defintively not an abbreviation for Font-En-Tja) % music font -% -% (c) 1997 Han-Wen Nienhuys +% +% (c) 1997--2008 Han-Wen Nienhuys % Jan Nieuwenhuizen -% - +% -fet_begingroup("scripts") +fet_begingroup ("scripts"); def draw_fermata = - save alpha, radius, crook_thinness, crook_fatness, dot_diam; - - % [Wanske] and some Baerenreiter editions - % suggest ca 80 degrees iso half-circle - alpha := 10; - - radius# = 1.25 interline#; - crook_thinness# = 1.5stafflinethickness#; - crook_fatness# = 4 stafflinethickness#; - - radius# + crook_fatness#/2 = h#; - radius# + crook_thinness#/2 = w#; - set_char_box(w#, w#, crook_thinness#/2, h#); - - define_pixels(radius, crook_thinness, crook_fatness); - dot_diam = 4/3 crook_fatness; - - - penpos1(crook_thinness, 0); - penpos2(crook_fatness, -90); - z1 = (-radius,0); - z2 = (0, radius); - - fill z1l{dir (-alpha-90)}..{dir (90-alpha)}z1r.. - {right}z2r -- z2l{left} .. cycle; - - addto currentpicture also - currentpicture xscaled -1; - - pickup pencircle scaled dot_diam; - x4 =0; - bot y4 = - crook_thinness/2; - draw z4; + save alpha, radius, crook_thinness, crook_fatness, dot_size; + save pat; + path pat; + + % [Wanske] and some Baerenreiter editions + % suggest about 80 degrees instead of a half-circle + alpha := 10; + + radius# = 1.25 staff_space#; + crook_thinness# = 1.5 linethickness#; + crook_fatness# = 0.25 staff_space# + 1.5 linethickness#; + + radius# + crook_fatness# / 2 = h#; + radius# + crook_thinness# / 2 = w#; + + set_char_box (w#, w#, crook_thinness# / 2, h#); + + define_pixels (radius, crook_thinness, crook_fatness); + + dot_size# = 8/6 crook_fatness#; + define_whole_blacker_pixels (dot_size); + + penpos1 (crook_thinness, 0); + penpos2 (crook_fatness, -90); + z1 = (-radius, 0); + z2 = (0, radius); + + pat := z2l{left} + .. z1l{dir (-alpha - 90)} + .. {dir (90 - alpha)}z1r + .. {right}z2r; + pat := pat + -- reverse pat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + fill pat; + + pickup pencircle scaled dot_size; + x4 = 0; + bot y4 = vround (-crook_thinness / 2); + drawdot z4; enddef; -fet_beginchar("fermata up", "ufermata", "ufermata") - draw_fermata; - penlabels(1,2,4); + +fet_beginchar ("fermata up", "ufermata"); + draw_fermata; + penlabels (1, 2, 4); fet_endchar; -fet_beginchar("fermata down", "dfermata", "dfermata") + +fet_beginchar ("fermata down", "dfermata"); draw_fermata; y_mirror_char; fet_endchar; + +def draw_short_fermata = + save fat_factor, thinness, dot_size; + save left_dist, right_dist, se, ne; + pair left_dist, right_dist, se, ne; + + set_char_box (staff_space#, staff_space#, 0, 2.2 staff_space#); + + dot_size# = 0.266 staff_space# + 2.666 linethickness#; + define_whole_blacker_pixels (dot_size); + + fat_factor = .11; + thinness = 1.5 linethickness; + + pickup pencircle scaled thinness; + + rt x2 = w; + lft x5 = -b; + bot y5 = 0; + top y3 = h; + y1 = y2 = y5; + + x3 = 0; + z1 - z4 = whatever * (charwd, -charht); + z4 = fat_factor [z3, z5]; + + ne = unitvector (z3 - z5); + se = unitvector (z2 - z3); + + left_dist = (ne rotated 90) * 0.5 thinness; + right_dist = (se rotated 90) * 0.5 thinness; + + fill bot z5{right} + .. (z5 - left_dist){ne} + -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint + ((z1 - right_dist) -- (z4 - right_dist))) + -- (z1 - right_dist){se} + .. bot z1{right} + -- bot z2{right} + .. (z2 + right_dist){-se} + -- (z3 + right_dist){-se} + .. top z3 + .. (z3 + left_dist){-ne} + -- (z5 + left_dist){-ne} + .. cycle; + + pickup pencircle scaled dot_size; + + x1 - 2 x6 = x2; + x6 := vround (x6); + bot y6 = -d; + + drawdot z6; +enddef; + +fet_beginchar ("short fermata up", "ushortfermata"); + draw_short_fermata; + labels (1, 2, 3, 4, 5, 6); +fet_endchar; + + +fet_beginchar ("short fermata down", "dshortfermata"); + draw_short_fermata; + xy_mirror_char; +fet_endchar; + + +def draw_long_fermata = + save stemthick, beamheight, dot_size, wd; + save pat; + path pat; + + wd# = 2.5 staff_space#; + stemthick = hround (1.5 linethickness); + beamheight = 0.3 staff_space + linethickness; + dot_size# = 0.266 staff_space# + 2.666 * linethickness#; + define_pixels (wd); + define_whole_blacker_pixels (dot_size); + + set_char_box (wd# / 2, wd# / 2, 0, 3/2 staff_space#); + + pickup pencircle scaled blot_diameter; + + top y1 = h; + lft x1 = -b; + + pat := top z1{left} + .. {down}lft z1; + + pickup pencircle scaled stemthick; + + x2 = -b + stemthick; + y2 = h - beamheight; + lft x3 = -b; + bot y3 = -d; + + pat := pat + -- lft z3 + .. bot z3 + .. rt z3 + -- z2; + pat := pat + -- reverse pat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + + fill pat; + + pickup pencircle scaled dot_size; + + x4 = 0; + bot y4 = -d; + + drawdot z4; +enddef; + + +fet_beginchar ("long fermata up", "ulongfermata"); + draw_long_fermata; + labels (1, 2, 3, 4); +fet_endchar; + + +fet_beginchar ("long fermata down", "dlongfermata"); + draw_long_fermata; + y_mirror_char; +fet_endchar; + + +def draw_very_long_fermata = + save ibeamheight, obeamheight; + save ihwd, ohwd, iht, oht; % inner/outer half_width/height + save stemthick, dot_size; + save opat, ipat; + path opat, ipat; + + ihwd# = 1.0 staff_space#; + ohwd# = 1.5 staff_space#; + iht# = 0.9 staff_space#; + oht# = 1.6 staff_space#; + define_pixels (ihwd, ohwd, iht, oht) + + stemthick = hround (1.5 linethickness); + ibeamheight# = 0.3 staff_space#; + obeamheight# = 0.5 staff_space#; + define_pixels (ibeamheight, obeamheight); + + dot_size# = (iht# - ibeamheight#) * 8/10; + define_whole_blacker_pixels (dot_size); + + set_char_box (ohwd#, ohwd#, 0, oht#); + + pickup pencircle scaled blot_diameter; + + top y1 = oht; + lft x1 = -ohwd; + top y11 = iht; + lft x11 = -ihwd; + + opat := top z1{left} + .. {down}lft z1; + ipat := top z11{left} + .. {down}lft z11; + + pickup pencircle scaled stemthick; + + x2 = -ohwd + stemthick; + y2 = oht - obeamheight; + lft x3 = -ohwd; + bot y3 = 0; + x12 = -ihwd + stemthick; + y12 = iht - ibeamheight; + lft x13 = -ihwd; + bot y13 = 0; + + opat := opat + -- lft z3 + .. bot z3 + .. rt z3 + -- z2; + opat := opat + -- reverse opat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + ipat := ipat + -- lft z13 + .. bot z13 + .. rt z13 + -- z12; + ipat := ipat + -- reverse ipat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + + fill opat; + fill ipat; + + pickup pencircle scaled dot_size; + + x4 = 0; + bot y4 = -d; + + drawdot z4; +enddef; + + +fet_beginchar ("very long fermata up", "uverylongfermata"); + draw_very_long_fermata; + labels (1, 2, 3, 11, 12, 13, 4); +fet_endchar; + + +fet_beginchar ("very long fermata down", "dverylongfermata"); + draw_very_long_fermata; + y_mirror_char; +fet_endchar; + + % % Thumbs are used in cello music. % TODO : thumbs should look like the finger-font and should be placed in % the same way in the score. % -fet_beginchar("Thumb", "thumb", "thumb") - save thin, height, width, thick; - height# = 5/4 width#; - height# = interline#; - thin = 1.2 stafflinethickness; - thick = 2 thin; - set_char_box(width#/2, width#/2, height#/2, height#/2); - - penpos1(thick, 0); - penpos2(thin, 90); - z1r = (w, 0); - z2r = (0, h); - penlabels(1,2); - penstroke z1e{up} .. {left}z2e; - addto currentpicture also currentpicture xscaled -1; - addto currentpicture also currentpicture yscaled -1; - - z3 = (0, -h); - z4 = (0, -1.5h); - penlabels(3,4); - draw_brush(z3,1.4*thin, z4,0.9*thick); +fet_beginchar ("Thumb", "thumb"); + save thin, height, width, thick, depth; + height# = 5/4 width#; + height# = staff_space#; + depth# = 1.6 (height# / 2); + + set_char_box (width# / 2, width# / 2, depth#, height# / 2); + + define_pixels (height, width); + + thin = .6 linethickness + 0.06 staff_space; + 2 thick + 0.5 (height - 2 thin) = width; + + penpos1 (thick, 0); + penpos2 (thin, 90); + penpos3 (thick, 180); + penpos4 (thin, 270); + z1r = (w, 0); + z2r = (0, h); + z3r = (-w, 0); + z4r = (0, -h); + + penlabels (1, 2, 3, 4); + + penstroke z1e{up} + .. z2e{left} + .. z3e{down} + .. z4e{right} + .. cycle; + + save brush_thick; + y5 = -d + brush_thick / 2; + brush_thick = 0.9 thick; + x5 = 0; + + labels (5); + + draw_brush (z4r, 1.4 thin, z5, brush_thick); fet_endchar; -% -% FIXME: rounded endings + % % `\accent' is TeX reserved. -fet_beginchar("> accent", "sforzato", "sforzatoaccent") - set_char_box(.9 interline#, .9 interline#, .5 interline#, .5 interline#); - save thickness, diminish; +% - thickness = 3/2 stafflinethickness; +def draw_accent (expr bottom_left, top_right, thickness, diminish) = + save thinning_start; + thinning_start = 0.4; pickup pencircle scaled thickness; - % prevent blobs at crossing lines - diminish = .75; - - top y1 = h; - lft x1 = -b; - rt x2 = w; - y2 = .25 thickness* diminish; + lft x1 = xpart bottom_left; + top y1 = ypart top_right; + lft x6 = xpart bottom_left; + bot y6 = ypart bottom_left; - rt z4 = (w,0); - x3 =0; + rt z4 = (xpart top_right, (ypart top_right + ypart bottom_left) / 2); + x5 = x3 = thinning_start [xpart top_right, xpart bottom_left] + - linethickness + 0.1 staff_space; z3 = whatever [z1, z4]; + z5 = whatever [z6, z4]; + + penpos1 (thickness, angle (z3 - z1) + 90); + penpos3 (thickness, angle (z3 - z1) + 90); + penpos4 (thickness, 90); + penpos5 (thickness, angle (z6 - z5) + 90); + penpos6 (thickness, angle (z6 - z5) + 90); + + x4 - x7 = diminish * thickness; + y7 = y4; + + fill z1l + -- z3l + -- z7 + -- z5l + -- z6l + .. lft z6{down} + .. bot z6 + .. z6r + -- z4l + ..tension 0.8.. rt z4 + ..tension 0.8.. z4r + -- z1r + .. top z1 + .. lft z1{down} + .. cycle; +enddef; - penpos2(thickness*(2 - diminish)/2 , 90); - penpos1(thickness, 90); - penpos3(thickness, 90); - draw z1 .. z3; - draw (z1 .. z3) yscaled -1; - draw z4; - penstroke z3e .. z2e; - penstroke (z3e .. z2e) yscaled -1; +fet_beginchar ("> accent", "sforzato"); + set_char_box (.9 staff_space#, .9 staff_space#, + .5 staff_space#, .5 staff_space#); - penlabels(1,2,3); - labels(4); + draw_accent ((-w, -d), (w, h), + 0.05 staff_space + linethickness, 0.7); + penlabels (1, 3, 4, 5, 6); + labels (7); fet_endchar; -fet_beginchar("staccato dot", "staccato", "staccato") + +fet_beginchar ("espr", "espr"); + set_char_box (1.9 staff_space#, 1.9 staff_space#, + .5 staff_space#, .5 staff_space#); + + draw_accent ((w - 1.78 staff_space, -d), (w, h), + 0.05 staff_space + linethickness, 0.6); + addto currentpicture also currentpicture xscaled -1; +fet_endchar; + + +fet_beginchar ("staccato dot", "staccato"); save radius; - radius# = 1.5 stafflinethickness#; - define_pixels(radius); + radius# = 0.20 * staff_space#; + define_whole_pixels (radius); + pickup pencircle scaled 2 radius; - draw (0,0); - set_char_box(radius#, radius#, radius#, radius#); + drawdot (0, 0); + + set_char_box (radius#, radius#, radius#, radius#); fet_endchar; + def draw_staccatissimo = save radius, height; - height# = .8 interline#; - radius# = 2 stafflinethickness#; - define_pixels(radius, height); + height# = .8 staff_space#; + radius# = linethickness# + .1 staff_space#; + define_whole_blacker_pixels (radius); + define_pixels (height); - draw_brush((0,0), stafflinethickness, (0, height),2 radius); - set_char_box(radius#,radius#, blot_diameter#/2, height# + radius#); + draw_brush ((0, 0), linethickness, (0, height), 2 radius); + + set_char_box (radius#, radius#, + blot_diameter# / 2, height# + radius#); enddef; -fet_beginchar("staccatissimo/martellato up", "ustaccatissimo", - "ustaccatissimo") + +fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo"); draw_staccatissimo; fet_endchar; -% -% FIXEM: scale labels too. -% -fet_beginchar("staccatissimo/martellato down", "dstaccatissimo", "dstaccatissimo") + +fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo"); draw_staccatissimo; y_mirror_char; fet_endchar; -fet_beginchar("portato/single tenuto", "tenuto", "tenuto") + +fet_beginchar ("portato/single tenuto", "tenuto"); save thick; - thick# = 1.4 stafflinethickness#; - define_pixels(thick); + thick# = 1.6 linethickness#; + define_whole_blacker_pixels (thick); - set_char_box(.6 interline#, .6 interline#, thick#/2,thick#/2); - pickup pencircle scaled thick; - lft x1 = -b; - rt x2 = w; - y1 = y2 = 0; - draw z1 .. z2; + set_char_box (.6 staff_space#, .6 staff_space#, + thick# / 2, thick# / 2); + + draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick); +fet_endchar; + + +def draw_portato = + save thick, dot_size; + thick# = 1.4 linethickness#; + dot_size# = 2.4 linethickness# + 0.08 staff_space#; + define_whole_blacker_pixels (thick, dot_size); + + set_char_box (.6 staff_space#, .6 staff_space#, + thick# / 2, .5 staff_space# + .5 dot_size#); + + draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick); + + pickup pencircle scaled dot_size; + drawdot (0, h); +enddef; + + +fet_beginchar ("portato/tenuto with staccato", "uportato"); + draw_portato; +fet_endchar; + + +fet_beginchar ("portato/tenuto with staccato", "dportato"); + draw_portato; + y_mirror_char fet_endchar; -def draw_marcato = +def draw_marcato = save fat_factor, thinness; - set_char_box(interline#/2, interline#/2, 0, 1.1 interline#); + save left_dist, right_dist, ne, se; + pair left_dist, right_dist, ne, se; + + set_char_box (staff_space# / 2, staff_space# / 2, + 0, 1.1 staff_space#); fat_factor = .3; - thinness = stafflinethickness; + thinness = linethickness; pickup pencircle scaled thinness; + rt x2 = w; lft x5 = -b; bot y5 = 0; @@ -188,127 +495,165 @@ def draw_marcato = z1 - z4 = whatever * (charwd, -charht); z4 = fat_factor [z3, z5]; - filldraw z1 -- z2 -- z3 -- z4 -- cycle; - draw z3 .. z5; + ne = unitvector (z3 - z5); + se = unitvector (z2 - z3); + + left_dist = (ne rotated 90) * 0.5 thinness; + right_dist = (se rotated 90) * 0.5 thinness; + + fill bot z5{right} + .. (z5 - left_dist){ne} + -- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint + ((z1 - right_dist) -- (z4 - right_dist))) + -- (z1 - right_dist){se} + .. bot z1{right} + -- bot z2{right} + .. (z2 + right_dist){-se} + -- (z3 + right_dist){-se} + .. top z3 + .. (z3 + left_dist){-ne} + -- (z5 + left_dist){-ne} + .. cycle; enddef; -fet_beginchar("marcato up", "umarcato", "umarcato") + +fet_beginchar ("marcato up", "umarcato"); draw_marcato; - labels(1,2,3,4,5); + labels (1, 2, 3, 4, 5); fet_endchar; % -% The down marcato char (not very much used). +% The down marcato char (not very much used). % Contrary to what some MF/TeX `gurus' believe % it is *point*-symmetric with the "up" version -fet_beginchar("marcato down", "dmarcato", "dmarcato") +% + +fet_beginchar ("marcato down", "dmarcato"); draw_marcato; xy_mirror_char; fet_endchar; - + % % used in french horn music todo % % TODO: too light at 20pt -fet_beginchar("open (unstopped)", "open", "ouvert") +% + +fet_beginchar ("open (unstopped)", "open"); save thin, height, width, thick; + height# = 5/4 width#; - height# = interline#; - thin = 1.2 stafflinethickness; - thick = 1.4 thin; - set_char_box(width#/2, width#/2, height#/2, height#/2); - - penpos1(thick, 0); - penpos2(thin, 90); + height# = staff_space#; + thin = .6 linethickness + 0.06 staff_space; + + set_char_box (width# / 2, width# / 2, height# / 2, height# / 2); + + define_pixels (width, height); + + 2 thick + 0.6 (height - 2 thin) = width; + + penpos1 (thick, 0); + penpos2 (thin, 90); + penpos3 (thick, 180); + penpos4 (thin, 270); z1r = (w, 0); z2r = (0, h); - penlabels(1,2); - penstroke z1e{up} .. {left}z2e; - addto currentpicture also currentpicture xscaled -1; - addto currentpicture also currentpicture yscaled -1; + z3r = (-w, 0); + z4r = (0, -h); + + penlabels (1, 2, 3, 4); + + penstroke z1e{up} + .. z2e{left} + .. z3e{down} + .. z4e{right} + .. cycle; fet_endchar; -fet_beginchar("plus (stopped)", "stopped", "plusstop") - save thick, size; - thick = 2 stafflinethickness; - size# = 1.1 interline#; +fet_beginchar ("plus (stopped)", "stopped"); + save hthick, vthick, size, outer_hsize, outer_vsize; - set_char_box(size#/2, size#/2, size#/2, size#/2); - pickup pencircle scaled thick; + hthick# = vthick# = 2 linethickness#; + size# = 1.1 staff_space#; + define_whole_blacker_pixels (vthick); + define_whole_vertical_blacker_pixels (hthick); - rt x1 = w; - y1 = 0; - z2 = -z1; + set_char_box (size# / 2, size# / 2, size# / 2, size# / 2); + + outer_hsize = hround ((b + w - vthick) / 2); + outer_vsize = vround ((h + d - hthick) / 2); + w := b := (2 outer_hsize + vthick) / 2; + h := d := (2 outer_vsize + hthick) / 2; - draw z1 .. z2; - draw (z1 .. z2) rotated 90; + draw_rounded_block ((-b, -d + outer_vsize), + (w, -d + outer_vsize + hthick), hthick); + draw_rounded_block ((-b + outer_hsize, -d), + (-b + outer_hsize + vthick, h), vthick); fet_endchar; -% -% FIXME: blotting -% -fet_beginchar("Upbow", "upbow", "upbow") - save ht, wd, thick; - thick = 1.4 stafflinethickness; - wd# = 1.3 interline#; - ht# = 1.6 wd#; +fet_beginchar ("Upbow", "upbow"); + save ht, wd, thick; - - set_char_box(wd#/2, wd#/2, 0, ht#); - pickup pencircle scaled thick; + thick = 1.4 linethickness; + wd# = 1.3 staff_space#; + ht# = 1.6 wd#; - x1 = 0; - bot y1 = 0; - rt x2 = w; - top y2 = h; + set_char_box (wd# / 2, wd# / 2, 0, ht#); - labels(1,2); - draw z2 -- z1 -- (z2 xscaled -1); + draw_accent ((-h, -w), (0, w), thick, 0.9); + currentpicture := currentpicture rotated -90; fet_endchar; -fet_beginchar("Downbow", "downbow", "downbow") - save stemthick, beamheight; - save wd; - define_pixels(wd) +fet_beginchar ("Downbow", "downbow"); + save stemthick, beamheight, wd; + save pat; + path pat; - wd# = 1.5 interline#; - stemthick = 1.2 stafflinethickness; + wd# = 1.5 staff_space#; + define_pixels (wd); - set_char_box(wd#/2, wd#/2, 0, 4/3 interline#); + stemthick = hround (1.2 linethickness); - beamheight = 4/10 h; + set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#); + beamheight = 4/10 h; pickup pencircle scaled blot_diameter; - top y2 - bot y1 = beamheight; - top y2 = h; - rt x1 = w; - x1 = x2; - y2 = y3; - y1 = y4; - x3 = 0; - x4 = x3; - save p; - path p; - filldraw z1 -- z2 -- z3 -- z4 --cycle; + + top y1 = h; + lft x1 = -b; + + pat := top z1{left} + .. {down}lft z1; pickup pencircle scaled stemthick; - bot y5 =0; - rt x5 = rt x6 = w; - y6 = h - beamheight; - draw z6 -- z5; - labels(1, 2,3,4,5,6); - addto currentpicture also currentpicture xscaled -1; + x2 = -b + stemthick; + y2 = h - beamheight; + lft x3 = -b; + bot y3 = -d; + + pat := pat + -- lft z3 + .. bot z3 + .. rt z3 + -- z2; + pat := pat + -- reverse pat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + + fill pat; + + labels (1, 2, 3); fet_endchar; % -% Inspired by a computer-set version of Auf dem Strom by Baerenreiter. +% Inspired by a computer-set version of Auf dem Strom by Baerenreiter. % def draw_turn = @@ -317,11 +662,11 @@ def draw_turn = save turndir; pair turndir; - wd# = 35/16 interline#; - ht# = 18/17 interline#; - darkness = 1.20 stafflinethickness; + wd# = 35/16 staff_space#; + ht# = 18/17 staff_space#; + darkness = 0.3 linethickness + 0.09 staff_space; - set_char_box(wd#/2, wd#/2, ht#/2, ht#/2); + set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2); thick_nibangle = 60; thick = 3 darkness; @@ -329,377 +674,887 @@ def draw_turn = ball_nib_thick = 2.7 darkness; ball_diam = ball_nib_thick + (h - ball_nib_thick) / 10; - x3l = w; y3 = 0; y4l = h; x4 = x2; - x2l = w/2; + x2l = w / 2; y2l = -d; z1 = (0,0); - penpos1(1.1 thick, thick_nibangle); - penpos2(thick, thick_nibangle); - penpos3(thin, 180); - penpos4(ball_nib_thick, -90); + penpos1 (1.1 thick, thick_nibangle); + penpos2 (thick, thick_nibangle); + penpos3 (thin, 180); + penpos4 (ball_nib_thick, -90); path swoosh, ploop; - swoosh := z1l{curl 0} .. z2l .. z3l{up} .. {left}z4l - -- z4r .. z3r{down} .. z2r{left} ; - fill swoosh .. (swoosh scaled -1) .. cycle; + swoosh := z1l{curl 0} + .. z2l + .. z3l{up} + .. {left}z4l + -- z4r + .. z3r{down} + .. z2r{left}; + fill swoosh + .. swoosh scaled -1 shifted (-feta_eps, -feta_eps) + .. cycle; x5r = x4; - y5r = y4l - ball_diam /2; + y5r = y4l - ball_diam / 2; z6r = z5r; - penpos5(1.6 ball_diam/2, 10); - penpos6(ball_diam/2, 150); + penpos5 (1.6 ball_diam / 2, 10); + penpos6 (ball_diam / 2, 150); - ploop := z4l{left} .. z5l .. z6l -- cycle; + ploop := z4l{left} + .. z5l + .. z6l + -- cycle; fill ploop; - fill ploop scaled -1; - - + fill ploop scaled -1 shifted (-feta_eps, -feta_eps); enddef; -fet_beginchar("Reverse turn","reverseturn","reverseturn") + +fet_beginchar ("Reverse turn", "reverseturn"); draw_turn; currentpicture := currentpicture yscaled -1; - penlabels(5,6,7); - penlabels(2,3,4); fet_endchar; -fet_beginchar("Turn","turn","turn") +fet_beginchar ("Turn", "turn"); draw_turn; - - penlabels(5,6,7); - penlabels(1,2,3,4); + penlabels (1, 2, 3, 4, 5, 6, 7); fet_endchar; - % -% Inspired by a (by now) PD edition of Durand & C'ie edition of -% Saint-Saens' Celloconcerto no. 1 +% Inspired by a (by now) PD edition of Durand & C'ie edition of +% Saint-Saens' Celloconcerto no. 1 % % FIXME take out hardcoded vars. % FIXME the two loops on the `t' should be smoother (and the left one bigger). % FIXME generic macros for serifs: top of the t and bottom of r % -% -fet_beginchar("Trill (`tr')","trill","trill") - - save start_nib_angle, ascender_extra, ex, hair_thick, fatness, - slant_angle, slant, t_fatness, r_fatness, kerning, t_overshoot, - uitschieter, bulb_size; - ; - pair slant_vec; +fet_beginchar ("Trill (`tr')", "trill"); + save start_nib_angle, ascender_extra, ex, hair_thick, fatness; + save slant, t_fatness, r_fatness, kerning, t_overshoot; + save uitschieter, bulb_size, krul_ang; + save u, v; ascender_extra# = 1/2 ex#; ascender# = ascender_extra# + ex#; - ex# = 1.5 interline#; - kerning# = .75 ex#; + ex# = 1.4 staff_space#; + kerning# = 0.6 ex#; start_nib_angle = 20; - bulb_size = 0.47; - define_pixels(ex, ascender_extra, ascender, kerning); + bulb_size = 0.8; + define_pixels (ex, ascender_extra, ascender, kerning); t_overshoot = 0.03 ex; fatness = 12/40 ex; - t_fatness = 8/10 fatness; - r_fatness = .75 fatness; - uitschieter = 21/40 ex; - hair_thick = blot_diameter; - + t_fatness = 0.78 fatness; + t_width = 1.9 t_fatness; + r_fatness = 0.78 fatness; + uitschieter = 0.48 ex; + hair_thick = linethickness; + r_flare = .5 hair_thick + 0.25 r_fatness; + r_width = 2 r_fatness + 0.25 kerning; slant = .2; - local_copy(transform)(currenttransform); - currenttransform := currenttransform slanted slant shifted (- interline, 0) ; + local_copy (transform)(currenttransform); + currenttransform := currenttransform slanted slant + shifted (-staff_space, 0); + + set_char_box (.85 staff_space#, .85 staff_space#, 0, ascender#); y1 = ascender; - x1l = 0; - x1r = t_fatness; - penpos1(start_nib_wid, start_nib_angle); - - z2 = (x1, 7/18 ex); - penpos2(start_nib_wid, start_nib_angle); - z3l = (11/10 t_fatness, - t_overshoot); + % try to position in such a way that the center is the visual + % center - z4l = (13/6 t_fatness, 5/16 ex); - penpos4(hair_thick, 180); + x1l = 0.2 staff_space; + x1r - x1l = t_fatness; + penpos1 (start_nib_wid, start_nib_angle); - 1.9 [z3l, z3r] = z4r; - z3 = .5 [z3l, z3r]; - - save t_p, krul_p; - path t_p, krul_p, r_p; + z2 = (x1, 7/18 ex); + penpos2 (start_nib_wid, start_nib_angle); + z3l = (x2l + 0.5 t_width, - t_overshoot); - t_p := z1l -- z2l{down} .. tension (1 + .5 slant) - .. z3l{right} - - .. z4l{up} -- z4r{down} - .. z3r{left} .. z2r{up} .. z1r -- cycle; - fill t_p ; + z4l = (x2l + t_width, 0.23 ex); + penpos4 (whatever, 180); % 200 + x4l - x4r = hair_thick; + + x3r = 0.5 [x4r, x2r]; +% 1.7 [x3l, x3r] = x4r; + y3r - y3l = 0.6 t_fatness; + + save krul_p; + path krul_p; krul_ang = 32; pickup pencircle scaled hair_thick; - z5 = (t_fatness/2, 2/3 ex); - - lft x6 = - uitschieter; - y6 = y5 - 1/20 ex; - - z7 = z5 + whatever*dir krul_ang; - up_angle = krul_ang; - % angle (z7-z5) + z5 = (x2l + t_fatness / 2, 2/3 ex); + lft x6 = x2l - uitschieter; + y6 = y5; % - 1/20 ex; + z7 = z5 + whatever * dir krul_ang; + up_angle = krul_ang; % = angle (z7-z5) x7 = 5/10 kerning + x5; - - penpos7(hair_thick, up_angle + 90); - - x8l = .7 [x9r, x7r]; - y8l = y7l; - penpos8(2 hair_thick, (up_angle +90)/2); + krul_p := z4{up} + ..tension 0.98.. z5 + .. z6 + .. z5{z7 - z5} + -- z7; + + z4' = point 0.85 of krul_p; + penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90); + + % the body of the `t' and the bottom loop + fill z1r{dir (angle (z1l - z1r) + 30)} + .. z1l{-dir (angle (z1r - z1l) - 45)} + -- z2l{down} + ..tension (1 + .5 slant).. z3l{right} + .. z4l{up} + .. z4'l{direction 0.85 of krul_p} + -- z4'r{-direction 0.85 of krul_p} + .. z4r{down} + .. z3r{left} + ..tension (1.5 + .7 slant).. z2r{up} + -- cycle; + + z5' = point 1.1 of krul_p; + penpos5' (hair_thick, angle (direction 1.1 of krul_p) + 90); + z5'' = point 1.5 of krul_p; + penpos5'' (hair_thick, angle (direction 1.5 of krul_p) + 90); + z5''' = point 1.8 of krul_p; + penpos5''' (hair_thick, angle (direction 1.8 of krul_p) + 90); + z6 = point 2 of krul_p; + penpos6 (hair_thick, angle (direction 2 of krul_p) + 90); + z6' = point 2.3 of krul_p; + penpos6' (hair_thick, angle (direction 2.3 of krul_p) + 90); + z6'' = point 2.6 of krul_p; + penpos6'' (hair_thick, angle (direction 2.6 of krul_p) + 90); + z6''' = point 2.9 of krul_p; + penpos6''' (hair_thick, angle (direction 2.9 of krul_p) + 90); + penpos7 (hair_thick, up_angle + 90); + z7' = point 3.2 of krul_p; + penpos7' (hair_thick, angle (direction 3.2 of krul_p) + 90); + + % the left loop + penstroke z5'e{direction 1.1 of krul_p} + .. z5''e{direction 1.5 of krul_p} + .. z5'''e{direction 1.8 of krul_p} + .. z6e{direction 2 of krul_p} + .. z6'e{direction 2.3 of krul_p} + .. z6''e{direction 2.6 of krul_p} + .. {direction 2.9 of krul_p}z6'''e; y9 = 3/4 ex; x9 = x1 + kerning; - penpos9(r_fatness, 0); + penpos9 (r_fatness, 0); x10 = x9; - y10 = 0; - penpos10(r_fatness, 0); - - krul_p := z4{up} .. tension 1.1 .. z5 - .. tension 1 and .75 .. {down}z6 - .. tension .85 and 1.1 .. z5 --- z7; - draw krul_p; - r_p := z7l{z7-z5} .. z8l{right} .. z9l{down} --- z10l -- z10r - --- z9r{up} - .. z8r{left} .. z7r{z5-z7} -- cycle; - fill r_p; - set_char_box(interline# , interline#, 0,ascender#); - + y10 = -0.3 linethickness; + penpos10 (r_fatness, 0); - penpos11(1/4 r_fatness, -20); + penpos11 (hair_thick, -4); z11r = z9r; - - z13 = (x9 + 2 r_fatness, y11 ); - penpos13(r_fatness, 180); - fill z11r{dir 70} .. z13r{down} -- z13l{up} .. z11l{dir 250} -- cycle; - penlabels(range 1 thru 15); - - draw_bulb(-1, z13r, z13l, bulb_size * r_fatness, 1.5); + z13l = (x9l + r_width, y11 - linethickness); + penpos13 (r_flare, 180); + + z15 = z13r - (bulb_size * r_fatness, 0); + z14 = 0.5 [z13l, z15] - (0, bulb_size * r_fatness); + + save before, after; + path before, after; + before := z13l{up} + .. {down}z11l; + after := z9r{up} + .. z7r{z7' - z7} + -- z7'r; + (u, v) = before intersectiontimes after; + + save before_bulb, after_bulb; + path before_bulb, after_bulb; + before_bulb := z9r{up} + ..tension 0.94.. z13r{down}; + after_bulb := z13l{up} + ..tension 1.06.. z15{down}; + (u_bulb, v_bulb) = before_bulb intersectiontimes after_bulb; + + % the connection between `t' and `r', the body of the `r', + % and the bulb + fill z7'l + -- z7l{z7 - z7'} + .. z9l{down} + -- simple_serif (z10l, z10r, -30) + -- z9r{up} + .. subpath (0, u_bulb) of before_bulb + .. subpath (v_bulb, infinity) of after_bulb + .. z14 + .. z13l{up} + .. subpath (0, u) of before + .. subpath (v, infinity) of after + -- cycle; + + penlabels (range 1 thru 15); + penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7'); fet_endchar; def draw_heel = - save radius, thickness, wall; + save radius, thickness; + save pat; + path pat; + + radius# := .5 staff_space#; - radius# := .5 interline#; + set_char_box (radius#, radius#, radius#, 2/3 staff_space#); - define_pixels(radius); - set_char_box(radius#, radius#, radius#, 2/3 interline#); + thickness := hround (1.5 linethickness); - thickness := 1.5 stafflinethickness; pickup pencircle scaled thickness; + rt x1 = b; top y1 = h; - + x2 =x1; y2 = 0; x3 = 0; bot y3 = -d; - draw z1{down} .. z2{down} .. z3{left}; - addto currentpicture also currentpicture xscaled -1; - + pat := top z3{right} + .. lft z2{up} + -- lft z1 + .. top z1 + .. rt z1 + -- rt z2{down} + .. bot z3{left}; + pat := pat + -- reverse pat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + fill pat; enddef; -fet_beginchar("left heel", "upedalheel", "upedalheel") +fet_beginchar ("left heel", "upedalheel"); draw_heel; - labels(1,2,3); + labels (1, 2, 3); fet_endchar; -fet_beginchar("right heel", "dpedalheel", "dpedalheel") + +fet_beginchar ("right heel", "dpedalheel"); draw_heel; y_mirror_char; fet_endchar; + def draw_toe = - save ht,wd; + save ht, wd, thickness; - thickness := 1.5 stafflinethickness; - ht# := 1.5 interline#; + thickness := 1.5 linethickness; + ht# := 1.5 staff_space#; wd# := 1/3 ht#; - define_pixels(ht,wd); - - - set_char_box(wd#, wd#, 0, ht#); - - pickup pencircle scaled thickness; - lft x1 = -b; - bot y1 = 0; - x2 =0; - top y2 = h; - z3 = z1 xscaled -1; + define_pixels (ht, wd); + set_char_box (wd#, wd#, 0, ht#); + draw_accent ((-h, -w), (0, w), thickness, 0.9); + currentpicture := currentpicture rotated -90; +enddef; - draw z1 -- z2 -- z3; -enddef; - -fet_beginchar("left toe", "upedaltoe", "upedaltoe") +fet_beginchar ("left toe", "upedaltoe"); draw_toe; - labels(1,2,3); fet_endchar; -fet_beginchar("right toe", "dpedaltoe", "dpedaltoe") + + +fet_beginchar ("right toe", "dpedaltoe"); draw_toe; y_mirror_char; fet_endchar; -fet_beginchar("Flageolet", "flageolet", "flageolet") - save height,width,thickness; - height#=4/15 staffsize#; - width#=height#; - thickness#=blot_diameter#; - define_pixels(height,width,thickness); - set_char_box(width#/2,width#/2,height#/2,height#/2); - - pickup pencircle scaled thickness; - x1= .5 [x2, x4]; - x1 = 0; - top y1=height/2; - rt x4 - lft x2 =width; - y2 = 0; - y4=y2; - x3=x1; - bot y3=-height/2; - penlabels(1,2,3,4); - draw z1..z2..z3..z4..cycle; -fet_endchar; +fet_beginchar ("Flageolet", "flageolet"); + save height, width, thickness, superness; -fet_beginchar("Repeatsign", "repeatsign", "repeatsign") - set_char_box(interline#, interline#, interline#, interline#); + height# = 4/15 staffsize#; + width# = height#; + thickness# = blot_diameter#; + define_pixels (height, width); + define_whole_blacker_pixels (thickness); - save dot_diam; - 2 dot_diam# = interline# - stafflinethickness#; - define_pixels(dot_diam); + set_char_box (width# / 2, width# / 2, height# / 2, height# / 2); - penpos1(dot_diam,0); - z1l=(-b,-d); - penpos2(dot_diam,0); - z2r=(w,h); - filldraw z1l--z2l{right}--z2r{down}--z1r{right}--cycle; - penlabels (1,2); + penpos1 (thickness, 90); + penpos2 (thickness, 180); + penpos3 (thickness, 270); + penpos4 (thickness, 0); - pickup pencircle scaled dot_diam; - draw (-interline/2, interline/2); - draw (interline/2, -interline/2); + x1 = 0; + y1r = h; + x4r = w; + x2r = -x4r; + y2 = 0; + y4 = y2; + x3 = x1; + y3r = -y1r; + + penlabels (1, 2, 3, 4); + + % mf doesn't handle pixel dropouts in outline objects, so we use + % `draw' if not called by mpost + if known miterlimit: + penstroke z1e + .. z2e + .. z3e + .. z4e + .. cycle; + else: + pickup pencircle scaled thickness; + draw z1 + .. z2 + .. z3 + .. z4 + .. cycle; + fi; fet_endchar; -fet_beginchar("Segno", "segno", "segno") + +% +% TODO: ARGRGHGH code dup. +% + +fet_beginchar ("Segno", "segno"); save thin, thick, ball_diam, darkness, pointheight; save wd, ht, thick_nibangle, ball_nib_thick; save turndir; pair turndir; - ht# = 3 interline#; - wd# = 2 interline#; - darkness = 1.20 stafflinethickness; + ht# = 3 staff_space#; + wd# = 2 staff_space#; + darkness = .08 staff_space + 0.4 linethickness; - set_char_box(wd#/2, wd#/2, ht#/2, ht#/2); + set_char_box (wd# / 2, wd# / 2, ht# / 2, ht# / 2); thick_nibangle = 30; thick = 3 darkness; thin = darkness; ball_nib_thick = 2.7 darkness; ball_diam = ball_nib_thick + (w - ball_nib_thick) / 10; - pointheight = 2 stafflinethickness; - + pointheight = 2 linethickness; + y3l = h; 2 x3 = x2 + x4; x4 = 0; y4 = y2; y2l = .6 h; x2l = -b; - z1 = (0,0); + z1 = (0, 0); - penpos1(thick, 2 thick_nibangle); - penpos2(thick, thick_nibangle); - penpos3(thin, -90); - penpos4(ball_nib_thick, 180-thick_nibangle); + penpos1 (thick, 2 thick_nibangle); + penpos2 (thick, thick_nibangle); + penpos3 (thin, -90); + penpos4 (ball_nib_thick, 180 - thick_nibangle); + save swoosh, ploop; path swoosh, ploop; - swoosh := z1l{curl 0} .. z2l .. z3l{right} .. {down}z4l - -- z4r .. z3r{left} .. z2r{down} ; - fill swoosh .. (swoosh scaled -1) .. cycle; - penlabels(1,2,3,4); + + swoosh := z1l{curl 0} + .. z2l + .. z3l{right} + .. {down}z4l + -- z4r + .. z3r{left} + .. z2r{down}; + fill swoosh + .. (swoosh scaled -1) + .. cycle; y5r = y4; - x5r = x4l - ball_diam /2; + x5r = x4l - ball_diam / 2; z6r = z5r; - penpos5(1.6 ball_diam/2, 100); - penpos6(ball_diam/2, 240); + penpos5 (1.6 ball_diam / 2, 100); + penpos6 (ball_diam / 2, 240); - ploop := z4l{down} .. z5l .. z6l -- cycle; + ploop := z4l{down} + .. z5l + .. z6l + -- cycle; fill ploop; fill ploop scaled -1; - penlabels(4,5,6); - penpos7(2 thin,0); - z7l=(-b,-d); - penpos8(2 thin,0); - z8r=(w,h); - filldraw z7l--z8l{right}--z8r{down}--z7r{right}--cycle; + penpos7 (2 thin, 0); + z7l = (-b, -d); + penpos8 (2 thin, 0); + z8r = (w, h); + + penstroke z7e + -- z8e; + pickup pencircle scaled 2 thin; - draw (-x2r,pointheight); - draw (x2r,-pointheight); + drawdot (-x2r, pointheight); + drawdot (x2r, -pointheight); + + penlabels (range 1 thru 8); +fet_endchar; + + +fet_beginchar ("Coda", "coda"); + save stickout, thin, thick, codawidth, codaheight; + + stickout# = 0.35 staff_space#; + codawidth# = 2/3 staff_space#; + codaheight# = staff_space#; + define_pixels (codawidth, codaheight); + + set_char_box (codawidth# + stickout#, codawidth# + stickout#, + codaheight# + stickout#, codaheight# + stickout#); + + thin = 1.2 linethickness; + 0.1 (codaheight - 2 thin) = (codawidth - 2 thick); + + penpos1 (thick, 0); + penpos2 (thin, -90); + penpos3 (thick, -180); + penpos4 (thin, -270); + + x1l = -codawidth; + y2l = codaheight; + y1 = 0; + x2 = 0; + z3 = -z1; + z4 = -z2; + + penlabels (1, 2, 3, 4); + + fill z1l{up} + .. z2l{right} + .. z3l{down} + .. z4l{left} + .. cycle; + unfill z1r{up} + .. z2r{right} + .. z3r{down} + .. z4r{left} + .. cycle; + + draw_gridline ((0, -h), (0, h), thin); + draw_gridline ((-w, 0), (w, 0), thin); +fet_endchar; + + +fet_beginchar ("Varied Coda", "varcoda"); + save thin, thick, codawidth, codaheight; + thin# = 1.2 linethickness#; + thick# = 1.0 linethickness# + 0.25 staff_space#; + codawidth# = 2/3 staff_space#; + codaheight# = staff_space#; + define_pixels (thin, thick, codawidth, codaheight); + + set_char_box (codawidth# + thick#, codawidth# + thick#, + codaheight# + thick#, codaheight# + thick#); + + x1 = -codawidth + thick - .5 blot_diameter; + y1 = y2 - thin; + x2 = codawidth - thick + .5 blot_diameter; + y2 = codaheight; + draw_square_block (z1, z2); + + x3 = -codawidth; + y3 = -codaheight; + x4 = x3 + thick; + y4 = y2; + draw_block (z3, z4); + + labels (1, 2, 3, 4); + + addto currentpicture also currentpicture scaled -1; + + draw_gridline ((0, -h), (0, h), thin); + draw_gridline ((-w, 0), (w, 0), thin); +fet_endchar; + + +def draw_comma = + save alpha, thick, thin, ht; + + alpha := 35; + thin# = 1.2 linethickness#; + thick# = 3 linethickness#; + ht# = .6 staff_space#; + define_pixels (thin, thick, ht); + + set_char_box (0, .5 staff_space#, ht#, ht#); + + penpos1 (thick, alpha); + penpos2 (thick, alpha + 90); + penpos3 (thin, 180 - alpha); + penpos4 (thin, 90 - alpha); + + x3r = 0; + x1l = x3l; + y2r = -y4l = h; + z1 = z2; + z3 = z4; + + fill z1l{dir (alpha + 90)} + .. z2r{dir alpha} + .. z1r{dir (alpha - 90)} + .. z3l{dir (270 - alpha)} + .. z4l{dir (180 - alpha)} + .. z3r{dir (90-alpha)} + .. cycle; +enddef; + + +fet_beginchar ("Right Comma", "rcomma"); + draw_comma; + penlabels (1, 2, 3, 4); +fet_endchar; + + +fet_beginchar ("Left Comma", "lcomma"); + draw_comma; + xy_mirror_char; +fet_endchar; + + +def draw_varcomma = + save thick, thin, ht, wd, alpha; + + alpha := 35; + thin# = 1.2 linethickness#; + thick# = 3 linethickness#; + ht# = .6 staff_space#; + wd# = .25 staff_space#; + define_pixels (thin, thick, ht, alpha); + + set_char_box (wd#, wd#, ht#, ht#); + + z1 = (-b, -d); + z2 = (w, h); + + draw_brush (z1, thin, z2, thick); +enddef; + + +fet_beginchar ("Right Varied Comma", "rvarcomma"); + draw_varcomma; + labels (1, 2); +fet_endchar; + + +fet_beginchar ("Left Varied Comma", "lvarcomma"); + draw_varcomma; + xy_mirror_char; +fet_endchar; + + +thick# := 1/24 designsize; +define_blacker_pixels (thick); + +rthin := 0.075 * staff_space + 0.5 linethickness; +rthick := 2 thick + rthin; + + +def draw_arpeggio = + save alpha; + save ne, nw, se, sw; + save x, y; + pair ne, nw, se, sw; + + alpha := -40; + + nw = dir (alpha + 180); + ne = dir (alpha + 90); + se = dir alpha; + sw = dir (alpha - 90); + + penpos1 (rthin, alpha + 90); + penpos2 (5/4 rthick, alpha); + penpos3 (3/4 rthick, alpha); + penpos4 (5/4 rthick, alpha); + penpos5 (rthin, alpha + 90); + + z1 = (width / 2, height) - overshoot * se; + z2 = 2 [z4, (width / 2, height / 2)]; + z3 = 1/2 [z2, z4]; + x4 = 2/8 staff_space; + y4 = rthin; + + z5 = 2 [z1, (width / 2, height / 2)]; + z6 = z2l + 1/2 rthin * sw; + z7 = z4l + 1/2 rthin * sw + 1/2 rthin * se; + z8 = 2 [z6, (width / 2, height / 2)]; + z9 = 2 [z7, (width / 2, height / 2)]; + + fill z1l{se} + -- z6 + .. z3l + .. z7{se} + -- z5l + .. z5r{nw} + -- z8 + .. z3r + .. z9{nw} + -- z1r + .. cycle; +enddef; + + +fet_beginchar ("Arpeggio", "arpeggio"); + save height, overshoot, width; + height# = staff_space#; + width# = 0.8 height#; + overshoot# = 0.25 staff_space#; + define_pixels (height, overshoot, width); + + set_char_box (0, width#, 0, height#); + draw_arpeggio; + penlabels (range 1 thru 9); + + draw_staff (-2, 2, 0.0); fet_endchar; -fet_beginchar("Wheel", "wheel", "wheel") - save thin, thick, wheelwidth, wheelheight; - thin# = 1.2 stafflinethickness#; - thick# = 3.5 stafflinethickness#; - wheelwidth# = 2/3 interline#; - wheelheight# = 1 interline#; - define_pixels(thin, thick, wheelwidth, wheelheight); - set_char_box(wheelwidth#+thick#, wheelwidth#+thick#, - wheelheight#+thick#, wheelheight#+thick#); +% +% Extendable Trill symbol. +% Not yet used +% Rename me to Trill, rename Trill to Tr? +% + +fet_beginchar ("Trill_element", "trill_element"); + save height, overshoot; + height# = staff_space#; + width# = 0.8 height#; + overshoot# = 0.25 staff_space#; + define_pixels (height, overshoot, width); + + set_char_box (0, height#, 0, width#); + draw_arpeggio; + + currentpicture := currentpicture shifted -(width / 2, height / 2); + currentpicture := currentpicture rotated 90; + currentpicture := currentpicture shifted (height / 2, width / 2); +fet_endchar; + + +% +% Arpeggio arrow by Chris Jackson +% + +def draw_arpeggio_arrow = + save thinness, height, width, overshoot; + save nw, ne, se, sw; + save alpha; + save before_left, before_right, after_left, after_right; + save u_left, v_left, u_right, v_right; + pair nw, ne, se, sw; + path before_left, before_right, after_left, after_right; + + height# = staff_space#; + width# = 0.8 height#; + overshoot# = 0.25 staff_space#; + define_pixels (height, overshoot, width); + + set_char_box (0, width#, 0, height#); + + alpha := -40; + nw = dir (alpha + 180); + ne = dir (alpha + 90); + se = dir alpha; + sw = dir (alpha - 90); + + penpos1 (rthin, alpha + 90); + penpos2 (5/4 rthick, alpha); + penpos3 (5/4 rthick, 0); + + z1 = (width / 2, height) - overshoot * se; % numbering is consistent + % with the arpeggio symbol + z2 = 2 [z4, (width / 2, height / 2)]; + z3 = (0.5 width, 0.5 height); + z4 = (0.25 staff_space, rthin); + z6 = z2l + 1/2 rthin * sw; + z9 = (width / 2, height) + overshoot * se; + + pickup pencircle scaled vround (0.5 rthin); + + bot z10 = (0.5 w, 0); + lft z11 = (0.5 w - hround (0.8 w), 0.8 h); + rt z12 = (0.5 w + hround (0.8 w), 0.8 h); + + before_left := z1l + -- z6{z6 - z1l} + .. {down}z3l; + after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw)))) + -- (z11 + 0.25 rthin * ne); + (u_left, v_left) = before_left intersectiontimes after_left; + + before_right := (z12 + 0.25 rthin * nw) + -- (z3 + (0, -0.25 rthin / cosd (angle (nw)))); + after_right := z3r{up} + .. z9{z1r - z9} + -- z1r; + (u_right, v_right) = before_right intersectiontimes after_right; + + fill subpath (0, u_left) of before_left + .. subpath (v_left, infinity) of after_left + .. top z11 + .. lft z11 + .. {dir -50}(z11 + 0.25 rthin * sw) + .. (z10 + 0.25 rthin * sw){dir -70} + .. bot z10 + .. {dir 70}(z10 + 0.25 rthin * se) + .. (z12 + 0.25 rthin * se){dir 50} + .. rt z12 + .. top z12 + .. subpath (0, u_right) of before_right + .. subpath (v_right, infinity) of after_right + .. cycle; + + % mf doesn't handle pixel dropouts in outline objects, so we use + % `draw' if not called by mpost + if not known miterlimit: + pickup pencircle scaled 0.7 rthin; + draw z1 + -- (z9 + 0.5 rthin * dir (alpha - 90)); + fi; +enddef; - penpos1(thick,0); - penpos2(thin,-90); - penpos3(thick,180); - x1l=-wheelwidth; - y2l=wheelheight; - y1=0; - x2=0; - z3 = - z1; - penlabels(1,2,3); - path halfwheel; - halfwheel := z1l{up} .. z2l{right} .. z3l{down} -- - z3r{up} .. z2r{left} .. z1r{down} .. cycle; - fill halfwheel; - fill (halfwheel scaled -1); +fet_beginchar ("Arpeggio arrow down", "arpeggio.arrow.M1"); + draw_arpeggio_arrow; + penlabels (range 1 thru 12); +fet_endchar; - pickup pencircle scaled thin; - draw (0,-h) -- (0,h); - draw (-w,0) -- (w,0); +fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1"); + draw_arpeggio_arrow; + currentpicture := currentpicture scaled -1 + shifted (w - feta_eps, h - feta_eps); fet_endchar; + +% Hmm input feta-slag; -input feta-accordion; -fet_endgroup("scripts"); +% +% Railroad tracks. We define two variants of these -- both as slightly +% tapered, comma-shaped curves and as two straight parallel slashes. +% + +fet_beginchar ("Curved caesura", "caesura.curved"); + save slant, space_between, clearance; + save alpha, pat; + save botthick, topthick; + save krom; + path pat; + + botthick = 1.5 linethickness; + topthick = 2.5 linethickness; + + pickup pencircle scaled botthick; + + slant = 3.5; + space_between# = 0.6 staff_space#; + clearance# = 0.2 staff_space#; + height# = 1.2 staff_space#; + + set_char_box (0, 2.0 staff_space#, + staff_space# - clearance#, height#); + define_pixels (clearance, height); + define_whole_pixels (space_between); + + bot y1 = -d; + top y2 = h; + + lft x1 = 0; + x2 = (y2 - y1) / slant; + + krom = 10; + + alpha = angle (z2 - z1); + penpos1 (botthick, alpha - krom); + penpos3 (botthick, alpha - krom + 90); + + penpos2 (topthick, alpha + krom); + penpos4 (topthick, alpha + krom + 90); + + z3 = z1; + z4 = z2; + + penlabels (1, 2, 3, 4); + + pat := z3r{(z1r - z1l)} + .. z4r{z2r-z2l} + .. z2r{z4l-z4r} + .. z4l{z2l-z2r} + .. z3l{z1l-z1r} + .. z1l{z3r-z3l} + .. cycle; + fill pat; + fill pat shifted (space_between, 0); +fet_endchar; + + +fet_beginchar ("Straight caesura", "caesura.straight"); + save slant, space_between, clearance; + save thick, ne, pat; + path pat; + pair ne; + + slant = 2.0; + thick = 2.88 linethickness; + + space_between# = 0.56 staff_space#; + clearance# = 0.2 staff_space#; + + set_char_box (0, 2.0 staff_space#, + staff_space# - clearance#, 1.2 staff_space#); + define_whole_pixels (space_between); + + x1 = 0; + x2 = x1 + thick; + y1 = y2 = -d; + + x3 = x4 + thick; + x4 = x1 + (h + d) / slant; + y3 = y4 = h; + + ne = unitvector (z4 - z1); + + z1a = z1 + blot_diameter * ne; + z1b = z1 + blot_diameter * right; + z2a = z2 + blot_diameter * ne; + z2b = z2 + blot_diameter * left; + + z3a = z3 - blot_diameter * ne; + z3b = z3 + blot_diameter * left; + z4a = z4 - blot_diameter * ne; + z4b = z4 + blot_diameter * right; + + pat = z1a{-ne} + .. {right}z1b + -- z2b{right} + .. {ne}z2a + -- z3a{ne} + .. {left}z3b + -- z4b{left} + .. {-ne}z4a + -- cycle; + + fill pat; + fill pat shifted (space_between, 0); + + labels(range 1 thru 4); + labels(1a, 1b, 2a, 2b, 3a, 3b, 4a, 4b); +fet_endchar; + +fet_endgroup ("scripts");