+pl 16.jcn2
+ - mf-to-table.in: generate mozarella metric info tables
+ - autometric.mf: write metric info to mf logfile
+ - ital-r.mf, smaller ital-m.mf
+ - variable streepjes length (top/bottomlines); fixed (for 20pt?)
+ - streepjes twice as thick as staffrules
+ - even more pronounced bolletjes -- how 'bout this wendy?
+ - quarter and half note after drawings (a/b less distinct)
+
pl 16
- bf: doco about {Mus*,Opus}TeX
- ; optional after \musicidentifier
- bf: 20 pt flags
- bf: longarest
-
pl 15.jcn1
- bf: typos whole and half notehead
- de-uglyfied bolletjes.mf
TOPLEVEL_PATCH_LEVEL = 16
# use to send patches, always empty for released version:
-TOPLEVEL_MY_PATCH_LEVEL =
+TOPLEVEL_MY_PATCH_LEVEL = .jcn1
--- /dev/null
+#!@PERL@ -w
+# -*-perl-*-
+
+=head1 TODO
+
+rename me!
+
+Ugh . Perl sux. Anybody for Python?
+
+=cut
+
+$mf_to_table_version = 0.1;
+
+use Getopt::Long;
+
+sub last_conversion
+{
+ my @v = &versions;
+ return pop @v;
+}
+sub identify
+{
+
+ print STDERR "This is mf-to-table " . $mf_to_table_version . "\n";
+}
+
+sub usage
+{
+ print STDERR "Usage: mf-to-table [options] LOG..\n"
+ . "Generate mozarella metrics table from preparated metafont log\n\n"
+ . "Options:\n"
+ . " -h, --help print this help\n"
+ . " -o, --output=FILE name output file\n"
+}
+
+sub make_table
+{
+ my $line;
+ my $indent = 0;
+ while ($line = <IN>) {
+ if ($line =~ /^@@/) {
+ $line =~ s/^@@(.*)@@/$1/;
+ chop ($line);
+ my @fields = split (/:/,$line);
+ my $label = $fields [0];
+ my $name = $fields [1];
+ print OUT "\t" x $indent;
+ if ($label eq "font") {
+ print OUT "% $name=\\symboltables {\n";
+ $indent++;
+ } elsif ($label eq "group") {
+ print OUT "\"$name\" = \\table {\n";
+ $indent++;
+ } elsif ($label eq "puorg") {
+ print OUT "}\n";
+ $indent--;
+ } elsif ($label eq "tnof") {
+ print OUT "% } % $name\n";
+ $indent--;
+ } elsif ($label eq "char") {
+ my $c = $fields [2];
+ my $w = $fields [3];
+ my $h = $fields [4];
+ my $d = $fields [5];
+ my $id = $fields [6];
+ my $texstr = $fields [7];
+ print OUT sprintf( "\"%s\"\t\"\\%s\"\t%.2f\\pt\t%.2f\\pt\t%.2f\\pt\t%.2f\\pt\n", $id, $texstr, 0, $w, $h, $d );
+ } else {
+ print STDERR "mf-to-table: unknown label: \`$label\'\n";
+ }
+ }
+ }
+}
+
+sub set_files
+{
+ $infile = "-";
+ $outfile = "-";
+ $outfile = $opt_output if (defined($opt_output));
+
+ if ($ARGV [0]) {
+ $infile = $ARGV[0];
+ }
+ if (( ! -f $infile) && (! $infile =~ /\\.log$/s ) ){
+ $infile .= ".log";
+ }
+ print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. \n";
+}
+
+sub do_one_arg
+{
+ set_files;
+
+ die "can't open \`$infile\'" unless open IN,$infile ;
+ die "can't open \`$outfile\'" unless open OUT, ">$outfile";
+ print OUT "% generated at " . localtime() . " from $infile\n";
+ print OUT "% changes will be lost\n";
+
+ make_table;
+
+ close IN;
+ close OUT;
+}
+
+## "main"
+
+identify;
+
+#GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
+GetOptions ("help", "output=s");
+
+if ($opt_help) {
+ usage();
+ $opt_help = 0; # to extinguish typo check.
+ exit 0;
+}
+
+local ($infile,$outfile);
+my $processed_one=0;
+
+while (defined($ARGV[0])) {
+ do_one_arg;
+ shift @ARGV;
+ $processed_one = 1;
+}
+do_one_arg unless ($processed_one);
+
INIFILES = $(wildcard *.ly)
DISTFILES = Makefile $(INIFILES)
+## we probably can make tex/*defs.tex and init/*.ly in one go...
+## moved to mf/Makefile
+FONT_FILES = $(wildcard $(depth)/mf/*[0-9].mf)
+TABLES = $(patsubst $(depth)/mf/%.mf,%.ly,$(FONT_FILES))
+##
+## all: $(TABLES)
+##
+## $(outdir)/%.log: $(depth)/mf/%.mf
+## mf $<
+## mv $(@F) $@
+## rm $(shell basename $< .mf).*gf
+##
+## %.ly: $(outdir)/%.log
+## mf-to-table -o $@ $<
+##
+localclean:
+ rm -f $(TABLES)
localinstall:
$(INSTALL) -d $(datadir)/lilypond/init
--- /dev/null
+% generated at Mon Sep 22 21:28:05 1997 from out/dyn10.log
+% changes will be lost
+% dyn=\symboltables {
+ % } % dyn
--- /dev/null
+% generated at Mon Sep 22 22:26:51 1997 from out/font-en-tja16.log
+% changes will be lost
+% font-en-tja=\symboltables {
+ "balls" = \table {
+ "0" "\wholeball" 0.00\pt 8.64\pt 4.80\pt 0.00\pt
+ "1" "\halfball" 0.00\pt 5.97\pt 4.80\pt 0.00\pt
+ "2" "\quartball" 0.00\pt 5.88\pt 4.80\pt 0.00\pt
+ "-1" "\breveball" 0.00\pt 9.60\pt 4.80\pt 0.00\pt
+ "-2" "\longaball" 0.00\pt 9.60\pt 4.80\pt 0.00\pt
+ }
+ % } % font-en-tja
--- /dev/null
+% generated at Mon Sep 22 22:28:11 1997 from out/font-en-tja20.log
+% changes will be lost
+% font-en-tja=\symboltables {
+ "balls" = \table {
+ "0" "\wholeball" 0.00\pt 10.44\pt 5.80\pt 0.00\pt
+ "1" "\halfball" 0.00\pt 7.21\pt 5.80\pt 0.00\pt
+ "2" "\quartball" 0.00\pt 7.10\pt 5.80\pt 0.00\pt
+ "-1" "\breveball" 0.00\pt 11.60\pt 5.80\pt 0.00\pt
+ "-2" "\longaball" 0.00\pt 11.60\pt 5.80\pt 0.00\pt
+ }
+ % } % font-en-tja
rule_thickness = 0.4\pt;
bar_size = 16.0 \pt;
interline = 4.\pt;
- notewidth = 5.45\pt; % ugh, see table16 for sizes
- wholewidth = 8.0\pt;
+ notewidth = 5.93\pt; % ugh, see table16 for sizes
+ wholewidth = 8.64\pt;
unitspace = 22.\pt;
%geometric = 1.414;
basicspace = 4.\pt;
rule_thickness = 0.4\pt;
bar_size = 20.0 \pt;
interline = 5.\pt;
- notewidth = 6.7\pt; % ugh see table20 for sizes
- wholewidth = 10.0\pt;
+ notewidth = 7.15\pt; % ugh see table20 for sizes
+ wholewidth = 10.44\pt;
unitspace = 22.\pt;
% basicspace = 4.\pt;
% geometric = 1.414;
--- /dev/null
+% generated at Mon Sep 22 22:23:19 1997 from out/r20.log
+% changes will be lost
+% font-en-tja=\symboltables {
+ "rests" = \table {
+ "-2" "\eighthrest" 0.00\pt 5.40\pt 17.55\pt 0.00\pt
+ }
+ % } % font-en-tja
"tenor_change" "\caltoclef" 0.0\pt 11.2\pt 0.0\pt 16.0\pt
}
- "balls" = \table {
- "-2" "\longaball" 0.0\pt 6.0\pt -2.0\pt 2.0\pt
- "-1" "\breveball" 0.0\pt 6.0\pt -2.0\pt 2.0\pt
- "0" "\wholeball" 0.0\pt 8.0\pt 0.0\pt 4.4\pt
- "1" "\halfball" 0.0\pt 5.4\pt 0.0\pt 4.4\pt
- "2" "\quartball" 0.0\pt 5.5\pt 0.0\pt 4.4\pt
- }
+ % ugh what's our outdir called?
+ \include "font-en-tja16.ly"
"slur" = \table {
"whole" "\slurchar%{%}"
"half" "\hslurchar%{%}"
}
+
"accidentals" = \table {
"-2" "\flatflat" 0.0\pt 8.16\pt -2.5\pt 7.5\pt
"-1" "\flat" 0.0\pt 4.8\pt -2.5\pt 7.5\pt
}
"streepjes" = \table {
- "toplines" "\toplines{%}" -1.0\pt 7.0\pt 0.0\pt 0.0\pt
- "botlines" "\botlines{%}" -1.0\pt 7.0\pt 0.0\pt 0.0\pt
+ "toplines" "\toplines{%}{%}" -1.0\pt 7.0\pt 0.0\pt 0.0\pt
+ "botlines" "\botlines{%}{%}" -1.0\pt 7.0\pt 0.0\pt 0.0\pt
}
"bars" = \table {
"tenor_change" "\caltoclef" 0.0\pt 16.0\pt 0.0\pt 20.0\pt
}
- "balls" = \table {
- "-1" "\breveball" 0.0\pt 7.5\pt -2.5\pt 2.5\pt
- "0" "\wholeball" 0.0\pt 10.2\pt 0.0\pt 5.4\pt
- "1" "\halfball" 0.0\pt 6.8\pt 0.0\pt 5.4\pt
- "2" "\quartball" 0.0\pt 6.6\pt 0.0\pt 5.4\pt
- }
+ % ugh what's our outdir called?
+ \include "font-en-tja20.ly"
"slur" = \table {
"whole" "\slurchar%{%}" 0.0\pt 0.0\pt 0.0\pt 0.0\pt
}
"streepjes" = \table {
- "toplines" "\toplines{%}" -3.0\pt 9.0\pt 0.0\pt 0.0\pt
- "botlines" "\botlines{%}" -3.0\pt 9.0\pt 0.0\pt 0.0\pt
+ "toplines" "\toplines{%}{%}" -3.0\pt 9.0\pt 0.0\pt 0.0\pt
+ "botlines" "\botlines{%}{%}" -3.0\pt 9.0\pt 0.0\pt 0.0\pt
}
"bars" = \table {
\melodic{
\octave c';
\meter 4/4;
+ % \longa
+ % \breve % \brevis
c1 g c' a'
c2 g c' a'
c4 g c' a'
a\ppp a\pp a\p a\mp a\mf a\f a\ff a\fff
- %a\fp a\sf a\sfz
+ a\fp a\sf a\sfz % a\fz a\rf
}
\paper{
\paper_twenty
pos == -3: below staff
*/
- Atom streepjes (int pos) const;
+ Atom streepjes (int type, int pos) const;
Atom vbrace (Real &dy) const;
Atom meter (Array<Scalar>) const;
}
Atom
-Lookup::streepjes (int i) const
+Lookup::streepjes (int type, int i) const
{
assert (i);
arg = i;
idx = "toplines";
}
+
+ // ugh
+ Real w = paper_l_->note_width ();
+ if (type <= 0)
+ w *= 1.46;
+
Atom ret = (*symtables_)("streepjes")->lookup (idx);
Array<String> a;
+ a.push (String (w) + "pt");
a.push (arg);
ret.tex_ = substitute_args (ret.tex_, a);
? -((-position_i_)/2)
: (position_i_-staff_size_i_)/2;
- Atom str = p->lookup_l()->streepjes (s);
+ Atom str = p->lookup_l()->streepjes (balltype_i_, s);
Molecule sm;
sm.add (Atom (str));
if (position_i_ % 2)
# descent order into subdirectories:
#
-SUBDIRS = flower lib lily mf mi2mu \
- Documentation bin init input tex make
+SUBDIRS = bin flower lib lily mf mi2mu \
+ Documentation init input tex make
#
# list of distribution files:
EXTRA_DISTFILES = $(MFFILES) $(TEXFILES) TODO
#
+FONT_FILES = $(wildcard *[0-9].mf)
+tableout = $(depth)/init
+TABLES = $(addprefix $(tableout)/, $(FONT_FILES:.mf=.ly))
+#
+
+all: $(TABLES)
+
+# localclean:
+# rm -f $(TABLES)
+
+$(outdir)/%.log: %.mf
+ mf $<
+ mv $(@F) $@
+ rm $(shell basename $< .mf).*gf
+
+$(tableout)/%.ly: $(outdir)/%.log
+ mf-to-table -o $@ $<
+
localinstall:
$(INSTALL) -d $(MFDIR)/lilypond
$(INSTALL) -m 644 $(MFFILES) $(MFDIR)/lilypond/
localuninstall:
for i in $(MFFILES) ; do rm -f $(MFDIR)/lilypond/$$i; done
-rmdir $(MFDIR)/lilypond/
+
+# dependencies:
+#
+$(tableout)/dyn10.ly: autometric.mf ital-f.mf ital-m.mf ital-p.mf ital-r.mf ital-s.mf ital-z.mf dyn10.mf
+$(tableout)/font-en-tja16.ly: autometric.mf bolletjes.mf font-en-tja16.mf
+$(tableout)/font-en-tja20.ly: autometric.mf bolletjes.mf font-en-tja20.mf
+#
+
+
- - add r to dynfont
- move to OpusTeX fonts
- make own font-en-tja{10,11,13,16,20} files
- opustex/lilypond fonts from the same generic driver files
-% metric.mf
+% autometric.mf
% part of LilyPond's pretty-but-neat music font
+% font or database?
def fet_beginfont(expr name,size) =
+ font_identifier:=name&decimal size;
+ font_size size;
message "@@font:"&name&":"&decimal size&"@@";
message "";
enddef;
+
+def fet_endfont(expr name) =
+ message "@@tnof:"&name&"@@";
+ message "";
+ enddef;
+
+% group or table?
+def fet_begingroup(expr name) =
+ message "@@group:"&name&"@@";
+ message "";
+ enddef;
+
+def fet_endgroup(expr name) =
+ message "@@puorg:"&name&"@@";
+ message "";
+ enddef;
-def fet_beginchar(expr code,w,h,d,name) =
- message "@@char:"&name&":"&decimal code&":"&decimal w&":"&decimal h&":"&decimal d&"@@";
+def fet_beginchar(expr code,w,h,d,name,id,texstr) =
+ message "@@char:"&name&":"&decimal code&":"&decimal w&":"&decimal h&":"&decimal d&":"&id&":"&texstr&"@@";
beginchar(code,w,h,d) name;
enddef;
% bolletjes.mf
% part of LilyPond's pretty-but-neat music font
% third try at bolletjes
-% most beautiful bolletjes are not circular, and not even symmetric.
+% most beautiful bolletjes are pronounced, not circular,
+% and not even symmetric.
-interline#:=staffsize#/(stafflines-1)+stafflinethickness#;
+% interline#:=staffsize#/(stafflines-1)+stafflinethickness#;
+% even more pronounced (almost overdone), just like the original
+interline#:=staffsize#/(stafflines-1)+2stafflinethickness#;
def test_grid =
if test>1:
save b_h,a_w;
enddef;
-def end_notehead(expr code,interline,name) =
+def end_notehead(expr code,interline,name,id,texstr) =
save a,b,h,w,ai,bi;
h#=interline;
2b#=h#*b_h;
define_pixels(a,b);
define_pixels(w,h);
define_pixels(ai,bi);
- fet_beginchar(code,w#,h#,0,name);
+ fet_beginchar(code,w#,h#,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);
endgroup;
enddef;
+% fet_begingroup("noteheads");
+fet_begingroup("balls");
% whole note
% Wanske, p.38
% begin_notehead(incr code,interline#,"Whole notehead");
superi:=0.69;
b_h:=1; %no rotate-> no height correction
a_w:=1; % no rotate-> no width correction
- end_notehead(incr code,interline#,"Whole notehead");
+ end_notehead(incr code,interline#,"Whole notehead","0","wholeball");
% half note
% Wanske, p.39
begin_notehead;
- a_b:=1.49; % after text
- % a_b:=1.50; % after drawing
+ % a_b:=1.49; % after text
+ a_b:=1.50; % after drawing
err_y_a:=0.157;
alpha:=34;
super:=0.66;
superi:=0.80;
b_h:=0.935;
a_w:=1.12;
- end_notehead(incr code,interline#,"Half notehead");
+ end_notehead(incr code,interline#,"Half notehead","1","halfball");
% quarter note
% Wanske p.38
begin_notehead;
- a_b:=1.57; % after text
- % a_b:=1.54; % after drawing
+ % a_b:=1.57; % after text
+ a_b:=1.54; % after drawing
err_y_a:=0.044;
alpha:=32;
super:=0.707;
superi:=0.707;
b_h:=0.85;
a_w:=1.09;
- end_notehead(incr code,interline#,"Quarter notehead");
+ end_notehead(incr code,interline#,"Quarter notehead","2","quartball");
-end.
+% from MO*gen.mf
+lthick:=.4pt;
+pen line_pen;
+line_pen:= pencircle scaled lthick;
+
+picture save_pic;
+def callpic = currentpicture:= save_pic enddef;
+def savepic = save_pic:= currentpicture enddef;
+
+def add_mirror (expr pone, ptwo) =
+ addto currentpicture also currentpicture
+ reflectedabout (round(pone), round(ptwo))
+enddef;
+
+def fill_square (expr xwidth, ywidth, zshift) =
+ fill unitsquare xscaled xwidth yscaled ywidth shifted zshift
+enddef;
+
+% ugh
+nhh#:=interline#;
+nhw#:=6/5interline#;
+define_pixels(nhh,nhw);
+
+fet_beginchar(incr code,2interline#,interline#,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;
+ pickup line_pen;
+ draw z1--z2; draw z3--z4;
+ savepic;
+ endchar;
+
+fet_beginchar(incr code,2interline#,interline#,0,"Longa notehead","-2","longaball");
+ callpic;
+ pickup line_pen;
+ draw (5/4nhw,-.7nhh)--(5/4nhw,-1.7nhh);
+ endchar;
+
+% fet_endgroup("noteheads");
+fet_endgroup("balls");
\hbox{\dynfp}
\hbox{\dynsf}
\hbox{\dynsfz}
+\hbox{\dynfz}
+\hbox{\dynrf}
\bye
mode_setup;
font_setup;
+input autometric;
+fet_beginfont("dyn", 10);
+
num=-1;
input ital-f;
input ital-p;
slant:=.28; % tilt ratio $(\Delta x/\Delta y)$
-stem#:=30/36pt#; % lowercase stem breadth
-ess#:=28/36pt#; % breadth in middle of lowercase s
+stem#:=26/36pt#; % lowercase stem breadth
+ess#:=24/36pt#; % breadth in middle of lowercase s
crisp#:=13/36pt#; % diameter of serif corners
tiny#:=13/36pt#; % diameter of rounded corners
font_setup;
input ital-m;
+input ital-r;
input ital-s;
input ital-z;
font_slant slant; font_x_height x_height#;
-bye.
+
+fet_endfont("dyn");
+end.
% font-en-tja16.mf
% part of LilyPond's pretty-but-neat music font
-mode_setup;
+% font_identifier:="font-en-tja16";
+% font_size 16pt#;
+input autometric;
+fet_beginfont("font-en-tja", 16);
+
+mode_setup;
test:=0;
stafflinethickness#:=0.4pt#;
code:=-1;
-input autometric;
-% fet_beginfont;
-fet_beginfont("font-en-tja", 16);
-
input bolletjes;
+fet_endfont("font-en-tja");
+
end.
mode_setup;
+input autometric;
+fet_beginfont("font-en-tja", 20);
+
test:=0;
staffsize#:=20pt#;
stafflinethickness#:=0.4pt#;
code:=-1;
-input autometric;
-fet_beginfont("font-en-tja", 20);
-
input bolletjes;
+fet_endfont("font-en-tja");
+
end.
% cmchar "Italic letter m";
% beginchar("m",15u#,x_height#,0);
\"Dynamic letter m";
-beginchar(incr num,15u#,x_height#,0);
+% beginchar(incr num,15u#,x_height#,0);
+beginchar(incr num,10u#,x_height#,0);
italcorr 1/3x_height#*slant+.5hair#+.5u#;
adjust_fit(if monospace:-1.5u#,-2u# else: 0,0 fi); pickup fine.nib;
numeric shaved_stem; shaved_stem=mfudged.stem;
--- /dev/null
+% ital-r.mf
+% from itall.mf
+%
+% Computer Modern Italic lower case:
+% This lowercase italic alphabet was prepared by D. E. Knuth in December, 1979,
+% inspired by the Monotype faces used in {\sl The Art of Computer Programming}.
+% The programs were revised for the new \MF\ conventions in 1985.
+
+% Character codes \0141 through \0172 are generated.
+% not
+
+% cmchar "Italic letter r";
+% beginchar("r",5.5u#+max(1.75u#,flare#),x_height#,0);
+\"Dynamic letter r";
+beginchar(incr num,5.5u#+max(1.75u#,flare#),x_height#,0);
+italcorr x_height#*slant;
+adjust_fit(if monospace:.25u#,.5u# else: 0,0 fi); pickup fine.nib;
+x0=0; x2=x3; pos3(stem,0); lft x3l=hround(2.5u-.5stem); y3-.5stem=-oo;
+hook_in(0,1,2); % opening hook
+filldraw circ_stroke z3e--z2e; % left stem
+pos3'(hair,180); z3'=z3; pos4(vair,90); pos5(hair,0); pos6(flare,0);
+x4=w-.5u-max(1.75u,flare); rt x5r=hround(r-.5u); top y4r=h+oo;
+filldraw stroke z3'e{up}...z4e{right}; % link
+y6+.5flare=vround(bot y4l-.03x_height); bulb(4,5,6); % bulb
+math_fit(-2/3x_height#*slant+.5hair#+.5u#,ic#-.5u#);
+penlabels(0,1,2,3,4,5,6); endchar;
\def\dynnf{\dynfont\char1}
\def\dynp{\dynfont\char2}
\def\dynm{\dynfont\char3}
-\def\dyns{\dynfont\char4}
-\def\dynz{\dynfont\char5}
+\def\dynr{\dynfont\char4}
+\def\dyns{\dynfont\char5}
+\def\dynz{\dynfont\char6}
\def\kdynf{\dynnf}
\def\kdynp{\dynp\kern-.1ex}
\def\dynfp{{\kdynf\dynp}}
\def\dynsf{{\dyns\kern-.3ex\dynnf}}
\def\dynsfz{{\dynsf\dynz}}
+\def\dynfz{{\dynf\dynz}}
+\def\dynrf{{\dynr\dynf}}
\newdimen\noteheight
\newdimen\staffrulethickness
\newdimen\interstaffrule
+\newdimen\dist
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% set fonts and primary dimensions
+% ugh
\def\musixtwentydefs{
\balkheight=20pt
- \notewidth=6.7pt
+ \notewidth=7.15pt
\noteheight=5pt
\staffrulethickness=0.4pt
\musixtwentyfonts
\def\musixsixteendefs{
\balkheight=16pt
\staffrulethickness=0.4pt
- \notewidth=5.45pt
+ \notewidth=5.93pt
\noteheight=4pt
\musixsixteenfonts
\font\textmusic=cmmi10
%%
% Ugh. Need to redo this. Wish we had PS.
%
-\def\toplines#1{ % why space needed here?
- \topalign{\hbox{\kern-\notewidth\lines{#1}{1.6\notewidth}{1.6\staffrulethickness}}}}
-
-\def\botlines#1{ % idem ditto
- \botalign{\hbox{\kern-\notewidth\lines{#1}{1.6\notewidth}{1.6\staffrulethickness}}}}
+\def\toplines#1#2{ % why space needed here?
+ \dist#1
+ % ugh, lily still uses "notewith" for all heads
+ \topalign{\hbox{\kern-.50\notewidth\kern-.25\dist\lines{#2}{1.5\dist}{2\staffrulethickness}}}}
+
+\def\botlines#1#2{ % idem ditto
+ \dist#1
+ \botalign{\hbox{\kern-.50\notewidth\kern-.25\dist\lines{#2}{1.5\dist}{2\staffrulethickness}}}}
%
% a staffsymbol with #1 lines, width #2
% \musicdef\quartball{'007}
% \musicdef\halfball{'010}
% \musicdef\wholeball{'011}
+\musicdef\breveball{'040}
+\musicdef\longaball{'047}
\fetdef\quartball{'002}
\fetdef\halfball{'001}
\fetdef\wholeball{'000}
-\musicdef\breveball{'040}
-\musicdef\longaball{'047}
+% \fetdef\breveball{'003}
+% \fetdef\longaball{'004}
\musicdef\halfrest{'074}
\musicdef\wholerest{'075}
\musicdef\breverest{'072}