X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mf%2Ffeta-bolletjes.mf;h=60c6564867f2572dbdbab37689daa52e5238b347;hb=8ae0f4d296b1e78b2a012e31ad2f7ed828fea1ad;hp=5ef657ad805962b677dabc5810bbefcc983b144e;hpb=75be12aa75a535af753d6125bfc03da3ee303b36;p=lilypond.git diff --git a/mf/feta-bolletjes.mf b/mf/feta-bolletjes.mf index 5ef657ad80..60c6564867 100644 --- a/mf/feta-bolletjes.mf +++ b/mf/feta-bolletjes.mf @@ -1,10 +1,11 @@ -% +% -*-Fundamental-*- % feta-bolletjes.mf -- implement noteheads % % source file of LilyPond's pretty-but-neat music font % -% (c) 1997, 1998 Jan Nieuwenhuizen -% & Han-Wen Nienhuys +% (c) 1997--2002 Jan Nieuwenhuizen +% & Han-Wen Nienhuys +% & Juergen Reuter % @@ -16,91 +17,15 @@ save black_notehead_width; numeric black_notehead_width; -fet_begingroup("balls"); +fet_begingroup("noteheads"); -noteheight#:=interline#+ (1 + overdone_heads) *stafflinethickness#; +noteheight#:=staff_space#+ (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; +%%% TODO: Document these! +% % setup user vars def setup_notehead_vars = @@ -146,9 +71,7 @@ fi enddef; -% whole note -% Wanske, p.38 -fet_beginchar("Whole notehead", "0", "wholeball") +def draw_whole_head = setup_notehead_vars; a_b:=1.80; @@ -172,17 +95,48 @@ fet_beginchar("Whole notehead", "0", "wholeball") notehead_calc; whole_notehead_width# := wd#; notehead_draw; -fet_endchar; +enddef; + + +% +% dimensions aren't entirely right. +% +fet_beginchar ("Brevis notehead", "-1", "brevishead"); + save stemthick, fudge; + define_pixels (stemthick); + fudge = blot_diameter /2; + stemthick# = 2 stafflinethickness#; + + draw_whole_head; + pickup pencircle scaled stemthick; -fet_beginchar("Whole ledger line", "0l", "wholeledger") - draw_ledger(whole_notehead_width#); + bot y1 = -d; + top y2 = h; + rt x1 - fudge = 0; + x1 = x2; + + fudge + lft x3 = w; + x4 = x3; + y4 = y2; + y3 = y1; + + draw_gridline(z1,z2,stemthick); + draw_gridline(z3,z4,stemthick); +fet_endchar; + +% whole note +% Wanske, p.38 +fet_beginchar("Whole notehead", "0", "wholehead") + draw_whole_head; fet_endchar; + + % half note % Wanske, p.39 fet_beginchar("Half notehead", "1", - "halfball") + "halfhead") setup_notehead_vars; % a_b:=1.49; % after text a_b:=1.50; % after drawing @@ -207,13 +161,10 @@ fet_beginchar("Half notehead", "1", 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") +fet_beginchar("Quart notehead", "2", "quarthead") setup_notehead_vars; % a_b:=1.57; % after text a_b:=1.54; % after drawing @@ -235,92 +186,268 @@ fet_beginchar("Quart notehead", "2", "quartball") fet_endchar; -fet_beginchar("Quart ledger", "2l", "quartledger") - draw_ledger(black_notehead_width#); +% 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; -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; + a_b := 1.50; % after drawing + err_y_a:=0.157; -% notehead_calc; - + 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; - head_width# = harmwid; + b_h:= 1.03; + a_w:= 1.2; - 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 = (schuif_op, 0); - z2l = z1l; -% z3l = (schuif_op + head_width/2,-head_width/2); - z3l = (schuif_op + head_width/2, -noteheight/2); - z4l = z3l; - z5l = (schuif_op + head_width, 0); - z6l = z5l; -% z7l = (schuif_op + head_width/2, head_width/2); - z7l = (schuif_op + 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; + 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; + + + +begingroup; +def def_triangle = + save triangle,kern; path triangle; + kern = 1/3(x2-x1); + z2 = z1 rotated 120; + z3 = z1 rotated 240; + z12 = caveness[.5[z1,z2],z3]; + z23 = z12 rotated 120; + z31 = z12 rotated 240; + triangle = z1 .. z12 .. z2 .. + z2 .. z23 .. z3 .. + z3 .. z31 .. z1 .. + cycle; + triangle := triangle shifted (-x1+pent/2-kern,0) xscaled xs; + pickup pencircle scaled pent xscaled xs; + hei = max(y1,-y2)+pent/2; + %set_char_box(-kern*xs*fac, ((x3-x1)*fac+pent#)*xs,hei*fac,hei*fac); + set_char_box(0, ((x3-x1-kern)*fac+pent#)*xs,hei*fac,hei*fac); +enddef; +save fac,pent; +fac = noteheight#/noteheight; +pent# = 2stafflinethickness#; +define_pixels(pent); + + +fet_beginchar("Whole trianglehead", "0triangle", "wholetrianglehead") + save hei,xs; + z1 = dir(130)*3/4noteheight; + xs = 1.5; + caveness:=0.1; + def_triangle; + draw triangle; +fet_endchar; + +fet_beginchar("Half trianglehead", "1triangle", "halftrianglehead") + save hei,xs; + z1 = dir(130)*2/3noteheight; + xs = 1.2; + caveness:=0.1; + def_triangle; + draw triangle; +fet_endchar; + +fet_beginchar("Quart trianglehead", "2triangle", "trianglehead") + save hei,xs; + z1 = dir(130)*2/3noteheight; + xs = 1.0; + caveness:=0.1; + def_triangle; + filldraw triangle; +fet_endchar; + +endgroup; + +%%% Editable values: + +slash_slope := 1.7; % slope of slash. From scm/grob-description.scm. How to auto-copy? +slt# := 2/3*0.48staff_space#; % thickness of lines. quarter notes get 1.5slt width. +slh# := 2staff_space#; % height of char. + +%%% Calculated values: +sxa# := 0; % how much the char exceeds the boundingbox horizontally: + + % Width of hor. pen - with thanks to Pythagoras +slxt# := sqrt(slt#*slt#+(slt#/slash_slope)*(slt#/slash_slope)); +slw# := slh#/slash_slope; % width of sloping part of slash: + +define_pixels(slt,slh,sxa,slxt,slw); + + +% +% +% UUGGGH! FIXME -- get rid of those sharp corners. +% +% +% + + +def draw_slash(expr hwid_hash) = + wid# := slw#+2slxt#+hwid_hash; + set_char_box(0,wid#-2sxa#,slh#/2,slh#/2); + define_pixels (wid#); + pickup penrazor scaled slxt; + draw (-b+slxt/2-sxa,-d) -- (-b+slxt/2+slw-sxa,h); + draw (w-slxt/2-slw+sxa,-d) -- (w-slxt/2+sxa,h); + pickup penrazor scaled slt rotated 90; + draw (-b+slxt-sxa,-d+slt/2) -- (w-slw+sxa,-d+slt/2); + draw (-b+slw-sxa,h-slt/2) -- (w-slxt+sxa,h-slt/2); enddef; -%save uitsteek; -% uitsteek = .25; -harmonic_wid# := interline#; +fet_beginchar("Whole slashhead","0slash","wholeslashhead") + draw_slash(staff_space#); +fet_endchar; -fet_beginchar("Harmonic notehead","harmonic","harmonicball") - draw_harmonic_notehead(harmonic_wid#) +fet_beginchar("Half slashhead","1slash","halfslashhead") + draw_slash(0.6staff_space#); fet_endchar; -fet_beginchar("Harmonic ledger", "harmonicl", "harmonicledger") - draw_ledger(harmonic_wid#); +fet_beginchar("Quart slashhead","2slash","quartslashhead") + draw_slash(-slxt#/2); +fet_endchar; + +% thick is the distance between the two parallel lines in the cross (distance between centres of lines) +def draw_cross(expr thick) = + pent := 1.2stafflinethickness; + pickup pencircle scaled pent; + % alfa is the slant of the lines (i.e. 1 means 45 degrees) + alfa := (2h-pent)/(w-pent); + % llen is the length of the little outer lines + % llen = thick / sin(2atan(alfa)) + llen := thick/(ypart(dir(2angle(1,alfa)))); + xa := llen/sqrt(1+alfa**2); + ya := xa*alfa; + xl := w/2-xa-pent/2; + yl := h-ya-pent/2; + save crz; path crz; + crz = (xa,0) -- (xa+xl,yl) -- (xl,yl+ya) -- (0,ya); + draw crz shifted(w/2,0); + draw crz xscaled -1 shifted(w/2,0); + draw crz yscaled -1 shifted(w/2,0); + draw crz scaled -1 shifted(w/2,0); +enddef; + +fet_beginchar("Whole Crossed notehead", "0cross", "wholecrossedhead") + wid# := black_notehead_width#+4stafflinethickness#; + hei# := noteheight#+stafflinethickness#; + set_char_box(0, wid#,hei#/2,hei#/2); + draw_cross(3.75stafflinethickness); +fet_endchar; + +fet_beginchar("Half Crossed notehead", "1cross", "halfcrossedhead") + wid# := black_notehead_width#+2stafflinethickness#; + hei# := noteheight#+stafflinethickness#/2; + set_char_box(0, wid#,hei#/2,hei#/2); + draw_cross(3stafflinethickness); +fet_endchar; + +fet_beginchar("Crossed notehead", "2cross", "crossedhead") + wid# := black_notehead_width#; + hei# := noteheight#; + set_char_box(0, wid#,hei#/2,hei#/2); + draw_cross(stafflinethickness/4); +fet_endchar; + +fet_beginchar("X-Circled notehead", "2xcircle", "xcircledhead") + wid# := black_notehead_width#*sqrt(sqrt2); + hei# := noteheight#*sqrt(sqrt2); + set_char_box(0, wid#,hei#/2,hei#/2); + cthick := (1.2+1/4)*stafflinethickness; + cxr := w/2-cthick/2; + cyr := h-cthick/2; + pickup pencircle scaled cthick; + draw fullcircle xscaled 2cxr yscaled 2cyr shifted (w/2,0); + xpos := cxr/sqrt2; + ypos := cyr/sqrt2; + draw (-xpos+w/2,-ypos) -- (xpos+w/2,ypos); + draw (-xpos+w/2,ypos) -- (xpos+w/2,-ypos); +fet_endchar; + + +%%%%%%%%%%%% +% +% +% ledger (leger) lines +% +fet_beginchar("Ledger ending", "ledgerending", "ledgerending") +set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#, + ledgerlinethickness#/2,ledgerlinethickness#/2); + + + draw_rounded_block((-b,-d),(w,h), 0.8 ledgerlinethickness); fet_endchar; -fi -fet_endgroup("balls"); +fet_endgroup("noteheads"); define_pixels(black_notehead_width);