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 <ctype.h>
#include <stdlib.h>
+#include <stdio.h>
#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"
#include "text-item.hh"
#include "music-list.hh"
-
#define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x))
-
+Music *property_op_to_music (SCM op);
+Music *context_spec_music (SCM type, SCM id, Music * m, SCM ops_);
+SCM get_next_unique_context ();
#define YYERROR_VERBOSE 1
make_chord_step (int step, int alter)
{
if (step == 7)
- alter--;
+ alter += FLAT;
- /* ugh: fucks up above 13 */
- Pitch m(step > 7 ? 1 : 0,(step - 1) % 7, alter);
+ while(step < 0)
+ step += 7;
+ Pitch m((step -1) / 7 , (step - 1) % 7, alter);
return m.smobbed_copy ();
}
%token ACCEPTS
%token ADDLYRICS
+%token NEWADDLYRICS
%token ALIAS
%token ALTERNATIVE
%token APPLY
%token AUTOCHANGE
%token BAR
%token BREATHE
+%token CHANGE
%token CHORDMODIFIERS
%token CHORDS
%token LESSLESS
%token DEFAULT
%token DENIES
%token DESCRIPTION
-%token DURATION
%token EXTENDER
%token FIGURES FIGURE_OPEN FIGURE_CLOSE
%token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN
%token NOTES
%token OCTAVE
%token ONCE
-%token OUTPUTPROPERTY
%token OVERRIDE SET REVERT
%token PAPER
%token PARTCOMBINE
%token PARTIAL
-%token PITCH
-%token PITCHNAMES
-%token PROPERTY
%token RELATIVE
%token REMOVE
%token REPEAT
%token TRANSPOSE
%token TYPE
%token UNSET
-
+%token WITH
/* escaped */
%token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE
%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> DURATION_IDENTIFIER
%token <scm> FRACTION
%token <id> IDENTIFIER
-%token <scm> CHORDNAMES
-
-%token <scm> CHORD_MODIFIER
-
+%token DRUMS
+%token <scm> DRUM_PITCH
+%token <scm> CHORD_MODIFIER
%token <scm> SCORE_IDENTIFIER
%token <scm> MUSIC_OUTPUT_DEF_IDENTIFIER
%token <scm> NUMBER_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 <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> verbose_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> explicit_pitch steno_tonic_pitch
+%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> embedded_scm scalar
%type <music> Music Sequential_music Simultaneous_music
-%type <music> relative_music re_rhythmed_music part_combined_music
-%type <music> property_def translator_change simple_property_def
-%type <scm> Music_list
-%type <outputdef> music_output_def_body
-%type <music> shorthand_command_req
+%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 translator_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 verbose_command_req
-%type <music> extender_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 {
- THIS->input_file_->scores_.push ($1);
+ Score * sc = $1;
+
+ SCM head = ly_module_p (sc->header_) ? sc->header_ : THIS->input_file_->header_.to_SCM ();
+
+ Path p = split_path (THIS->output_basename_);
+ int *c = &THIS->input_file_->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());
}
| 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 ();
$$ = $1->self_scm ();
scm_gc_unprotect_object ($$);
}
- | verbose_duration {
- $$ = $1;
- }
| number_expression {
$$ = $1;
}
;
translator_spec_body:
- TRANSLATOR_IDENTIFIER {
- $$ = $1;
- unsmob_translator_def ($$)-> set_spot (THIS->here_input ());
- }
- | TYPE STRING {
- $$ = Translator_def::make_scm ();
- Translator_def*td = unsmob_translator_def ($$);
- td->translator_group_type_ = $2;
- td->set_spot (THIS->here_input ());
- }
- | translator_spec_body DESCRIPTION string {
- unsmob_translator_def ($$)->description_ = $3;
- }
- | translator_spec_body STRING '=' embedded_scm {
- unsmob_translator_def ($$)->add_property_assign ($2, $4);
- }
- | translator_spec_body STRING OVERRIDE embedded_scm '=' embedded_scm {
- unsmob_translator_def ($$)
- ->add_push_property (scm_string_to_symbol ($2), $4, $6);
- }
- | translator_spec_body STRING SET embedded_scm '=' embedded_scm {
- unsmob_translator_def ($$)
- ->add_push_property (scm_string_to_symbol ($2), $4, $6);
- }
- | translator_spec_body STRING REVERT embedded_scm {
- unsmob_translator_def ($$)->add_pop_property (
- scm_string_to_symbol ($2), $4);
- }
- | translator_spec_body NAME STRING {
- unsmob_translator_def ($$)->type_name_ = scm_string_to_symbol ($3);
- }
- | translator_spec_body CONSISTS STRING {
- unsmob_translator_def ($$)->add_element ($3);
+ /**/ {
+ $$ = Context_def::make_scm ();
+ unsmob_context_def ($$)->set_spot (THIS->here_input ());
}
- | translator_spec_body ALIAS STRING {
- Translator_def*td = unsmob_translator_def ($$);
- td->type_aliases_ = scm_cons (scm_string_to_symbol ($3), td->type_aliases_);
+ | TRANSLATOR_IDENTIFIER {
+ $$ = $1;
+ unsmob_context_def ($$)->set_spot (THIS->here_input ());
}
| translator_spec_body GROBDESCRIPTIONS embedded_scm {
- Translator_def*td = unsmob_translator_def($$);
- // td->add_property_assign (ly_symbol2scm ("allGrobDescriptions"), $3);
- for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p))
- td->add_property_assign (scm_symbol_to_string (ly_caar (p)), ly_cdar (p));
- }
- | translator_spec_body CONSISTSEND STRING {
- unsmob_translator_def ($$)->add_last_element ( $3);
- }
- | translator_spec_body ACCEPTS STRING {
- unsmob_translator_def ($$)->set_acceptor (scm_string_to_symbol ($3), true);
- }
- | translator_spec_body DENIES STRING {
- unsmob_translator_def ($$)->set_acceptor (scm_string_to_symbol ($3), false);
+ 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, gh_cons (ly_cdar (p), SCM_EOL), SCM_UNDEFINED));
+ }
}
- | translator_spec_body REMOVE STRING {
- unsmob_translator_def ($$)->remove_element ($3);
+ | translator_spec_body context_mod {
+ unsmob_context_def ($$)->add_context_mod ($2);
}
;
/*cont*/ '{' score_body '}' {
THIS->pop_spot ();
$$ = $4;
- if (!$$->defs_.size ())
- {
- Music_output_def *id =
- unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper"));
- $$->add_output (id ? id->clone () : new Paper_def );
- }
+
}
;
}
| SCORE_IDENTIFIER {
- $$ = unsmob_score ($1);
+ $$ = new Score ( *unsmob_score ($1));
$$->set_spot (THIS->here_input ());
}
| score_body lilypond_header {
$$->header_ = $2;
}
| score_body output_def {
- $$->add_output ($2);
+ $$->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 {
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 {
$$->set_mus_property ("procedure", $2);
$$->set_spot (THIS->here_input());
}
- | OUTPUTPROPERTY embedded_scm embedded_scm '=' embedded_scm {
- SCM pred = $2;
- if (!gh_symbol_p ($3))
- {
- THIS->parser_error (_ ("Second argument must be a symbol"));
- }
- /* Should check # args */
- if (!gh_procedure_p (pred))
- {
- THIS->parser_error (_ ("First argument must be a procedure taking one argument"));
- }
-
- Music*m = MY_MAKE_MUSIC("OutputPropertySetMusic");
- m->set_mus_property ("predicate", pred);
- m->set_mus_property ("grob-property", $3);
- m->set_mus_property ("grob-value", $5);
-
- $$ = m;
- }
| MUSIC_IDENTIFIER {
$$ = unsmob_music ($1);
}
- | property_def
- | translator_change
+ | music_property_def
+ | context_change
;
+optional_context_mod:
+ /**/ { $$ = SCM_EOL; }
+ | WITH '{' context_mod_list '}' { $$ = $3; }
+ ;
+
grace_head:
GRACE { $$ = scm_makfrom0str ("Grace"); }
| ACCIACCATURA { $$ = scm_makfrom0str ("Acciaccatura"); }
| APPOGGIATURA { $$ = scm_makfrom0str ("Appoggiatura"); }
;
-
-
-Composite_music:
- CONTEXT STRING Music {
- Music*csm =MY_MAKE_MUSIC("ContextSpeccedMusic");
-
- csm->set_mus_property ("element", $3->self_scm ());
- scm_gc_unprotect_object ($3->self_scm ());
- csm->set_mus_property ("context-type", scm_string_to_symbol ($2));
- csm->set_mus_property ("context-id", scm_makfrom0str (""));
+context_mod_list:
+ /* */ { $$ = SCM_EOL; }
+ | context_mod_list context_mod {
+ $$ = gh_cons ($2, $1);
+ }
+ ;
- $$ = csm;
+Composite_music:
+ 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());
}
- | 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);
+ | 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);
scm_gc_unprotect_object ($2->self_scm ());
#endif
}
- | CONTEXT string '=' string Music {
- Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
+ | CONTEXT string '=' string optional_context_mod Music {
+ $$ = context_spec_music ($2, $4, $6, $5);
- csm->set_mus_property ("element", $5->self_scm ());
- scm_gc_unprotect_object ($5->self_scm ());
-
- csm->set_mus_property ("context-type", scm_string_to_symbol ($2));
- csm->set_mus_property ("context-id", $4);
-
- $$ = csm;
}
- | NEWCONTEXT string Music {
- static int new_context_count;
-
- Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
-
- csm->set_mus_property ("element", $3->self_scm ());
- scm_gc_unprotect_object ($3->self_scm ());
-
- csm->set_mus_property ("context-type", scm_string_to_symbol ($2));
-
- SCM new_id = scm_number_to_string (gh_int2scm (new_context_count ++),
- gh_int2scm (10));
- csm->set_mus_property ("context-id", new_id);
- $$ = csm;
+ | CONTEXT 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);
}
+
| TIMES {
THIS->push_spot ();
}
}
| APPLY embedded_scm Music {
if (!ly_input_procedure_p ($2))
+ {
THIS->parser_error (_ ("\\apply takes function argument"));
-
- SCM ret = gh_call1 ($2, $3->self_scm ());
- Music *m = unsmob_music (ret);
- if (!m) {
- THIS->parser_error ("\\apply must return a Music");
- m = MY_MAKE_MUSIC("Music");
+ $$ = $3;
+ }
+ else
+ {
+ SCM ret = gh_call1 ($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;
}
- $$ = m;
}
| 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);
}
;
-translator_change:
- TRANSLATOR STRING '=' STRING {
+context_change:
+ CHANGE STRING '=' STRING {
Music*t= MY_MAKE_MUSIC("TranslatorChange");
t-> set_mus_property ("change-to-type", scm_string_to_symbol ($2));
t-> set_mus_property ("change-to-id", $4);
}
;
-property_def:
- simple_property_def
- | ONCE simple_property_def {
- $$ = $2;
- SCM e = $2->get_mus_property ("element");
- unsmob_music (e)->set_mus_property ("once", SCM_BOOL_T);
+property_operation:
+ STRING '=' scalar {
+ $$ = scm_list_n (ly_symbol2scm ("assign"),
+ scm_string_to_symbol ($1), $3, SCM_UNDEFINED);
+ }
+ | STRING UNSET {
+ $$ = scm_list_n (ly_symbol2scm ("unset"),
+ scm_string_to_symbol ($1), SCM_UNDEFINED);
+ }
+ | STRING SET embedded_scm '=' embedded_scm {
+ $$ = scm_list_n (ly_symbol2scm ("poppush"),
+ scm_string_to_symbol ($1), $3, $5, SCM_UNDEFINED);
+ }
+ | STRING OVERRIDE embedded_scm '=' embedded_scm {
+ $$ = scm_list_n (ly_symbol2scm ("push"),
+ scm_string_to_symbol ($1), $3, $5, SCM_UNDEFINED);
+ }
+ | STRING REVERT embedded_scm {
+ $$ = scm_list_n (ly_symbol2scm ("pop"),
+ scm_string_to_symbol ($1), $3, SCM_UNDEFINED);
}
;
-simple_property_def:
- PROPERTY STRING '.' STRING '=' scalar {
- Music *t = set_property_music (scm_string_to_symbol ($4), $6);
- Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
+translator_mod:
+ CONSISTSEND { $$ = ly_symbol2scm ("consists-end"); }
+ | CONSISTS { $$ = ly_symbol2scm ("consists"); }
+ | REMOVE { $$ = ly_symbol2scm ("remove"); }
- csm->set_mus_property ("element", t->self_scm ());
- scm_gc_unprotect_object (t->self_scm ());
+ | ACCEPTS { $$ = ly_symbol2scm ("accepts"); }
+ | DENIES { $$ = ly_symbol2scm ("denies"); }
- $$ = csm;
- $$->set_spot (THIS->here_input ());
+ | ALIAS { $$ = ly_symbol2scm ("alias"); }
+ | TYPE { $$ = ly_symbol2scm ("translator-type"); }
+ | DESCRIPTION { $$ = ly_symbol2scm ("description"); }
+ | NAME { $$ = ly_symbol2scm ("context-name"); }
+ ;
- csm-> set_mus_property ("context-type", scm_string_to_symbol ($2));
+context_mod:
+ property_operation { $$ = $1; }
+ | translator_mod STRING {
+ $$ = scm_list_n ($1, $2, SCM_UNDEFINED);
}
- | PROPERTY STRING '.' STRING UNSET {
-
- Music *t = MY_MAKE_MUSIC("PropertyUnset");
- t->set_mus_property ("symbol", scm_string_to_symbol ($4));
-
- Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
- csm->set_mus_property ("element", t->self_scm ());
- scm_gc_unprotect_object (t->self_scm ());
-
- $$ = csm;
- $$->set_spot (THIS->here_input ());
+ ;
- csm-> set_mus_property ("context-type", scm_string_to_symbol ($2));
+context_prop_spec:
+ STRING {
+ $$ = scm_list_n (ly_symbol2scm ("Bottom"), scm_string_to_symbol ($1), SCM_UNDEFINED);
}
- | PROPERTY STRING '.' STRING SET embedded_scm '=' embedded_scm {
- bool autobeam
- = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
- bool itc = internal_type_checking_global_b;
- Music *t = MY_MAKE_MUSIC("OverrideProperty");
- t->set_mus_property ("symbol", scm_string_to_symbol ($4));
- t->set_mus_property ("pop-first", SCM_BOOL_T);
- if (autobeam)
- internal_type_checking_global_b = false;
- t->set_mus_property ("grob-property", $6);
- if (autobeam)
- internal_type_checking_global_b = itc;
- t->set_mus_property ("grob-value", $8);
-
- Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
- csm->set_mus_property ("element", t->self_scm ());
- scm_gc_unprotect_object (t->self_scm ());
- $$ = csm;
- $$->set_spot (THIS->here_input ());
-
- csm-> set_mus_property ("context-type", scm_string_to_symbol ($2));
+ | STRING '.' STRING {
+ $$ = scm_list_n (scm_string_to_symbol ($1), scm_string_to_symbol ($3), SCM_UNDEFINED);
}
- | PROPERTY STRING '.' STRING OVERRIDE
- embedded_scm '=' embedded_scm
- {
- /*
- UGH UGH UGH UGH.
- */
- bool autobeam
- = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
- bool itc = internal_type_checking_global_b;
-
- Music *t = MY_MAKE_MUSIC("OverrideProperty");
- t->set_mus_property ("symbol", scm_string_to_symbol ($4));
- if (autobeam)
- internal_type_checking_global_b = false;
- t->set_mus_property ("grob-property", $6);
- t->set_mus_property ("grob-value", $8);
- if (autobeam)
- internal_type_checking_global_b = itc;
-
- Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
- csm->set_mus_property ("element", t->self_scm ());
- scm_gc_unprotect_object (t->self_scm ());
-
- $$ = csm;
- $$->set_spot (THIS->here_input ());
-
- csm-> set_mus_property ("context-type", scm_string_to_symbol ($2));
+ ;
+music_property_def:
+ OVERRIDE context_prop_spec embedded_scm '=' scalar {
+ $$ = property_op_to_music (scm_list_n (
+ ly_symbol2scm ("poppush"),
+ gh_cadr ($2),
+ $3, $5, SCM_UNDEFINED));
+ $$= context_spec_music (gh_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
}
- | PROPERTY STRING '.' STRING REVERT embedded_scm {
- Music *t = MY_MAKE_MUSIC("RevertProperty");
- bool autobeam
- = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
- bool itc = internal_type_checking_global_b;
-
- t->set_mus_property ("symbol", scm_string_to_symbol ($4));
- if (autobeam)
- internal_type_checking_global_b = false;
- t->set_mus_property ("grob-property", $6);
- if (autobeam)
- internal_type_checking_global_b = itc;
-
- Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
- csm->set_mus_property ("element", t->self_scm ());
- scm_gc_unprotect_object (t->self_scm ());
-
- $$ = csm;
- $$->set_spot (THIS->here_input ());
+ | SET context_prop_spec '=' scalar {
+ $$ = property_op_to_music (scm_list_n (
+ ly_symbol2scm ("assign"),
+ gh_cadr ($2),
+ $4, SCM_UNDEFINED));
+ $$= context_spec_music (gh_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+ }
+ | REVERT context_prop_spec embedded_scm {
+ $$ = property_op_to_music (scm_list_n (
+ ly_symbol2scm ("pop"),
+ gh_cadr ($2),
+ $3, SCM_UNDEFINED));
- csm-> set_mus_property ("context-type", scm_string_to_symbol ($2));
+ $$= context_spec_music (gh_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+ }
+ | UNSET context_prop_spec {
+ $$ = property_op_to_music (scm_list_n (
+ ly_symbol2scm ("unset"),
+ gh_cadr ($2)));
+ $$= context_spec_music (gh_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+ }
+ | ONCE music_property_def {
+ $$ = $2;
+ $$->set_mus_property ("once", SCM_BOOL_T);
}
;
+
scalar:
string { $$ = $1; }
| bare_int { $$ = gh_int2scm ($1); }
| DIGIT { $$ = gh_int2scm ($1); }
;
-
-
/*
This is a trick:
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:
- extender_req {
- $$ = $1;
- }
- | 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"));
+ $$ = MY_MAKE_MUSIC("ExtenderEvent");
+ }
| script_dir direction_reqd_event {
if ($1)
$2->set_mus_property ("direction", gh_int2scm ($1));
}
| close_event {
$$ = $1;
- dynamic_cast<Music *> ($$)->set_mus_property ("span-direction", gh_int2scm (START));
+ dynamic_cast<Music *> ($$)->set_mus_property ("span-direction",
+ gh_int2scm (START));
}
| open_event {
$$ = $1;
- dynamic_cast<Music *> ($$)->set_mus_property ("span-direction", gh_int2scm (STOP))
+ dynamic_cast<Music *> ($$)->set_mus_property ("span-direction",
+ gh_int2scm (STOP));
}
| EVENT_IDENTIFIER {
$$ = unsmob_music ($1);
$$ = a;
}
;
-
+
+oct_check:
+ /**/ { $$ = SCM_EOL; }
+ | '=' { $$ = gh_int2scm (0); }
+ | '=' sub_quotes { $$ = gh_int2scm ($2); }
+ | '=' sup_quotes { $$ = gh_int2scm ($2); }
+ ;
+
sup_quotes:
'\'' {
$$ = 1;
steno_pitch {
$$ = $1;
}
- | explicit_pitch {
- $$ = $1;
- }
;
pitch_also_in_chords:
| steno_tonic_pitch
;
-explicit_pitch:
- PITCH embedded_scm {
- $$ = $2;
- if (!unsmob_pitch ($2)) {
- THIS->parser_error (_f ("Expecting musical-pitch value", 3));
- $$ = Pitch ().smobbed_copy ();
- }
- }
- ;
-
-verbose_duration:
- DURATION embedded_scm {
- $$ = $2;
- if (!unsmob_duration ($2))
- {
- THIS->parser_error (_ ("Must have duration object"));
- $$ = Duration ().smobbed_copy ();
- }
- }
- ;
-
-extender_req:
- EXTENDER {
- if (!THIS->lexer_->lyric_state_b ())
- THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
- $$ = MY_MAKE_MUSIC("ExtenderEvent");
- }
- ;
-
-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");
multiplied_duration {
$$ = $1;
}
- | verbose_duration {
- $$ = $1;
- }
;
optional_notemode_duration:
THIS->beam_check ($$);
}
- | verbose_duration {
- $$ = $1;
- THIS->default_duration_ = *unsmob_duration ($$);
- }
;
steno_duration:
| UNSIGNED {
$$ = scm_number_to_string (gh_int2scm ($1), gh_int2scm (10));
}
- | STRING { $$ = $1 }
+ | STRING { $$ = $1; }
;
bass_mod:
- '-' { $$ = -1; }
- | '+' { $$ = 1; }
+ '-' { $$ = -2; }
+ | '+' { $$ = 2; }
| '!' { $$ = 0; }
;
;
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 {
;
lyric_element:
- full_markup { $$ = $1 }
+ full_markup { $$ = $1; }
| STRING { $$ = $1 ; }
;
$$ = make_chord_step ($1, 0);
}
| bare_unsigned '+' {
- $$ = make_chord_step ($1, 1);
+ $$ = make_chord_step ($1, SHARP);
}
| bare_unsigned CHORD_MINUS {
- $$ = make_chord_step ($1,-1);
+ $$ = make_chord_step ($1, FLAT);
}
;
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;
}
} else if (gh_number_p (sid)) {
*destination = sid;
return NUMBER_IDENTIFIER;
- } else if (unsmob_translator_def (sid)) {
- *destination = unsmob_translator_def (sid)->clone_scm();
+ } else if (unsmob_context_def (sid)) {
+ *destination = unsmob_context_def (sid)->clone_scm();
return TRANSLATOR_IDENTIFIER;
} else if (unsmob_score (sid)) {
Score *sc = new Score (*unsmob_score (sid));
return -1;
}
+
+Music *
+property_op_to_music (SCM op)
+{
+ Music * m = 0;
+ SCM tag = gh_car (op);
+ SCM symbol = gh_cadr (op);
+ SCM args = gh_cddr (op);
+ SCM grob_val = SCM_UNDEFINED;
+ SCM grob_sym = SCM_UNDEFINED;
+ SCM val = SCM_UNDEFINED;
+
+ if (tag == ly_symbol2scm ("assign"))
+ {
+ m = MY_MAKE_MUSIC("PropertySet");
+ val = gh_car (args);
+ }
+ else if (tag == ly_symbol2scm ("unset"))
+ m = MY_MAKE_MUSIC("PropertyUnset");
+ else if (tag == ly_symbol2scm ("poppush")
+ || tag == ly_symbol2scm ("push"))
+ {
+ m = MY_MAKE_MUSIC("OverrideProperty");
+ grob_sym = gh_car (args);
+ grob_val = gh_cadr (args);
+ }
+ else if (tag == ly_symbol2scm ("pop")) {
+ m = MY_MAKE_MUSIC("RevertProperty");
+ grob_sym = gh_car (args);
+ }
+
+ m->set_mus_property ("symbol", symbol);
+
+ if (val != SCM_UNDEFINED)
+ m->set_mus_property ("value", val);
+ if (grob_val != SCM_UNDEFINED)
+ m->set_mus_property ("grob-value", grob_val);
+
+ if (grob_sym != SCM_UNDEFINED)
+ {
+ bool itc = internal_type_checking_global_b;
+ /* UGH.
+ */
+ bool autobeam = gh_equal_p (symbol, ly_symbol2scm ("autoBeamSettings"));
+ if (autobeam)
+ internal_type_checking_global_b = false;
+ m->set_mus_property ("grob-property", grob_sym);
+ if (autobeam)
+ internal_type_checking_global_b = itc;
+ }
+
+ if (op == ly_symbol2scm ("poppush"))
+ m->set_mus_property ("pop-first", SCM_BOOL_T);
+
+
+ return m;
+}
+
+Music*
+context_spec_music (SCM type, SCM id, Music * m, SCM ops)
+{
+ Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
+
+ csm->set_mus_property ("element", m->self_scm ());
+ scm_gc_unprotect_object (m->self_scm ());
+
+ csm->set_mus_property ("context-type",
+ gh_symbol_p (type) ? type : scm_string_to_symbol (type));
+ csm->set_mus_property ("property-operations", ops);
+
+ if (gh_string_p (id))
+ csm->set_mus_property ("context-id", id);
+ return csm;
+}
+
+
+SCM
+get_next_unique_context ()
+{
+ static int new_context_count;
+
+ char s[1024];
+ snprintf (s, 1024, "uniqueContext%d", new_context_count ++);
+
+ return scm_makfrom0str (s);
+}
+