% % 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("balls"); 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; save uitsteek; uitsteek = .25; def draw_ledger(expr wid)= set_char_box(uitsteek * wid, (1+ uitsteek)*wid, ledgerlinethickness#/2,ledgerlinethickness#/2); pickup pencircle scaled ledgerlinethickness; rt x2 = w; lft x1 = -b; y1 = y2 = 0; draw z1 .. z2; enddef; fet_beginchar("Brevis notehead", "-1", "brevisball") draw_brevis(brevis_wid#); fet_endchar; fet_beginchar("Brevis ledger", "-1l", "brevisledger") draw_ledger(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", "longaball"); 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; fet_beginchar("Longa ledger", "-2l", "longaledger") draw_ledger(brevis_wid#); fet_endchar; % 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", "wholeball") 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; fet_beginchar("Whole ledger line", "0l", "wholeledger") draw_ledger(whole_notehead_width#); fet_endchar; % half note % Wanske, p.39 fet_beginchar("Half notehead", "1", "halfball") 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; fet_beginchar("Half ledger", "1l", "halfledger") draw_ledger(half_notehead_width#); fet_endchar; % quarter note % Wanske p.38 fet_beginchar("Quart notehead", "2", "quartball") 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; fet_beginchar("Quart ledger", "2l", "quartledger") draw_ledger(black_notehead_width#); fet_endchar; %if test = 0: %else: def draw_harmonic_notehead(expr harmwid) = save beamheight, head_width, head_char_width; save holeheight, stem_width; save serif_size, serif_protrude; save stemthick; save thin, thick; save ht, schuif_op; % setup_notehead_vars; % a_b:=1.54; % ai_a:=0; % ai_bi:=1; % b_h:=0.85; % a_w:=1.09; % notehead_calc; head_width# = harmwid; define_pixels(head_width); % ht# = noteheight#; head_char_width = 1.54 noteheight; head_char_width# := 1.54 ht#; %schuif_op = head_char_width - head_width; %ugh %schuif_op# := head_char_width# - head_width#; % set_char_box(0, head_char_width#, noteheight#/2, noteheight#/2); set_char_box(0, head_width#, head_width#/2, head_width#/2); % 2 beamheight + holeheight = noteheight; thin = stafflinethickness; thick = 2.2 stafflinethickness; % serif_size = (holeheight - stafflinethickness)/2; % serif_protrude = 1.5 serif_size; penpos1(thick, 45); penpos2(thin, 315); penpos3(thin, 135); penpos4(thick, 45); penpos5(thick, 225); penpos6(thin, 135); penpos7(thin, 315); penpos8(thick, 225); % 1.5 noteheight = head_width; z1l = (0, 0); z2l = z1l; % z3l = (head_width/2,-head_width/2); z3l = (head_width/2, -noteheight/2); z4l = z3l; z5l = (head_width, 0); z6l = z5l; % z7l = (head_width/2, head_width/2); z7l = (head_width/2, noteheight/2); z8l = z7l; pickup pencircle; %scaled stemthick; penlabels(1,2,3,4,5,6,7,8); test_grid; fill z1l -- z2r -- z7r -- z7l -- cycle; fill z1l -- z1r -- z4r -- z4l -- cycle; fill z3r -- z3l -- z6l -- z6r -- cycle; fill z5r -- z5l -- z8l -- z8r -- cycle; enddef; %save uitsteek; % uitsteek = .25; harmonic_wid# := interline#; fet_beginchar("Harmonic notehead","harmonic","harmonicball") draw_harmonic_notehead(harmonic_wid#) fet_endchar; fet_beginchar("Harmonic ledger", "harmonicl", "harmonicledger") draw_ledger(harmonic_wid#); fet_endchar; %fi fet_endgroup("balls"); define_pixels(black_notehead_width);