+pl 24:
+ - Lyrics
+ - Commands in music-mode (an input feature) (there you are, Mats)
pl 23:
- TODO file inc'd
- error.pod,faq.pod
- Markers
- configure script
- - scrapped VPATH
- inputfile name in output.
Internal changes:
+ - scrapped VPATH
+ - Make dependencies per .o
- Split Input_* parsing steps to enable marking
Bugfixes:
- unconnected columns
+
BUGS
* first clef
INPUTLANGUAGE
+ * lexer condition stack
+
+ * lose the $ and @?
+
* figured bass?
* transposition
SMALLISH PROJECTS
+ * make spanner for staffsym
+
+ * Lyric_req : Text_req, Rhythmic_req
+
* Lookup::tex_glissando, Lookup::tex_bracket,
Lookup::tex_cresc, Lookup::tex_decresc (use texbeam.cc as an
example.)
* fix symbols in parser.o: `Warning: size of symbol'
- * Viola clef (->jan?!)
+ * Viola clef
DOC
* all errors
FUTURE
+ * Command_req
+
+ * scrap stem_request?
* Text_pstaff/Lyric_staff
* Implement all requests
+ * merge key{item} & localkey{item}
+
* QLP for beams?
* stacked slurs.
e4 fis4 () [fis e fis gis] |
cis4 `b4()`b8 r8 r4^"tr\`es soutenu" |
- r4 r4 | %2/4 meter
-
+ \command { \meter 2 *4 } r4 r4 |
+ \command { \meter 4 *4 }
'cis4_"\dyn ppp" 'd4 () ['d 'cis 'd 'e] |
a4 gis2. |
a4 b4()[b a b 'cis] |
| [f a 'c] \plet{1/1} 'e4-^ () ['e f-> a-> 'c->] |
'e4._"sf" 'e8()'c4 r4 |
r1 |
- r4 r4-\fermata
+ \command { \meter 2 *4 } r4 r4-\fermata
+ \command { \meter 4 *4 }
+
\octave { ' }
|d2( [)d e cis `b] |
`a4 [`b cis] [cis `b] `b4 |
commands {
meter 4 *4
skip 18:0
- meter 2 *4
skip 1:0
- meter 4 *4
skip 20:0
bar "|:"
skip 9:0
- meter 2* 4
skip 1:0
bar ":|"
meter 4* 4
%x notes
%x incl
%x quote
+%x lyrics
AA {A}|_
N [0-9]
AN {AA}|{N}
+PUNCT [?!,.:;]
+ACCENT [\\'"^]
+TEX {AA}|-|{PUNCT}|{ACCENT}
WORD {A}{AN}*
ALPHAWORD {A}+
NOTECOMMAND \\{WORD}
NOTENAME {ALPHAWORD}
DOTS \.+
+LYRICS {TEX}+
+COMMENT [%#].*\n
%%
BEGIN(notes);
}
+\@ {
+ BEGIN(lyrics);
+}
+
<notes>{RESTNAME} {
const char *s = YYText();
yylval.string = new String (s);
yylval.i = String(YYText()).value();
return INT;
}
-<notes>[%#].*\n {
-
+<notes>{COMMENT} {
}
<notes>[ \t\n]+ {
yylval.string = new String(s);
return STRING;
}
-<notes>[()\[\]|/.^>_-] {
- return yylval.c = YYText()[0];
-
-}
<notes>. {
- String s("lexer error: illegal character found: " + String(YYText()));
- yyerror(s);
+ return yylval.c = YYText()[0];
}
\" {
return STRING;
}
+<lyrics>{DOTS} {
+ yylval.i = strlen(YYText());
+ return DOTS;
+}
+<lyrics>{INT} {
+ yylval.i = String(YYText()).value();
+ return INT;
+}
+<lyrics>{NOTECOMMAND} {
+ String c = YYText() +1;
+ mtor << "\\word: " << YYText()+1<<eol;
+ int l = lookup_keyword(c);
+ if (l != -1)
+ return l;
+ Identifier * id = lookup_identifier(c);
+ if (id) {
+ yylval.id = id;
+ return IDENTIFIER;
+ }
+ String *sp = new String( c);
+
+ yylval.string=sp;
+ return NEWIDENTIFIER;
+}
+<lyrics>\"[^\"]*\" {
+ String s (YYText()+1);
+ s = s.left(s.len()-1);
+ yylval.string = new String(s);
+ return STRING;
+}
+<lyrics>{LYRICS} {
+ String s (YYText());
+ int i = 0;
+ while ((i=s.pos("_")) != 0)// ugh. Whats this.
+ *((char*)s.cptr() + i - 1) = ' ';
+ if ((i=s.pos("\\,")) !=0)
+ {
+ *((char*)s.cptr() + i) = 'c';
+ s = s.left(i+1) + " " + s.right(s.len()-i-1);
+ }
+ yylval.string = new String(s);
+ return STRING;
+}
+<lyrics>\| {
+ return YYText()[0];
+}
+<lyrics>{COMMENT} {
+
+}
+<lyrics>[ \t\n]+ {
+}
+<lyrics>@ {
+ BEGIN(INITIAL);
+}
+
<<EOF>> {
mtor << "<<EOF>>";
}
-%.* {
+{COMMENT} {
//ignore
}
. {
#include "staff.hh"
#include "score.hh"
#include "voice.hh"
-#include "swalker.hh"
+#include "staffwalker.hh"
#include "stcol.hh"
#include "sccol.hh"
#include "staffcommands.hh"
PointerList<Input_command*> staff_wide)
{
Input_commands commands;
+
+ // bring in commands from voices.
+ for (iter_top(voices, i); i.ok(); i++) {
+ Moment here = i->start;
+ for (iter_top(i->elts, j); j.ok(); j++) {
+ for (iter_top(j->reqs, k); k.ok(); k++) {
+ if (k->command()){
+ commands.find_moment(here);
+ commands.add(*k->command()->com_p_,
+ score_l_->markers_assoc_);
+ }
+ }
+ here += j->duration;
+ }
+ }
for (iter_top(score_wide,i); i.ok(); i++)
commands.add(**i, score_l_->markers_assoc_);
for (iter_top(staff_wide,i); i.ok(); i++)
- commands.add(**i,score_l_->markers_assoc_);
+ commands.add(**i, score_l_->markers_assoc_);
commands.parse(this);
}
one_beat = 1/Moment(o);
whole_per_measure = Moment(l) * one_beat;
if(whole_in_measure)
- error_t("Meterchange should be at start of measure", when);
+ error_t("Meterchange should be at start of measure", *this);
}
void
void
error_t(const String& s, const Moment& r)
{
- String t_mom = String(trunc(r)) + (r - Moment(trunc(r)));
- String e=s+ "(t = " + t_mom + ")";
+ String t_mom = String(trunc(r)) + String(r - Moment(trunc(r)));
+ String e=s+ " (t = " + t_mom + ")";
error(e);
}
void
error_t(const String& s, Time_description const &t_tdes)
{
- String e=s+ "(at " + t_tdes.bars + ": " + t_tdes.whole_in_measure + ")\n";
+ String e=s+ " (at t=" + t_tdes.bars + ": " + t_tdes.whole_in_measure + ")\n";
error(e);
}