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; z2 = z1 + whatever * (beamwidth, 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; def draw_sharp(expr arrowup, arrowdown) = save stem, stemx, stemwidth; save outer_space, interbeam; save stemlength, extendleft, extendright, height, depth; stemwidth# := stafflinethickness# + .05 staff_space#; define_whole_blacker_pixels (stemwidth); interbeam := 1.05 staff_space_rounded; stemlength# := 1.5 staff_space#; define_pixels (stemlength); height# = stemlength#; depth# = stemlength#; extendright# = 0; extendleft# = 0; if arrowup: height# := height# + 1.2 staff_space#; extendright# := extendright# + 1.5 stafflinethickness#; fi; if arrowdown: depth# := depth# + 1.2 staff_space#; extendleft# := extendleft# + 1.5 stafflinethickness#; fi; define_pixels (extendleft, extendright); set_char_box (extendleft#, 1.1 staff_space#, depth#, height#); 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); % expand the charbox so that it encloses the whole arrow; % this must not happen earlier because some commands above % still rely on the old width w := w + extendright; pickup pencircle scaled stemwidth; lft x5 = lft x6 = outer_space; lft x7 = lft x8 = outer_space + stemx; bot y5 = -stemlength; top y6 = vround (1.5 staff_space - stem * beamslope); bot y7 = -top y6 + feta_space_shift; top y8 = stemlength; labels (5, 6, 7, 8); draw_gridline (z5, z6, stemwidth); draw_gridline (z7, z8, stemwidth); if arrowup: draw_arrow (z8, stemwidth, up, stafflinethickness / 2 + stemwidth / 2, false); fi; if arrowdown: draw_arrow (z5, stemwidth, up, stafflinethickness / 2 + stemwidth / 2, true); fi; draw_staff_if_debugging (-2, 2); enddef; fet_beginchar ("Sharp", "sharp"); draw_sharp (false, false); fet_endchar; fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup"); draw_sharp (true, false); fet_endchar; fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown"); draw_sharp (false, true); fet_endchar; fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth"); draw_sharp (true, true); fet_endchar; 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); draw_staff_if_debugging (-2, 2); fet_endchar; 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 (.88 w, -.5 interbeam + vround interbeam); sharp_beamheight# := 1/.88 sharp_beamheight#; draw_meta_sharp (w, 0); 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); draw_staff_if_debugging (-2, 2); fet_endchar; 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 (.8 w, -.5 interbeam + vround interbeam); sharp_beamheight# := 1/.8 sharp_beamheight#; draw_meta_sharp (w, 0); 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); draw_staff_if_debugging (-2, 2); fet_endchar; 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); draw_staff_if_debugging (-2, 2); fet_endchar; 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); draw_staff_if_debugging (-2, 2); fet_endchar;