% % feta-toevallig.mf -- implement Accidentals % % (c) 1997--2006 Han-Wen Nienhuys % % % also show in other configuration wrt staff lines. % def draw_shifted_too = if test > 0: fet_beginchar ("shifted too", ""); set_char_box (0, 0,0,0); currentpicture := remember_pic; draw_staff (-2, 2, 0.5); fet_endchar; fi; enddef; % % Accidentals from various sources, notably % % Baerenreiter edition of Schuberts `Auf dem Strom' (sharp, natural) % F Hofmeister edition of Muellers `Etueden fuer Horn' (double sharp, flat) % % % Naming for microtonal % % BASES SLASHES STEMS % % mirroredflat.flat.slashslash % % standard sharp: % sharp.slashslash.stemstem % sharp.slashslash.stem fet_begingroup ("accidentals"); save remember_pic; picture remember_pic; save sharp_beamheight; sharp_beamheight# := 0.3 staff_space# + stafflinethickness#; % % The beams of most sharps have horizontal endings (as if drawn with % a square pen). [Wanske] does not mention this, so we'll just ignore % this fact. % def draw_meta_sharp (expr width, offset) = save beamwidth, beamslope; save ne, nw_dist; pair ne, nw_dist; beamwidth := width; define_whole_vertical_blacker_pixels (sharp_beamheight); clearxy; beamslope = sharp_beamheight / beamwidth; pickup pencircle scaled 2 blot_diameter; rt x2 - lft x1 = beamwidth; y2 - y1 = sharp_beamheight; .5 [z1, z3] = (.5 w, offset); x3 = x2; top y2 - bot y3 = sharp_beamheight; x4 = x1; top y1 - bot y4 = sharp_beamheight; ne = unitvector (z2 - z1); nw_dist = (ne rotated 90) * blot_diameter; fill lft z1{up} ... (z1 + nw_dist){ne} -- (z2 + nw_dist){ne} ... rt z2{down} -- rt z3{down} ... (z3 - nw_dist){-ne} -- (z4 - nw_dist){-ne} ... lft z4{up} -- cycle; labels (1, 2, 3, 4); enddef; fet_beginchar ("Sharp", "sharp"); save stem, stemx, stemwidth; save outer_space, interbeam; stemwidth# := stafflinethickness# + .05 staff_space#; define_whole_blacker_pixels (stemwidth); interbeam := 1.05 staff_space_rounded; set_char_box (0, 1.1 staff_space#, 1.5 staff_space#, 1.5 staff_space#); stem := 7 / 16 * w; stemx := hround stem; outer_space := hround ((w - stemx - stemwidth) / 2); w := 2 outer_space + stemx + stemwidth; d := d - feta_space_shift; draw_meta_sharp (w, -.5 interbeam); draw_meta_sharp (w, -.5 interbeam + vround interbeam); pickup pencircle scaled stemwidth; lft x5 = lft x6 = outer_space; lft x7 = lft x8 = outer_space + stemx; bot y5 = -d; top y6 = vround (1.5 staff_space - stem * beamslope); bot y7 = -top y6 + feta_space_shift; top y8 = h; labels (5, 6, 7, 8); draw_gridline (z5, z6, stemwidth); draw_gridline (z7, z8, stemwidth); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem"); save stem, stemwidth; save outer_space, interbeam; stemwidth# := stafflinethickness# + .05 staff_space#; define_whole_blacker_pixels (stemwidth); interbeam := 1.05 staff_space_rounded; set_char_box (0, 0.7 staff_space#, 1.5 staff_space#, 1.5 staff_space#); stem := 7 / 16 * w; outer_space := hround ((w - stemwidth) / 2); w := 2 outer_space + stemwidth; d := d - feta_space_shift; draw_meta_sharp (w, -.5 interbeam); draw_meta_sharp (w, -.5 interbeam + vround interbeam); pickup pencircle scaled stemwidth; lft x5 = lft x6 = outer_space; top y6 = vround (1.5 staff_space - .5 stem); bot y5 = -top y6 + feta_space_shift; labels (5, 6); draw_gridline (z5, z6, stemwidth); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem"); save stem, stemx, stemwidth; save outer_space, interbeam; save sharp_beamheight; sharp_beamheight# := 0.22 staff_space# + stafflinethickness#; stemwidth# := stafflinethickness# + .05 staff_space#; define_whole_blacker_pixels (stemwidth); interbeam := 1.2 staff_space_rounded; set_char_box (0, 1.1 staff_space#, 1.5 staff_space#, 1.5 staff_space#); stem := 7 / 16 * w; stemx := hround stem; outer_space := hround ((w - stemx - stemwidth) / 2); w := 2 outer_space + stemx + stemwidth; d := d - feta_space_shift; draw_meta_sharp (.88 w, -.5 interbeam); draw_meta_sharp (w, 0); draw_meta_sharp (.88 w, -.5 interbeam + vround interbeam); pickup pencircle scaled stemwidth; lft x5 = lft x6 = outer_space; lft x7 = lft x8 = outer_space + stemx; bot y5 = -d; top y6 = vround (1.5 staff_space - stem * beamslope); bot y7 = -top y6 + feta_space_shift; top y8 = h; labels (5, 6, 7, 8); draw_gridline (z5, z6, stemwidth); draw_gridline (z7, z8, stemwidth); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem"); save stem, stemx, stemwidth; save outer_space, interbeam; save sharp_beamheight; sharp_beamheight# := 0.22 staff_space# + stafflinethickness#; stemwidth# := stafflinethickness# + .05 staff_space#; define_whole_blacker_pixels (stemwidth); interbeam := 1.2 staff_space_rounded; set_char_box (0, 0.95 staff_space#, 1.3 staff_space#, 1.3 staff_space#); stem := 7 / 16 * w; outer_space := hround ((w - stemwidth) / 2); w := 2 outer_space + stemwidth; d := d - feta_space_shift; draw_meta_sharp (.8 w, -.5 interbeam); draw_meta_sharp (w, 0); draw_meta_sharp (.8 w, -.5 interbeam + vround interbeam); pickup pencircle scaled stemwidth; lft x5 = lft x6 = outer_space; top y6 = vround (1.5 staff_space - .5 stem); bot y5 = -top y6 + feta_space_shift; labels (5, 6); draw_gridline (z5, z6, stemwidth); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem"); save stem, stemx, stemwidth; save outer_space, interbeam; stemwidth# := stafflinethickness# + .05 staff_space#; define_whole_blacker_pixels (stemwidth); interbeam := 1.05 staff_space_rounded; set_char_box (0, 1.6 staff_space#, 1.5 staff_space#, 1.5 staff_space#); stem := 9 / 32 * w; stemx := hround stem; outer_space := hround ((w - 2 stemx - stemwidth) / 2); w := 2 outer_space + 2 stemx + stemwidth; d := d - feta_space_shift; draw_meta_sharp (w, -.5 interbeam); draw_meta_sharp (w, -.5 interbeam + vround interbeam); pickup pencircle scaled stemwidth; lft x5 = lft x6 = outer_space; lft x7 = lft x8 = outer_space + stemx; lft x9 = lft x10 = outer_space + 2 stemx; bot y5 = -d; top y6 = vround (1.5 staff_space - 2 stem * beamslope); bot y9 = -top y6 + feta_space_shift; top y10 = h; y7 = .5 [y5, y9]; y8 = .5 [y6, y10]; labels (5, 6, 7, 8, 9, 10); draw_gridline (z5, z6, stemwidth); draw_gridline (z7, z8, stemwidth); draw_gridline (z9, z10, stemwidth); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; % % The stems of the natural are brushed (at least, in Barenreiter SCS) % fet_beginchar ("Natural", "natural"); save stemwidth, top_stem_thick; save ne, pat_top, pat_bottom; pair ne; path pat_top, pat_bottom; top_stem_thick# = stafflinethickness# + .10 staff_space#; stemwidth# = 0.09 staff_space# + .5 stafflinethickness#; define_whole_blacker_pixels (top_stem_thick, stemwidth); set_char_box (0, 2/3 staff_space#, 1.5 staff_space#, 1.5 staff_space#); d := d - feta_space_shift; pickup pencircle scaled stemwidth; penpos1 (top_stem_thick, 0); penpos3 (top_stem_thick, 0); penpos2 (stemwidth, 0); penpos4 (stemwidth, 0); x2r = w; x4l = 0; x3 = x2; x1 = x4; y1 = h; y3 = -d; top y2 = vround (staff_space - 3/2 stafflinethickness); y4 = -y2 + feta_space_shift; pat_bottom := z4r{z4r - z1r} .. bot z4 .. z4l{z1l - z4l}; fill simple_serif (z1l, z1r, -30) -- pat_bottom -- cycle; pat_top := z2r{z2r - z3r} .. top z2 .. z2l{z3l - z2l}; fill simple_serif (z3l, z3r, 30) -- pat_top -- cycle; ne = (x2 - x4, stafflinethickness); z11' = z3l + whatever * (z2l - z3l); y11' = vround (.5 (staff_space - stafflinethickness)); z11 = z11' + whatever * ne; x11 = x12; z12 = directionpoint -ne of pat_top; z13 = z12 + whatever * ne; x13 = x1; z14 = z11 + whatever * ne; x14 = x1; z21' = z4r + whatever * (z1r - z4r); y21' = -y11' + feta_space_shift; z21 = z21' + whatever * ne; x21 = x22; z22 = directionpoint -ne of pat_bottom; z23 = z22 + whatever * ne; x23 = x3; z24 = z21 + whatever * ne; x24 = x3; fill z11 -- z12 -- z13 -- z14 -- cycle; fill z21 -- z22 -- z23 -- z24 -- cycle; penlabels (1, 2, 3, 4); labels (11, 11', 12, 13, 14, 21, 21', 22, 23, 24); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; % % Dedicated to my mom. (3/10/97) % % Mamma, ik hou van je; kom je alsjeblieft terug? % -- HW % % % TODO: remove crook_fatness % TODO: document, simplify! % def draw_meta_flat (expr xcenter, w, crook_fatness) = save crook_thinness; save bottom_overshoot, bot_crook_dir; save top_stem_thick, bottom_stem_thick, hair, smaller_hole; save top_crook_thinness; save zwiep; save center; pair center, bot_crook_dir; save clearing; clearxy; % the stem shouldn't reach the top staff line. %% TODO: should take from height. % % TODO: parameterize this % if w >= 0.75 staff_space: smaller_hole = 0.35 stafflinethickness; else: smaller_hole = 0; fi clearing = 1.7 stafflinethickness; crook_thinness = .7 stafflinethickness + .06 staff_space; top_crook_thinness = 1 stafflinethickness + .065 staff_space; bottom_overshoot = stafflinethickness; bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#; top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#; define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick); if odd (top_stem_thick - bottom_stem_thick): top_stem_thick := top_stem_thick - 1; fi; center = (xcenter, 0); x1l = hround (xcenter - .5 top_stem_thick); y1 = vround (2 staff_space - clearing); x2l = hround (xcenter - .5 bottom_stem_thick); y2 = -.5 staff_space - .5 stafflinethickness; penpos1 (top_stem_thick, 0); penpos2 (bottom_stem_thick, 0); y3l = vfloor ((staff_space - stafflinethickness) / 2); z3l = whatever [z2r, z1r]; z3r = .3 [z2r, z1r] + (smaller_hole, 0); x3r := hceiling x3r; % we insert z3l to get better conversion with mf2pt1 fill simple_serif (z1r, z1l, 30) -- z2l -- z2r -- z3l -- cycle; z10 = whatever [z2r, z1r] + (smaller_hole, 0); y10 = -1/10 staff_space; x10 := hceiling x10; x11 = xcenter + bottom_overshoot / 3; y11 = -vround (.5 (staff_space + stafflinethickness) + bottom_overshoot); penpos4 (whatever, 53); y4l - y4r = top_crook_thinness; y5r = .15 staff_space; x5l = hround (w + xcenter); y4 = staff_space / 2; x4r = .45 [x5r, x3r]; y4l := vround y4l; penpos5 (crook_fatness, -175); bot_crook_dir = unitvector ((x5l, 0) - z11); z8 = z11 + whatever * bot_crook_dir; y8 = -staff_space / 2; z7 = z8 + whatever * bot_crook_dir + crook_thinness * (bot_crook_dir rotated 90); x7 = .1 [x3r, x8]; unfill z3r{z3r - z10} .. z4r{right} .. z5r{down} .. z7{-bot_crook_dir} & z7 .. z10{z3r - z10} -- cycle; fill z2l{down} .. z11{right} .. z8{bot_crook_dir} .. z5l{up} .. z4l{left} .. z3l -- cycle; enddef; % % unfortunately, 600dpi is not enough to show the brush of the stem. % fet_beginchar ("Flat", "flat"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, w, 0.31 staff_space); penlabels (range 0 thru 11); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("Flat (slashed)", "flat.slash"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, w, 0.31 staff_space); clearxy; save slope, slash_width; slope = 0.5; slash_width = w; z1 = (0, h / 2); z2 = z1 - (slash_width, slash_width * slope)/2; z3 = z1 + (slash_width, slash_width * slope)/2; pickup pencircle scaled 1.5 stafflinethickness; draw z2 .. z3; labels (1, 2, 3); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; fet_beginchar ("Flat (slashed twice)", "flat.slashslash"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, w, 0.31 staff_space); clearxy; save slope, slash_width; slope = 0.5; slash_width = w; pickup pencircle scaled 1.5 stafflinethickness; z1 = (0, 5/12 h); z2 = (0, 2/3 h); draw z1 - (slash_width, slash_width * slope)/2 .. z1 + (slash_width, slash_width * slope)/2; draw z2 - (slash_width, slash_width * slope)/2 .. z2 + (slash_width, slash_width * slope)/2; labels (1, 2); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat"); set_char_box (0, 1.6 staff_space#, 0.6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, w/2, 0.31 staff_space); currentpicture := currentpicture xscaled -1; draw_meta_flat (0, w/2, 0.31 staff_space); currentpicture := currentpicture shifted (w/2,0); penlabels (range 0 thru 11); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("Semi flat", "mirroredflat"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, w, 0.31 staff_space); currentpicture := currentpicture xscaled -1 shifted (w - b, 0); fet_endchar; fet_beginchar ("Semi flat", "mirroredflat.backslash"); set_char_box (1.2 stafflinethickness#, .8 staff_space#, 0.6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, w, 0.31 staff_space); clearxy; save slope, slash_width; slope = 0.5; slash_width = w; z1 = (0, h / 2); z2 = z1 - (slash_width, slash_width * slope)/2; z3 = z1 + (slash_width, slash_width * slope)/2; pickup pencircle scaled 1.5 stafflinethickness; draw z2 .. z3; currentpicture := currentpicture xscaled -1 shifted (w - b, 0); labels (1, 2, 3); fet_endchar; fet_beginchar ("Double Flat", "flatflat"); save left_wid, overlap, right_wid; left_wid = .7; right_wid = .8; overlap = .05; set_char_box (1.2 stafflinethickness#, (left_wid + right_wid - overlap) * staff_space#, .6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space); draw_meta_flat (round ((left_wid - overlap) * staff_space), right_wid * staff_space, 0.33 staff_space); fet_endchar; fet_beginchar ("3/4 Flat", "flatflat.slash"); save left_wid, overlap, right_wid; left_wid = .7; right_wid = .8; overlap = .05; set_char_box (1.2 stafflinethickness#, (left_wid + right_wid - overlap) * staff_space#, .6 staff_space#, 1.9 staff_space#); draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space); draw_meta_flat (round ((left_wid - overlap) * staff_space), right_wid * staff_space, 0.33 staff_space); %% maybe we should clip part of the stems? %% or make the 1st flat smaller? %% or reverse it? pickup pencircle scaled 2 stafflinethickness; z12 = round (-.25 w - b, .55 staff_space) + feta_offset; z13 = round (.75 w, 1.45 staff_space) + feta_offset; penpos12 (2 stafflinethickness, angle (z13 - z12) - 90); penpos13 (2 stafflinethickness, angle (z13 - z12) - 90); z14 = z12 - stafflinethickness * unitvector (z13 - z12); z15 = z13 + stafflinethickness * unitvector (z13 - z12); fill z13r .. z15 .. z13l -- z12l .. z14 .. z12 r -- z13r .. cycle; penlabels (12, 13); labels (14, 15); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("Double Sharp", "doublesharp"); save klaverblad, klaversteel; save pat; path pat; klaversteel = 1/15 staff_space; klaverblad = .4 staff_space - .5 stafflinethickness; set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#); z1 = (klaversteel, 0); z2 = (w / 2 - klaverblad / 10, h - klaverblad); z3 = (w / 2, h); z4 = z2 reflectedabout ((0, 0), (1, 1)); z5 = z1 reflectedabout ((0, 0), (1, 1)); labels (1, 2, 3, 4, 5); pickup pencircle scaled blot_diameter; x2 := hfloor (rt x2) - blot_diameter / 2; x3 := hfloor (rt x3) - blot_diameter / 2; y3 := vfloor (top y3) - blot_diameter / 2; y4 := vfloor (top y4) - blot_diameter / 2; pat = (rt z1){dir45} .. {right}(bot z2) .. rt z2 -- rt z3{z3 - z2} .. top z3{z4 - z3} -- top z4{z4 - z3} .. (lft z4){down} .. {dir 225}(top z5); pat := pat -- reverse pat xscaled -1 shifted (-feta_eps, 0); % assure symmetry -- it's more important to center the glyph on the % staff line than centering it between staff lines, so we use % feta_shift, not feta_space_shift. h := h + feta_shift; fill pat shifted (0, feta_shift) -- reverse pat yscaled -1 shifted (0, -feta_eps) -- cycle; % ugh currentpicture := currentpicture shifted (hround (w / 2), 0); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; def draw_paren = save leftindent; leftindent := .2 staff_space; set_char_box (0, .5 staff_space# + stafflinethickness#, staff_space#, staff_space#); d := d - feta_shift; z1 = (leftindent, h); z2 = (w - stafflinethickness, .5 (h - d)); z3 = (leftindent, -d); penpos1 (stafflinethickness, 35); penpos2 (.1 staff_space + stafflinethickness, 0); penpos3 (stafflinethickness, -35); fill z2l{down} .. simple_serif (z3l, z3r, 90) .. z2r{up} .. simple_serif (z1r, z1l, 90) .. z2l{down} -- cycle; enddef; fet_beginchar ("Right Parenthesis", "rightparen"); draw_paren; penlabels (1, 2, 3); remember_pic := currentpicture; draw_staff (-2, 2, 0); fet_endchar; draw_shifted_too; fet_beginchar ("Left Parenthesis", "leftparen"); draw_paren; currentpicture := currentpicture xscaled -1; set_char_box (charwd, charbp, chardp, charht); fet_endchar; fet_endgroup ("accidentals");