m->set_property ("tags", tags);
}
-
-
bool
is_regular_identifier (SCM id)
{
return p;
}
+Music*
+make_music_relative (Pitch start, Music *music)
+{
+ Music *relative = MY_MAKE_MUSIC ("RelativeOctaveMusic");
+ relative->set_property ("element", music->self_scm ());
+
+ Pitch last = music->to_relative_octave (start);
+ if (lily_1_8_relative)
+ music->set_property ("last-pitch", last.smobbed_copy ());
+ return relative;
+}
+
+Music*
+make_lyric_combine_music (SCM name, Music *music)
+{
+ Music *combine = MY_MAKE_MUSIC ("NewLyricCombineMusic");
+ combine->set_property ("element", music->self_scm ());
+ combine->set_property ("associated-context", name);
+ return combine;
+}
+
%}
/* We use SCMs to do strings, because it saves us the trouble of
deleting them. Let's hope that a stack overflow doesnt trigger a move
of the parse stack onto the heap. */
+%left NEWLYRICS
%union {
Book *book;
%}
-%expect 4
+%expect 3
/*
- Four shift/reduce problems:
-
-1. foo = bar.
-
- "bar" -> String -> Lyric -> Music -> music-assignment
-
- "bar" -> String -> string-assignment
-
-
-Similar problem for
+ Three shift/reduce problems:
2. \markup identifier.
\repeat { \repeat } \alternative
)
-
---hwn
-
*/
%token ACCEPTS
%token ADDLYRICS
%token ADDQUOTE
-%token NEWADDLYRICS
+%token LYRICSTO
%token ALIAS
%token ALTERNATIVE
-%token APPLY
%token APPLYCONTEXT
%token APPLYOUTPUT
%token AUTOCHANGE
%token CHANGE
%token CHORDMODIFIERS
%token CHORDS
-%token LESSLESS
-%token MOREMORE
+%token DOUBLE_ANGLE_OPEN
+%token DOUBLE_ANGLE_CLOSE
%token CLEF
%token COMMANDSPANREQUEST
%token CONSISTS
%token INVALID
%token KEY
%token LYRICS
+%token LYRICS_STRING
%token MARK
%token MIDI
%token MULTI_MEASURE_REST
%token SCM_T
%token SCORE
%token SEQUENTIAL
+%token NEWLYRICS
%token SIMULTANEOUS
%token SKIP
%token SPANREQUEST
%token WITH
/* escaped */
+/* FIXME: this sucks. The user will get to see these names:
+ syntax error, unexpected E_CHAR:
+ \
+ %%
+ */
%token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE
%token E_LEFTSQUARE E_RIGHTSQUARE E_TILDE
%token E_BACKSLASH
%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET CHORD_SLASH
%token FIGURE_SPACE
-%type <book> book_block book_body
-%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 <i> DIGIT
%token <scm> NOTENAME_PITCH
%token <scm> TONICNAME_PITCH
%token <scm> MARKUP_HEAD_SCM0_SCM1_SCM2
%token <scm> MARKUP_HEAD_SCM0_SCM1_MARKUP2
+%token <scm> MUSIC_FUNCTION_SCM
+%token <scm> MUSIC_FUNCTION_MUSIC
+%token <scm> MUSIC_FUNCTION_SCM_MUSIC
+%token <scm> MUSIC_FUNCTION_MUSIC_MUSIC
+%token <scm> MUSIC_FUNCTION_SCM_SCM_MUSIC
+%token <scm> MUSIC_FUNCTION_SCM_MUSIC_MUSIC
+
%token <scm> MARKUP_IDENTIFIER MARKUP_HEAD_LIST0
%type <scm> markup markup_line markup_list markup_list_body full_markup
+%type <book> book_block book_body
+%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
+%type <scm> new_lyrics
%type <outputdef> output_def
-%type <scm> lilypond_header lilypond_header_body
+%type <scm> lilypond_header lilypond_header_body
%type <music> open_event close_event
%type <i> sub_quotes sup_quotes
-%type <music> simple_element event_chord command_element Simple_music Composite_music
+%type <music> toplevel_music
+%type <music> simple_element event_chord command_element
+%type <music> Composite_music Simple_music Prefix_composite_music Generic_prefix_music
+%type <scm> Generic_prefix_music_scm
+%type <music> Grouped_music_list
%type <music> Repeated_music
%type <scm> Alternative_music
%type <i> tremolo_type
%type <i> bare_int bare_unsigned
%type <i> script_dir
%type <scm> identifier_init
+%type <scm> simple_string
-%type <music> note_chord_element chord_body chord_body_element
-%type <scm> chord_body_elements
-%type <scm> steno_duration optional_notemode_duration multiplied_duration
+%type <music> note_chord_element chord_body chord_body_element
+%type <scm> chord_body_elements
+%type <scm> steno_duration optional_notemode_duration multiplied_duration
-%type <scm> post_events
-%type <music> gen_text_def direction_less_event direction_reqd_event
-%type <scm> steno_pitch pitch absolute_pitch pitch_also_in_chords
-%type <scm> steno_tonic_pitch
+%type <scm> post_events
+%type <music> gen_text_def direction_less_event direction_reqd_event
+%type <scm> steno_pitch pitch absolute_pitch pitch_also_in_chords
+%type <scm> steno_tonic_pitch
%type <scm> duration_length fraction
-%type <scm> new_chord step_number chord_items chord_item chord_separator step_numbers
+%type <scm> chord_item chord_items chord_separator new_chord
+%type <scm> step_number step_numbers
-%type <scm> embedded_scm scalar
+%type <scm> embedded_scm scalar
%type <music> Music Sequential_music Simultaneous_music
%type <music> relative_music re_rhythmed_music
%type <music> music_property_def context_change
-%type <scm> context_prop_spec
-%type <scm> Music_list
-%type <scm> property_operation context_mod context_def_mod optional_context_mod
-%type <outputdef> music_output_def_body music_output_def_head
+%type <scm> context_prop_spec
+%type <scm> Music_list
+%type <scm> property_operation
+%type <scm> context_mod context_def_mod optional_context_mod
+%type <outputdef> music_output_def_body music_output_def_head
%type <music> post_event tagged_post_event
-%type <music> command_req
-%type <music> string_number_event
+%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
%%
lilypond: /* empty */
- | lilypond toplevel_expression {}
- | lilypond assignment { }
+ | lilypond toplevel_expression {
+ }
+ | lilypond assignment {
+ }
| lilypond error {
THIS->error_level_ = 1;
}
THIS->header_ = $1;
}
| add_quote {
+
}
| book_block {
Book *book = $1;
- SCM header = THIS->header_;
- Path outname = split_path (THIS->output_basename_);
- int *c = &THIS->book_count_;
- if (*c)
- outname.base += "-" + to_string (*c);
- (*c)++;
- Music_output_def *dp = unsmob_music_output_def
- (THIS->lexer_->lookup_identifier ("$defaultpaper"));
- book->process (outname.to_string (),
- dp ? dp->clone () : new Paper_def, header);
+ SCM proc = THIS->lexer_->lookup_identifier ("toplevel-book-handler");
+ scm_call_2 (proc, THIS->self_scm (), book->self_scm ());
scm_gc_unprotect_object (book->self_scm ());
}
| score_block {
- Score *sc = $1;
- SCM head = is_module (sc->header_) ? sc->header_
- : THIS->header_.to_SCM ();
-
- Path p = split_path (THIS->output_basename_);
- int *c = &THIS->score_count_;
- if (*c)
- p.base += "-" + to_string (*c);
-
- (*c)++;
- SCM outname = scm_makfrom0str (p.to_string ().to_str0());
-
- for (int i = 0; i < sc->defs_.size (); i++)
- default_rendering (sc->music_,
- sc->defs_[i]->self_scm (), head,
- outname);
-
- if (sc->defs_.is_empty ())
- {
- Music_output_def *id = unsmob_music_output_def
- (THIS->lexer_->lookup_identifier ("$defaultpaper"));
- id = id ? id->clone () : new Paper_def;
- default_rendering (sc->music_, id->self_scm (), head,
- outname);
- scm_gc_unprotect_object (id->self_scm ());
- }
- scm_gc_unprotect_object (sc->self_scm ());
+ Score *score = $1;
+
+ SCM proc = THIS->lexer_->lookup_identifier ("toplevel-score-handler");
+ scm_call_2 (proc, THIS->self_scm (), score->self_scm ());
+ scm_gc_unprotect_object (score->self_scm ());
+ }
+ | toplevel_music {
+ Music *music = $1;
+ SCM proc = THIS->lexer_->lookup_identifier ("toplevel-music-handler");
+ scm_call_2 (proc, THIS->self_scm (), music->self_scm ());
+ scm_gc_unprotect_object (music->self_scm ());
}
| output_def {
SCM id = SCM_EOL;
}
;
+toplevel_music:
+ Composite_music {
+ }
+ ;
embedded_scm:
SCM_T
;
-
-
lilypond_header_body:
{
$$ = ly_make_anonymous_module ();
$$ = Context_def::make_scm ();
unsmob_context_def ($$)->set_spot (THIS->here_input ());
}
- | CONTEXT_DEF_IDENTIFIER {
+ | CONTEXT_DEF_IDENTIFIER {
$$ = $1;
unsmob_context_def ($$)->set_spot (THIS->here_input ());
}
output_def:
music_output_def_body '}' {
$$ = $1;
- THIS-> lexer_-> remove_scope ();
+ THIS->lexer_->remove_scope ();
+ THIS->lexer_->pop_state ();
}
;
music_output_def_head '{' {
$$ = $1;
$$->input_origin_. set_spot (THIS->here_input ());
-
+ THIS->lexer_->push_initial_state ();
}
| music_output_def_head '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
scm_gc_unprotect_object ($1->self_scm ());
$$ = o;
THIS->lexer_->remove_scope ();
THIS->lexer_->add_scope (o->scope_);
+ THIS->lexer_->push_initial_state ();
}
| music_output_def_body assignment {
scm_set_car_x (s, c); /* set first cons */
scm_set_cdr_x (s, c); /* remember last cell */
}
+ | Music_list embedded_scm {
+ }
| Music_list error {
}
;
}
;
+
Repeated_music:
- REPEAT string bare_unsigned Music Alternative_music
+ REPEAT simple_string bare_unsigned Music Alternative_music
{
Music *beg = $4;
int times = $3;
optional_context_mod:
/**/ { $$ = SCM_EOL; }
- | WITH '{' context_mod_list '}' { $$ = $3; }
+ | WITH { THIS->lexer_->push_initial_state (); }
+ '{' context_mod_list '}'
+ {
+ THIS->lexer_->pop_state ();
+ $$ = $4;
+ }
;
grace_head:
}
;
+
Composite_music:
- AUTOCHANGE Music {
+ Prefix_composite_music { $$ = $1; }
+ | Grouped_music_list { $$ = $1; }
+ ;
+
+Grouped_music_list:
+ Simultaneous_music { $$ = $1; }
+ | Sequential_music { $$ = $1; }
+ ;
+
+Generic_prefix_music_scm:
+ MUSIC_FUNCTION_SCM {
+ THIS->push_spot ();
+ } embedded_scm {
+ $$ = scm_list_3 ($1, make_input (THIS->pop_spot ()), $3);
+ }
+ | MUSIC_FUNCTION_MUSIC {
+ THIS->push_spot ();
+ } Music {
+ $$ = scm_list_3 ($1, make_input (THIS->pop_spot ()), $3->self_scm ());
+ scm_gc_unprotect_object ($3->self_scm ());
+ }
+ | MUSIC_FUNCTION_SCM_MUSIC {
+ THIS->push_spot ();
+ } embedded_scm Music {
+ $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4->self_scm ());
+ scm_gc_unprotect_object ($4->self_scm ());
+ }
+ | MUSIC_FUNCTION_MUSIC_MUSIC {
+ THIS->push_spot ();
+ } Music Music {
+ $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3->self_scm (), $4->self_scm ());
+ scm_gc_unprotect_object ($3->self_scm ());
+ scm_gc_unprotect_object ($4->self_scm ());
+ }
+ | MUSIC_FUNCTION_SCM_MUSIC_MUSIC {
+ THIS->push_spot ();
+ } embedded_scm Music Music {
+ $$ = scm_list_5 ($1, make_input (THIS->pop_spot ()),
+ $3, $4->self_scm (), $5->self_scm ());
+ scm_gc_unprotect_object ($5->self_scm ());
+ scm_gc_unprotect_object ($4->self_scm ());
+ }
+ ;
+
+Generic_prefix_music:
+ Generic_prefix_music_scm {
+ SCM func = ly_car ($1);
+ Input *loc = unsmob_input (ly_cadr ($1));
+ SCM args = ly_cddr ($1);
+ SCM sig = scm_object_property (func, ly_symbol2scm ("music-function-signature"));
+ int k = 0;
+ bool ok = true;
+ for (SCM s = sig, t = args;
+ ok && ly_c_pair_p (s) && ly_c_pair_p (t);
+ s = ly_cdr (s), t = ly_cdr (t)) {
+ k++;
+ if (scm_call_1 (ly_car (s), ly_car (t)) != SCM_BOOL_T)
+ {
+ loc->error (_f ("Argument %d failed typecheck", k));
+ THIS->error_level_ = 1;
+ ok = false;
+ }
+ }
+ SCM m = SCM_EOL;
+ if (ok)
+ m = scm_apply_0 (func, ly_cdr ($1));
+ if (unsmob_music (m))
+ {
+ $$ = unsmob_music (m);
+ scm_gc_protect_object (m);
+ }
+ else
+ {
+ if (ok)
+ loc->error (_ ("Music head function should return Music object."));
+ $$ = MY_MAKE_MUSIC ("Music");
+ }
+ $$->set_spot (*loc);
+ }
+ ;
+
+
+Prefix_composite_music:
+ Generic_prefix_music {
+ $$ = $1;
+ }
+ |AUTOCHANGE Music {
SCM proc = ly_scheme_function ("make-autochange-music");
SCM res = scm_call_1 (proc, $2->self_scm ());
scm_gc_unprotect_object ($2->self_scm ());
#endif
}
- | CONTEXT string '=' string optional_context_mod Music {
+ | CONTEXT simple_string '=' simple_string optional_context_mod Music {
$$ = context_spec_music ($2, $4, $6, $5);
}
- | CONTEXT STRING optional_context_mod Music {
+ | CONTEXT simple_string optional_context_mod Music {
$$ = context_spec_music ($2, SCM_UNDEFINED, $4, $3);
}
- | NEWCONTEXT string optional_context_mod Music {
- $$ = context_spec_music ($2, get_next_unique_context (),
- $4, $3);
+ | NEWCONTEXT simple_string optional_context_mod Music {
+ $$ = context_spec_music ($2, get_next_unique_context (), $4,
+ $3);
}
| TIMES {
}
| Repeated_music { $$ = $1; }
- | Simultaneous_music { $$ = $1; }
- | Sequential_music { $$ = $1; }
| TRANSPOSE pitch_also_in_chords pitch_also_in_chords Music {
$$ = MY_MAKE_MUSIC ("TransposedMusic");
Music *p = $4;
$$->set_property ("element", p->self_scm ());
scm_gc_unprotect_object (p->self_scm ());
}
- | APPLY embedded_scm Music {
- if (!ly_input_procedure_p ($2))
- {
- THIS->parser_error (_ ("\\apply takes function argument"));
- $$ = $3;
- }
- else
- {
- SCM ret = scm_call_1 ($2, $3->self_scm ());
- Music *m = unsmob_music (ret);
- if (!m) {
- THIS->parser_error ("\\apply must return a Music");
- m = MY_MAKE_MUSIC ("Music");
- }
- $$ = m;
- }
- }
| NOTES
{
SCM nn = THIS->lexer_->lookup_identifier ("pitchnames");
SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames");
THIS->lexer_->push_note_state (alist_to_hashq (nn));
}
+ /* FIXME: This used to be: */
Music
+/* Grouped_music_list */
{ $$ = $3;
THIS->lexer_->pop_state ();
}
| FIGURES
{ THIS->lexer_->push_figuredbass_state (); }
+ /* FIXME: This used to be:
Music
+ but that breaks web build
+ */
+ Grouped_music_list
{
Music *chm = MY_MAKE_MUSIC ("UntransposableMusic");
chm->set_property ("element", $3->self_scm ());
nn = THIS->lexer_->lookup_identifier ("pitchnames");
THIS->lexer_->push_chord_state (alist_to_hashq (nn));
- } Music {
+ }
+ /* FIXME:
+ Music
+*/
+ Grouped_music_list
+ {
Music *chm = MY_MAKE_MUSIC ("UnrelativableMusic");
chm->set_property ("element", $3->self_scm ());
scm_gc_unprotect_object ($3->self_scm ());
}
| LYRICS
{ THIS->lexer_->push_lyric_state (); }
+ /* FIXME:
Music
+*/
+ Grouped_music_list
{
$$ = $3;
THIS->lexer_->pop_state ();
relative_music:
RELATIVE absolute_pitch Music {
- Music *p = $3;
- Pitch pit = *unsmob_pitch ($2);
- $$ = MY_MAKE_MUSIC ("RelativeOctaveMusic");
-
- $$->set_property ("element", p->self_scm ());
- scm_gc_unprotect_object (p->self_scm ());
-
-
- Pitch retpitch = p->to_relative_octave (pit);
- if (lily_1_8_relative)
- $$->set_property ("last-pitch", retpitch.smobbed_copy ());
+ Music *m = $3;
+ Pitch start = *unsmob_pitch ($2);
+ $$ = make_music_relative (start, m);
+ scm_gc_unprotect_object (m->self_scm ());
+ }
+ | RELATIVE Composite_music {
+ Music *m = $2;
+ /* FIXME: why is octave==0 and default not middleC? */
+ Pitch middle_c (-1, 0, 0);
+ $$ = make_music_relative (middle_c, m);
+ scm_gc_unprotect_object (m->self_scm ());
+ }
+ ;
+
+new_lyrics:
+ NEWLYRICS { THIS->lexer_->push_lyric_state (); }
+ /*cont */
+ Grouped_music_list {
+ /* Can also use Music at the expensive of two S/Rs similar to
+ \repeat \alternative */
+ THIS->lexer_->pop_state ();
+#if 0
+ Music *music = MY_MAKE_MUSIC ("SimultaneousMusic");
+ music->set_property ("elements", scm_list_1 ($3->self_scm ()));
+ $$ = music;
+#else
+ $$ = scm_cons ($3->self_scm (), SCM_EOL);
+#endif
+ }
+ | new_lyrics NEWLYRICS { THIS->lexer_->push_lyric_state (); }
+ Grouped_music_list {
+ THIS->lexer_->pop_state ();
+ $$ = scm_cons ($4->self_scm (), $1);
}
;
re_rhythmed_music:
ADDLYRICS Music Music {
- Music *l = MY_MAKE_MUSIC ("LyricCombineMusic");
- l->set_property ("elements", scm_listify ($2->self_scm (), $3->self_scm (), SCM_UNDEFINED));
- scm_gc_unprotect_object ($3->self_scm ());
- scm_gc_unprotect_object ($2->self_scm ());
- $$ = l;
+ Music *m = MY_MAKE_MUSIC ("LyricCombineMusic");
+ m->set_property ("elements", scm_listify ($2->self_scm (),
+ $3->self_scm (), SCM_UNDEFINED));
+ scm_gc_unprotect_object ($3->self_scm ());
+ scm_gc_unprotect_object ($2->self_scm ());
+ $$ = m;
}
- | NEWADDLYRICS string Music {
- Music *l = MY_MAKE_MUSIC ("NewLyricCombineMusic");
- l->set_property ("element", $3->self_scm ());
- scm_gc_unprotect_object ($3->self_scm ());
- $$ = l;
- l->set_property ("associated-context", $2);
+ | Grouped_music_list new_lyrics {
+
+ /* FIXME: should find out uniqueXXX name from music */
+ SCM name = $1->get_property ("context-id");
+ //if (name == SCM_EOL)
+ if (!ly_c_string_p (name))
+ name = scm_makfrom0str ("");
+
+ SCM context = scm_makfrom0str ("Lyrics");
+ Music *all = MY_MAKE_MUSIC ("SimultaneousMusic");
+
+ SCM lst = SCM_EOL;
+ for (SCM s = $2; ly_c_pair_p (s); s = ly_cdr (s))
+ {
+ Music *music = unsmob_music (ly_car (s));
+ Music *com = make_lyric_combine_music (name, music);
+ Music *csm = context_spec_music (context,
+ get_next_unique_context (), com, SCM_EOL);
+ lst = scm_cons (csm->self_scm (), lst);
+ }
+ /* FIXME: only first lyric music is accepted,
+ the rest is junked */
+ all->set_property ("elements", scm_cons ($1->self_scm (),
+ lst));
+ $$ = all;
+ scm_gc_unprotect_object ($1->self_scm ());
+ }
+ | LYRICSTO string Music {
+ Music *music = $3;
+ SCM name = $2;
+ $$ = make_lyric_combine_music (name, music);
+ scm_gc_unprotect_object (music->self_scm ());
}
;
;
property_operation:
- STRING '=' scalar {
+ STRING '=' scalar {
$$ = scm_list_3 (ly_symbol2scm ("assign"),
scm_string_to_symbol ($1), $3);
}
- | UNSET STRING {
+ | UNSET simple_string {
$$ = scm_list_2 (ly_symbol2scm ("unset"),
scm_string_to_symbol ($2));
}
- | OVERRIDE STRING embedded_scm '=' embedded_scm {
+ | OVERRIDE simple_string embedded_scm '=' embedded_scm {
$$ = scm_list_4 (ly_symbol2scm ("push"),
scm_string_to_symbol ($2), $3, $5);
}
- | REVERT STRING embedded_scm {
+ | REVERT simple_string embedded_scm {
$$ = scm_list_3 (ly_symbol2scm ("pop"),
scm_string_to_symbol ($2), $3);
}
;
context_prop_spec:
- STRING {
- $$ = scm_list_2 (ly_symbol2scm ("Bottom"), scm_string_to_symbol ($1));
+ simple_string {
+ $$ = scm_list_2 (ly_symbol2scm ("Bottom"),
+ scm_string_to_symbol ($1));
}
- | STRING '.' STRING {
- $$ = scm_list_2 (scm_string_to_symbol ($1), scm_string_to_symbol ($3));
+ | simple_string '.' simple_string {
+ $$ = scm_list_2 (scm_string_to_symbol ($1),
+ scm_string_to_symbol ($3));
}
;
;
+string:
+ STRING {
+ $$ = $1;
+ }
+ | STRING_IDENTIFIER {
+ $$ = $1;
+ }
+ | string '+' string {
+ $$ = scm_string_append (scm_list_2 ($1, $3));
+ }
+ ;
+
+simple_string: STRING {
+ }
+ | LYRICS_STRING {
+ }
+ ;
-scalar:
- string { $$ = $1; }
- | bare_int { $$ = scm_int2num ($1); }
- | embedded_scm { $$ = $1; }
- | full_markup { $$ = $1; }
- | DIGIT { $$ = scm_int2num ($1); }
+scalar: string {
+ }
+ | LYRICS_STRING {
+ }
+ | bare_int {
+ $$ = scm_int2num ($1);
+ }
+ | embedded_scm {
+ }
+ | full_markup {
+ }
+ | DIGIT {
+ $$ = scm_int2num ($1);
+ }
;
/*
+FIXME: remove or fix this comment. What is `This'?
+
This is a trick:
Adding pre_events to the simple_element
chord_close: '>'
;
-simul_open: LESSLESS
+simul_open: DOUBLE_ANGLE_OPEN
;
-simul_close: MOREMORE
+simul_close: DOUBLE_ANGLE_CLOSE
;
chord_body:
}
| OCTAVE { THIS->push_spot (); }
pitch {
- Music *l = MY_MAKE_MUSIC ("RelativeOctaveCheck");
- $$ = l;
+ Music *m = MY_MAKE_MUSIC ("RelativeOctaveCheck");
+ $$ = m;
$$->set_spot (THIS->pop_spot ());
$$->set_property ("pitch", $3);
}
| E_LEFTSQUARE {
- Music *l = MY_MAKE_MUSIC ("LigatureEvent");
- l->set_property ("span-direction", scm_int2num (START));
- l->set_spot (THIS->here_input ());
+ Music *m = MY_MAKE_MUSIC ("LigatureEvent");
+ m->set_property ("span-direction", scm_int2num (START));
+ m->set_spot (THIS->here_input ());
$$ = MY_MAKE_MUSIC ("EventChord");
- $$->set_property ("elements", scm_cons (l->self_scm (), SCM_EOL));
- scm_gc_unprotect_object (l->self_scm ());
+ $$->set_property ("elements", scm_cons (m->self_scm (), SCM_EOL));
+ scm_gc_unprotect_object (m->self_scm ());
$$->set_spot (THIS->here_input ());
}
| E_RIGHTSQUARE {
- Music *l = MY_MAKE_MUSIC ("LigatureEvent");
- l->set_property ("span-direction", scm_int2num (STOP));
- l->set_spot (THIS->here_input ());
+ Music *m = MY_MAKE_MUSIC ("LigatureEvent");
+ m->set_property ("span-direction", scm_int2num (STOP));
+ m->set_spot (THIS->here_input ());
$$ = MY_MAKE_MUSIC ("EventChord");
- $$->set_property ("elements", scm_cons (l->self_scm (), SCM_EOL));
+ $$->set_property ("elements", scm_cons (m->self_scm (), SCM_EOL));
$$->set_spot (THIS->here_input ());
- scm_gc_unprotect_object (l->self_scm ());
+ scm_gc_unprotect_object (m->self_scm ());
}
| E_BACKSLASH {
$$ = MY_MAKE_MUSIC ("VoiceSeparator");
| E_CLOSE {
Music *s= MY_MAKE_MUSIC ("PhrasingSlurEvent");
$$ = s;
- s->set_property ("span-type", scm_makfrom0str ( "phrasing-slur"));
+ s->set_property ("span-type",
+ scm_makfrom0str ("phrasing-slur"));
s->set_spot (THIS->here_input ());
}
;
}
| string {
Music *t = MY_MAKE_MUSIC ("TextScriptEvent");
- t->set_property ("text", make_simple_markup (THIS->lexer_->encoding (), $1));
+ t->set_property ("text",
+ make_simple_markup (THIS->lexer_->encoding (), $1));
t->set_spot (THIS->here_input ());
$$ = t;
}
;
-
-
-
multiplied_duration:
steno_duration {
$$ = $1;
}
;
-
tremolo_type:
':' {
$$ = 0;
}
;
-
-
-/*****************************************************************
- BASS FIGURES
-*****************************************************************/
bass_number:
DIGIT {
$$ = scm_number_to_string (scm_int2num ($1), scm_int2num (10));
+ $$ = scm_list_2 (ly_scheme_function ("number-markup"),
+ $$);
}
| UNSIGNED {
$$ = scm_number_to_string (scm_int2num ($1), scm_int2num (10));
+ $$ = scm_list_2 (ly_scheme_function ("number-markup"),
+ $$);
}
| STRING { $$ = $1; }
;
;
lyric_element:
- full_markup { $$ = $1; }
- | STRING { $$ = $1; }
+ /* FIXME: lyric flavoured markup would be better */
+ full_markup {
+ }
+ | LYRICS_STRING {
+ }
;
new_chord:
}
;
-
-string:
- STRING {
- $$ = $1;
- }
- | STRING_IDENTIFIER {
- $$ = $1;
- }
- | string '+' string {
- $$ = scm_string_append (scm_list_2 ($1, $3));
- }
- ;
-
-
exclamations:
{ $$ = 0; }
| exclamations '!' { $$ ++; }
| STRING_IDENTIFIER {
$$ = $1;
}
+ | score_block {
+ /* WIP this is a bit arbitrary,
+ we should also allow \book or Composite_music.
+ However, you'd typically want to change paper
+ settings, and need a \score block anyway. */
+ Score *score = $1;
+ Book *book = new Book;
+ book->scores_.push (score);
+ extern Music_output_def* get_paper (My_lily_parser *parser);
+ Music_output_def *paper = get_paper (THIS);
+ SCM s = book->to_stencil (paper, THIS->header_);
+ scm_gc_unprotect_object (score->self_scm ());
+ scm_gc_unprotect_object (book->self_scm ());
+ $$ = scm_list_2 (ly_scheme_function ("stencil-markup"), s);
+ }
;
markup_list:
*destination = unsmob_context_def (sid)->clone_scm ();
return CONTEXT_DEF_IDENTIFIER;
} else if (unsmob_score (sid)) {
- Score *sc = new Score (*unsmob_score (sid));
- *destination = sc->self_scm ();
+ Score *score = new Score (*unsmob_score (sid));
+ *destination = score->self_scm ();
return SCORE_IDENTIFIER;
} else if (Music *mus = unsmob_music (sid)) {
mus = mus->clone ();
return csm;
}
-
SCM
get_next_unique_context ()
{
static int new_context_count;
-
char s[1024];
- snprintf (s, 1024, "uniqueContext%d", new_context_count ++);
-
+ snprintf (s, 1024, "uniqueContext%d", new_context_count++);
return scm_makfrom0str (s);
}