+
+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;
+ 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;
+
+