TOPLEVEL_MAJOR_VERSION = 0
TOPLEVEL_MINOR_VERSION = 0
-TOPLEVEL_PATCH_LEVEL = 65
+TOPLEVEL_PATCH_LEVEL = 66
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
+[DRAFT]
Announcing
for compilation you need
- Unix. (Win32 is known to work, too)
+ Unix. (windows32 is known to work, too)
GNU C++ v2.7 or better, with libg++ installed.
GNU make.
Flex (2.5.1 or better).
dynamics (both absolute and hairpin style) clef changes, meter
changes, cadenza-mode, key changes, repeat bars
-
[Kudos to the FSF, all linux hackers, and --of course-- especially
GrandMaster Linus T, for the OS and The Announce :-]
-19/May/97 LilyPond 0.0.65 1
+19/May/97 LilyPond 0.0.66 1
=item *
-Unix. GNU LilyPond is known to run on Linux, AIX, Digital Unix and
-Solaris
+A Unix system with GNU tools. GNU LilyPond is known to run on Linux,
+AIX, Digital Unix and Solaris.
-If you have the Cygnus WIN32 port of the GNU utils, it will
+If you have the Cygnus WINDOWS32 port of the GNU utils, it will
even work in Lose NT/95, but don't promise to support it.
=item *
with the perl's Plain Old Documentation.
=item *
+
(GNU) find
=back
Windows NT:
-you need the cygnus win32 gnu port development stuff; have a look
+you need the cygnus windows32 gnu port development stuff; have a look
at http://www.cygnus.com/gnu-win32.
to make GNU LilyPond under, brr, aargh, well, simply type:
GNU LilyPond (pl 0.0.39) is known to compile on the following platforms:
+Unix:
+
* linux 2.0.x, g++ 2.7.2[.1]
* aix 4.1, g++ 2.7.2
- * windows-nt 4.0, cygnus gnu-win32 beta17.1 (~=g++ 2.7.2)
+
+Other:
+
+ * windows-nt 4.0, cygnus gnu-windows32 beta17.1 (~=g++ 2.7.2)
* linux 2.0.28 X to doze, gcc-go32 (~=g++ 2.7.2) [exec. untested]
=head1 AUTHORS
translated into printable items is complex: it is not always possible
to associate one Request with one Item or Spanner.
+As a further notice, we want to move away from TeX (and perhaps
+output PostScript or render to an X window too)
=head2 Miscellaneous
Q: I want a DOS/NT/W95 port.
-A.0: Reconsider. Try Linux. It's fun!
+A.0: Reconsider. Try Linux/GNU. It's fun!
A.1: Currently (patchlevel 27), GNU LilyPond (and flowerLib) compiles, links
and runs on windhoos-nt, using the cygnus gnu port (release b17.1).
Random ranting about the GNU Music project
-=head GOAL
+=head1 GOAL
Provide the users with free software for:
=item *
<a href=lelieblond.gif
>
-The lilypond logo (Big)
+The lilypond logo (Big, format: .gif)
</a
>
=item *
<a href=lelie_logo.gif
>
-The lilypond logo (in gif format, medium size)
+The lilypond logo (medium size, format: .gif)
</a
>
=item *
<a href=example_output.html
>
-examples: MIDI, PS, GIF and input.
+examples: MIDI, PS, .gif and input.
</a
>
=head1 DESCRIPTION
-A list of resources on music printing/writing and engraving.
-Please note that don't have access to most material (except a library
-copy of Chlapik)
+A list of resources on music printing/writing and engraving. Please
+note that don't have access to most material (except a library copy of
+Chlapik)
+
+
+More on GNU Music: http://dept-info.labri.u-bordeaux.fr/~strandh/Gsharp
+
=head2 References
W.A. Hegazy and J. S. Gourlay. Optimal line breaking in music. In
``Document Manipulation and Typography'', J.C. van Vliet (ed) 1988.
-Ross, Ted. ``Teach yourself the art of music engraving and processing''
-(3rd edition). Hansen House, Miami Beach, FL.
+Ross, Ted. ``Teach yourself the art of music engraving and
+processing'' (3rd edition). Hansen House, Miami Beach, FL.
Hansen House
1820 West Ave.
Miami, FL 33139
(305) 532-5461
-[This is about I<engraving> i.e. professional music typesetting, and includes
-some good spacing tables]
+[This is about I<engraving> i.e. professional music typesetting, and
+includes some good spacing tables]
Read, Gardner. ``Modern Rhythmic Notation.'' Indiana University Press, 1978.
as one is likely to get.]
The University of Colorado Music Engraving page.
-http://www.cc.colorado.edu/cgi-bin/mfs/01/Dept/Musicpress/Welcome.html
-
-More on GNU Music: http://www.u-bordeaux.fr/~strandh
+http://www.cc.colorado.edu/cgi-bin/mfs/01/Dept/MU/Musicpress/Welcome.html
=head2 Further reading
P\bP\bP\bPR\bR\bR\bRE\bE\bE\bER\bR\bR\bRE\bE\bE\bEQ\bQ\bQ\bQU\bU\bU\bUI\bI\bI\bIS\bS\bS\bSI\bI\bI\bIT\bT\bT\bTE\bE\bE\bES\bS\bS\bS
For compilation you need.
- +\bo Unix. GNU LilyPond is known to run on Linux, AIX,
- Digital Unix and Solaris
+ +\bo A Unix system with GNU tools. GNU LilyPond is known
+ to run on Linux, AIX, Digital Unix and Solaris.
- If you have the Cygnus WIN32 port of the GNU utils,
- it will even work in Lose NT/95, but don't promise to
- support it.
+ If you have the Cygnus WINDOWS32 port of the GNU
+ utils, it will even work in Lose NT/95, but don't
+ promise to support it.
+\bo GNU C++ v2.7 or better, with libg++ installed.
Version 2.7.2 or better recommended. I almost
documentation was created with the perl's Plain Old
Documentation.
- +\bo (GNU) find
+ +\bo (GNU) find
C\bC\bC\bCO\bO\bO\bON\bN\bN\bNF\bF\bF\bFI\bI\bI\bIG\bG\bG\bGU\bU\bU\bUR\bR\bR\bRI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG a\ba\ba\ban\bn\bn\bnd\bd\bd\bd C\bC\bC\bCO\bO\bO\bOM\bM\bM\bMP\bP\bP\bPI\bI\bI\bIL\bL\bL\bLI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
to install GNU LilyPond, simply type:
-26/May/97 LilyPond 0.0.65 1
+28/May/97 LilyPond 0.0.66 1
-26/May/97 LilyPond 0.0.65 2
+28/May/97 LilyPond 0.0.66 2
-26/May/97 LilyPond 0.0.65 3
+28/May/97 LilyPond 0.0.66 3
-26/May/97 LilyPond 0.0.65 4
+28/May/97 LilyPond 0.0.66 4
INSTALL(1) LilyPond documentation INSTALL(1)
- you need the cygnus win32 gnu port development stuff; have
- a look at http://www.cygnus.com/gnu-win32.
+ you need the cygnus windows32 gnu port development stuff;
+ have a look at http://www.cygnus.com/gnu-win32.
to make GNU LilyPond under, brr, aargh, well, simply type:
GNU LilyPond (pl 0.0.39) is known to compile on the
following platforms:
+ Unix:
+
* linux 2.0.x, g++ 2.7.2[.1]
* aix 4.1, g++ 2.7.2
- * windows-nt 4.0, cygnus gnu-win32 beta17.1 (~=g++ 2.7.2)
+
+ Other:
+
+ * windows-nt 4.0, cygnus gnu-windows32 beta17.1 (~=g++ 2.7.2)
* linux 2.0.28 X to doze, gcc-go32 (~=g++ 2.7.2) [exec. untested]
-
-
-
-
-
-26/May/97 LilyPond 0.0.65 5
+28/May/97 LilyPond 0.0.66 5
+pl 66
+ - make_website --jpeg, --png and --gif
+ - win32 -> windows32
+ - bf: Score_elem::TeXstring assert fail
+ - bf: headswap with stemdown
+ - bf: broken tie
+ - bf: broken slur
+ - bf: accidental dims
+ - bf: measure bar width
+
+
+******
+may 26
pl 65
- bf pathfind /root/file
- massive Score_elem rewrite:
* decent TeX page layout
- * per-pstaff item-widths [JCN]
+ * per staff item-widths [JCN]
* script priority
- trill
- bracket
- * Rewrite Beam and Rhythmic_grouping (hairy)
+ * Rewrite Stem, Beam and Rhythmic_grouping (hairy)
- [c8. c32 c32]
- interbeam height
- doc on Rhythmic_grouping
- - general shaving
+ - general shaving on Beam and Stem
- use plet grouping
- abbreviations [c2 c2]1/2
- separate visual from rhythmic info even more
****************
+
BUGS
+ * RPM permissions -> redhat!
+
* spurious Weird stem size warnings
* staccato dot positions.
* lilypond - -> crash
- * chlapik balk ruimte
-
* standchen triool beam up/down
SEVERELY LACKING:
SMALLISH PROJECTS
- * handle do_substitute_dependency in more derived classes.
-
- * replace member access by get()/set() methods, to enable
+ * replace Score_elem member access by get()/set() methods, to enable
future embedded code.
* --fast/--draft: leave out constraints
* adaptive accidental spacing.
- * Score_elem invible_b_ flag
+ * Score_elem invisible_b_ flag
* unix style paths for LILYINCLUDE env
* detect -pipe
-
DOC
* Score_elem structure.
* guitar chord
- * Junk Staff_column, and find the requests while walking the Voices.?
+ * Junk Staff_column, and find the requests while walking the
+ Voices.?
* better beamslope calculation: QLP for beams?
* volta
- * piano staff
-
- * vertical spanner
-
IDEAS
- * derive PCol from Score_elem?
+ * check out CORBA for Score_elems?
+
+ * derive PCol from Score_elem? More in Score_elems? Spacing?
* scoping in Lexer: do general id- assignments in mudela.
# stupid script to generate WWW site.
use FileHandle;
+use Getopt::Long;
my $lily_version;
my $footstr;
my $mw_id = "<!make_website!>";
+
sub get_version
{
my ($vstr)=("");
{
my (@cmds) = @_;
foreach $cmd (@cmds) {
+ my ($ignoreret)=0;
+ if ( $cmd =~ /^-/ ) {
+ $ignoreret = 1;
+ $cmd = substr ($cmd, 1);
+ }
+
my $ret = ( system ($cmd));
- if ($ret) {
+ if (!$ignoreret && $ret) {
print STDERR "\nmake_website: failed on command \`$cmd\' (status $ret)\n";
exit 2;
}
my_system "make -kC .. html";
}
+sub ps_to_gif
+{
+ my ($a)=@_;
+
+ if (! -f "$a.ps" ) {
+ my_system("gunzip -c $a.ps.gz > $a.ps");
+ }
+ my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $a.ps -c quit |pnmscale 0.5| ppmtogif > $a.gif";
+}
+
+
+sub ps_to_jpeg
+{
+ my ($a)=@_;
+ my $in = "$a.ps";
+
+ my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $in -c quit |pnmscale 0.5| cjpeg -grayscale > $a.jpeg";
+}
+
sub gen_examples
{
print "generating examples: \n";
if ( ! -f "$a.ly.txt" ) {
my_system "ln $depth/input/$a.ly ./$a.ly.txt";
}
- if ( ! -f "$a.ps.gz" ) {
+ if (! -f "$a.dvi" ) {
my_system "lilypond $a;",
- "$tex",
- "dvips -o $a.ps $texfile;";
-
+ "$tex", "-mv $texfile.dvi $a.dvi";
+ }
+ if ( ! -f "$a.ps.gz" && ! -f "$a.ps" ) {
+ my_system "dvips -o $a.ps $a.dvi";
}
- my_system "mv lelie.midi $a.midi; " if ( -f "lelie.midi" );
+ my_system "mv lelie.midi $a.midi; " if ( -f "lelie.midi" );
# generate the pixmap at twice the size, then rescale (for antialiasing)
if ( ! -f "$a.gif" ) {
- my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $a.ps -c quit |pnmscale 0.5| ppmtogif > $a.gif",
- "gzip $a.ps";
+ ps_to_gif($a);
+ }
+ if ( ! -f "$a.ps.gz" ) {
+ my_system "gzip -f $a.ps";
}
}
}
$inputf="$a.ly.txt";
$giff="$a.gif";
+ $jpegf="$a.jpeg";
+ $pngf = "$a.png";
$psf="$a.ps.gz";
$midif="$a.midi";
- print HTMLLIST "<ul>
-<li><a href=$inputf> The input file</a>
-<li><a href=$giff>The output (gif)</a>
-<li><a href=$psf>The output (PS)</a>\n";
+ print HTMLLIST "<ul>";
+
+ print HTMLLIST "<li><a href=$inputf> The input file</a>"
+ if ( -f $inputf );
- print HTMLLIST "<li><a href=$midif>The output (MIDI)</a>\n"
+ print HTMLLIST "<li><a href=$giff>The output (picture)</a>"
+ if ( -f $giff );
+
+ print HTMLLIST "<li><a href=$psf>The output (PS)</a>\n"
+ if ( -f $psf );
+
+ print HTMLLIST "<li><a href=$midif>The output (MIDI)</a>\n"
if ( -f $midif );
print HTMLLIST "</ul>";
}
print HTMLLIST "</BODY></HTML>";
- close HTMLLIST;
+ close HTMLLIST;
}
sub edit_html
my $subst = $footstr;
$subst .= $back if (! $a =~ /index.html/ );
$file =~ s/$sep/$subst$sep/g ;
-
+ $file =~ s/\.gif/\.$image/g;
open H, ">$a";
print H $mw_id;
print H $file;
close H;
}
}
+
sub copy_files
{
print "copying files\n";
"cp ../lelie*gif .";
}
+sub set_images
+{
+ for $a (<*.gif>) {
+ if ($opt_png) {
+ my_system "gif2png -d $a";
+ }
+ if ($opt_jpeg) {
+ my $b=$a;
+ $b =~ s/.gif/.jpeg/;
+ my_system "cjpeg -o $b $a";
+ }
+ }
+}
+
sub docxx_update
{
my_system "make -C $depth doc++";
{
print "tarring.\n";
my_system
- " tar vhcf website.tar *.html *.gif *.ps.gz *.txt *.midi docxx/*;",
+ " tar vhcf website.tar *.html *.$image *.ps.gz *.txt *.midi docxx/*;",
"gzip -f9 website.tar;";
}
-
+sub identify
+{
+ print STDERR "make_website 0.1\n";
+
+}
sub main
{
+ identify;
+ GetOptions("jpeg", "gif", "png");
+
+ local $image="gif" ;
+ $image = "png" if ($opt_png);
+ $image = "jpeg" if ($opt_jpeg);
+
$depth = "../";
my $cwd;
chomp($cwd = `pwd`);
gen_html;
gen_examples;
- gen_list;
copy_files;
+ set_images;
+ gen_list;
edit_html;
+
docxx_update;
do_tar;
}
+
main;
MAJOR_VERSION = 1
MINOR_VERSION = 1
-PATCH_LEVEL = 18
+PATCH_LEVEL = 19
# use to send patches, always empty for released version:
MY_PATCH_LEVEL = # include separator: "-1" or ".a"
#
version 1.1:
+pl 19
+ - Array::reverse()
pl 18
- Path::find("/usr/..") fix
arrcpy(r.thearray, thearray + lower, s);
return r;
}
+ void reverse() {
+ int h = size_/2;
+ for (int i =0,j = size_-1; i < h; i++,j--)
+ swap(i,j);
+ }
};
#endif
"half" "\hslurchar%{%}"
}
"accidentals" = \table {
- "-2" "\flatflat" 0\pt 10.2\pt -2.5\pt 7.5\pt
- "-1" "\flat" 0\pt 6\pt -2.5\pt 7.5\pt
- "0" "\natural" 0\pt 6\pt -7.5\pt 7.5\pt
- "1" "\sharp" 0\pt 6\pt -7.5\pt 7.5\pt
- "2" "\sharpsharp" 0\pt 6\pt -2.5\pt 7.5\pt
+ "-2" "\flatflat" 0\pt 8.16\pt -2.5\pt 7.5\pt
+ "-1" "\flat" 0\pt 4.8\pt -2.5\pt 7.5\pt
+ "0" "\natural" 0\pt 4.8\pt -7.5\pt 7.5\pt
+ "1" "\sharp" 0\pt 3.6\pt -7.5\pt 7.5\pt
+ "2" "\sharpsharp" 0\pt 4.8\pt -2.5\pt 7.5\pt
}
"streepjes" = \table {
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 65
+PATCH_LEVEL = 66
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
x = s->hpos_f();
int dir = s->dir_i_;
idealy = dir * s->stem_end_f();
- miny = dir * s->stem_start_f();
+ miny = dir * s->stem_start_f() + 2; // ugh
assert(miny <= idealy);
}
PCursor<PCol *> find_col(PCol const *)const;
Link_array<PCol> col_range(PCol *left_l, PCol *right_l) const;
+ Link_array<PCol> breakable_col_range(PCol*,PCol*) const;
+ Link_array<PCol> broken_col_range(PCol*,PCol*) const;
/* MAIN ROUTINES */
void process();
/*
p-score.cc -- implement PScore
- source file of the LilyPond music typesetter
+ source file of the GNU LilyPond music typesetter
(c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
#include "lookup.hh"
#include "spanner.hh"
#include "paper-def.hh"
-#include "molecule.hh"
-#include "dimen.hh"
#include "scoreline.hh"
#include "p-score.hh"
#include "tex-stream.hh"
-#include "item.hh"
#include "break.hh"
#include "p-col.hh"
*mlog << "\nPostprocessing elements..." << endl;
postprocess();
}
+/** Get all breakable columns between l and r, (not counting l and r). */
+Link_array<PCol>
+PScore::breakable_col_range(PCol*l,PCol*r)const
+{
+ Link_array<PCol> ret;
+
+ PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
+ PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
+
+ while ( start < stop ) {
+ if (start->breakable_b())
+ ret.push(start);
+ start++;
+ }
+ return ret;
+}
Link_array<PCol>
PScore::col_range(PCol*l,PCol*r)const
{
ret.push(r);
return ret;
}
+
+Link_array<PCol>
+PScore::broken_col_range(PCol*l,PCol*r)const
+{
+ Link_array<PCol> ret;
+
+ PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
+ PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
+
+ while ( start < stop ) {
+ if (start->breakable_b() && !start->line_l_ )
+ ret.push(start);
+ start++;
+ }
+
+ return ret;
+}
remove_us_arr.uniq();
for (int i=0; i <remove_us_arr.size(); i++)
remove_dependency(remove_us_arr[i]);
+
+ if (status < BROKEN)
+ status = BROKEN;
}
}
+static int
+Note_column_compare(Note_column *const&n1 , Note_column* const&n2)
+{
+ return n1->pcol_l_->rank_i() - n2->pcol_l_->rank_i();
+}
+
void
Slur::do_post_processing()
{
+ encompass_arr_.sort(Note_column_compare);
if (!dir_i_)
set_default_dir();
Real inter_f = paper()->internote_f();
- if (encompass_arr_[0]->stem_l_)
+
+ if (encompass_arr_[0]->stem_l_)
left_pos_i_ = rint(encompass_arr_[0]->stem_l_->height()[dir_i_]/inter_f);
- else
- left_pos_i_ = 0;
+ else
+ left_pos_i_ = rint ( encompass_arr_[0]->head_positions_interval()[dir_i_]);
+
if (encompass_arr_.top()->stem_l_)
right_pos_i_ = rint(encompass_arr_.top()->stem_l_->height()[dir_i_]/inter_f);
- else
- right_pos_i_ = 0;
+ else
+ right_pos_i_ = rint (encompass_arr_.top()->head_positions_interval()[dir_i_]);
left_pos_i_ += dir_i_;
right_pos_i_ += dir_i_;
Spanner::do_print()const
{
if (broken_into_l_arr_.size())
- mtor << "Spanner with broken pieces\n";
+ mtor << "with broken pieces\n";
}
void
{
PCol * left = left_col_l_;
PCol * right = right_col_l_;
- if (left->daddy_l_)
- left = left->daddy_l_;
- if (right->daddy_l_)
- right = right->daddy_l_;
+ if(left->daddy_l_) left = left->daddy_l_;
+ if(right->daddy_l_) right = right->daddy_l_;
- Link_array<PCol> all_cols = pscore_l_->col_range(left, right);
- Line_of_score *line = left->line_l_;
- if (!line) {
- left = left->postbreak_p_;
- line = left->line_l_;
+ Link_array<PCol> break_cols = pscore_l_->broken_col_range(left,right);
+ Link_array<Spanner> broken_into_l_arr;
+
+ break_cols.insert(left,0);
+ break_cols.push(right);
+
+ for (int i=1; i < break_cols.size(); i++) {
+ Spanner* span_p = clone();
+ left = break_cols[i-1];
+ right = break_cols[i];
+ if (!right->line_l_)
+ right = right->prebreak_p_;
+ if (!left->line_l_)
+ left = left->postbreak_p_;
+
+ assert(left&&right && left->line_l_ == right->line_l_);
+
+ span_p->left_col_l_ = left;
+ span_p->right_col_l_ = right;
+
+ pscore_l_->typeset_broken_spanner(span_p);
+ broken_into_l_arr.push( span_p );
}
- for (int i=1; i < all_cols.size(); i++) {
- if (!all_cols[i]->line_l_) {
-
- Spanner* span_p = clone();
- right = all_cols[i]->prebreak_p_;
- assert(left&&right && left->line_l_ == right->line_l_);
-
- span_p->left_col_l_ = left;
- span_p->right_col_l_ = right;
- left = all_cols[i]->postbreak_p_;
- line = left->line_l_;
-
- pscore_l_->typeset_broken_spanner(span_p);
- broken_into_l_arr_.push( span_p );
- }
- }
+ broken_into_l_arr_ = broken_into_l_arr;
}
void
}
// if dir_i_ is set we return a fake value.
-
int
Stem::get_center_distance()
{
stem_xoffset_f_ = 0;
}
+/*
+ TODO
+
+ move into note_column.cc
+
+ */
void
Stem::set_noteheads()
{
if(!head_l_arr_.size())
return;
head_l_arr_.sort(Note_head::compare);
+ if (dir_i_ < 0)
+ head_l_arr_.reverse();
+
head_l_arr_[0]->extremal_i_ = -1;
head_l_arr_.top()->extremal_i_ = 1;
int parity=1;
Begin3
Title: LilyPond
-Version: 0.0.65
-Entered-date: 05/23/97
+Version: 0.0.66
+Entered-date: 05/28/97
Description: LilyPond is a program which converts a music-script (mudela) into
TeX output, or MIDI to produce multi-staff scores. Features include multiple
meters, clefs, keys, lyrics, versatile input-language, cadenzas
jan@digicash.com (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: pcnov095.win.tue.nl /pub/lilypond/
- 300k lilypond-0.0.65.tar.gz
+ 300k lilypond-0.0.66.tar.gz
Alternate-site:
Original-site:
Platform: unix/win32, GNU C++
Name: lilypond
-Version: 0.0.65
+Version: 0.0.66
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.65.tar.gz
+Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.66.tar.gz
Summary: A preprocessor to make TeX typeset music.
URL: http://www.stack.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
+%
+% A tex file to help determine dims.
+%
\font\musicfont=musixsps
\font\slurfont=xslu16
\def\thefont{\musicfont}
\newdimen\noteheight
\newdimen\notewidthhalf
\newdimen\notewidthdouble
+\newdimen\notewidthquart
\newdimen\staffrulethickness
\newdimen\interstaffrule
\newdimen\balkhalf
\interlinedist=\fontdimen5\musicfnt
\smallspace=.3\interlinedist
\interstaffrule=\balkhoog
- \advance\interstaffrule by-\staffrulethickness
\divide\interstaffrule by 4
- \advance\interstaffrule by -\staffrulethickness
\notewidthhalf=\notewidth
+ \notewidthquart=\notewidth
\notewidthdouble=\notewidth
\rationalmultiply \notewidthhalf*1/2
+ \rationalmultiply\notewidthquart*1/4
\multiply \notewidthdouble by 2
- \balkhalf=\balkhoog
- \rationalmultiply\balkhalf*1/2
+ \balkhalf=\balkhoog
+ \rationalmultiply\balkhalf*1/2
}
% dynamics take extra kerning
\def\emptybar{}
-\def\thinbar{\vrule height\balkhoog}
+\def\thinbar{\vrule height\balkhoog width0.8pt} % TODO parametric.
\def\thickbar{\vrule height\balkhoog width 2\smallspace}
\def\maatstreep{\thinbar}
%? what-s wrong with rightalign?
\def\finishbar{\rightalign{\thinbar\kern\smallspace\thickbar}}
-%%% \def\finishbar{\hss\rightalign{\thinbar\kern\smallspace\thickbar}}
-% \def\repeatstopbar{\rightalign{\repeatcolon\hskip2\smallspace\thinbar\hskip\smallspace\thickbar}}
-
\def\repeatstopbar{\hss\rightalign{\repeatcolon\hskip2\smallspace\thinbar\hskip\smallspace\thickbar}}
\def\repeatstartbar{\hbox{\thickbar\kern\smallspace\thinbar\kern2\smallspace\repeatcolon}}
\def\repeatstopstart{\hbox{\repeatcolon\kern2\smallspace\thinbar\kern\smallspace\thickbar\kern\smallspace\thickbar\kern\smallspace\thinbar\kern2\smallspace\repeatcolon}}
\n=0\nointerlineskip%
\loop\ifnum\n<#1\advance\n by1%
\kern\interstaffrule
- \hrule height \staffrulethickness width#2
+ \nointerlineskip
+ \vbox to 0pt{\hrule height \staffrulethickness width#2%
+ \vss}\nointerlineskip
\repeat
}}
+%%
+% Ugh. Need to redo this. Wish we had PS.
+%
\def\toplines#1{ % why space needed here?
\topalign{\hbox{\kern-\notewidth\lines{#1}{\notewidthdouble}}}}
+
\def\botlines#1{ % idem ditto
\botalign{\hbox{\kern-\notewidth\lines{#1}{\notewidthdouble}}}}