# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-TOPLEVEL_MY_PATCH_LEVEL =
+TOPLEVEL_MY_PATCH_LEVEL = .jcn1
-This file documents bugs which were "re-introduced" in various pl's
-
-pl69
- * slurs.ly
-
-pl68:
- * opening rests of wohltemperirt
-
-
- * midi broken
+pl 75.jcn1
+ - all of the above
pl 75
- inbook.ly & book.tex example.
- natural width: linewidth = -1.0\cm
+pl 74pre.jcn2
+ - mi2mu fixes after scott snyder <snyder@d0sgif.fnal.gov> [sss]
+ - mi2mu update for mudela 0.0.61
+ - conflily fixes
+
pl 74pre.jcn1
- oversimplified midi output thru performer hierarchy
- bf: Spanner::doprint
# conflily
# ugh: must be executed from lilypond-x.x.x (bin/conflily)
-root=$HOME
-lelie=music/lily
+# the lilypond root dir looks like this:
+# current -> ./lilypond-x.x.x symlink to current source
+# lilypond-x.x.x the lilypond source
+# patches gzipped patches
+# releases gzipped releases
-if [ ! -e $root/lelie ]
-then
- echo ln -s $root/$lelie/current $root/lelie
- ln -s $root/$lelie/current $root/lelie
+# the lily root dir
+#
+lelie=$HOME/music/lily
+#
+
+if [ ! -e $HOME/lelie ]; then
+ ln -s $lelie $HOME/lelie
fi
-rm $root/$lelie/current >& /dev/null
+rm $lelie/current >& /dev/null
current=`basename \`pwd\``
-echo ln -s $root/$lelie/$current $root/$lelie/current
-ln -s $root/$lelie/$current $root/$lelie/current
+echo ln -s $lelie/$current $lelie/current
+ln -s $lelie/$current $lelie/current
-ln -sf $root/lelie/lily/out/lilypond bin/lilypond
-ln -sf $root/lelie/mi2mu/out/mi2mu bin/mi2mu
+ln -sf $lelie/current/lily/out/lilypond bin/lilypond
+ln -sf $lelie/current/mi2mu/out/mi2mu bin/mi2mu
-if [ "x$LILYINCLUDE" = "x" ]
-then
- export LILYINCLUDE=$root/lelie/init
+if [ "x$LILYINCLUDE" = "x" ]; then
+ export LILYINCLUDE=$lelie/current/init
fi
configure --prefix=$root --enable-debugging --enable-printing --enable-checking
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-MY_PATCH_LEVEL =
+MY_PATCH_LEVEL = .jcn1
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 17
+PATCH_LEVEL = 18
# use to send patches, always empty for released version:
MY_PATCH_LEVEL =
#
/// (midi_lexer)
class My_midi_lexer : yyFlexLexer {
public:
- My_midi_lexer( String &filename_str ,Sources * );
+ My_midi_lexer( String& filename_str, Sources* );
~My_midi_lexer();
int close_i();
char const* here_ch_C();
static int varint2_i( String str );
int yylex();
- Source_file * source_file_l_ ;
+ Source_file* source_file_l_ ;
+
private:
- int char_count_;
+ int char_count_;
+ int running_status_i_;
+
public: // ugh
int errorlevel_i_;
};
*os_p_ << "% from input file: ";
*os_p_ << midi_parser_l_g->filename_str_;
*os_p_ << "\n\n";
- *os_p_ << "\\version \"0.0.58\";\n";
+ // ugh
+ *os_p_ << "\\version \"0.0.61\";\n";
}
/*
snapnie: dit kan toch automaties? Zie ook dstream.
str += String( (char)( ( key_i_ + 2 ) % 7 + 'A' ) );
else // heu, -2: should be - 1 1/2: A -> fis
str += String( (char)( ( key_i_ + 2 - 2 ) % 7 + 'a' ) );
- str = String( "%" ) + str + "\n"; // "\key\F" not supported yet...
+ str = String( "%" ) + str + ";\n"; // "\key\F" not supported yet...
return str;
}
return "";
String str = "\\tempo 4:";
str += String( get_tempo_i( Moment( 1, 4 ) ) );
+ str += ";";
return str;
}
#include "midi-parser.hh"
#define YY_USER_ACTION char_count_ += YYLeng(); // ugh
+
%}
%option c++
BACKUP_TOP_1 MTh
BACKUP_TOP_2 MTr
-XRUNNING_STATUS [\x30-\x4f]
RUNNING_STATUS [\x00-\x5f]
DATA_ENTRY [\x60-\x79]
ALL_NOTES_OFF [\x7a-\x7f]
%%
-{HEADER} { // huh? using {HEADER}/{INT32}; longer match than {INT32}
+{HEADER} {
tor( DEBUG_ver ) << "lex: header" << endl;
yy_push_state( int16 );
yy_push_state( int16 );
return HEADER;
}
-{TRACK} { // huh? using {TRACK}/{INT32}; longer match than {INT32}
+{TRACK} {
tor( DEBUG_ver ) << "lex: track" << endl;
yy_push_state( track );
yy_push_state( int32 );
}
<event>{RUNNING_STATUS} {
// yylval.byte = *(Byte*)YYText();
- yylval.i = *(Byte*)YYText();
+// yylval.i = *(Byte*)YYText();
+ yylval.i = running_status_i_;
tor( DEBUG_ver ) << String ( "lex: running status: " ) + String( yylval.i ) << endl;
- yy_pop_state();
-// yy_push_state( u8 );
- yy_push_state( u8 );
+ /*
+ 'running status' rather means 'missing status'.
+ we'll put the running status data back, prepend (unput)
+ the running status, and try again.
+ */
+ yyless( 0 );
+ unput( running_status_i_ );
return RUNNING_STATUS;
}
<event>{DATA_ENTRY} {
tor( DEBUG_ver ) << "lex: note off" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
yy_push_state( u8 );
tor( DEBUG_ver ) << "lex: note on" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
yy_push_state( u8 );
tor( DEBUG_ver ) << "lex: polyphonic aftertouch" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
yy_push_state( u8 );
tor( DEBUG_ver ) << "lex: controlmode change" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
yy_push_state( u8 );
tor( DEBUG_ver ) << "lex: program change" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
return PROGRAM_CHANGE;
tor( DEBUG_ver ) << "lex: channel aftertouch" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
yy_push_state( u8 );
tor( DEBUG_ver ) << "lex: pitchwheel range" << endl;
// yylval.byte = *(Byte*)YYText();
yylval.i = *(Byte*)YYText();
+ running_status_i_ = yylval.i;
yy_pop_state();
yy_push_state( u8 );
yy_push_state( u8 );
;
running_status:
- RUNNING_STATUS U8 { //U8 {
- $$ = 0;
+ RUNNING_STATUS midi_event {
+ $$ = $2;
}
;
int i = $1;
i = i & ~0x90;
$$ = 0;
- midi_parser_l_g->note_begin( $1 & ~0x90, $2, $3 );
+ if ( $3 )
+ midi_parser_l_g->note_begin( $1 & ~0x90, $2, $3 );
+ /*
+ sss: some broken devices encode NOTE_OFF as
+ NOTE_ON with zero volume
+ */
+ else
+ $$ = midi_parser_l_g->note_end_midi_event_p( $1 & ~0x90, $2, $3 );
}
;
lily_stream << "\\score{";
lily_stream.indent();
- for ( PCursor<Midi_track*> i( midi_track_p_list_.top() ); i.ok(); i++ ) {
- if ( ( midi_track_p_list_.size() != 1 )
- && ( i == midi_track_p_list_.top() ) )
- continue;
- lily_stream << "\\staff{ melodicregs ";
- lily_stream << i->name_str();
- lily_stream << " }";
- lily_stream.newline();
- }
+ lily_stream << " < \\multi 3;";
+ lily_stream.indent();
+ for ( PCursor<Midi_track*> i( midi_track_p_list_.top() ); i.ok(); i++ ) {
+ if ( ( midi_track_p_list_.size() != 1 )
+ && ( i == midi_track_p_list_.top() ) )
+ continue;
+ lily_stream << "\\melodic{ ";
+ lily_stream << "\\$" << i->name_str();
+ lily_stream << " }";
+ lily_stream.newline();
+ }
+ lily_stream.tnedni();
+ lily_stream << ">";
lily_stream.newline();
lily_stream << "\\paper{";
lily_stream.indent();
- lily_stream << "\\unitspace 20\\mm";
+ lily_stream << "unitspace = 20.0\\mm;";
lily_stream.tnedni();
lily_stream << "}";
+ lily_stream.newline();
lily_stream << "\\midi{";
lily_stream.indent();
// not use silly 0 track
#ifdef TCOL_LIST
for ( PCursor<Track_column*> i( tcol_p_list_.top() ); i.ok(); i++ ) {
if ( i->mom() > mom ) { //not used, let's use array!
- assert( 0 );
+// assert( 0 );
+// 97-07-21; it's used now! cannot use array
Track_column* tcol_p = new Track_column( mom );
i.insert( tcol_p );
return tcol_p;
switch_streams( source_file_l_->istream_l() );
errorlevel_i_ = 0;
char_count_ = 0;
+ running_status_i_ = 0;
}
My_midi_lexer::~My_midi_lexer()