% -*-Fundamental-*- % feta-bolletjes.mf -- implement noteheads % % source file of LilyPond's pretty-but-neat music font % % (c) 1997, 1998 Jan Nieuwenhuizen % & Han-Wen Nienhuys % % most beautiful noteheads are pronounced, not circular, % and not even symmetric. % These examples are inspired by [Wanske], see literature list save black_notehead_width; numeric black_notehead_width; fet_begingroup("noteheads"); noteheight#:=interline#+ (1 + overdone_heads) *stafflinethickness#; define_pixels(noteheight); brevis_wid# := 2 interline#; def draw_brevis(expr brevwid) = save beamheight, head_width; save holeheight, stem_width; save serif_size, serif_protrude; head_width# = brevwid; holeheight = 3 stafflinethickness; stem_width = 1.4 stafflinethickness; define_pixels(head_width); set_char_box(0, head_width#, noteheight#/2, noteheight#/2); 2 beamheight + holeheight = noteheight; serif_size = (holeheight - stafflinethickness)/2; serif_protrude = 1.5 serif_size; penpos1(stem_width, 0); penpos2(stem_width, 0); penpos3(beamheight, 90); penpos4(beamheight, 90); penpos5(stem_width, 180); z1l = (0, 0); z2l = (0, -stafflinethickness/2); z3r = z2r + serif_size *(1,-1); y4r = y3r; x4r = head_width/2; z5l = z3l + (-serif_size, -serif_protrude); penlabels(1,2,3,4, 5); fill z1r -- z1l -- z5r{down} .. z5l{up} .. z3l{right} -- z4l -- z4r -- z3r{left} .. z2r{up} -- cycle; addto currentpicture also currentpicture yscaled -1; show z4r; show z4l; addto currentpicture also currentpicture shifted (-x4r,0) xscaled -1 shifted (x4l,0); enddef; fet_beginchar("Ledger ending", "ledgerending", "ledgerending") set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#, ledgerlinethickness#/2,ledgerlinethickness#/2); pickup pencircle scaled 1.3 blot_diameter; rt x2 = w; lft x1 = -b; x3 = x2; bot y1 = -d; y2 = y1; top y3 = h; y4 = y3; x4 = x1; filldraw z1 --- z2 --- z3 --- z4 --- cycle ; fet_endchar; fet_beginchar("Brevis notehead", "-1", "brevishead") draw_brevis(brevis_wid#); fet_endchar; % % Some sources (eg Musix/OpusTeX think that the appendage should be on % the right, my only other ref [Willemze], shows an appendage to the left % fet_beginchar("Longa notehead", "-2", "longahead"); draw_brevis(brevis_wid#); save theta; z7 = z5; z6 - z7 = (-stem_width/2, -interline); theta = angle(z6-z7)+ 90; penpos7(stem_width, theta); penpos6(1.2 stem_width, theta); fill z7r .. z6r{z6-z7} .. {z7-z6} z6l -- z7l -- cycle; penlabels(6,7); fet_endchar; % TODO: Document these! % setup user vars def setup_notehead_vars = save a_b,err_y_a,tilt,superness; save ai_a,ai_bi,err_y_ai,err_x_bi,inner_tilt,inner_superness; save b_h,a_w; enddef; % setup addititional vars and calc them def notehead_calc = save a,beta,ai,bi, ht, wd; ht# =noteheight#; 2beta#=ht#*b_h; a# = beta#*a_b; wd# = 2a# / a_w; ai# = a# * ai_a; bi# = ai#/ai_bi; define_pixels(a,beta); define_pixels(ai,bi); set_char_box(0, wd#, .5 ht#, .5 ht#); enddef; % draw the outer and inner ellipse. def notehead_draw = path black,white; black=distorted_ellipse(a,beta,a*err_y_a,0,superness); white=distorted_ellipse(ai,bi,ai*err_y_ai,bi*err_x_bi,inner_superness); if test>1: %fixme save x; x1=-x3=a; x2=x4=0; y1=y3=0; y2=-y4=b; penlabels(1,2,3,4); test_grid; else: black:=black rotated tilt; black:=black shifted (w/2,0); white:=white rotated inner_tilt; white:=white shifted (w/2,0); fi fill black; unfill white; enddef; % whole note % Wanske, p.38 fet_beginchar("Whole notehead", "0", "wholehead") setup_notehead_vars; a_b:=1.80; err_y_a:=0; % no slant tilt:=0; superness:=0.707; ai_a:=0.508; % ai_bi:=1.23; ai_bi:=1.30; % jcn % err_y_ai:=0.0938; % err_x_bi:=0; err_y_ai:=0; err_x_bi:=0.115; % inner_tilt:=135; inner_tilt:=125; % jcn % inner_superness:=0.69; inner_superness:=0.68; % jcn b_h:=1; %no rotate-> no height correction a_w:=1; % no rotate-> no width correction notehead_calc; whole_notehead_width# := wd#; notehead_draw; fet_endchar; % half note % Wanske, p.39 fet_beginchar("Half notehead", "1", "halfhead") setup_notehead_vars; % a_b:=1.49; % after text a_b:=1.50; % after drawing err_y_a:=0.157; tilt:=34; % superness:=0.66; superness:=0.67; % jcn % ai_a:=0.863; ai_a:=0.850; % jcn % ai_bi:=3.14; ai_bi:=3.30; % jcn err_y_ai:=0; err_x_bi:=-0.12; inner_tilt:=tilt; inner_superness:=0.80; b_h:=0.935; a_w:=1.12; notehead_calc; half_notehead_width# := wd#; notehead_draw; fet_endchar; % quarter note % Wanske p.38 fet_beginchar("Quart notehead", "2", "quarthead") setup_notehead_vars; % a_b:=1.57; % after text a_b:=1.54; % after drawing err_y_a:=0.044; tilt:=32; superness:=0.707; ai_a:=0; ai_bi:=1; err_y_ai:=0; err_x_bi:=0; inner_tilt:=0; inner_superness:=0.707; b_h:=0.85; a_w:=1.09; notehead_calc; black_notehead_width# := wd#; notehead_draw; fet_endchar; % whole note % Wanske, p.38 fet_beginchar("Whole diamondhead", "0diamond", "wholediamondhead") setup_notehead_vars; a_b:=1.80; err_y_a:=0; % no slant tilt:=0; superness:=0.495; ai_a:=0.350; % ai_bi:=1.23; ai_bi:=1.30; % jcn % err_y_ai:=0.0938; % err_x_bi:=0; err_y_ai:=0; err_x_bi:=0.115; % inner_tilt:=135; inner_tilt:=125; % jcn % inner_superness:=0.69; inner_superness:=0.6; % jcn b_h:=1; %no rotate-> no height correction a_w:=1; % no rotate-> no width correction notehead_calc; whole_notehead_width# := wd#; notehead_draw; fet_endchar; % half note % Wanske, p.39 fet_beginchar("Half diamondhead", "1diamond", "halfdiamondhead") setup_notehead_vars; a_b := 1.50; % after drawing err_y_a:=0.157; tilt:=34; superness:=0.49; % jcn ai_a:=0.550; % jcn ai_bi:=3.30; % jcn err_y_ai:=0; err_x_bi:=-0.12; inner_tilt:=tilt; inner_superness:=0.80; b_h:= 1.03; a_w:= 1.2; notehead_calc; half_notehead_width# := wd#; notehead_draw; fet_endchar; % quarter note % Wanske p.38 fet_beginchar("Quart diamondhead", "2diamond", "diamondhead") set_char_box(0, black_notehead_width#, noteheight#/2, noteheight#/2); save a_b,err_y_a,tilt,superness; save b_h,a_w; save a,beta,ai,bi, ht, wd; a_b:= 1.8; err_y_a:=-0.044; b_h:=0.90; a_w:=1.1; tilt:=35; superness:=0.495; ht# =noteheight#; 2beta#=ht#*b_h; a# = beta#*a_b; define_pixels(a,beta); black := distorted_ellipse(.72 noteheight, .45 noteheight, -.2 noteheight , 0, superness) % beta,a*err_y_a,0,superness); black:=black rotated tilt; black:=black shifted (w/2,0); fill black; fet_endchar; fet_beginchar("Crossed notehead", "2cross", "crossedhead") set_char_box(0, black_notehead_width#, noteheight#/2, noteheight#/2); pickup pencircle scaled 1.5 stafflinethickness; lft x1 = 0; bot y1 = -d; top y2 = h; rt x2 = w; draw z1 .. z2; draw (z1 .. z2) yscaled -1; fet_endchar def draw_harmonic_notehead(expr harmwid) = save beamheight, head_width, head_char_width; save stemthick; save thin, thick; save ht; head_width# = harmwid; define_pixels(head_width); head_char_width = 1.54 noteheight; head_char_width# := 1.54 ht#; set_char_box(0, head_width#, head_width#/2, head_width#/2); thin = stafflinethickness - blot_diameter/2; thick = 2.2 stafflinethickness - blot_diameter/2; penpos1(thick, 45); penpos2(thin, 315); penpos3(thin, 135); penpos4(thick, 55); penpos5(thick, 225); penpos6(thin, 135); penpos7(thin, 315); penpos8(thick, 235); pickup pencircle scaled blot_diameter; lft x1l = 0; y1l = 0; z2l = z1l; bot y3l = -noteheight/2; x3l = head_width/2; z4l = z3l; rt x5l = head_width; y5l = 0; z6l = z5l; top y7l = noteheight/2; x7l = (head_width/2); z8l = z7l; penlabels(1,2,3,4,5,6,7,8); test_grid; filldraw z1l -- z2r -- z7r -- z7l -- cycle; filldraw z1l -- z1r -- z4r -- z4l -- cycle; filldraw z3r -- z3l -- z6l -- z6r -- cycle; filldraw z5r -- z5l -- z8l -- z8r -- cycle; enddef; harmonic_wid# := interline#; fet_beginchar("Harmonic notehead","2harmonic","harmonichead") draw_harmonic_notehead(harmonic_wid#) fet_endchar; %fi fet_endgroup("noteheads"); define_pixels(black_notehead_width);