% autometric.mf
% part of LilyPond's pretty-but-neat music font
+%
+% these macros help create ascii logging output
+% to automate generation of lily tables and tex backend
+% parsed by the mf-to-table script
% font or database?
def fet_beginfont(expr name,size) =
message "";
enddef;
-def fet_beginchar(expr code,w,h,d,name,id,texstr) =
- message "@@char:"&name&":"&decimal code&":"&decimal w&":"&decimal h&":"&decimal d&":"&id&":"&texstr&"@@";
+% starts just as plain mf's beginchar:
+% charcode, width, height, depth
+% and then adds:
+% charname see below
+% breapth x-depth
+% id index in lily's table
+% texstr name of tex macro in lily's table and tex backend
+def fet_beginchar(expr code,w,h,d,b,name,id,texstr) =
+ message "@@char:"&name&":"&decimal code&":"&decimal w&":"&decimal h&":"&decimal d&":"&decimal b&":"&id&":"&texstr&"@@";
beginchar(code,w,h,d) name;
enddef;
% most beautiful bolletjes are pronounced, not circular,
% and not even symmetric.
-% interline#:=staffsize#/(stafflines-1)+stafflinethickness#;
+%noteheight#:=interline#;
% even more pronounced (almost overdone), just like the original
-interline#:=staffsize#/(stafflines-1)+2stafflinethickness#;
+noteheight#:=interline#+1.5stafflinethickness#;
def test_grid =
if test>1:
save b_h,a_w;
enddef;
-def end_notehead(expr code,interline,name,id,texstr) =
+def end_notehead(expr code,height,name,id,texstr) =
save a,b,h,w,ai,bi;
- h#=interline;
+ h#=height;
2b#=h#*b_h;
a#=b#*a_b;
w#=2a#/a_w;
define_pixels(a,b);
define_pixels(w,h);
define_pixels(ai,bi);
- fet_beginchar(code,w#,h#,0,name,id,texstr);
+ fet_beginchar(code,w#,h#,0,0,name,id,texstr);
path black,white;
black=distorted_ellipse(a,b,a*err_y_a,0,super);
white=distorted_ellipse(ai,bi,ai*err_y_ai,bi*err_x_bi,superi);
alpha:=0;
super:=0.707;
ai_a:=0.508;
- ai_bi:=1.23;
+ % 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;
- alphai:=135;
- superi:=0.69;
+ % alphai:=135;
+ alphai:=125; % jcn
+ % superi:=0.69;
+ superi:=0.68; % jcn
b_h:=1; %no rotate-> no height correction
a_w:=1; % no rotate-> no width correction
- end_notehead(incr code,interline#,"Whole notehead","0","wholeball");
+ end_notehead(incr code,noteheight#,"Whole notehead","0","wholeball");
% half note
% Wanske, p.39
a_b:=1.50; % after drawing
err_y_a:=0.157;
alpha:=34;
- super:=0.66;
- ai_a:=0.863;
- ai_bi:=3.14;
+ % super:=0.66;
+ super:=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;
alphai:=alpha;
superi:=0.80;
b_h:=0.935;
a_w:=1.12;
- end_notehead(incr code,interline#,"Half notehead","1","halfball");
+ end_notehead(incr code,noteheight#,"Half notehead","1","halfball");
% quarter note
% Wanske p.38
superi:=0.707;
b_h:=0.85;
a_w:=1.09;
- end_notehead(incr code,interline#,"Quarter notehead","2","quartball");
+ end_notehead(incr code,noteheight#,"Quarter notehead","2","quartball");
% from MO*gen.mf
lthick:=.4pt;
nhw#:=6/5interline#;
define_pixels(nhh,nhw);
-fet_beginchar(incr code,2interline#,interline#,0,"Brevis notehead","-1","breveball");
+fet_beginchar(incr code,2interline#,interline#,0,0,"Brevis notehead","-1","breveball");
fill_square (5/4nhw, .25nhh, (0,.25nhh));
add_mirror (origin, right);
x1=x2=0; x3=x4=5/4nhw; y1=-y2=y3=-y4=.7nhh;
savepic;
endchar;
-fet_beginchar(incr code,2interline#,interline#,0,"Longa notehead","-2","longaball");
+fet_beginchar(incr code,2interline#,interline#,0,0,"Longa notehead","-2","longaball");
callpic;
pickup line_pen;
draw (5/4nhw,-.7nhh)--(5/4nhw,-1.7nhh);
--- /dev/null
+% eindelijk.mf
+% LilyPond's own rest(s)
+
+% MO*TeX stuff
+% nhh#:=interline#;
+% nhw#:=6/5*interline#;
+% define_pixels(interline,nhw);
+
+med#:=1/33designsize;
+thick#:=1/16designsize;
+define_blacker_pixels(med,thick);
+pen med_pen;
+med_pen:= pencircle scaled med;
+
+rthin:=1/8interline;
+% rthick:=2rthin;
+rthick:=2thick+rthin;
+
+def shift_pic (expr pone, ptwo) =
+ currentpicture:=currentpicture shifted (round(pone),round(ptwo))
+enddef;
+
+% ugh, dunno how to generate doubles "outside*" rests?
+fet_begingroup("almostrests");
+
+% stem#:=1/8interline#;
+stem#:=1/5interline#;
+flare#:=2/3interline#;
+define_pixels(stem,flare);
+
+fet_beginchar(incr code,interline#,4interline#,0,0,"Quarter rest","4","quartrest");
+ alpha:=-50;
+ penpos1(rthin,alpha+90);
+ penpos2(5/4rthick,alpha);
+ penpos4(5/4rthick,alpha);
+ penpos3(3/4rthick,alpha);
+ penpos6(rthin,alpha-20);
+% penpos6(rthick,alpha-20);
+% penpos7(4/3thick,alpha);
+ penpos7(5/8rthick,alpha);
+ penpos8(rthin,-10);
+ y1l=7/2interline; x1l=1/3interline;
+ z2r=z1+(interline*right) rotated alpha;
+ z3=1/2[z2,z4];
+ x4=3/8interline; y4=2interline;
+ z6=z4l+(5/4interline*right) rotated alpha;
+% x7l=x4l; y7r=y6l;
+ x7l=x4l; y7l=y4r;
+ x8=2/5interline; y8= interline-1/4interline;
+ z5=z6r shifted (sqrt(2)*rthin/4,sqrt(2)*rthin/4);
+
+ pickup penrazor scaled rthin rotated 45;
+ draw z1--z2r;
+ draw z4l--z5;
+ penstroke z2e..z3e..z4e;
+ penstroke z6e..tension1.4..z7e..tension1.4..z8e;
+ penlabels(1,2,3,4,5,6,7,8);
+ endchar;
+
+def crook(expr a,w) =
+ begingroup;
+ save x,y;
+ penpos1(flare/2,-90);
+ penpos2(flare/2,0);
+ penpos3(flare/2,90);
+ penpos4(flare/2,180);
+ x4r=xpart a-w; y3r=ypart a+flare/4;
+ x1l=x2l=x3l=x4l;
+ y1l=y2l=y3l=y4l;
+ penpos5(stem,250);
+ x5=x4r+9/8flare; y5r=y1r;
+ penpos6(stem,260);
+ x6l=xpart a; y6l=ypart a;
+ penstroke z1e..z2e..z3e..z4e..z1e..z5e{right}..z6e;
+ penlabels(1,2,3,4,5,6);
+ endgroup;
+ enddef;
+
+def brush(expr a,w,b,v) =
+ begingroup;
+ save x,y;
+ z1=a; z2=b;
+ penpos3(w,angle(z2-z1)+90);
+ penpos4(w,angle(z2-z1));
+ penpos5(v,angle(z1-z2)+90);
+ penpos6(v,angle(z1-z2));
+ x3=x4=x1; y3=y4=y1;
+ x5=x6=x2; y5=y6=y2;
+ fill z3r{z1-z2}..z4l..{z2-z1}z3l..z5r{z2-z1}..z6l..{z1-z2}z5l..cycle;
+ penlabels(1,2,3,4,5,6);
+ endgroup;
+ enddef;
+
+fet_beginchar(incr code,4/3interline#,5/3interline#+2stafflinethickness#,0,0,"8th rest","-2","eighthrest");
+ save x,y;
+ x1=w-stem/6; y1=h-flare/4;
+ crook (z1,w-stem/6);
+ z2-z1=whatever*dir70;
+ y2=stem/2;
+ brush (z1,stem/3,z2,stem);
+ % ugh
+ currentpicture:=currentpicture shifted (0,interline);
+% currentpicture:=currentpicture shifted (0,interline+2stafflinethickness);
+ endchar;
+
+fet_beginchar(incr code,4/3interline#,5/3interline#+interline#+2stafflinethickness#,0,0,"16th rest","-2","sixteenthrest");
+ save x,y;
+ x1=w-stem/6; y1=h-flare/4;
+ z2-z1=whatever*dir74;
+ y2=stem/2;
+ brush (z1,stem/2,z2,stem);
+ crook (z1,7/8w);
+ z3-z1=whatever*dir74;
+ y3=y1-interline;
+ crook (z3,7/8w);
+% currentpicture:=currentpicture shifted (0,2stafflinethickness);
+ endchar;
+
+fet_beginchar(incr code,4/3interline#,5/3interline#+2interline#+2stafflinethickness#,0,0,"32th rest","-2","thirtysecondrest");
+ save x,y;
+ x1=w-stem/6; y1=h-flare/4;
+ z2-z1=whatever*dir76;
+ y2=stem/2;
+ brush (z1,stem/2,z2,stem);
+ crook (z1,7/8w);
+ z3-z1=whatever*dir76;
+ y3=y1-interline;
+ crook (z3,7/8w);
+ z4-z1=whatever*dir76;
+ y4=y1-2interline;
+ crook (z4,7/8w);
+% currentpicture:=currentpicture shifted (0,2stafflinethickness);
+ endchar;
+
+fet_beginchar(incr code,4/3interline#,5/3interline#+3interline#+2stafflinethickness#,0,0,"64th rest","-2","sixtyfourthrest");
+ save x,y;
+ x1=w-stem/6; y1=h-flare/4;
+ z2-z1=whatever*dir78;
+ y2=stem/2;
+ brush (z1,stem/2,z2,stem);
+ crook (z1,7/8w);
+ z3-z1=whatever*dir78;
+ y3=y1-interline;
+ crook (z3,7/8w);
+ z4-z1=whatever*dir78;
+ y4=y1-2interline;
+ crook (z4,7/8w);
+ z5-z1=whatever*dir78;
+ y5=y1-3interline;
+ crook (z5,7/8w);
+% currentpicture:=currentpicture shifted (0,2stafflinethickness);
+ endchar;
+
+fet_beginchar(incr code,4/3interline#,5/3interline#+4interline#+2stafflinethickness#,0,0,"128th rest","-2","hundredtwentyeighthrest");
+ save x,y;
+ x1=w-stem/6; y1=h-flare/4;
+ z2-z1=whatever*dir80;
+ y2=stem/2;
+ brush (z1,stem/2,z2,stem);
+ crook (z1,7/8w);
+ z3-z1=whatever*dir80;
+ y3=y1-interline;
+ crook (z3,7/8w);
+ z4-z1=whatever*dir80;
+ y4=y1-2interline;
+ crook (z4,7/8w);
+ z5-z1=whatever*dir80;
+ y5=y1-3interline;
+ crook (z5,7/8w);
+ z6-z1=whatever*dir80;
+ y6=y1-4interline;
+ crook (z6,7/8w);
+% currentpicture:=currentpicture shifted (0,2stafflinethickness);
+ endchar;
+
+fet_endgroup("rests");
+