X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=mf%2Ffeta-bolletjes.mf;h=92b298055a34439b57bbf263ebc3c51663c08e0f;hb=438f3ce8aa92b01a01c99e678c734486c70b93f0;hp=f99fed2e69b6123753a7e7b3b496581579c0f3f6;hpb=934d7fd539e587975098a6de6ee39cb25151ac48;p=lilypond.git diff --git a/mf/feta-bolletjes.mf b/mf/feta-bolletjes.mf index f99fed2e69..92b298055a 100644 --- a/mf/feta-bolletjes.mf +++ b/mf/feta-bolletjes.mf @@ -1,77 +1,31 @@ -% bolletjes.mf -% part of LilyPond's pretty-but-neat music font +% -*-Fundamental-*- +% feta-bolletjes.mf -- implement noteheads +% +% source file of LilyPond's pretty-but-neat music font +% +% (c) 1997--2003 Jan Nieuwenhuizen +% & Han-Wen Nienhuys +% & Juergen Reuter +% + % most beautiful noteheads are pronounced, not circular, % and not even symmetric. -% These examples are inspired by [Wanske] [see literature list] +% These examples are inspired by [Wanske], see literature list -fet_begingroup("balls"); +save black_notehead_width; +numeric black_notehead_width; -noteheight#:=interline#+ (1 + overdone_heads) *stafflinethickness#; +fet_begingroup("noteheads"); +noteheight#:=staff_space#+ (1 + overdone_heads) *stafflinethickness#; define_pixels(noteheight); - - -def draw_brevis = - save beamheight, head_width; - save holeheight, stem_width; - save serif_size; - - head_width# = 2 interline#; - 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; - - 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 * (-1,-1); - - 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; - addto currentpicture also currentpicture reflectedabout(z4r, z4l); -enddef; - -fet_beginchar("Brevis notehead", "-1", "brevisball") - draw_brevis; -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 + +%%% TODO: Document these! % -fet_beginchar("Longa notehead", "-2", "longaball"); - draw_brevis; - 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; % setup user vars def setup_notehead_vars = @@ -117,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; @@ -141,14 +93,50 @@ fet_beginchar("Whole notehead", "0", "wholeball") a_w:=1; % no rotate-> no width correction notehead_calc; + whole_notehead_width# := wd#; notehead_draw; +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; + + 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 @@ -168,13 +156,15 @@ fet_beginchar("Half notehead", "1", a_w:=1.12; notehead_calc; + half_notehead_width# := wd#; notehead_draw; 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 @@ -191,11 +181,316 @@ fet_beginchar("Quart notehead", "2", "quartball") 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; -fet_endgroup("balls"); +% 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; + + +save pent; +pen_thick# = 2stafflinethickness#; +define_pixels(pen_thick); + + +begingroup; + + +def def_triangle_old = + 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; + + +def def_triangle = + save triangle,kern; path triangle; + save left_point, height, width; + pair exact_left_point; + + exact_left_point := llap# * dir (90 + tilt); + height# = max (ypart exact_left_point, + -ypart (exact_left_point rotated 120)) + pen_thick#/2; + + kern# = 1/3 xpart (exact_left_point - (exact_left_point rotated 120)); + width# = xpart (-exact_left_point + (exact_left_point rotated 240)); + define_pixels (kern); + z1 = (hround_pixels (xpart exact_left_point), vround_pixels (ypart exact_left_point)); + 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+pen_thick/2-kern,0) xscaled xs; + pickup pencircle scaled pen_thick xscaled xs; +% labels(1,2,12,23,31,3); + set_char_box(0, width# - kern#+ pen_thick#, height#, height#); +enddef; + +fet_beginchar("Whole trianglehead", "0triangle", "wholetrianglehead") + save hei,xs; + save llap; + save tilt; + + tilt = 40; + llap# = 3/4noteheight#; + + xs = 1.5; + caveness:=0.1; + def_triangle; + draw triangle; +fet_endchar; + +fet_beginchar("Half trianglehead", "1triangle", "halftrianglehead") + save hei,xs; + save llap; + save tilt; + + tilt = 40; + llap# = 2/3noteheight#; + xs = 1.2; + caveness:=0.1; + def_triangle; + draw triangle; +fet_endchar; + +fet_beginchar("Quart trianglehead", "2triangle", "trianglehead") + save hei,xs; + save llap; + save tilt; + tilt = 40; + llap# = 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; + +fet_beginchar("Whole slashhead","0slash","wholeslashhead") + draw_slash(staff_space#); +fet_endchar; + +fet_beginchar("Half slashhead","1slash","halfslashhead") + draw_slash(0.6staff_space#); +fet_endchar; + +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; + +fet_endgroup("noteheads"); +define_pixels(black_notehead_width);