3 % The beams of most sharps have horizontal endings (as if drawn with
4 % a square pen). [Wanske] does not mention this, so we'll just ignore
8 save default_width, default_height, onestemmed_height;
9 save default_interbeam_dist, triples_interbeam_dist;
10 save default_beam_thickness, stem_thickness;
12 default_width# := 1.1 staff_space#;
13 default_height# := 3 staff_space#;
14 onestemmed_height# := 2.66 staff_space#;
15 define_pixels (default_width);
17 default_interbeam_dist := 1.05 staff_space_rounded;
18 triples_interbeam_dist := 1.2 staff_space_rounded;
20 default_beam_thickness# := 0.3 staff_space# + stafflinethickness#;
21 stem_thickness# := stafflinethickness# + .05 staff_space#;
22 define_whole_blacker_pixels (stem_thickness);
25 def draw_sharp_beam (expr length, y_offset) =
27 save ne_beam_dir, nw_dist;
28 pair ne_beam_dir, nw_dist;
30 beam_length := length;
32 define_whole_vertical_blacker_pixels (default_beam_thickness);
36 pickup pencircle scaled 2 blot_diameter;
38 rt x2 - lft x1 = beam_length;
39 z2 = z1 + whatever * (beam_length, default_beam_thickness);
40 .5 [z1, z3] = (.5 w, y_offset);
42 top y2 - bot y3 = default_beam_thickness;
44 top y1 - bot y4 = default_beam_thickness;
46 ne_beam_dir = unitvector (z2 - z1);
47 nw_dist = (ne_beam_dir rotated 90) * blot_diameter;
50 ... (z1 + nw_dist){ne_beam_dir}
51 -- (z2 + nw_dist){ne_beam_dir}
54 ... (z3 - nw_dist){-ne_beam_dir}
55 -- (z4 - nw_dist){-ne_beam_dir}
63 def draw_sharp (expr arrowup, arrowdown) =
64 save dist_between_stems;
66 save half_height, interbeam_dist;
68 half_height# := 0.5 default_height#;
69 define_pixels (half_height);
70 interbeam_dist := default_interbeam_dist;
72 set_char_box (0, default_width#, half_height#, half_height#);
73 d := d - feta_space_shift;
75 dist_between_stems := hround (7 / 16 * default_width);
76 outer_space := hround ((w - dist_between_stems - stem_thickness) / 2);
78 w := 2 outer_space + dist_between_stems + stem_thickness;
80 draw_sharp_beam (w, -.5 interbeam_dist);
81 draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist);
83 % expand the charbox so that it encloses the whole arrow;
84 % this must not happen earlier because some commands above
85 % still rely on the old width
87 w := w + 1.5 stafflinethickness;
88 h := h + 1.2 staff_space;
91 b := b + 1.5 stafflinethickness;
92 d := d + 1.2 staff_space;
95 pickup pencircle scaled stem_thickness;
97 lft x5 = lft x6 = outer_space;
98 lft x7 = lft x8 = outer_space + dist_between_stems;
99 bot y5 = -half_height;
100 top y8 = half_height;
101 z6 = z8 + whatever * ne_beam_dir;
102 bot y7 = -top y6 + feta_space_shift;
104 draw_gridline (z5, z6, stem_thickness);
105 draw_gridline (z7, z8, stem_thickness);
108 draw_arrow (z8, stem_thickness, up,
109 stafflinethickness / 2 + stem_thickness / 2, false);
112 draw_arrow (z5, stem_thickness, up,
113 stafflinethickness / 2 + stem_thickness / 2, true);
117 draw_staff_if_debugging (-2, 2);
121 fet_beginchar ("Sharp", "sharp");
122 draw_sharp (false, false);
126 fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup");
127 draw_sharp (true, false);
131 fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown");
132 draw_sharp (false, true);
136 fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth");
137 draw_sharp (true, true);
141 fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem");
143 save half_height, interbeam_dist;
145 half_height# := 0.5 onestemmed_height#;
146 define_pixels (half_height);
147 interbeam_dist := default_interbeam_dist;
149 set_char_box (0, 0.7 staff_space#, half_height#, half_height#);
150 d := d - feta_space_shift;
152 outer_space := hround ((w - stem_thickness) / 2);
154 w := 2 outer_space + stem_thickness;
156 draw_sharp_beam (w, -.5 interbeam_dist);
157 draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist);
159 pickup pencircle scaled stem_thickness;
161 lft x5 = lft x6 = outer_space;
162 top y6 = half_height;
163 bot y5 = -top y6 + feta_space_shift;
165 draw_gridline (z5, z6, stem_thickness);
168 draw_staff_if_debugging (-2, 2);
172 fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem");
173 save dist_between_stems;
175 save half_height, interbeam_dist;
176 save default_beam_thickness;
178 half_height# := 0.5 default_height#;
179 define_pixels (half_height);
180 interbeam_dist := triples_interbeam_dist;
182 default_beam_thickness# := 0.22 staff_space# + stafflinethickness#;
184 set_char_box (0, default_width#, half_height#, half_height#);
186 dist_between_stems := hround (7 / 16 * default_width);
187 outer_space := hround ((w - dist_between_stems - stem_thickness) / 2);
189 w := 2 outer_space + dist_between_stems + stem_thickness;
190 d := d - feta_space_shift;
192 draw_sharp_beam (.88 w, -.5 interbeam_dist);
193 draw_sharp_beam (.88 w, -.5 interbeam_dist + vround interbeam_dist);
194 default_beam_thickness# := 1/.88 default_beam_thickness#;
195 draw_sharp_beam (w, 0);
197 pickup pencircle scaled stem_thickness;
199 lft x5 = lft x6 = outer_space;
200 lft x7 = lft x8 = outer_space + dist_between_stems;
201 bot y5 = -half_height;
202 top y8 = half_height;
203 z6 = z8 + whatever * ne_beam_dir;
204 bot y7 = -top y6 + feta_space_shift;
206 draw_gridline (z5, z6, stem_thickness);
207 draw_gridline (z7, z8, stem_thickness);
210 draw_staff_if_debugging (-2, 2);
214 fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem");
216 save half_height, interbeam_dist;
217 save default_beam_thickness;
219 half_height# := 0.5 onestemmed_height#;
220 define_pixels (half_height);
221 interbeam_dist := triples_interbeam_dist;
223 default_beam_thickness# := 0.22 staff_space# + stafflinethickness#;
225 set_char_box (0, 0.95 staff_space#, half_height#, half_height#);
227 outer_space := hround ((w - stem_thickness) / 2);
229 w := 2 outer_space + stem_thickness;
230 d := d - feta_space_shift;
232 draw_sharp_beam (.8 w, -.5 interbeam_dist);
233 draw_sharp_beam (.8 w, -.5 interbeam_dist + vround interbeam_dist);
234 default_beam_thickness# := 1/.8 default_beam_thickness#;
235 draw_sharp_beam (w, 0);
237 pickup pencircle scaled stem_thickness;
239 lft x5 = lft x6 = outer_space;
240 top y6 = half_height;
241 bot y5 = -top y6 + feta_space_shift;
243 draw_gridline (z5, z6, stem_thickness);
246 draw_staff_if_debugging (-2, 2);
250 fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem");
251 save dist_between_stems;
253 save half_height, interbeam_dist;
255 half_height# := 0.5 default_height#;
256 define_pixels (half_height);
257 interbeam_dist := default_interbeam_dist;
259 set_char_box (0, 1.6 staff_space#, half_height#, half_height#);
260 d := d - feta_space_shift;
262 dist_between_stems := hround (9 / 32 * w);
263 outer_space := hround ((w - 2 dist_between_stems - stem_thickness) / 2);
265 w := 2 outer_space + 2 dist_between_stems + stem_thickness;
267 draw_sharp_beam (w, -.5 interbeam_dist);
268 draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist);
270 pickup pencircle scaled stem_thickness;
272 lft x5 = lft x6 = outer_space;
273 lft x9 = lft x10 = outer_space + dist_between_stems;
274 lft x7 = lft x8 = outer_space + 2 dist_between_stems;
275 bot y5 = -half_height;
276 top y8 = half_height;
277 z6 = z8 + whatever * ne_beam_dir;
278 bot y7 = -top y6 + feta_space_shift;
282 draw_gridline (z5, z6, stem_thickness);
283 draw_gridline (z7, z8, stem_thickness);
284 draw_gridline (z9, z10, stem_thickness);
286 labels (5, 6, 7, 8, 9, 10);
287 draw_staff_if_debugging (-2, 2);
291 fet_beginchar ("Double Sharp", "doublesharp");
292 save klaverblad, klaversteel;
296 klaversteel = 1/15 staff_space;
297 klaverblad = .4 staff_space - .5 stafflinethickness;
299 set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#);
301 z1 = (klaversteel, 0);
302 z2 = (w / 2 - klaverblad / 10, h - klaverblad);
304 z4 = z2 reflectedabout ((0, 0), (1, 1));
305 z5 = z1 reflectedabout ((0, 0), (1, 1));
307 pickup pencircle scaled blot_diameter;
309 x2 := hfloor (rt x2) - blot_diameter / 2;
310 x3 := hfloor (rt x3) - blot_diameter / 2;
311 y3 := vfloor (top y3) - blot_diameter / 2;
312 y4 := vfloor (top y4) - blot_diameter / 2;
321 .. {dir 225}(top z5);
323 -- reverse pat xscaled -1 shifted (-feta_eps, 0);
325 % assure symmetry -- it's more important to center the glyph on the
326 % staff line than centering it between staff lines, so we use
327 % feta_shift, not feta_space_shift.
330 fill pat shifted (0, feta_shift)
331 -- reverse pat yscaled -1 shifted (0, -feta_eps)
335 currentpicture := currentpicture shifted (hround (w / 2), 0);
337 labels (1, 2, 3, 4, 5);
338 draw_staff_if_debugging (-2, 2);