+/*
+ boxes.cc -- implement Box
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
#include "boxes.hh"
#include "varray.hh"
void set_last_duration (Duration const *);
void set_default_duration (Duration const *);
- void set_last_abbrev (int type_i);
void set_abbrev_beam (int type_i);
void set_duration_mode (String s);
friend int yyparse (void*);
public:
int abbrev_beam_type_i_;
- int default_abbrev_type_i_;
int default_octave_i_;
Duration default_duration_;
Plet plet_;
class Stem_engraver : public Engraver
{
Direction dir_;
+ int default_abbrev_i_;
Stem *stem_p_;
Rhythmic_req *rhythmic_req_l_;
Abbreviation_req* abbrev_req_l_;
protected:
+ virtual void do_creation_processing ();
virtual void acknowledge_element (Score_elem_info);
virtual void do_pre_move_processing ();
virtual bool do_try_request (Request*);
source_l_ = source_l;
lexer_p_ = 0;
abbrev_beam_type_i_ = 0;
- default_abbrev_type_i_ = 0;
default_duration_.durlog_i_ = 2;
default_octave_i_ = 0;
textstyle_str_="roman"; // in lexer?
abbrev_beam_type_i_ = type_i;
}
-void
-My_lily_parser::set_last_abbrev (int type_i)
-{
- default_abbrev_type_i_ = type_i;
-}
-
void
My_lily_parser::set_default_duration (Duration const *d)
{
last_duration_mode_b_ = false;
default_duration_ = *d;
- set_last_abbrev (0);
}
{
if (last_duration_mode_b_)
default_duration_ = *d;
- set_last_abbrev (0);
}
if (s=="s")
{ /* Space */
- Skip_req * skip_p = new Skip_req;
- skip_p->duration_ = *duration_p;
+ Skip_req * skip_p = new Skip_req;
+ skip_p->duration_ = *duration_p;
- skip_p->set_spot (here_input());
- velt_p->add (skip_p);
+ skip_p->set_spot (here_input());
+ velt_p->add (skip_p);
}
else
{
My_lily_parser::get_note_element (Note_req *rq, Duration * duration_p)
{
Chord*v = new Request_chord;
- v->set_spot (here_input());
+ v->set_spot (here_input ());
v->add (rq);
duration_p->set_plet (1, 2);
}
rq->set_duration (*duration_p);
- rq->set_spot (here_input());
+ rq->set_spot (here_input ());
delete duration_p ;
return v;
}
#include <iostream.h>
// mmm
-#define MUDELA_VERSION "0.1.5"
+#define MUDELA_VERSION "0.1.6"
#include "scalar.hh"
#include "translation-property.hh"
#include "music-list.hh"
#include "header.hh"
#include "duration-convert.hh"
+#include "change-translator.hh"
#ifndef NDEBUG
#define YYDEBUG 1
%type <scalar> scalar
%type <music> Music transposed_music
-%type <music> propertydef
+%type <music> property_def translator_change
%type <musiclist> Voice Voice_body
%type <chord> Chord Chord_body
%type <paper> paper_block paper_body
paper_body:
/* empty */ {
- $$ = THIS->default_paper (); // paper / video / engrave
+ $$ = THIS->default_paper ();
}
| PAPER_IDENTIFIER {
$$ = $1->paperdef ();
{ THIS->lexer_p_->push_lyric_state (); }
Music
{ $$ = $3; THIS->lexer_p_->pop_state (); }
- | propertydef
+ | property_def
+ | translator_change
;
-propertydef:
+translator_change:
TRANSLATOR STRING '=' STRING {
- /* kluge. Could use Music just as well */
- Translation_property * t = new Translation_property;
- t-> translator_type_str_ = *$2;
- t-> translator_id_str_ = *$4;
+ Change_translator * t = new Change_translator;
+ t-> change_to_type_str_ = *$2;
+ t-> change_to_id_str_ = *$4;
+
$$ = t;
delete $2;
delete $4;
}
- | PROPERTY STRING '.' STRING '=' scalar {
+ ;
+
+property_def:
+ PROPERTY STRING '.' STRING '=' scalar {
Translation_property *t = new Translation_property;
t-> translator_type_str_ = *$2;
t-> var_str_ = *$4;
Chord:
'<' Chord_body '>' { $$ = $2; }
+ | MULTI INT Chord {
+ $$ = $3;
+ $$->multi_level_i_=$2;
+ }
;
Chord_body:
$$ = new Chord;
$$-> multi_level_i_ = 1;
}
- | Chord_body MULTI INT ';' {
- $$->multi_level_i_=$3;
- }
| Chord_body Music {
$$->add ($2);
}
c' -> default_octave_i_ == 1
*/
- /* why can't we have \oct{0} iso \oct{c'}*/
+ /* why can't we have \oct 0 iso \oct{c'}*/
THIS->default_octave_i_ = 1; }
/* cont */
steno_melodic_req {
abbrev_type:
- ':' int {
+ ':' {
+ $$ =0;
+ }
+ | ':' int {
if (!Duration::duration_type_b ($2))
THIS->parser_error ("Not a duration");
else if ($2 < 8)
THIS->parser_error ("Can't abbreviate");
- else
- THIS->set_last_abbrev ($2);
- $$ = THIS->default_abbrev_type_i_;
+ $$ = $2;
}
+
;
music_elt:
{
abbrev_req_l_ = 0;
stem_p_ = 0;
+ default_abbrev_i_ = 16;
dir_ = CENTER;
}
+void
+Stem_engraver::do_creation_processing ()
+{
+ Scalar prop = get_property ("abbrev");
+ if (prop && prop.isnum ())
+ {
+ default_abbrev_i_ = prop;
+ }
+}
+
void
Stem_engraver::acknowledge_element(Score_elem_info i)
{
Rhythmic_req * r = i.req_l_->musical()->rhythmic();
stem_p_ = new Stem;
int durlog_i = r->duration_.durlog_i_;
- stem_p_->flag_i_ = Duration_convert::type2_i(durlog_i);
+ stem_p_->flag_i_ = durlog_i;
+
+
if (abbrev_req_l_)
- stem_p_->abbrev_flag_i_ = intlog2 (abbrev_req_l_->type_i_)
- - (durlog_i>? 2);
+ {
+ int t = abbrev_req_l_->type_i_;
+ if (!t)
+ t = default_abbrev_i_;
+ else
+ default_abbrev_i_ = t;
+ stem_p_->abbrev_flag_i_ = intlog2 (t) - (durlog_i>? 2);
+ }
announce_element (Score_elem_info (stem_p_, r));
}
stem_p_->add (h);
}
Translator::Translator (Translator const &s)
+ : Input (s)
{
status = ORPHAN;
daddy_trans_l_ =0;
void
Translator::add_processing ()
{
- if (status == ORPHAN)
- status = VIRGIN;
+ if (status > ORPHAN)
+ return;
+
+ do_add_processing ();
+ status = VIRGIN;
+}
+
+void
+Translator::do_add_processing ()
+{
}
void
#ifndef NPRINT
DOUT << name () << " {";
if (name () != type_str_)
- DOUT << "type= " << type_str_;
+ DOUT << "type = " << type_str_;
for (Dictionary_iter<Scalar> i (properties_dict_); i.ok (); i++)
{
DOUT << i.key () << "=" << i.val () <<"\n";
void
Translator::removal_processing()
{
+ if (status == ORPHAN)
+ return;
creation_processing();
do_removal_processing();
+ // elegancy ...
+ // status = ORPHAN;
}