source file of the GNU LilyPond music typesetter
- (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
*/
#include "scm-option.hh"
-#include "translator-def.hh"
+#include "context-def.hh"
#include "lily-guile.hh"
#include "misc.hh"
#include "my-lily-lexer.hh"
#include "input.hh"
#include "lilypond-input-version.hh"
#include "scm-hash.hh"
-#include "auto-change-iterator.hh"
#include "ly-modules.hh"
#include "music-sequence.hh"
#include "input-smob.hh"
%token ACCEPTS
%token ADDLYRICS
+%token NEWADDLYRICS
%token ALIAS
%token ALTERNATIVE
%token APPLY
%token PAPER
%token PARTCOMBINE
%token PARTIAL
-%token PITCHNAMES
%token PROPERTY
%token RELATIVE
%token REMOVE
%type <i> exclamations questions dots optional_rest
%type <i> bass_mod
%type <scm> grace_head
+%type <scm> oct_check
%type <scm> context_mod_list
%type <scm> lyric_element
%type <scm> bass_number br_bass_figure bass_figure figure_list figure_spec
%token <scm> DURATION_IDENTIFIER
%token <scm> FRACTION
%token <id> IDENTIFIER
-%token <scm> CHORDNAMES
+%token DRUMS
+%token <scm> DRUM_PITCH
%token <scm> CHORD_MODIFIER
%token <scm> SCORE_IDENTIFIER
%token <scm> MUSIC_OUTPUT_DEF_IDENTIFIER
%token MARKUP
%token <scm> MARKUP_HEAD_MARKUP0
+%token <scm> MARKUP_HEAD_EMPTY
%token <scm> MARKUP_HEAD_MARKUP0_MARKUP1
%token <scm> MARKUP_HEAD_SCM0
%token <scm> MARKUP_HEAD_SCM0_MARKUP1
%type <scm> embedded_scm scalar
%type <music> Music Sequential_music Simultaneous_music
-%type <music> relative_music re_rhythmed_music part_combined_music
+%type <music> relative_music re_rhythmed_music
%type <music> music_property_def context_change
%type <scm> Music_list
%type <scm> property_operation context_mod translator_mod optional_context_mod
-%type <outputdef> music_output_def_body
-%type <music> shorthand_command_req
+%type <outputdef> music_output_def_body music_output_def_head
%type <music> post_event tagged_post_event
-%type <music> command_req verbose_command_req
-%type <music> hyphen_req
+%type <music> command_req
%type <music> string_number_event
%type <scm> string bare_number number_expression number_term number_factor
%type <score> score_block score_body
%type <scm> translator_spec_block translator_spec_body
%type <music> tempo_event
-%type <scm> notenames_body notenames_block chordmodifiers_block
%type <scm> script_abbreviation
;
toplevel_expression:
- notenames_block {
- THIS->lexer_->pitchname_tab_ = $1;
- }
- | chordmodifiers_block {
- THIS->lexer_->chordmodifier_tab_ = $1;
- }
- | lilypond_header {
+ lilypond_header {
THIS->input_file_->header_ = $1;
}
| score_block {
for (int i=0; i < sc->defs_.size (); i++)
default_rendering (sc->music_, sc->defs_[i]->self_scm(),head, outname);
- if (sc->defs_.empty ())
+ if (sc->defs_.is_empty ())
{
Music_output_def *id =
unsmob_music_output_def (THIS->lexer_->lookup_identifier
scm_gc_unprotect_object (sc->self_scm());
}
| output_def {
+ SCM id = SCM_EOL;
if (dynamic_cast<Paper_def*> ($1))
- THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultpaper"), $1->self_scm ());
+ id = scm_makfrom0str ("$defaultpaper");
else if (dynamic_cast<Midi_def*> ($1))
- THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultmidi"), $1->self_scm ());
+ id = scm_makfrom0str ("$defaultmidi");
+ THIS->lexer_->set_identifier (id, $1->self_scm ());
+ scm_gc_unprotect_object ($1->self_scm ());
}
;
;
-chordmodifiers_block:
- CHORDMODIFIERS notenames_body { $$ = $2; }
- ;
-
-notenames_block:
- PITCHNAMES notenames_body { $$ = $2; }
- ;
-
-notenames_body:
- embedded_scm {
- int i = scm_ilength ($1);
- SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL);
- for (SCM s = $1; gh_pair_p (s); s = ly_cdr (s)) {
- SCM pt = ly_cdar (s);
- scm_hashq_set_x (tab, ly_caar (s), pt);
- }
- $$ = tab;
- }
- ;
lilypond_header_body:
{
;
-
identifier_init:
score_block {
$$ = $1->self_scm ();
translator_spec_body:
/**/ {
- $$ = Translator_def::make_scm ();
+ $$ = Context_def::make_scm ();
unsmob_context_def ($$)->set_spot (THIS->here_input ());
}
| TRANSLATOR_IDENTIFIER {
unsmob_context_def ($$)->set_spot (THIS->here_input ());
}
| translator_spec_body GROBDESCRIPTIONS embedded_scm {
- Translator_def*td = unsmob_context_def($$);
+ Context_def*td = unsmob_context_def($$);
for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p)) {
SCM tag = gh_caar (p);
+
+ /* TODO: should make new tag "grob-definition" ? */
td->add_context_mod (scm_list_n (ly_symbol2scm ("assign"),
- tag, ly_cdar (p), SCM_UNDEFINED));
+ tag, gh_cons (ly_cdar (p), SCM_EOL), SCM_UNDEFINED));
}
}
| translator_spec_body context_mod {
}
| SCORE_IDENTIFIER {
- $$ = unsmob_score ($1);
+ $$ = new Score ( *unsmob_score ($1));
$$->set_spot (THIS->here_input ());
}
| score_body lilypond_header {
}
| score_body output_def {
$$->defs_.push ($2);
+ scm_gc_unprotect_object ($2->self_scm ());
}
| score_body error {
}
;
-music_output_def_body:
- MIDI '{' {
+music_output_def_head:
+ MIDI {
Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultmidi"));
$$ = p;
THIS->lexer_->add_scope (p->scope_);
}
- | PAPER '{' {
+ | PAPER {
Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper"));
Paper_def *p = 0;
if (id)
THIS->lexer_->add_scope (p->scope_);
$$ = p;
}
- | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
- Music_output_def * o = unsmob_music_output_def ($3);
- $$ =o;
+ ;
- THIS->lexer_->add_scope (o->scope_);
+
+music_output_def_body:
+ music_output_def_head '{' {
+
}
- | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
+ | music_output_def_head '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
+ scm_gc_unprotect_object ($1->self_scm ());
Music_output_def * o = unsmob_music_output_def ($3);
$$ = o;
-
+ THIS->lexer_->remove_scope ();
THIS->lexer_->add_scope (o->scope_);
}
| music_output_def_body assignment {
}
| music_output_def_body translator_spec_block {
$$->assign_translator ($2);
-
}
| music_output_def_body tempo_event {
/*
Midi_def * md = dynamic_cast<Midi_def*> ($$);
if (md)
md->set_tempo (d->get_length (), m);
+ scm_gc_unprotect_object ($2->self_scm ());
}
| music_output_def_body error {
;
Composite_music:
- AUTOCHANGE STRING Music {
- Music*chm = MY_MAKE_MUSIC("AutoChangeMusic");
- chm->set_mus_property ("element", $3->self_scm ());
- chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_proc);
+ AUTOCHANGE Music {
+ static SCM proc ;
+ if (!proc)
+ proc = scm_c_eval_string ("make-autochange-music");
+
+ SCM res = scm_call_1 (proc, $2->self_scm ());
+ scm_gc_unprotect_object ($2->self_scm ());
+ $$ = unsmob_music (res);
+ scm_gc_protect_object (res);
+ $$->set_spot (THIS->here_input());
+ }
+ | PARTCOMBINE Music Music {
+ static SCM proc;
+ if (!proc)
+ proc = scm_c_eval_string ("make-part-combine-music");
+ SCM res = scm_call_1 (proc, gh_list ($2->self_scm (),
+ $3->self_scm (), SCM_UNDEFINED));
scm_gc_unprotect_object ($3->self_scm ());
- chm->set_mus_property ("what", scm_string_to_symbol ($2));
-
- $$ = chm;
- chm->set_spot (*$3->origin ());
+ scm_gc_unprotect_object ($2->self_scm ());
+ $$ = unsmob_music (res);
+ scm_gc_protect_object (res);
+ $$->set_spot (THIS->here_input());
}
| grace_head Music {
#if 1
scm_gc_unprotect_object (startm->self_scm ());
}
-
Music* seq = MY_MAKE_MUSIC("SequentialMusic");
seq->set_mus_property ("elements", ms);
}
}
| NOTES
- { THIS->lexer_->push_note_state (); }
+ {
+ SCM nn = THIS->lexer_->lookup_identifier ("pitchnames");
+ THIS->lexer_->push_note_state (alist_to_hashq (nn));
+ }
+ Music
+ { $$ = $3;
+ THIS->lexer_->pop_state ();
+ }
+ | DRUMS
+ {
+ SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames");
+ THIS->lexer_->push_note_state (alist_to_hashq (nn));
+ }
Music
{ $$ = $3;
THIS->lexer_->pop_state ();
THIS->lexer_->pop_state ();
}
- | CHORDS
- { THIS->lexer_->push_chord_state (); }
- Music
- {
+ | CHORDS {
+ SCM nn = THIS->lexer_->lookup_identifier ("chordmodifiers");
+ THIS->lexer_->chordmodifier_tab_ = alist_to_hashq (nn);
+ nn = THIS->lexer_->lookup_identifier ("pitchnames");
+ THIS->lexer_->push_chord_state (alist_to_hashq (nn));
+
+ } Music {
Music * chm = MY_MAKE_MUSIC("UnrelativableMusic");
chm->set_mus_property ("element", $3->self_scm ());
scm_gc_unprotect_object ($3->self_scm());
}
| relative_music { $$ = $1; }
| re_rhythmed_music { $$ = $1; }
- | part_combined_music { $$ = $1; }
| TAG embedded_scm Music {
tag_music ($3, $2, THIS->here_input ());
$$ = $3;
scm_gc_unprotect_object ($2->self_scm ());
$$ = l;
}
- ;
-
-part_combined_music:
- PARTCOMBINE STRING Music Music {
- Music * p= MY_MAKE_MUSIC("PartCombineMusic");
- p->set_mus_property ("what", scm_string_to_symbol ($2));
- p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED));
-
- scm_gc_unprotect_object ($3->self_scm ());
- scm_gc_unprotect_object ($4->self_scm ());
-
- $$ = p;
+ | NEWADDLYRICS string Music {
+ Music*l =MY_MAKE_MUSIC("NewLyricCombineMusic");
+ l->set_mus_property ("element", $3->self_scm ());
+ scm_gc_unprotect_object ($3->self_scm ());
+ $$ = l;
+ l->set_mus_property ("associated-context", $2);
}
;
if ($2 % 2 || $3 % 2)
n->set_mus_property ("force-accidental", SCM_BOOL_T);
- SCM arts = scm_reverse_x ($4, SCM_EOL);
- n->set_mus_property ("articulations", arts);
+ if (gh_pair_p ($4)) {
+ SCM arts = scm_reverse_x ($4, SCM_EOL);
+ n->set_mus_property ("articulations", arts);
+ }
+ $$ = n;
+ }
+ | DRUM_PITCH post_events {
+ Music *n = MY_MAKE_MUSIC("NoteEvent");
+ n->set_mus_property ("duration" ,$2);
+ n->set_mus_property ("drum-type" , $1);
+ n->set_spot (THIS->here_input());
+ if (gh_pair_p ($2)) {
+ SCM arts = scm_reverse_x ($2, SCM_EOL);
+ n->set_mus_property ("articulations", arts);
+ }
$$ = n;
}
;
$$-> set_spot (THIS->here_input ());
$1-> set_spot (THIS->here_input ());
}
+ | SKIP duration_length {
+ Music * skip = MY_MAKE_MUSIC("SkipMusic");
+ skip->set_mus_property ("duration", $2);
+
+ $$ = skip;
+ }
| OCTAVE { THIS->push_spot (); }
pitch {
Music *l = MY_MAKE_MUSIC("RelativeOctaveCheck");
scm_gc_protect_object (result);
$$ = unsmob_music (result);
}
- ;
+ | MARK scalar {
+ static SCM proc;
+ if (!proc)
+ proc = scm_c_eval_string ("make-mark-set");
-command_req:
- shorthand_command_req { $$ = $1; }
- | verbose_command_req { $$ = $1; }
+ SCM result = scm_call_1 (proc, $2);
+ scm_gc_protect_object (result);
+ $$ = unsmob_music (result);
+ }
;
-shorthand_command_req:
- hyphen_req {
- $$ = $1;
- }
- | BREATHE {
+command_req:
+ BREATHE {
$$ = MY_MAKE_MUSIC("BreathingSignEvent");
}
| E_TILDE {
$$ = MY_MAKE_MUSIC("PesOrFlexaEvent");
}
- ;
-
-verbose_command_req:
- MARK DEFAULT {
+ | MARK DEFAULT {
Music * m = MY_MAKE_MUSIC("MarkEvent");
$$ = m;
}
- | MARK scalar {
- Music *m = MY_MAKE_MUSIC("MarkEvent");
- m->set_mus_property ("label", $2);
- $$ = m;
- }
- | SKIP duration_length {
- Music * skip = MY_MAKE_MUSIC("SkipEvent");
- skip->set_mus_property ("duration", $2);
-
- $$ = skip;
- }
| tempo_event {
$$ = $1;
}
direction_less_event {
$$ = $1;
}
+ | HYPHEN {
+ if (!THIS->lexer_->lyric_state_b ())
+ THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
+ $$ = MY_MAKE_MUSIC("HyphenEvent");
+ }
| EXTENDER {
if (!THIS->lexer_->lyric_state_b ())
THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
$$ = a;
}
;
-
+
+oct_check:
+ /**/ { $$ = SCM_EOL; }
+ | '=' { $$ = gh_int2scm (0); }
+ | '=' sub_quotes { $$ = gh_int2scm ($2); }
+ | '=' sup_quotes { $$ = gh_int2scm ($2); }
+ ;
+
sup_quotes:
'\'' {
$$ = 1;
| steno_tonic_pitch
;
-hyphen_req:
- HYPHEN {
- if (!THIS->lexer_->lyric_state_b ())
- THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
- $$ = MY_MAKE_MUSIC("HyphenEvent");
- }
- ;
-
close_event:
'(' {
Music * s= MY_MAKE_MUSIC("SlurEvent");
;
simple_element:
- pitch exclamations questions optional_notemode_duration optional_rest {
+ pitch exclamations questions oct_check optional_notemode_duration optional_rest {
Input i = THIS->pop_spot ();
if (!THIS->lexer_->note_state_b ())
THIS->parser_error (_ ("Have to be in Note mode for notes"));
Music *n = 0;
- if ($5)
+ if ($6)
n = MY_MAKE_MUSIC("RestEvent");
else
n = MY_MAKE_MUSIC("NoteEvent");
n->set_mus_property ("pitch", $1);
- n->set_mus_property ("duration", $4);
+ n->set_mus_property ("duration", $5);
+ if (gh_number_p ($4))
+ {
+ int q = gh_scm2int ($4);
+ n->set_mus_property ("absolute-octave", gh_int2scm (q-1));
+ }
if ($3 % 2)
n->set_mus_property ("cautionary", SCM_BOOL_T);
n->set_spot (i);
$$ = v;
}
+ | DRUM_PITCH optional_notemode_duration {
+ Input i = THIS->pop_spot ();
+
+ Music *n = MY_MAKE_MUSIC("NoteEvent");
+ n->set_mus_property ("duration" ,$2);
+ n->set_mus_property ("drum-type" , $1);
+
+ Music *v = MY_MAKE_MUSIC("EventChord");
+ v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED));
+ scm_gc_unprotect_object (n->self_scm());
+ v->set_spot (i);
+ n->set_spot (i);
+ $$ = v;
+
+ }
| figure_spec optional_notemode_duration {
Music * m = unsmob_music ($1);
Input i = THIS->pop_spot ();
velt->set_mus_property ("elements", scm_list_n (ev->self_scm (),SCM_UNDEFINED));
velt->set_spot (i);
+ scm_gc_unprotect_object (ev->self_scm());
+
$$ = velt;
}
| MULTI_MEASURE_REST optional_notemode_duration {
STRING {
$$ = make_simple_markup ($1);
}
+ | MARKUP_HEAD_EMPTY {
+ $$ = scm_list_n ($1, SCM_UNDEFINED);
+ }
| MARKUP_HEAD_MARKUP0 markup {
$$ = scm_list_n ($1, $2, SCM_UNDEFINED);
}
| MARKUP_HEAD_SCM0_SCM1_SCM2 embedded_scm embedded_scm embedded_scm {
$$ = scm_list_n ($1, $2, $3, $4, SCM_UNDEFINED);
}
+ | MARKUP_HEAD_SCM0_SCM1 embedded_scm embedded_scm {
+ $$ = scm_list_n ($1, $2, $3, SCM_UNDEFINED);
+ }
| MARKUP_IDENTIFIER {
$$ = $1;
}
return scm_makfrom0str (s);
}
+