% % feta-toevallig.mf -- implement Accidentals % % source file of the Feta (Font-En-Tja) music font % % (c) 1997--2001 Han-Wen Nienhuys % % % 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) % %tracingall; %proofing := 2; %\tracingequations:= tracingonline := 1; fet_begingroup("accidentals"); % % 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 % fet_beginchar("Sharp" , "1", "sharp"); set_char_box(0, 1.1 staff_space#, 1.5 staff_space#, 1.5 staff_space#); save interbeam, interstem, beamheight, beamwidth, stemwidth; interbeam := 1.05 staff_space; interstem := 7/16 ; beamheight := 4 stafflinethickness; beamwidth := w; stemwidth := 1.3 stafflinethickness; roundness := 2blot_diameter; pair center; center := (.5 w, 0); roundness + 2 spanwidth = beamwidth; roundness + 2 spanheight = beamheight; 2 horizontal_protrusion + interstem * beamwidth + stemwidth = beamwidth; % wanske: whole beamheight; or ca 18 degrees % z2 - z1 = (beamwidth - roundness, beamheight/2); z2 - z1 = (beamwidth - roundness, beamheight); z1 + z2 = 2*center; beamslope = (y2-y1)/(x2-x1); pair hspan, vspan; hspan = (spanwidth, beamslope * spanwidth); vspan = (0, spanheight); path beam; beam := (hspan + vspan -- -hspan + vspan -- -hspan -vspan -- hspan - vspan -- cycle ) shifted center; pickup pencircle scaled roundness; filldraw (beam shifted (0,-interbeam/2)); filldraw (beam shifted (0,interbeam/2)); pickup pencircle scaled stemwidth; x3 = x4 = xpart center; bot y3 = -1.5 staff_space + ypart center; top y4 = 1.5 staff_space + ypart center; path stem; stem := z3 .. z4; numeric xs; xs := interstem* beamwidth / 2; draw stem shifted (- xs, - xs* beamslope); draw stem shifted (xs , xs *beamslope); labels(1,2,3,4); fet_endchar; fet_beginchar( "Natural", "0", "natural") set_char_box(0, 8/12 staff_space#, 1.5 staff_space#, 1.5 staff_space#); save interbeam, interstem, beamheight, beamwidth, stemwidth; beamheight = 4.5 stafflinethickness; interstem + stemwidth = w; stemwidth = 1.3 stafflinethickness; z2 -z1 = (interstem, slope * interstem); xpart .5 [z2,z1] = xcenter ; xcenter = w/2; pickup penrazor scaled beamheight rotated 90; top y2 = staff_space - 3/2 stafflinethickness ; slope = stafflinethickness / interstem; draw z1 .. z2; draw (xpart z1, -y2) .. (xpart z2, -y1); beamtop = top y2; pickup pencircle scaled stemwidth; xpart z3 = xpart z1; xpart z4 = xpart z2; top y3 = 1.5 staff_space; top y4 = beamtop; draw (xpart z1, -y4) .. z3; draw (xpart z2, -y3) .. z4; labels(1,2,3,4); fet_endchar; % % Dedicated to my mom. (3/10/97) % % Mamma, ik hou van je; kom je alsjeblieft terug? % -- HW % % TODO: remove crook_fatness def draw_meta_flat(expr xcenter, w, crook_fatness) = clearxy; save crook_thinness; save top_stem_thick, bottom_stem_thick, hair; save center; pair center; center = (xcenter, 0); crook_thinness = 1.25 stafflinethickness; top_stem_thick = 2 stafflinethickness; bottom_stem_thick = 1.2 stafflinethickness; z1 = (0, 2 staff_space) + center; z2 = (0, - 1/2 staff_space)+ center; penpos1(top_stem_thick, 0); penpos2(bottom_stem_thick, 0); fill simple_serif(z1r, z1l, 30) -- z2l -- z2r -- cycle; y3l = (staff_space - stafflinethickness)/2 + ypart center; z3l = whatever [z2r,z1r]; z3r = .26 [z2r, z1r]; z4 = (3/8 staff_space, staff_space/2) + center; penpos4(whatever, 53); y4l - y4r = 2 crook_thinness ; % y4l - y4r = 6/20[crook_thinness, crook_fatness] ; y5r = 1/4 staff_space + ypart center; x5l = w + xpart center; penpos5(crook_fatness, -175); z8 = (0, - staff_space/2 - stafflinethickness/2) + center; z9 = (x5,0); save ne_angle; ne_angle = angle(z9 - z8); z7 = 8/33 [z8,z9]; z6l = 18/33 [z8,z9] + .5 crook_thinness *dir(ne_angle -90); penpos7(crook_thinness, ne_angle + 90); z6r = .3 (z9-z8) + z7r; % penpos7(crook_thinness, angle(dir(z8-center) -180); penpos8(whatever, ne_angle + 90); x8r = xpart center - bottom_stem_thick/2; penlabels(range 0 thru 10); z10 = (bottom_stem_thick/2, -1/5 staff_space) + center; unfill z3r{up} .. z4r{right} .. tension .9 .. z6r --- z7r{left} .. z10 {up} -- cycle; fill z8r{down} .. tension 0.8 ..z8l{(z9-z8)} .. z7l .. z6l .. z5l{up} .. z4l{left} .. z3l -- cycle; labels(10); enddef; % % unfortunately, 600dpi is not enough to show the brush of the stem. % fet_beginchar("Flat", "-1", "flat") set_char_box(1.2 stafflinethickness#, .8 staff_space#, .5 staff_space#, 2 staff_space#); draw_meta_flat(0, w, 1/3 staff_space); fet_endchar; fet_beginchar("Double Flat", "-2", "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#, .5 staff_space#, 2 staff_space#); draw_meta_flat(0, left_wid* staff_space, 1/3 staff_space); draw_meta_flat((left_wid - overlap) *staff_space, right_wid *staff_space, 1/3 staff_space); fet_endchar; fet_beginchar("Double Sharp", "2", "sharpsharp") set_char_box(0, staff_space#, .5 staff_space#, .5 staff_space#); save klaverblad, klaversteel; klaversteel = 1/15 staff_space; klaverblad = .35 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 1/20 staff_space; filldraw z1{dir 45} .. {right}z2 -- z3 -- z4{down} .. {dir 225}z5 .. cycle; addto currentpicture also currentpicture yscaled (-d/h); addto currentpicture also currentpicture xscaled (-1); % ugh currentpicture := currentpicture shifted (w/2,0); fet_endchar; def draw_paren = save leftindent; leftindent# := .2 staff_space#; define_pixels(leftindent); set_char_box(0, .5 staff_space#+stafflinethickness#, staff_space#, staff_space#); z1 = (leftindent,h); z2 = (w-stafflinethickness,0); z3 = (leftindent,-d); penpos1(stafflinethickness, 35); penpos2(2 stafflinethickness, 0); penpos3(stafflinethickness, -35); penlabels(1,2,3); 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; fet_endchar; fet_beginchar("Left Parenthesis", "(", "leftparen") draw_paren; currentpicture := currentpicture xscaled -1; set_char_box(charwd, charbp, chardp, charht); fet_endchar; %%%%%%%% % % % % EDITIO MEDICAEA % % % fet_beginchar("Ed. Med. Flat" , "medicaea-1", "medicaeaflat"); set_char_box(0, 0.8 staff_space#, 0.6 staff_space#, 2.0 staff_space#); pickup pencircle xscaled 0.50 stafflinethickness yscaled 0.22 staff_space; save za, zb; pair za, zb; za = (0.00 staff_space, +0.90 staff_space); zb = (0.00 staff_space, -0.50 staff_space); draw za -- zb; pickup pencircle xscaled 0.50 stafflinethickness yscaled 0.22 staff_space rotated -63; save zc, zd, ze; pair zc, zd, ze; zc = (0.10 staff_space, -0.50 staff_space); zd = (0.40 staff_space, +0.40 staff_space); ze = (0.10 staff_space, +0.40 staff_space); draw zc{(1,2)} .. zd .. ze{(-1,-1)}; fet_endchar; %%%%%%%% % % % % EDITIO VATICANA % % % fet_beginchar("Ed. Vat. Flat" , "vaticana-1", "vaticanaflat"); set_char_box(0, 0.8 staff_space#, 0.6 staff_space#, 2.0 staff_space#); define_pixels (stafflinethickness, staff_space); save za, zb, zc, zd, ze, zf, zg; pair za, zb, zc, zd, ze, zf, zg; za = (0.00 staff_space, +0.80 staff_space); zb = (0.00 staff_space, -0.03 staff_space); zc = (0.25 staff_space, -0.23 staff_space); zd = (0.50 staff_space, -0.23 staff_space); ze = (0.50 staff_space, +0.00 staff_space); zf = (0.25 staff_space, +0.20 staff_space); zg = (0.15 staff_space, +0.26 staff_space); pickup pencircle xscaled 0.50 stafflinethickness yscaled 0.22 staff_space; draw za{down} .. {down}zb .. zc .. zd{up} .. {up}ze .. zf .. zg; fet_endchar; fet_beginchar("Ed. Vat. Natural" , "vaticana0", "vaticananatural"); set_char_box(0, 0.7 staff_space#, 0.6 staff_space#, 2.0 staff_space#); define_pixels (stafflinethickness, staff_space); save za, zb, zc, zd; pair za, zb, zc, zd; pickup pencircle xscaled 0.80 stafflinethickness yscaled 0.22 staff_space; za = (0.00 staff_space, +0.65 staff_space); zb = (0.00 staff_space, -0.35 staff_space); zc = (0.00 staff_space, -0.30 staff_space); zd = (0.40 staff_space, -0.08 staff_space); draw za -- zb; draw zc -- zd; addto currentpicture also currentpicture xscaled -1 yscaled -1 shifted (0.40 staff_space, 0.0 staff_space); fet_endchar; %%%%%%%% % % % % MENSURAL NOTATION % % % fet_beginchar("Mensural Sharp" , "mensural1", "mensuralsharp"); set_char_box(0, 0.7 staff_space#, 0.5 staff_space#, 0.5 staff_space#); save stemthick; define_pixels (stemthick, staff_space); stemthick# = stafflinethickness#; save za, zb; pair za, zb; pickup pencircle scaled 0.8 stemthick; za = 0.4 * staff_space * (0.8, 1); za = -zb; draw za .. zb; addto currentpicture also currentpicture xscaled -1; addto currentpicture also currentpicture shifted (0.20 staff_space, 0); fet_endchar; fet_beginchar("Mensural Flat" , "mensural-1", "mensuralflat"); set_char_box(0, 0.7 staff_space#, 0.4 staff_space#, 1.8 staff_space#); save stemthick; define_pixels (stemthick, staff_space); stemthick# = stafflinethickness#; save za, zb, zc, zd, ze; pair za, zb, zc, zd, ze; pickup pencircle xscaled 1.4 stemthick yscaled 0.6 stemthick rotated 45; za = (0.00 staff_space, +1.80 staff_space); zb = (0.00 staff_space, -0.25 staff_space); zc = (0.35 staff_space, -0.25 staff_space); zd = (0.35 staff_space, +0.25 staff_space); ze = (0.00 staff_space, +0.25 staff_space); draw za -- zb .. zc .. zd .. ze; fet_endchar; fet_beginchar("Hufnagel Flat" , "hufnagel-1", "hufnagelflat"); set_char_box(0, 0.7 staff_space#, 0.4 staff_space#, 1.8 staff_space#); save stemthick; define_pixels (stemthick, staff_space); stemthick# = stafflinethickness#; save za, zb, zc, zd, ze, zf; pair za, zb, zc, zd, ze, zf; pickup pencircle xscaled 2.4 stemthick yscaled 0.4 stemthick rotated 45; za = (0.00 staff_space, +1.80 staff_space); zb = (0.00 staff_space, -0.15 staff_space); zc = (0.25 staff_space, -0.30 staff_space); zd = (0.50 staff_space, +0.00 staff_space); ze = (0.30 staff_space, +0.30 staff_space); zf = (0.00 staff_space, +0.15 staff_space); draw za -- zb -- zc .. zd .. ze -- zf; fet_endchar; fet_endgroup("accidentals");