beautiful sheet music from a music definition file. It can also play
mechanical performances to a MIDI file. Features include multiple
staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas,
-beams, slurs, triplets, formatting scores, part extraction. It includes
-a nice font of musical symbols.
+beams, slurs, triplets, named chords, transposing, formatting scores,
+part extraction. It includes a nice font of musical symbols.
LilyPond is de muziekzetter van het GNU Project. Dit programma drukt
prachtige bladmuziek volgens een muzikaal definitie bestand. Ook kan
het een mechanische uitvoering afspelen naar een MIDI bestand.
-Bijzondere kunstjes zijn verscheidene notenbalken, maatsoorten,
-sleutels, toonaarden, zangteksten, krachtige invoer taal, cadensa,
-balken, boogjes, triolen, partituren, en uittreksels voor individuele
-partijen. Een fraaie set muziektekens is inbegrepen.
+Bijzondere kunstjes zijn verscheidene notenbalken, maatsoorten, sleutels,
+toonaarden, zangteksten, krachtige invoer taal, cadensa, balken, boogjes,
+triolen, accoordnamen, transponeren, partituren, en uittreksels voor
+individuele partijen. Een fraaie set muziektekens is inbegrepen.
%
-
+@Book{banter,
+ author = {Harald Banter},
+ title = {Akkord Lexikon},
+ publisher = {Schott's S\"ohne},
+ year = {1987},
+ isbn = {ISBN 3-7957-2095-8},
+ note = {Comprehensive overview of commonly used
+ chords. Suggests (and uses) a unification for all different kinds
+ of chord names.},
+ address = {Mainz, Germany},
+}
@Book{rastall,
author = {Richard Rastall},
should do. If you are going to compile and install LilyPond very
often you might want to check out the file(buildscripts/set-lily.sh)
script. It sets some environment variables and symlinks, which comes
-in handly when you have to compile LilyPond very often.
+in handly when you have to compile LilyPond more often.
sect(PREREQUISITES)
Although we recommend to use Unix, LilyPond is known to run on Windows
NT/95/98 as well. See Section ref(w32).
-it() GNU C++ version 2.7 or newer (2.8 and egcs are also fine).
+it() GNU C++ version 2.8 or newer (egcs-1.1 or newer is also fine).
it() Python 1.5 (Strictly speaking, you shouldn't need Python for
compiling and installing, but you'll need it to regenerate the font
tables, e.g.).
-it() GUILE 1.3 (no, GUILE 1.2 won't work), check out lurl(http://www.gnu.org/programs/guile.html)
+it() GUILE 1.3 (no, GUILE 1.2 won't work), check out lurl(http://www.gnu.org/programs/guile.html).
)
sect(RUNNING)
it()A PostScript printer and/or viewer (such as Ghostscript) is strongly
recommended. Xdvi will show all embedded PostScript too if you have
Ghostscript installed.
-it() GUILE 1.3 (no, GUILE 1.2 won't work), check out lurl(http://www.gnu.org/programs/guile.html)
+it() GUILE 1.3 (no, GUILE 1.2 won't work), check out lurl(http://www.gnu.org/programs/guile.html)
)
+pl 12.jcn2
+ - bf: package-diff
+ - new chord syntax, again: TONIC [DURATION] ['-' MODIFIERS/ADDITIONS]
+ - shorthand prefix for note-mode: '@', no shorthand for notes in chord
+ mode...
+
+pl 12.jcn1
+pl 11.jcn6
+ - bf: ly2dvi: better guess LILYPONDPREFIX: <bin>../share/lilypond
+ - chord-table; urg bugs:
+ * note-collisions
+ * accidental-placement
+ - bf: cis m (\textsharpm, urg)
+
+pl 11.jcn5
+ - bib entry, twinkle-pop
+ - bf's: chords
+
+pl 11.jcn4
+
pl 13
- mutopia stuff (thanks, Peter)
- bugfix : \maininput
- one volta spanner per score
- repeat bars span staffs
- placement alternative number
- - dimensions of volta bracket
* who is trying to print too (small/big) piano braces all the time?
warning: piano brace too small (16.000pt)
* configure error if GUILE 1.3 not found
+ * configure error if no rtti (gcc 2.8 or egcs-1.1)
+
* catch GUILE errors?
* add new glyphs to font.ly
.. ?
* chords
- - guitar chords
- - chord names
+ - jazz style inversions C/E => <e g c>
+ - guitar chords (fret diagrams)
+ - other chord name styles (american(?) style)
- basso continuo
- - Syntax/parser
- MIDI output?
- - typesetting
* Debug logs:
- derive lily_stream, Dstream, texstream from ostream?
MAJOR_VERSION=1
MINOR_VERSION=1
PATCH_LEVEL=13
-MY_PATCH_LEVEL=
+MY_PATCH_LEVEL=uu1
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
setenv GS_LIB "@datadir@/afm"
setenv GS_FONTPATH "@datadir@/ps"
setenv LILYINCLUDE "@datadir@/ly:@datadir@/afm"
+setenv LILYPONDPREFIX "@datadir@"
# include an empty path component for the system wide includes.
setenv MFINPUTS "@datadir@/mf:$MFINPUTS::"
GS_LIB="@datadir@/afm"
GS_FONTPATH="@datadir@/ps"
LILYINCLUDE="@datadir@/ly:@datadir@/afm"
+# bit silly. for ly2dvi, overrules compiled-in datadir...
+LILYPONDPREFIX="@datadir@"
# include an empty path component for the system wide includes.
MFINPUTS="@datadir@/mf:"${MFINPUTS:=":"}
GUILE_LOAD_PATH="@datadir@/scm:$GUILE_LOAD_PATH"
-export GUILE_LOAD_PATH LILYINCLUDE MFINPUTS TEXINPUTS GS_LIB GS_FONTPATH
+export GUILE_LOAD_PATH LILYINCLUDE LILYPONDPREFIX MFINPUTS TEXINPUTS GS_LIB GS_FONTPATH
# echo $LILYINCLUDE $MFINPUTS $TEXINPUTS $GS_LIB $GS_FONTPATH
chmod 755 $LILYPOND_SOURCEDIR/buildscripts/ps-to-gifs.sh
ln -sf $LILYPOND_SOURCEDIR/buildscripts/ps-to-gifs.sh $prefix/bin/ps-to-gifs
ln -sf $LILYPOND_SOURCEDIR/mf/out/ afm
+mkdir -p $prefix/share/lilypond
+ln -sf $LILYPOND_SOURCEDIR/scm $prefix/share/lilypond
if [ -f ../.gdbinit ];
then
ln ../.gdbinit .
beautiful sheet music from a music definition file. It can also play
mechanical performances to a MIDI file. Features include multiple
staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas,
- beams, slurs, triplets, formatting scores, part extraction. It includes
- a nice font of musical symbols.
+ beams, slurs, triplets, named chords, transposing, formatting scores,
+ part extraction. It includes a nice font of musical symbols.
.
URLs: http://www.cs.uu.nl/~hanwen/lilypond/
http://www.xs4all.nl/~jantien/lilypond/
--- /dev/null
+\version "1.0.12";
+
+scales = \notes\transpose c''{
+ f2 f f f f f f f f f\break
+ }
+
+keys = \notes{
+ \key b; s1 \key f; s1 \key f; s1 \key f; s1 \key f; s1
+ }
+
+\score{
+ <
+ \type ChordNames \scales
+ \type Staff < \scales \keys >
+ >
+}
--- /dev/null
+\header{
+filename = "chord-table.ly";
+copyright = "public domain";
+enteredby = "jcn";
+}
+
+tab = \notes\transpose c'''\chords{
+ c1 c-m c-4 c-m4 c-5+ c-5- c-m5- c-5-5+ c-6\break %c-m6\break
+ % Han-Wen: try this instead, and Wierd Things (spacing etc) happen:
+% \notes {<c1 e g>} c1-m c-4 c-m4 c-5+ c-5- c-m5- c-5-5+ c-6 c-m6\break
+}
+
+\score{
+ \type StaffGroup <
+ \type Staff=c \notes\transpose c\tab
+ \type ChordNames=c \notes\transpose c\tab
+ \type Staff=cis \notes\transpose cis\tab
+ \type ChordNames=cis \notes\transpose cis\tab
+ \type Staff=des \notes\transpose des\tab
+ \type ChordNames=des \notes\transpose des\tab
+ \type Staff=d \notes\transpose d\tab
+ \type ChordNames=d \notes\transpose d\tab
+ \type Staff=es \notes\transpose es\tab
+ \type ChordNames=es \notes\transpose es\tab
+ \type Staff=e \notes\transpose e\tab
+ \type ChordNames=e \notes\transpose e\tab
+ \type Staff=fis \notes\transpose fis\tab
+ \type ChordNames=fis \notes\transpose fis\tab
+ \type Staff=g \notes\transpose g\tab
+ \type ChordNames=g \notes\transpose g\tab
+ \type Staff=as \notes\transpose as\tab
+ \type ChordNames=as \notes\transpose as\tab
+ \type Staff=a \notes\transpose a\tab
+ \type ChordNames=a \notes\transpose a\tab
+ \type Staff=bes \notes\transpose bes,\tab
+ \type ChordNames=bes \notes\transpose bes,\tab
+ \type Staff=b \notes\transpose b,\tab
+ \type ChordNames=b \notes\transpose b,\tab
+ >
+ \paper{
+ textheight = \vsize - 4.0 * \staffheight;
+ }
+
+}
%{
Would this be acceptable/good enough/convenient for entry?
- Convention/Standard Logical/Lily(?)
+ Convention/Standard Lily
C# cis
Cb ces
- Cm/Cmin c3-
- Caug c5+
- Cdim c5-
- Cmaj7 c7
- C7 c7-
- Csus/Csus4 c4^3
+ Cm; Cmin c-3-; c-m; c-min
+ Caug c-5+; c-aug;
+ Cdim c-5-; c-dim
+ Cmaj7 c-7+; c-maj
+ C7 c-7
+ Csus; Csus4 c-4; c-sus
%}
scales = \notes\transpose c''\chords{
- *c *g *d *a *e *b *fis
- *c *f *bes *es *as *des *ges
- *c6 *c7 *c9 *c11 *c13
+ %<c1 e g>
+ c1-m c-min c4-dim c-aug c-sus c-maj
+ c1-6 c4-7 c-9 c-11 c-13
+ c1 g d a e b fis
+ c1 f bes es as des ges
+ }
+
+keys = \notes{
+ s1
+ s1 s1 s1
+ s1 s1
+ s1
+ \key g; s1
+ \key d; s1
+ \key a; s1
+ \key e; s1
+ \key b; s1
+ \key fis; s1
+ \key c; s1
+ \key f; s1
+ \key bes; s1
+ \key es; s1
+ \key as; s1
+ \key des; s1
+ \key ges; s1
}
\score{
<
\type ChordNames \scales
- \type Staff \scales
+ \type Staff < \scales \keys >
>
}
Tested Features lyrics and chords
%}
-\version "1.0.10";
-
+\version "1.0.12";
+
melodie = \notes\relative c'' {
\clef "violin";
- \time 2/4 ;
-
+ \time 2/4 ;
+
c4 c | g' g | a a | g2 |
f4 f | e e | d d | c2 |
g'4 g | f f | e e | d d |
g g | f f | e e | d d |
- % copy 1-8
+ % copy 1-8
c4 c | g' g | a a | g2 |
- f4 f | e e | d d | c2 |
+ f4 f | e e | d d | c2 \bar "|.";
}
acc = \chords {
- % why don't \skip, s4 work?
- @2c @c @f @c
- @f @c @g7 @c
- @g @f @c @g7 % urg, bug!
- @g @f @c @g7
- % copy 1-8
- @2c @c @f @c
- @f @c @g7 @c
-}
+ % why don't \skip, s4 work?
+ c2 c f c
+ f c g-7 c
+ g f c g-7 % urg, bug!
+ g f c g-7
+ % copy 1-8
+ c2 c f c
+ f c g-7 c
+ }
+
text = \lyrics{
\property Lyrics . textstyle = "italic"
\score {
<
- \chords \type ChordNames \acc
-% \notes \type Staff=chords \acc
- \notes \type Staff=melody \melodie
+ \type ChordNames \acc
+ \type Staff=melody \melodie
+ \type Lyrics \text
+ >
+ \header{
+ title = "Ah, vous dirais-je, maman ";
+ }
+ \paper { }
+ }
+
+\score {
+ <
+ \chords \type ChordNames \transpose bes\acc
+ \notes \type Staff=melody \transpose bes\melodie
\lyrics \type Lyrics \text
>
+ \header{
+ piece = "clarinet in B\\textflat";
+ }
\paper { }
}
*/
+ /*
+ Banter style chord names (almost).
+ TODO:
+ - don't print inclusive scale (i.e. no "9" in c 9/11)
+ - handle c7 / cmaj7
+ - use #,b iso -es -is on tonica
+ - switch on property, add american (?) chordNameStyle
+
+ Scalar chordNameStyle = get_property ("chordNameStyle");
+ if (chordNameStyle == "Banner")
+ chord = pitches_to_banner (pitch_arr_.size ());
+
+ */
+
Scalar style = get_property ("textstyle");
Scalar alignment = get_property ("textalignment");
Text_def* text_p = new Text_def;
void kill_lexer();
void set_lexer();
-
/// lexer for Mudela
-class My_lily_lexer : public Includable_lexer {
- int lookup_keyword (String);
- int scan_bare_word (String);
- int scan_escaped_word (String);
-
- char escaped_char(char) const;
+class My_lily_lexer : public Includable_lexer
+{
public:
String main_input_str_;
void * lexval_l;
Scope * toplevel_scope_p_;
bool main_input_b_;
-
+
+ Notename_table *chordmodifier_tab_p_;
Notename_table *note_tab_p_;
Array<Scope*> scope_l_arr_;
Keyword_table * keytable_p_;
int errorlevel_i_;
- Notename_table *chordmodifier_tab_p_;
- Musical_pitch lookup_notename (String s);
+
+ My_lily_lexer ();
+ ~My_lily_lexer ();
+ int yylex ();
+
void start_main_input ();
- void set_notename_table(Notename_table*tab_p);
+ bool notename_b (String) const;
bool chordmodifier_b (String) const;
void set_chordmodifier_table (Notename_table*tab_p);
- Musical_pitch lookup_chordmodifier (String s);
-
- bool notename_b(String) const;
+ void set_notename_table (Notename_table*tab_p);
Identifier*lookup_identifier (String s);
- Musical_pitch lookup_pitch (String s);
+ Musical_pitch lookup_notename (String s);
+ Musical_pitch lookup_chordmodifier (String s);
void push_note_state();
void push_chord_state();
void push_lyric_state();
void pop_state();
void LexerError (char const *);
- My_lily_lexer();
void set_identifier (String str, Identifier* i, bool unique_b = true);
- ~My_lily_lexer();
- int yylex();
void print_declarations (bool init_b) const;
- void add_notename (String, Musical_pitch);
bool note_state_b() const;
bool chord_state_b() const;
bool lyric_state_b() const;
+
+private:
+ int lookup_keyword (String);
+ int scan_bare_word (String);
+ int scan_escaped_word (String);
+
+ char escaped_char(char) const;
};
#endif
{NOTECOMMAND} {
return scan_escaped_word (YYText () + 1);
}
+ {NOTECOMMAND} {
+ return scan_escaped_word (YYText () + 1);
+ }
{UNSIGNED} {
yylval.i = String_convert::dec2_i (String (YYText ()));
return UNSIGNED;
yylval.pitch = new Musical_pitch (lookup_notename (str));
yylval.pitch->set_spot (Input (source_file_l (),
here_ch_C ()));
- return NOTENAME_PITCH;
+ return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
} else if (chordmodifier_b (str)) {
DOUT << "(chordmodifier)\n";
yylval.pitch = new Musical_pitch (lookup_chordmodifier (str));
%type <i> dots
%token <i> DIGIT
%token <pitch> NOTENAME_PITCH
+%token <pitch> TONICNAME_PITCH
%token <pitch> CHORDMODIFIER_PITCH
%token <id> DURATION_IDENTIFIER
%token <id> IDENTIFIER
%type <symtables> symtables symtables_body
%type <pitch> explicit_musical_pitch steno_musical_pitch musical_pitch absolute_musical_pitch
+%type <pitch> steno_tonic_pitch
%type <notereq> steno_notepitch
%type <pitch_arr> pitch_list
-%type <music> chord
-%type <pitch_arr> chord_additions chord_subtractions
-%type <pitch> chord_note
+%type <music> chord notemode_chord
+%type <pitch_arr> chord_additions chord_subtractions
+%type <pitch> chord_addsub chord_note
%type <midi> midi_block midi_body
%type <duration> duration_length
%type <tempo> tempo_request
%type <notenametab> notenames_body notenames_block chordmodifiers_block
-%expect 6
+/* 5 extra for notemode_chord */
+%expect 15
%left '-' '+'
| ';'
;
+optional_dot:
+ /* empty */
+ | '.'
+ ;
+
paper_def_body:
/* empty */ {
Paper_def *p = THIS->default_paper_p ();
$$ = new Transposed_music ($3, *$2);
delete $2;
}
+ | TRANSPOSE steno_tonic_pitch Music {
+ $$ = new Transposed_music ($3, *$2);
+ delete $2;
+ }
| NOTES
{ THIS->lexer_p_->push_note_state (); }
Music
}
;
+steno_tonic_pitch:
+ TONICNAME_PITCH {
+ $$ = $1;
+ }
+ | TONICNAME_PITCH sup_quotes {
+ $$ = $1;
+ $$->octave_i_ += $2;
+ }
+ | TONICNAME_PITCH sub_quotes {
+ $$ = $1;
+ $$->octave_i_ += - $2;
+ }
+ ;
+
explicit_musical_pitch:
MUSICAL_PITCH '{' int_list '}' {/* ugh */
Array<int> &a = *$3;
simple_element:
steno_notepitch notemode_duration {
- if (!THIS->lexer_p_->note_state_b ()
- && !THIS->lexer_p_->chord_state_b ())
+ if (!THIS->lexer_p_->note_state_b ())
THIS->parser_error (_ ("have to be in Note mode for notes"));
$1->duration_ = *$2;
$$ = THIS->get_note_element ($1, $2);
{
$$ = new Array<Musical_pitch>;
}
- | '^' chord_subtractions chord_note {
- $2->push (*$3);
- $$ = $2;
+ | '^' {
+ $$ = new Array<Musical_pitch>;
+ }
+ | chord_subtractions chord_addsub {
+ $$ = $1;
+ $$->push (*$2);
}
;
"""
name = 'ly2dvi'
-version = '0.0.6'
+version = '0.0.7'
errorlog = ''
import sys
else:
p=os.path.split(sys.argv[0])
p=os.path.split(p[0])
- this.setRoot(p[0],'init')
+ # bit silly. for ly2dvi, overrules compiled-in datadir...
+ # how to do this better (without running lily, of course?
+ this.setRoot(p[0] + '/share/lilypond', 'init')
if not os.environ.has_key('HOME'):
if os.environ.has_key('HOMEDRIVE') and \
+pl 61
+ - bf: package-diff
+
pl 60
- small fixes.
PACKAGE_NAME=StepMake
MAJOR_VERSION=0
MINOR_VERSION=1
-PATCH_LEVEL=59
+PATCH_LEVEL=61
MY_PATCH_LEVEL=
# use the above to send patches, always empty for released version:
dpkg-buildpackage -b; \
)'
-# urg urg
-# this one works for unix (try 'make diff help==' or 'make diff release==')
-makeflags=$(patsubst %==, %, $(patsubst %----,%,$(MAKEFLAGS:%=--%)))
-# and this one for nt
-# makeflags=$(patsubst %==, %, $(patsubst %----,%,$($(MAKEFLAGS:%=--%):--unix%=%)))
+makeflags=$(patsubst %==, %, $(patsubst ----%,,$(MAKEFLAGS:%=--%)))
diff:
$(PYTHON) $(step-bindir)/package-diff.py --package=$(topdir) $(makeflags)