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 "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 OVERRIDE SET REVERT
%token PAPER
%token PARTCOMBINE
-%token NEWPARTCOMBINE
%token PARTIAL
-%token PITCHNAMES
%token PROPERTY
%token RELATIVE
%token REMOVE
%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
%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 <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 {
;
-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:
{
;
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
}
}
| 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;
}
;
-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;
- }
- | NEWPARTCOMBINE Music Music {
- static SCM proc;
- if (!proc)
- proc = scm_c_eval_string ("make-new-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 ());
- scm_gc_unprotect_object ($2->self_scm ());
- $$ = unsmob_music (res);
- scm_gc_protect_object (res);
- }
- ;
-
context_change:
CHANGE STRING '=' STRING {
Music*t= MY_MAKE_MUSIC("TranslatorChange");
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;
}
;
| steno_tonic_pitch
;
-
close_event:
'(' {
Music * s= MY_MAKE_MUSIC("SlurEvent");
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 ();
return scm_makfrom0str (s);
}
+