% source file of the Feta (defintively not an abbreviation for Font-En-Tja)
% music font
%
-% (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+% (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
% Jan Nieuwenhuizen <janneke@gnu.org>
%
-fet_begingroup ("scripts")
+fet_begingroup ("scripts");
def draw_fermata =
- save alpha, radius, crook_thinness, crook_fatness, dot_radius;
+ save alpha, radius, crook_thinness, crook_fatness, dot_size;
save pat;
path pat;
set_char_box (w#, w#, crook_thinness# / 2, h#);
define_pixels (radius, crook_thinness, crook_fatness);
- dot_radius = round (4/6 crook_fatness);
+
+ dot_size# = 8/6 crook_fatness#;
+ define_whole_blacker_pixels (dot_size);
penpos1 (crook_thinness, 0);
penpos2 (crook_fatness, -90);
.. {dir (90 - alpha)}z1r
.. {right}z2r;
pat := pat
- & reverse pat xscaled -1
- & cycle;
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
fill pat;
- pickup pencircle scaled 2 dot_radius;
+ pickup pencircle scaled dot_size;
x4 = 0;
- bot y4 = -crook_thinness / 2;
+ bot y4 = vround (-crook_thinness / 2);
drawdot z4;
enddef;
-fet_beginchar ("fermata up", "ufermata")
+fet_beginchar ("fermata up", "ufermata");
draw_fermata;
penlabels (1, 2, 4);
fet_endchar;
-fet_beginchar ("fermata down", "dfermata")
+fet_beginchar ("fermata down", "dfermata");
draw_fermata;
y_mirror_char;
fet_endchar;
def draw_short_fermata =
- save fat_factor, thinness, dot_radius;
- save left_dist, right_dist;
- pair left_dist, right_dist;
+ 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_radius# = 0.133 staff_space# + 1.33 linethickness#;
- define_pixels (dot_radius)
+ dot_size# = 0.266 staff_space# + 2.666 linethickness#;
+ define_whole_blacker_pixels (dot_size);
fat_factor = .11;
thinness = 1.5 linethickness;
z1 - z4 = whatever * (charwd, -charht);
z4 = fat_factor [z3, z5];
- left_dist = (unitvector (z3 - z5) rotated 90) * 0.5 thinness;
- right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 thinness;
-
- fill bot z5
- .. (z5 - left_dist)
- --- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
- ((z1 - right_dist) -- (z4 - right_dist)))
- --- (z1 - right_dist)
- .. bot z1
- --- bot z2
- .. (z2 + right_dist)
- --- (z3 + right_dist)
+ 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)
- --- (z5 + left_dist)
+ .. (z3 + left_dist){-ne}
+ -- (z5 + left_dist){-ne}
.. cycle;
- pickup pencircle scaled 2 dot_radius;
+ pickup pencircle scaled dot_size;
- x1 - 2x6 = x2;
+ x1 - 2 x6 = x2;
+ x6 := vround (x6);
bot y6 = -d;
drawdot z6;
enddef;
-fet_beginchar ("short fermata up", "ushortfermata")
+fet_beginchar ("short fermata up", "ushortfermata");
draw_short_fermata;
labels (1, 2, 3, 4, 5, 6);
fet_endchar;
-fet_beginchar ("short fermata down", "dshortfermata")
+fet_beginchar ("short fermata down", "dshortfermata");
draw_short_fermata;
xy_mirror_char;
fet_endchar;
def draw_long_fermata =
- save stemthick, beamheight, dot_radius, wd;
+ save stemthick, beamheight, dot_size, wd;
save pat;
path pat;
- define_pixels (wd, dot_radius);
-
wd# = 2.5 staff_space#;
- stemthick = 1.5 linethickness;
+ stemthick = hround (1.5 linethickness);
beamheight = 0.3 staff_space + linethickness;
- dot_radius# = 0.133 staff_space# + 1.333 * 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#);
top y1 = h;
lft x1 = -b;
- x2 = x3 = 0;
- y2 = h;
- y3 = h - beamheight;
- pat := z2
- --- top z1
- .. lft z1;
+ pat := top z1{left}
+ .. {down}lft z1;
pickup pencircle scaled stemthick;
- x4 = -b + stemthick;
- y4 = y3;
- lft x5 = -b;
- bot y5 = -d;
+ x2 = -b + stemthick;
+ y2 = h - beamheight;
+ lft x3 = -b;
+ bot y3 = -d;
pat := pat
- --- lft z5
- .. bot z5
- .. rt z5
- --- z4
- --- z3;
+ -- lft z3
+ .. bot z3
+ .. rt z3
+ -- z2;
pat := pat
- & reverse pat xscaled -1
- & cycle;
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
fill pat;
- pickup pencircle scaled 2 dot_radius;
+ pickup pencircle scaled dot_size;
- x6 = 0;
- bot y6 = -d;
+ x4 = 0;
+ bot y4 = -d;
- drawdot z6;
+ drawdot z4;
enddef;
-fet_beginchar ("long fermata up", "ulongfermata")
+fet_beginchar ("long fermata up", "ulongfermata");
draw_long_fermata;
- labels (1, 2, 3, 4, 5, 6);
+ labels (1, 2, 3, 4);
fet_endchar;
-fet_beginchar ("long fermata down", "dlongfermata")
+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_radius;
+ save stemthick, dot_size;
save opat, ipat;
path opat, ipat;
- define_pixels (ihwd, ohwd, iht, oht)
-
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);
- stemthick = 1.5 linethickness;
- ibeamheight = 0.3 staff_space;
- obeamheight = 0.5 staff_space;
- dot_radius = (iht - ibeamheight) * 4/10;
+ dot_size# = (iht# - ibeamheight#) * 8/10;
+ define_whole_blacker_pixels (dot_size);
set_char_box (ohwd#, ohwd#, 0, oht#);
top y1 = oht;
lft x1 = -ohwd;
- x2 = x3 = 0;
- y2 = oht;
- y3 = oht - obeamheight;
top y11 = iht;
lft x11 = -ihwd;
- x12 = x13 = 0;
- y12 = iht;
- y13 = iht - ibeamheight;
- opat := z2
- --- top z1
- .. lft z1;
- ipat := z12
- --- top z11
- .. lft z11;
+ opat := top z1{left}
+ .. {down}lft z1;
+ ipat := top z11{left}
+ .. {down}lft z11;
pickup pencircle scaled stemthick;
- x4 = -ohwd + stemthick;
- y4 = y3;
- lft x5 = -ohwd;
- bot y5 = 0;
- x14 = -ihwd + stemthick;
- y14 = y13;
- lft x15 = -ihwd;
- bot y15 = 0;
+ 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 z5
- .. bot z5
- .. rt z5
- --- z4
- --- z3;
+ -- lft z3
+ .. bot z3
+ .. rt z3
+ -- z2;
opat := opat
- & reverse opat xscaled -1
- & cycle;
+ -- reverse opat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
ipat := ipat
- --- lft z15
- .. bot z15
- .. rt z15
- --- z14
- --- z13;
+ -- lft z13
+ .. bot z13
+ .. rt z13
+ -- z12;
ipat := ipat
- & reverse ipat xscaled -1
- & cycle;
+ -- reverse ipat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
fill opat;
fill ipat;
- pickup pencircle scaled 2 dot_radius;
+ pickup pencircle scaled dot_size;
- x6 = 0;
- bot y6 = -d;
+ x4 = 0;
+ bot y4 = -d;
- drawdot z6;
+ drawdot z4;
enddef;
-fet_beginchar ("very long fermata up", "uverylongfermata")
+fet_beginchar ("very long fermata up", "uverylongfermata");
draw_very_long_fermata;
- labels (1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 6);
+ labels (1, 2, 3, 11, 12, 13, 4);
fet_endchar;
-fet_beginchar ("very long fermata down", "dverylongfermata")
+fet_beginchar ("very long fermata down", "dverylongfermata");
draw_very_long_fermata;
y_mirror_char;
fet_endchar;
% the same way in the score.
%
-fet_beginchar ("Thumb", "thumb")
+fet_beginchar ("Thumb", "thumb");
save thin, height, width, thick, depth;
height# = 5/4 width#;
height# = staff_space#;
fet_endchar;
-%
-% FIXME: rounded endings
%
% `\accent' is TeX reserved.
%
def draw_accent (expr bottom_left, top_right, thickness, diminish) =
+ save thinning_start;
+ thinning_start = 0.4;
pickup pencircle scaled thickness;
lft x1 = xpart bottom_left;
bot y6 = ypart bottom_left;
rt z4 = (xpart top_right, (ypart top_right + ypart bottom_left) / 2);
- x5 = x3 = (xpart top_right + xpart 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];
y7 = y4;
fill z1l
- --- z3l
- --- z7
- --- z5l
- --- z6l
+ -- z3l
+ -- z7
+ -- z5l
+ -- z6l
.. lft z6{down}
.. bot z6
.. z6r
- --- z4l
+ -- z4l
..tension 0.8.. rt z4
..tension 0.8.. z4r
- --- z1r
+ -- z1r
.. top z1
.. lft z1{down}
.. cycle;
enddef;
-fet_beginchar ("> accent", "sforzato")
+fet_beginchar ("> accent", "sforzato");
set_char_box (.9 staff_space#, .9 staff_space#,
.5 staff_space#, .5 staff_space#);
draw_accent ((-w, -d), (w, h),
- 0.05 staff_space + linethickness, 0.6);
+ 0.05 staff_space + linethickness, 0.7);
penlabels (1, 3, 4, 5, 6);
labels (7);
fet_endchar;
-fet_beginchar ("espr", "espr")
+fet_beginchar ("espr", "espr");
set_char_box (1.9 staff_space#, 1.9 staff_space#,
.5 staff_space#, .5 staff_space#);
fet_endchar;
-fet_beginchar ("staccato dot", "staccato")
+fet_beginchar ("staccato dot", "staccato");
save radius;
radius# = 0.20 * staff_space#;
define_whole_pixels (radius);
save radius, height;
height# = .8 staff_space#;
radius# = linethickness# + .1 staff_space#;
- define_whole_pixels (radius);
+ define_whole_blacker_pixels (radius);
define_pixels (height);
draw_brush ((0, 0), linethickness, (0, height), 2 radius);
enddef;
-fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo")
+fet_beginchar ("staccatissimo/martellato up", "ustaccatissimo");
draw_staccatissimo;
fet_endchar;
-fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo")
+fet_beginchar ("staccatissimo/martellato down", "dstaccatissimo");
draw_staccatissimo;
y_mirror_char;
fet_endchar;
-fet_beginchar ("portato/single tenuto", "tenuto")
+fet_beginchar ("portato/single tenuto", "tenuto");
save thick;
thick# = 1.6 linethickness#;
- define_whole_pixels (thick);
+ define_whole_blacker_pixels (thick);
set_char_box (.6 staff_space#, .6 staff_space#,
- thick# / 2,thick# / 2);
+ thick# / 2, thick# / 2);
- pickup pencircle scaled thick;
draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
fet_endchar;
def draw_portato =
- save thick, radius;
+ save thick, dot_size;
thick# = 1.4 linethickness#;
- radius# = 1.2 linethickness# + 0.04 staff_space#;
- define_whole_pixels (thick, radius);
+ 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# + radius#);
+ thick# / 2, .5 staff_space# + .5 dot_size#);
draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
- pickup pencircle scaled 2 radius;
+ pickup pencircle scaled dot_size;
drawdot (0, h);
enddef;
-fet_beginchar ("portato/tenuto with staccato", "uportato")
+fet_beginchar ("portato/tenuto with staccato", "uportato");
draw_portato;
fet_endchar;
-fet_beginchar ("portato/tenuto with staccato", "dportato")
+fet_beginchar ("portato/tenuto with staccato", "dportato");
draw_portato;
y_mirror_char
fet_endchar;
def draw_marcato =
save fat_factor, thinness;
- save left_dist, right_dist;
- pair left_dist, right_dist;
+ 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#);
z1 - z4 = whatever * (charwd, -charht);
z4 = fat_factor [z3, z5];
- left_dist = (unitvector (z3 - z5) rotated 90) * 0.5 thinness;
- right_dist = (unitvector (z2 - z3) rotated 90) * 0.5 thinness;
-
- fill bot z5
- .. (z5 - left_dist)
- --- (((z5 - left_dist) -- (z3 - left_dist)) intersectionpoint
- ((z1 - right_dist) -- (z4 - right_dist)))
- --- (z1 - right_dist)
- .. bot z1
- --- bot z2
- .. (z2 + right_dist)
- --- (z3 + right_dist)
+ 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)
- --- (z5 + left_dist)
+ .. (z3 + left_dist){-ne}
+ -- (z5 + left_dist){-ne}
.. cycle;
enddef;
-fet_beginchar ("marcato up", "umarcato")
+fet_beginchar ("marcato up", "umarcato");
draw_marcato;
labels (1, 2, 3, 4, 5);
fet_endchar;
% it is *point*-symmetric with the "up" version
%
-fet_beginchar ("marcato down", "dmarcato")
+fet_beginchar ("marcato down", "dmarcato");
draw_marcato;
xy_mirror_char;
fet_endchar;
% TODO: too light at 20pt
%
-fet_beginchar ("open (unstopped)", "open")
+fet_beginchar ("open (unstopped)", "open");
save thin, height, width, thick;
height# = 5/4 width#;
fet_endchar;
-fet_beginchar ("plus (stopped)", "stopped")
- save thick, size;
+fet_beginchar ("plus (stopped)", "stopped");
+ save hthick, vthick, size, outer_hsize, outer_vsize;
- thick = 2 linethickness;
+ hthick# = vthick# = 2 linethickness#;
size# = 1.1 staff_space#;
+ define_whole_blacker_pixels (vthick);
+ define_whole_vertical_blacker_pixels (hthick);
set_char_box (size# / 2, size# / 2, size# / 2, size# / 2);
- draw_rounded_block ((-b, -thick / 2), (w, thick / 2), thick);
- addto currentpicture also currentpicture rotated 90;
+ 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_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;
-fet_beginchar ("Upbow", "upbow")
+fet_beginchar ("Upbow", "upbow");
save ht, wd, thick;
thick = 1.4 linethickness;
fet_endchar;
-fet_beginchar ("Downbow", "downbow")
+fet_beginchar ("Downbow", "downbow");
save stemthick, beamheight, wd;
save pat;
path pat;
+ wd# = 1.5 staff_space#;
define_pixels (wd);
- wd# = 1.5 staff_space#;
- stemthick = 1.2 linethickness;
+ stemthick = hround (1.2 linethickness);
set_char_box (wd# / 2, wd# / 2, 0, 4/3 staff_space#);
top y1 = h;
lft x1 = -b;
- x2 = x3 = 0;
- y2 = h;
- y3 = h - beamheight;
- pat := z2
- --- top z1
- .. lft z1;
+ pat := top z1{left}
+ .. {down}lft z1;
pickup pencircle scaled stemthick;
- x4 = -b + stemthick;
- y4 = y3;
- lft x5 = -b;
- bot y5 = -d;
+ x2 = -b + stemthick;
+ y2 = h - beamheight;
+ lft x3 = -b;
+ bot y3 = -d;
pat := pat
- --- lft z5
- .. bot z5
- .. rt z5
- --- z4
- --- z3;
+ -- lft z3
+ .. bot z3
+ .. rt z3
+ -- z2;
pat := pat
- & reverse pat xscaled -1
- & cycle;
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
fill pat;
+
+ labels (1, 2, 3);
fet_endchar;
%
.. z3r{down}
.. z2r{left};
fill swoosh
- .. (swoosh scaled -1)
+ .. swoosh scaled -1 shifted (-feta_eps, -feta_eps)
.. cycle;
x5r = x4;
.. z6l
-- cycle;
fill ploop;
- fill ploop scaled -1;
+ fill ploop scaled -1 shifted (-feta_eps, -feta_eps);
enddef;
-fet_beginchar ("Reverse turn","reverseturn")
+fet_beginchar ("Reverse turn", "reverseturn");
draw_turn;
currentpicture := currentpicture yscaled -1;
fet_endchar;
-fet_beginchar ("Turn","turn")
+fet_beginchar ("Turn", "turn");
draw_turn;
penlabels (1, 2, 3, 4, 5, 6, 7);
fet_endchar;
% FIXME generic macros for serifs: top of the t and bottom of r
%
-fet_beginchar ("Trill (`tr')", "trill")
+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;
krul_p := z4{up}
..tension 0.98.. z5
.. z6
- .. z5
- --- z7;
+ .. z5{z7 - z5}
+ -- z7;
z4' = point 0.85 of krul_p;
penpos4' (hair_thick, angle (direction 0.85 of krul_p) + 90);
.. z4r{down}
.. z3r{left}
..tension (1.5 + .7 slant).. z2r{up}
- .. z1r
-- cycle;
z5' = point 1.1 of krul_p;
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.3 of krul_p;
- penpos7' (hair_thick, angle (direction 3.3 of krul_p) + 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}
penpos11 (hair_thick, -4);
z11r = z9r;
- z13l = (x9l + r_width, y11 - linethickness);
+ z13l = (x9l + r_width, y11 - linethickness);
penpos13 (r_flare, 180);
z15 = z13r - (bulb_size * r_fatness, 0);
before := z13l{up}
.. {down}z11l;
after := z9r{up}
- .. z7r
- --- z7'r;
+ .. 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 part of the bulb
+ % and the bulb
fill z7'l
- --- z7l
+ -- z7l{z7 - z7'}
.. z9l{down}
- --- simple_serif (z10l, z10r, -30)
- --- z9r{up}
- ..tension 0.94.. z13r{down}
- -- z15{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;
- % the rest of the bulb
- fill z15{up}
- ..tension 1.06.. z13l{down}
- .. z14
- .. cycle;
-
penlabels (range 1 thru 15);
penlabels (4', 5', 5'', 5''', 6', 6'', 6''', 7');
fet_endchar;
path pat;
radius# := .5 staff_space#;
- define_pixels (radius);
set_char_box (radius#, radius#, radius#, 2/3 staff_space#);
- thickness := 1.5 linethickness;
+ thickness := hround (1.5 linethickness);
pickup pencircle scaled thickness;
pat := top z3{right}
.. lft z2{up}
- .. lft z1{up}
+ -- lft z1
.. top z1
- .. rt z1{down}
- .. rt z2{down}
+ .. rt z1
+ -- rt z2{down}
.. bot z3{left};
pat := pat
- & reverse pat xscaled -1
- & cycle;
+ -- reverse pat xscaled -1 shifted (-feta_eps, 0)
+ -- cycle;
fill pat;
enddef;
-fet_beginchar ("left heel", "upedalheel")
+fet_beginchar ("left heel", "upedalheel");
draw_heel;
labels (1, 2, 3);
fet_endchar;
-fet_beginchar ("right heel", "dpedalheel")
+fet_beginchar ("right heel", "dpedalheel");
draw_heel;
y_mirror_char;
fet_endchar;
enddef;
-fet_beginchar ("left toe", "upedaltoe")
+fet_beginchar ("left toe", "upedaltoe");
draw_toe;
fet_endchar;
-fet_beginchar ("right toe", "dpedaltoe")
+fet_beginchar ("right toe", "dpedaltoe");
draw_toe;
y_mirror_char;
fet_endchar;
-fet_beginchar ("Flageolet", "flageolet")
- save height, width, thickness;
- height #= 4/15 staffsize#;
- width #= height#;
- thickness #= blot_diameter#;
- define_pixels (height, width, thickness);
+fet_beginchar ("Flageolet", "flageolet");
+ save height, width, thickness, superness;
- set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
+ height# = 4/15 staffsize#;
+ width# = height#;
+ thickness# = blot_diameter#;
+ define_pixels (height, width);
+ define_whole_blacker_pixels (thickness);
- pickup pencircle scaled thickness;
+ set_char_box (width# / 2, width# / 2, height# / 2, height# / 2);
penpos1 (thickness, 90);
penpos2 (thickness, 180);
penpos3 (thickness, 270);
penpos4 (thickness, 0);
- x1= .5 [x2, x4];
x1 = 0;
- top y1 = height / 2;
- rt x4 - lft x2 = width;
+ y1r = h;
+ x4r = w;
+ x2r = -x4r;
y2 = 0;
y4 = y2;
x3 = x1;
- bot y3 = -height / 2;
+ y3r = -y1r;
penlabels (1, 2, 3, 4);
- penstroke z1e
- .. z2e
- .. z3e
- .. z4e
- .. cycle;
+ % 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;
% TODO: ARGRGHGH code dup.
%
-fet_beginchar ("Segno", "segno")
+fet_beginchar ("Segno", "segno");
save thin, thick, ball_diam, darkness, pointheight;
save wd, ht, thick_nibangle, ball_nib_thick;
save turndir;
fet_endchar;
-fet_beginchar ("Coda", "coda")
+fet_beginchar ("Coda", "coda");
save stickout, thin, thick, codawidth, codaheight;
stickout# = 0.35 staff_space#;
penlabels (1, 2, 3, 4);
- penstroke z1e{up}
- .. z2e{right}
- .. z3e{down}
- .. z4e{left}
- .. cycle;
+ 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);
+ draw_gridline ((0, -h), (0, h), thin);
+ draw_gridline ((-w, 0), (w, 0), thin);
fet_endchar;
-fet_beginchar ("Varied Coda", "varcoda")
+fet_beginchar ("Varied Coda", "varcoda");
save thin, thick, codawidth, codaheight;
thin# = 1.2 linethickness#;
thick# = 1.0 linethickness# + 0.25 staff_space#;
set_char_box (codawidth# + thick#, codawidth# + thick#,
codaheight# + thick#, codaheight# + thick#);
- x1 = -codawidth;
+ x1 = -codawidth + thick - .5 blot_diameter;
y1 = y2 - thin;
- x2 = codawidth;
+ x2 = codawidth - thick + .5 blot_diameter;
y2 = codaheight;
- draw_rounded_block (z1, z2, blot_diameter);
+ draw_square_block (z1, z2);
- x3 = x1;
+ x3 = -codawidth;
y3 = -codaheight;
- x4 = x1 + thick;
+ x4 = x3 + thick;
y4 = y2;
- draw_rounded_block (z3, z4, blot_diameter);
+ draw_block (z3, z4);
labels (1, 2, 3, 4);
.. z2r{dir alpha}
.. z1r{dir (alpha - 90)}
.. z3l{dir (270 - alpha)}
- .. z4l{dir (alpha + 180)}
+ .. z4l{dir (180 - alpha)}
.. z3r{dir (90-alpha)}
.. cycle;
enddef;
save alpha;
save ne, nw, se, sw;
save x, y;
- pair ne,nw,se,sw;
+ pair ne, nw, se, sw;
alpha := -40;
z9 = 2 [z7, (width / 2, height / 2)];
fill z1l{se}
- --- z6
+ -- z6
.. z3l
.. z7{se}
- --- z5l
+ -- z5l
.. z5r{nw}
- --- z8
+ -- z8
.. z3r
.. z9{nw}
- --- z1r
+ -- z1r
.. cycle;
enddef;
fet_beginchar ("Arpeggio", "arpeggio");
-% draw_staff (-2, 2, 0.0);
-
save height, overshoot, width;
height# = staff_space#;
width# = 0.8 height#;
set_char_box (0, width#, 0, height#);
draw_arpeggio;
penlabels (range 1 thru 9);
+
+ draw_staff (-2, 2, 0.0);
fet_endchar;
z6 = z2l + 1/2 rthin * sw;
z9 = (width / 2, height) + overshoot * se;
- bot z10 = (0.5 w, 0);
- lft z11 = (-0.3 w, 0.8 h);
- rt z12 = (1.3 w, 0.8 h);
+ pickup pencircle scaled vround (0.5 rthin);
- pickup pencircle scaled 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{z6 - z1l}
.. {down}z3l;
after_left := (z3 + (0, -0.25 rthin / cosd (angle (nw))))
-- (z11 + 0.25 rthin * ne);
before_right := (z12 + 0.25 rthin * nw)
-- (z3 + (0, -0.25 rthin / cosd (angle (nw))));
after_right := z3r{up}
- .. z9
- --- z1r;
+ .. z9{z1r - z9}
+ -- z1r;
(u_right, v_right) = before_right intersectiontimes after_right;
fill subpath (0, u_left) of before_left
.. subpath (v_right, infinity) of after_right
.. cycle;
-% fill (z3 + (0, -0.25 rthin / cosd (angle (nw))))
-% -- (z12 + 0.25 rthin * nw)
-% .. top z12
-% .. rt z12
-% .. (z12 + 0.25 rthin * se){dir -130}
-% .. {dir -110}(z10 + 0.25 rthin * se)
-% .. bot z10
-% .. (z10 + 0.25 rthin * sw){dir 110}
-% .. {dir 130}(z11 + 0.25 rthin * sw)
-% .. lft z11
-% .. top z11
-% .. (z11 + 0.25 rthin * ne)
-% -- 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;
fet_beginchar ("Arpeggio arrow up", "arpeggio.arrow.1");
draw_arpeggio_arrow;
currentpicture := currentpicture scaled -1
- shifted (0.8 staff_space,
- staff_space);
+ shifted (w - feta_eps, h - feta_eps);
fet_endchar;
input feta-slag;
-% railroad tracks.
%
-% I actually have no clue how they should look, so we use a slightly curvy
-% and tapered shape.
+% Railroad tracks. We define two variants of these -- both as slightly
+% tapered, comma-shaped curves and as two straight parallel slashes.
%
-fet_beginchar ("Caesura", "caesura");
+fet_beginchar ("Curved caesura", "caesura.curved");
save slant, space_between, clearance;
- save alpha, p;
+ save alpha, pat;
save botthick, topthick;
save krom;
- path p;
+ path pat;
botthick = 1.5 linethickness;
topthick = 2.5 linethickness;
set_char_box (0, 2.0 staff_space#,
staff_space# - clearance#, height#);
- define_pixels (space_between, clearance, height);
+ define_pixels (clearance, height);
+ define_whole_pixels (space_between);
bot y1 = -d;
top y2 = h;
penlabels (1, 2, 3, 4);
- p := z3r{(z1r - z1l)}
- .. z4r{z2r-z2l}
- .. z2r{z4l-z4r}
- .. z4l{z2l-z2r}
- .. z3l{z1l-z1r}
- .. z1l{z3r-z3l}
- .. cycle;
- fill p;
- fill p shifted (space_between, 0);
+ 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");