]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.63
authorfred <fred>
Sun, 24 Mar 2002 19:43:17 +0000 (19:43 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:43:17 +0000 (19:43 +0000)
16 files changed:
lib/duration-convert.cc
lily/.version
lily/lexer.l
make/Rules.make
mi2mu/.version
mi2mu/include/mi2mu.hh
mi2mu/include/midi-track.hh
mi2mu/include/midi-voice.hh
mi2mu/include/track-column.hh
mi2mu/main.cc
mi2mu/midi-lexer.l
mi2mu/midi-track.cc
mi2mu/midi-voice.cc
mi2mu/my-midi-parser.cc
mi2mu/template.cc
mi2mu/track-column.cc

index 882d275b3c06b7911bfd722803350396db972bd1..1b738507af96665162d7cf170b457c6fe3d6bf83 100644 (file)
@@ -93,8 +93,8 @@ Duration_convert::mom2_dur( Moment mom )
        
 
        Duration dur = mom2standardised_dur( mom );
-//     if ( dur.mom() == mom )
-       if ( dur.length() == mom )
+//     if ( !dur.mom() || ( dur.mom() == mom ) )
+       if ( !dur.length() || ( dur.length() == mom ) )
                return dur;
        assert( midi_as_plet_b_s );
 
@@ -121,7 +121,10 @@ Duration_convert::mom2standardised_dur( Moment mom )
        for ( int i = 0; i < dur_array_s.size() - 1; i++ ) {
                Moment lower_mom = dur2_mom( dur_array_s[ i ] );
                if ( mom <= lower_mom ) {
-                       if ( i || ( mom / lower_mom > Moment( 3, 4 ) ) )
+                       // all arbitrary, but 1/4 will get rid of the noise...
+//                     if ( i || ( mom / lower_mom > Moment( 3, 4 ) ) )
+//kinda ok             if ( i || ( mom / lower_mom > Moment( 2, 4 ) ) )
+                       if ( i || ( mom / lower_mom > Moment( 2, 6 ) ) )
                                return dur_array_s[ i ];
                        else
                                return Duration( 0 );
@@ -192,10 +195,6 @@ Duration_convert::ticks2standardised_dur( int ticks_i )
 {
        Moment mom( ticks_i, Duration::division_1_i_s );
        Duration dur = mom2standardised_dur( mom );
-
-//     if ( dur.mom() != mom )
-       if ( dur.length() != mom )
-               warning( String( "duration not exact: " ) + String( (Real)mom ) );
        return dur;
 }
 
index 2438befc5444fca13a0fe147376b6bb18fabcd03..e929572e511eb9d3ee1cf4d9995028e8a67bb54a 100644 (file)
@@ -1,6 +1,6 @@
 MAJOR_VERSION = 0
 MINOR_VERSION = 0
-PATCH_LEVEL = 62
+PATCH_LEVEL = 63
 
 # use to send patches, always empty for released version:
 # include separator: ".postfix", "-pl" makes rpm barf
index 38adcc5fd914f145b9d443c17993ec02ad67b205..39250c95c4ad22a9aea2c9faa17bbfbaf58477eb 100644 (file)
@@ -8,6 +8,19 @@
 */
 
 
+/*
+  backup rules
+
+  after making a change to the lexer rules, run 
+      flex -b <this lexer file>
+  and make sure that 
+      lex.backup
+  contains no backup states, but only the reminder
+      Compressed tables always back up.
+  (don-t forget to rm lex.yy.cc :-)
+ */
+
+
 #include <stdio.h>
 
 #include "string.hh"
@@ -76,8 +89,12 @@ LYRICS               ({AA}|{NATIONAL})[^0-9 \t\n\f]*
   }
   %[^{\n].*\n  {
   }
+  %[^{\n]      { // backup rule
+  }
   %\n  {
   }
+  %[^{\n].*    {
+  }
   {WHITE}+     {
        
   }
@@ -105,6 +122,10 @@ LYRICS             ({AA}|{NATIONAL})[^0-9 \t\n\f]*
        new_input(s,source_l_g);
        yy_pop_state();
 }
+<incl>\"[^"]*   { // backup rule
+       cerr << "missing end quote" << endl;
+       exit( 1 );
+}
 <notes>{RESTNAME}      {
        const char *s = YYText();
        yylval.string = new String (s); 
@@ -121,6 +142,14 @@ LYRICS             ({AA}|{NATIONAL})[^0-9 \t\n\f]*
        s=s.left_str(s.length_i() - 1);
        return scan_bare_word(s);
 }
+<INITIAL,lyrics,notes>\\\${BLACK}*             { // backup rule
+       cerr << "white expected" << endl;
+       exit( 1 );
+}
+<INITIAL,lyrics,notes>\${BLACK}*               { // backup rule
+       cerr << "white expected" << endl;
+       exit( 1 );
+}
 <notes>{
        {ALPHAWORD}/\'  {
                post_quotes_b_ = true;
@@ -238,6 +267,11 @@ LYRICS             ({AA}|{NATIONAL})[^0-9 \t\n\f]*
        return REAL;
 }
 
+{INT}\. { // backup rule
+       cerr << "int. encountered" << endl;
+       exit( 1 );
+}
+
 [{}]   {
 
        mtor << "parens\n";
index 2f6d76904470edb6e9d1183576f64725c821b398..36986881e580fcd73ddac99cede9dd40e134144e 100644 (file)
@@ -37,6 +37,8 @@ $(outdir)/%.hh: %.y
 
 $(outdir)/%.cc: %.l
        $(FLEX) -Cfe -p -p -t $< > $@
+# could be faster:
+#      $(FLEX) -8 -Cf -t $< > $@
 
 $(outdir)/%.text: $(outdir)/%.1
        groff -man -Tascii $< > $@
index af965a51c4034cb7f79f7a31eb30bb8530c0f253..4e05deeab57cc7fb14d236354a7e42e7d1e73b3a 100644 (file)
@@ -1,6 +1,6 @@
 MAJOR_VERSION = 0
 MINOR_VERSION = 0
-PATCH_LEVEL = 15
+PATCH_LEVEL = 16
 # use to send patches, always empty for released version:
 MY_PATCH_LEVEL = 
 #
index 9d9bf8ecc092dcde2eb53eff2754534a0fb5736a..5d381cedd050ac6d52d0c64af05adb6ced98545a 100644 (file)
@@ -26,6 +26,8 @@
 #undef mtor
 #endif
 
+#define MVOICE_LIST
+
 #include "string.hh"
 #include "string-convert.hh"
 
index 5e3394da3501b100dd35d90e777e140c569a8778..61022327c36d9ffb6e5c8f92d3c5938884a7a96d 100644 (file)
@@ -31,17 +31,35 @@ public:
        int number_i_;
 
 private:
-       void add_begin_at( Pointer_list<Midi_voice*>& open_voices_r, Moment mom );
+#ifdef MVOICE_LIST
+       void add_begin_at( Link_list<Midi_voice*>& open_voices_r, Moment mom );
+#else
+       void add_begin_at( Array<Midi_voice*>& open_voices_r, Moment mom );
+#endif
        int check_begin_bar_i( Moment now_mom, int open_bar_i );
        int check_end_bar_i( Moment now_mom, int open_bar_i );
        Midi_voice* get_free_midi_voice_l( Moment mom );
-       void remove_end_at( Pointer_list<Midi_voice*>& open_voices_r, Moment mom );
+#ifdef MVOICE_LIST
+       void remove_end_at( Link_list<Midi_voice*>& open_voices_r, Moment mom );
+#else
+       void remove_end_at( Array<Midi_voice*>& open_voices_r, Moment mom );
+#endif
        void output_mudela_begin_bar( Lily_stream& lily_stream_r, Moment now_mom, int bar_i );
        void output_mudela_rest( Lily_stream& lily_stream_r, Moment begin_mom, Moment end_mom );
        void output_mudela_rest_remain( Lily_stream& lily_stream_r, Moment mom );
 
-       IPointer_list<Track_column*> tcol_p_list_;
-       IPointer_list<Midi_voice*> midi_voice_p_list_;
+#ifdef TCOL_LIST
+#warning using track_column list
+       Pointer_list<Track_column*> tcol_p_list_;
+#else
+       Array<Track_column*> tcol_p_array_;
+#endif
+#ifdef MVOICE_LIST
+#warning using midi_voice list
+       Pointer_list<Midi_voice*> midi_voice_p_list_;
+#else
+       Array<Midi_voice*> midi_voice_p_array_;
+#endif
 };
 
 #endif // MIDI_TRACK_HH
index 6cadebfccb0a0ed173bcd0f2700e8d82e0af95a8..8360af08e4a940e513e6c4415de72dfc97ad3575 100644 (file)
@@ -15,14 +15,18 @@ public:
        Moment begin_mom();
        Moment end_mom();
 
-       String mudela_str( Moment to_mom, Moment to_mom, bool multiple_bo );
-    // ARE you sure?              ^^             ^^  
+       String mudela_str( Moment from_mom, Moment to_mom, bool multiple_bo );
 
 private:
-    int events_i_;
-       Moment end_mom_;
-       Moment begin_mom_;
-       IPointer_list<Midi_event*> midi_event_p_list_;
+       int events_i_;
+       Moment end_mom_;
+       Moment begin_mom_;
+#ifdef MEVENT_LIST
+#error using list
+       Pointer_list<Midi_event*> midi_event_p_list_;
+#else
+       Array<Midi_event*> midi_event_p_array_;
+#endif
 };
 
 #endif // MIDI_VOICE_HH
index c1126437e668dfa37b28c3b774f3fe0a721d8215..6c0630883b39ac4ad032ebe5889c9fffd35a26b3 100644 (file)
@@ -15,7 +15,12 @@ public:
        Moment mom();
 
 //private:
-       IPointer_list<Midi_event*> midi_event_p_list_;
+#ifdef MEVENT_LIST
+#error using list
+       Pointer_list<Midi_event*> midi_event_p_list_;
+#else
+       Array<Midi_event*> midi_event_p_array_;
+#endif
        Moment mom_;
 };
 
index 06589c789152107a0cb72d93731ca767fcab8b40..200c96a606ae91bfea0192d7f15728d50d1221ba 100644 (file)
@@ -90,7 +90,6 @@ main( int argc_i, char* argv_sz_a[] )
                0,0,0
        };
        Getopt_long getopt_long( argc_i, argv_sz_a, long_option_init_a );
-       identify();
 
        String output_str;
        while ( Long_option_init* long_option_init_p = getopt_long() )
@@ -102,6 +101,7 @@ main( int argc_i, char* argv_sz_a[] )
                        level_ver = DEBUG_ver;
                        break;
                case 'h':
+                       identify();
                        usage();
                        exit( 0 );
                        break;
@@ -125,6 +125,7 @@ main( int argc_i, char* argv_sz_a[] )
                case 's': {
                                int i = String_convert::dec2_i( getopt_long.optarg );
                                if ( !i ) {
+                                       identify();
                                        usage();
                                        exit( 2 ); //usage
                                }
@@ -135,6 +136,7 @@ main( int argc_i, char* argv_sz_a[] )
                        level_ver = VERBOSE_ver;
                        break;
                case 'w':
+                       identify();
                        notice();
                        exit( 0 );
                        break;
@@ -146,6 +148,9 @@ main( int argc_i, char* argv_sz_a[] )
                        break;
                }
   
+       // flag -q must be checked first
+       identify();
+
        char* arg_sz = 0;
        while ( ( arg_sz = getopt_long.get_next_arg() ) ) {
                My_midi_parser midi_parser( arg_sz, & source );
index 691955d5748bf6213743aea68368ae66d896f966..1bc41ded0ab0ab92390251fea1342c9f4666261e 100644 (file)
@@ -1,6 +1,17 @@
 %{//-*-Fundamental-*-
 // midi-lexer.l
 
+/*
+  backup rules
+
+  after making a change to the lexer rules, run 
+      flex -b <this lexer file>
+  and make sure that 
+      lex.backup
+  contains no backup states, but only the reminder
+      Compressed tables always back up.
+  (don-t forget to rm lex.yy.cc :-)
+ */
 
 #include "mi2mu.hh"
 #include "midi-parser.hh"
 U8             [\x00-\xff]
 I8             {U8}
 INT16          {U8}{U8}
+BACKUP_INT16_0 {U8}
 INT32          {INT16}{INT16}
+BACKUP_INT32_0 {U8}
+BACKUP_INT32_1 {U8}{U8}
+BACKUP_INT32_2 {INT16}{U8}
 INT7_8UNSET    [\x00-\x7f]
 INT7_8SET      [\x80-\xff]
 VARINT         {INT7_8SET}{0,3}{INT7_8UNSET}
+BACKUP_VARINT_0 {INT7_8SET}
+BACKUP_VARINT_1 {INT7_8SET}{INT7_8SET}
+BACKUP_VARINT_2 {INT7_8SET}{INT7_8SET}{INT7_8SET}
 
 HEADER         MThd
 TRACK          MTrk
+BACKUP_TOP_0   MT
+BACKUP_TOP_1   MTh
+BACKUP_TOP_2   MTr
 
 XRUNNING_STATUS        [\x30-\x4f]
 RUNNING_STATUS [\x00-\x5f]
@@ -70,7 +91,7 @@ SSME          [\0x7f][\x03]
 
 %%
 
-{HEADER}/{INT32}       { // using /{INT32}; longer match than {INT32}
+{HEADER} { // huh? using {HEADER}/{INT32}; longer match than {INT32}
        tor( DEBUG_ver ) << "lex: header" << endl;
        yy_push_state( int16 ); 
        yy_push_state( int16 ); 
@@ -79,17 +100,32 @@ SSME               [\0x7f][\x03]
        return HEADER;
 }
 
-{TRACK}/{INT32}        { // using /{INT32}; longer match than {INT32}
+{TRACK} { // huh? using {TRACK}/{INT32}; longer match than {INT32}
        tor( DEBUG_ver ) << "lex: track" << endl;
        yy_push_state( track ); 
        yy_push_state( int32 ); 
        return TRACK;
 }
 {U8}   {
-       error( String( "top level: illegal byte: " )
+       error( String( "top level: header expected: " )
                + String_convert::bin2hex_str( String( *YYText() ) ) );
        exit( 1 );
 }
+{BACKUP_TOP_0} {
+       error( String( "top level: header expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+{BACKUP_TOP_1} {
+       error( String( "top level: header expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+{BACKUP_TOP_2} {
+       error( String( "top level: header expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
 <int32>{INT32} { // really signed? 
        tor( DEBUG_ver ) << "lex: int32" << endl;
        assert( YYLeng() == 4 );
@@ -98,14 +134,34 @@ SSME               [\0x7f][\x03]
        yy_pop_state();
        return INT32;
 }
+<int32>{BACKUP_INT32_0} {
+       error( String( "int32: int32 expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+<int32>{BACKUP_INT32_1} {
+       error( String( "int32: int32 expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+<int32>{BACKUP_INT32_2} {
+       error( String( "int32: int32 expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
 <int16>{INT16} { // really signed?
        tor( DEBUG_ver ) << "lex: int16" << endl;
        assert( YYLeng() == 2 );
        String str( (Byte const*)YYText(), YYLeng() );
-       yylval.i = String_convert::bin2_i( str );
+       yylval.i = (short)String_convert::bin2_i( str );
        yy_pop_state();
        return INT16;
 }
+<int16>{BACKUP_INT16_0} {
+       error( String( "int16: int16 expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
 <i8>{I8}       {
        tor( DEBUG_ver ) << "lex: i8" << endl;
        assert( YYLeng() == 1 );
@@ -137,6 +193,21 @@ SSME               [\0x7f][\x03]
                + String_convert::bin2hex_str( String( *YYText() ) ) );
        exit( 1 );
 }
+<track>{BACKUP_VARINT_0}{U8} {
+       error( String( "track: varint expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+<track>{BACKUP_VARINT_1}{U8} {
+       error( String( "track: varint expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+<track>{BACKUP_VARINT_2}{U8} {
+       error( String( "track: varint expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
 <event>{RUNNING_STATUS}        {
 //     yylval.byte = *(Byte*)YYText();
        yylval.i = *(Byte*)YYText();
@@ -399,6 +470,21 @@ SSME               [\0x7f][\x03]
                + String_convert::bin2hex_str( String( *YYText() ) ) );
        exit( 1 );
 }
+<data>{BACKUP_VARINT_0}{U8} {
+       error( String( "data: varint expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+<data>{BACKUP_VARINT_1}{U8} {
+       error( String( "data: varint expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
+<data>{BACKUP_VARINT_2}{U8} {
+       error( String( "data: varint expected: " )
+               + String_convert::bin2hex_str( String( *( YYText() ) ) ) );
+       exit( 1 );
+}
 
 <<EOF>> {
 //     tor( NORMAL_ver ) << "<<EOF>>";
index 07f57c0a6722ea34bc183c49a909eb03c6e72726..03ac7fc13080d491cda9dafdf1669cf2e2654174 100644 (file)
@@ -13,7 +13,12 @@ Midi_track::Midi_track( int number_i, String copyright_str, String track_name_st
        name_str_ = track_name_str;
        midi_time_p_ = new Midi_time( 4, 2, 24, 8 );
        midi_tempo_p_ = new Midi_tempo( 1000000 );
+#ifdef TCOL_LIST
+#error doing list!
        tcol_p_list_.bottom().add( new Track_column( Moment( 0 ) ) );
+#else
+       tcol_p_array_.push( new Track_column( Moment( 0 ) ) );
+#endif
 }
 
 Midi_track::~Midi_track()
@@ -22,8 +27,9 @@ Midi_track::~Midi_track()
        delete midi_tempo_p_;
 }
 
+#ifdef MVOICE_LIST
 void
-Midi_track::add_begin_at( Pointer_list<Midi_voice*>& open_voices_r, Moment mom )
+Midi_track::add_begin_at( Link_list<Midi_voice*>& open_voices_r, Moment mom )
 {
        for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
                if ( i->begin_mom() == mom ) {
@@ -31,6 +37,17 @@ Midi_track::add_begin_at( Pointer_list<Midi_voice*>& open_voices_r, Moment mom )
                        open_voices_r.bottom().add( *i );
                }
 }
+#else
+void
+Midi_track::add_begin_at( Array<Midi_voice*>& open_voices_r, Moment mom )
+{
+       for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
+               if ( midi_voice_p_array_[ i ]->begin_mom() == mom ) {
+                       tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): +1\n";
+                       open_voices_r.push( midi_voice_p_array_[ i ] );
+               }
+}
+#endif
 
 void
 Midi_track::add_event( Moment mom, Midi_event* midi_event_p )
@@ -69,22 +86,44 @@ Midi_track::end_mom()
 {
        // heu..
        Moment mom = 0.0;
+#ifdef MVOICE_LIST
        for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ ) 
                mom = i->end_mom() >? mom;
+#else
+       for ( int i = 0; i < midi_voice_p_array_.size(); i++ ) 
+               mom = midi_voice_p_array_[ i ]->end_mom() >? mom;
+#endif
        return mom;
 }
 
 Midi_voice*
 Midi_track::get_free_midi_voice_l( Moment mom )
 {
-       for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
+#ifdef MVOICE_LIST
+       Real f = mom;
+       for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ ) {
+               Real e = i->end_mom();
                if ( i->end_mom() == mom )
                        return *i;
+       }
 
        Midi_voice* midi_voice_p = new Midi_voice( mom );
        Midi_voice* midi_voice_l = midi_voice_p;
        midi_voice_p_list_.bottom().add( midi_voice_p );
        return midi_voice_l; 
+#else
+       Real f = mom;
+       for ( int i = 0; i < midi_voice_p_array_.size(); i++ ) {
+               Real e = i->end_mom();
+               if ( midi_voice_p_array_[ i ]->end_mom() == mom )
+                       return midi_voice_p_array_[ i ];
+       }
+
+       Midi_voice* midi_voice_p = new Midi_voice( mom );
+       Midi_voice* midi_voice_l = midi_voice_p;
+       midi_voice_p_array_.push( midi_voice_p );
+       return midi_voice_l; 
+#endif
 }
 
 String
@@ -100,10 +139,17 @@ Midi_track::next_begin_mom( Moment now_mom )
 {
 //     Moment begin_mom = Midi_track::end_mom() + 1;
        Moment begin_mom = Midi_track::end_mom();
+#ifdef MVOICE_LIST
        for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
-//             if ( i->begin_mom() >= now_mom )
+//             if ( i->begin_mom() >= now_mom )// well, which one ? 
                if ( i->begin_mom() > now_mom )
                        begin_mom = begin_mom <? i->begin_mom();
+#else
+       for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
+               if ( midi_voice_p_array_[ i ]->begin_mom() >= now_mom ) // well, which one ?
+               if ( midi_voice_p_array_[ i ]->begin_mom() > now_mom )
+//                     begin_mom = begin_mom <? midi_voice_p_array_[ i ]->begin_mom();
+#endif
        return begin_mom;
 }
 
@@ -111,9 +157,16 @@ Moment
 Midi_track::next_end_mom( Moment now_mom )
 {
        Moment end_mom = Midi_track::end_mom();
+#ifdef MVOICE_LIST
        for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ ) 
                if ( i->end_mom() > now_mom )
                        end_mom = end_mom <? i->end_mom();
+#else
+       for ( int i = 0; i < midi_voice_p_array_.size(); i++ ) 
+//             if ( midi_voice_p_array_[ i ]->end_mom() >= now_mom )
+               if ( midi_voice_p_array_[ i ]->end_mom() > now_mom )
+                       end_mom = end_mom <? midi_voice_p_array_[ i ]->end_mom();
+#endif
        return end_mom;
 }
 
@@ -123,7 +176,9 @@ Midi_track::process()
        /* 
           columns to voices
        */
-       int bar_i = 1;
+//     int bar_i = 1;
+       int bar_i = 0;
+#ifdef TCOL_LIST
        for ( PCursor<Track_column*> i( tcol_p_list_.top() ); i.ok(); i++ ) {
                int begin_bar_i = check_begin_bar_i( i->mom(), bar_i );
                if ( begin_bar_i )
@@ -132,11 +187,43 @@ Midi_track::process()
                        get_free_midi_voice_l( i->mom() )->add_event( i->midi_event_p_list_.top().remove_p() );
                bar_i = check_end_bar_i( i->mom(), bar_i );
        }
+#else
+       for ( int i = 0; i < tcol_p_array_.size(); i++ ) {
+               Track_column* tcol_l = tcol_p_array_[ i ];
+               int begin_bar_i = check_begin_bar_i( tcol_l->mom(), bar_i );
+               if ( begin_bar_i )
+                       tor( NORMAL_ver ) << begin_bar_i << flush; 
+#ifdef MEVENT_LIST
+               while ( tcol_l->midi_event_p_list_.size() ) 
+                       get_free_midi_voice_l( tcol_l->mom() )->add_event( tcol_l->midi_event_p_list_.top().remove_p() );
+#else
+               // what's efficient here?
+#if 0          // heu, what's different here?
+               while ( tcol_l->midi_event_p_array_.size() ) {
+                       get_free_midi_voice_l( tcol_l->mom() )->add_event( tcol_l->midi_event_p_array_[ 0 ] );
+                       tcol_l->midi_event_p_array_.del( 0 );
+               }
+#else
+               for ( int i = 0; i < tcol_l->midi_event_p_array_.size(); i++ ) {
+                       get_free_midi_voice_l( tcol_l->mom() )->add_event( tcol_l->midi_event_p_array_[ i ] );
+                       tcol_l->midi_event_p_array_[ i ] = 0;
+               }
+               tcol_l->midi_event_p_array_.clear();
+#endif 
+#endif
+               bar_i = check_end_bar_i( tcol_l->mom(), bar_i );
+       }
+#endif
 
        tor( DEBUG_ver ) << "ends: " << endl;
        int n = 0;
+#ifdef MVOICE_LIST
        for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ ) 
                tor( VERBOSE_ver ) << "voice " << n++ << ": " << i->end_mom() << endl;
+#else
+       for ( int i = 0; i < midi_voice_p_array_.size(); i++ ) 
+               tor( VERBOSE_ver ) << "voice " << n++ << ": " << midi_voice_p_array_[ i ]->end_mom() << endl;
+#endif
        tor( DEBUG_ver ) << ":sdne" << endl;
 }
 
@@ -151,9 +238,14 @@ Midi_track::output_mudela( Lily_stream& lily_stream_r )
        lily_stream_r << "% instrument:" << instrument_str_;
        lily_stream_r.newline();
 
+//     int bar_i = 1;
        int bar_i = 0;
 
-       Pointer_list<Midi_voice*> open_voices;
+#ifdef MVOICE_LIST
+       Link_list<Midi_voice*> open_voices;
+#else
+       Array<Midi_voice*> open_voices;
+#endif
        Moment now_mom = 0.0;
        Real now_f = now_mom;
        Real begin_f = 0;
@@ -209,16 +301,26 @@ Midi_track::output_mudela( Lily_stream& lily_stream_r )
                if ( start_of_track_bo ) {
                        start_of_track_bo = false;
                        String str;
+#ifdef MVOICE_LIST
                        for ( PCursor<Midi_voice*> i( open_voices.top() ); i.ok(); i++ )
                                lily_stream_r << i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+#else
+                       for ( int i = 0; i < open_voices.size(); i++ )
+                               lily_stream_r << open_voices[ i ]->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+#endif
                        if ( str.length_i() )
                                lily_stream_r << str;
                        else
                                output_mudela_rest( lily_stream_r, now_mom, then_mom );
                }
                else {
+#ifdef MVOICE_LIST
                        for ( PCursor<Midi_voice*> i( open_voices.top() ); i.ok(); i++ )
                                lily_stream_r << i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+#else
+                       for ( int i = 0; i < open_voices.size(); i++ )
+                               lily_stream_r << open_voices[ i ]->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+#endif
                        if ( !open_voices.size() )
                                output_mudela_rest( lily_stream_r, now_mom, then_mom );
                }
@@ -232,8 +334,8 @@ Midi_track::output_mudela( Lily_stream& lily_stream_r )
 
                now_mom = then_mom;
        }
-       bar_i++;
-       tor( NORMAL_ver ) << '[' << bar_i << ']' << flush; 
+//     bar_i++;
+//     tor( NORMAL_ver ) << '[' << bar_i << ']' << flush; 
 
        lily_stream_r.tnedni();
        lily_stream_r << "} % " << name_str();
@@ -299,7 +401,8 @@ Midi_track::output_mudela_rest( Lily_stream& lily_stream_r, Moment begin_mom, Mo
                        output_mudela_begin_bar( lily_stream_r, now_mom, begin_bar_i );
                lily_stream_r << "r1 ";
 //             *lily_stream_r.os_p_ << flush;
-               tor( NORMAL_ver ) << begin_bar_i << flush; 
+               if ( begin_bar_i )
+                       tor( NORMAL_ver ) << begin_bar_i << flush; 
                bar_i = check_end_bar_i( now_mom, bar_i );
                now_mom += bar_mom;
        }
@@ -335,8 +438,10 @@ Midi_track::output_mudela_rest_remain( Lily_stream& lily_stream_r, Moment mom )
                lily_stream_r << "r" << dur.str() << " ";
 }
 
+
+#ifdef MVOICE_LIST
 void
-Midi_track::remove_end_at( Pointer_list<Midi_voice*>& open_voices_r, Moment mom )
+Midi_track::remove_end_at( Link_list<Midi_voice*>& open_voices_r, Moment mom )
 {
        for ( PCursor<Midi_voice*> i( open_voices_r.top() ); i.ok(); i++ )
 //             if ( i->end_mom() == mom ) { }
@@ -347,6 +452,19 @@ Midi_track::remove_end_at( Pointer_list<Midi_voice*>& open_voices_r, Moment mom
                                break;
                }
 }
+#else
+void
+Midi_track::remove_end_at( Array<Midi_voice*>& open_voices_r, Moment mom )
+{
+       for ( int i = 0; i < open_voices_r.size(); i++ )
+               if ( midi_voice_p_array_[ i ]->end_mom() <= mom ) {
+                       tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): -1\n";
+                       open_voices_r[ i ] = 0;
+//                     open_voices_r.del( i-- );
+                       open_voices_r.del( i );
+               }
+}
+#endif
 
 void
 Midi_track::set_tempo( int useconds_per_4_i )
@@ -365,18 +483,55 @@ Midi_track::set_time( int num_i, int den_i, int clocks_i, int count_32_i )
 Track_column*
 Midi_track::tcol_l( Moment mom )
 {
+#ifdef TCOL_LIST
        for ( PCursor<Track_column*> i( tcol_p_list_.top() ); i.ok(); i++ ) {
-               if ( i->mom() == mom )
-                       return *i;
-               if ( i->mom() > mom ) {
+               if ( i->mom() > mom ) { //not used, let's use array!
+                       assert( 0 );
                        Track_column* tcol_p = new Track_column( mom );
                        i.insert( tcol_p );
                        return tcol_p;
                }
+               if ( i->mom() == mom )
+                       return *i;
        }
 
        Track_column* tcol_p = new Track_column( mom );
        tcol_p_list_.bottom().add( tcol_p );
        return tcol_p;
+#elif 0
+       for ( int i = 0; i < tcol_p_array_.size(); i++ )
+               if ( tcol_p_array_[ i ]->mom() == mom )
+                       return tcol_p_array_[ i ];
+
+       Track_column* tcol_p = new Track_column( mom );
+       tcol_p_array_.push( tcol_p );
+       return tcol_p;
+#else
+       /*
+        as "insert" is never called, the right column will
+        always be found, unless mom > tcol_p_array[ i ]->mom().
+        */
+       int upper_i = max( 0, tcol_p_array_.size() - 1 );
+       int lower_i = 0;
+       int i = upper_i;
+       while ( 1 ) {
+               Moment i_mom = tcol_p_array_[ i ]->mom();
+               if ( i_mom == mom )
+                       return tcol_p_array_[ i ];
+               if ( mom < i_mom )
+                       upper_i = i;
+               else
+                       lower_i = i;
+               if ( ( upper_i == lower_i ) || ( i == tcol_p_array_.size() - 1 ) ) {
+// huh?                        assert ( upper_i == tcol_p_array_.size() );
+                       Track_column* tcol_p = new Track_column( mom );
+                       tcol_p_array_.push( tcol_p );
+                       return tcol_p;
+               }
+               i = ( upper_i + lower_i + 1 ) / 2;
+       }
+       assert( 0 );
+       return 0;
+#endif
 }
 
index 21cac0482c1e015f900efe58dccca8aeffde1fef..77a6526ef855320830ce2b0892b6ebad6da06672 100644 (file)
@@ -15,7 +15,11 @@ Midi_voice::Midi_voice( Moment begin_mom )
 void
 Midi_voice::add_event( Midi_event* midi_event_p )
 {
+#ifdef MEVENT_LIST
        midi_event_p_list_.bottom().add( midi_event_p );
+#else
+       midi_event_p_array_.push( midi_event_p );
+#endif
 }
 
 Moment 
@@ -27,6 +31,7 @@ Midi_voice::begin_mom()
 Moment 
 Midi_voice::end_mom()
 {
+#ifdef MEVENT_LIST
 //     if ( events_i_ == midi_event_p_list_.length_i() )
        if ( events_i_ == midi_event_p_list_.size() )
                return end_mom_;
@@ -41,6 +46,20 @@ Midi_voice::end_mom()
 //     events_i_ = midi_event_p_list_.length_i();
        events_i_ = midi_event_p_list_.size();
        return end_mom_;
+#else
+       if ( events_i_ == midi_event_p_array_.size() )
+               return end_mom_;
+       Moment now_mom = begin_mom_;
+       tor( DEBUG_ver ) << now_mom << ", ";
+       for ( int i = 0; i < midi_event_p_array_.size(); i++ ) {
+               tor( DEBUG_ver ) << now_mom << ", ";
+               now_mom += midi_event_p_array_[ i ]->mom();
+       }
+       tor( DEBUG_ver ) << endl;
+       end_mom_ = now_mom;
+       events_i_ = midi_event_p_array_.size();
+       return end_mom_;
+#endif
 }
 
 String 
@@ -48,12 +67,15 @@ Midi_voice::mudela_str( Moment from_mom, Moment to_mom, bool multiple_bo )
 {
        String str;
 
-       if ( begin_mom() >= to_mom )
+//     if ( begin_mom() >= to_mom )
+       if ( begin_mom() > to_mom )
                return "";
-       if ( end_mom() <= from_mom )
+//     if ( end_mom() <= from_mom )
+       if ( end_mom() < from_mom )
                return "";
        
        Moment now_mom = begin_mom();
+#ifdef MEVENT_LIST
        PCursor<Midi_event*> i( midi_event_p_list_.top() );
        for ( ; i.ok() && now_mom < from_mom ; i++ )
                now_mom += i->mom();
@@ -62,6 +84,16 @@ Midi_voice::mudela_str( Moment from_mom, Moment to_mom, bool multiple_bo )
                now_mom += i->mom();
                str += i->mudela_str( false ) + " ";
        }
+#else
+       int i = 0;
+       for ( ; i < midi_event_p_array_.size() && now_mom < from_mom ; i++ )
+               now_mom += midi_event_p_array_[ i ]->mom();
+       
+       for ( ; i < midi_event_p_array_.size() && now_mom < to_mom ; i++ ) {
+               now_mom += midi_event_p_array_[ i ]->mom();
+               str += midi_event_p_array_[ i ]->mudela_str( false ) + " ";
+       }
+#endif
        
        if ( str.length_i() && multiple_bo )
                str = "{ " + str + "} ";
index a8a2fb1e3b4c4cec9f36740724783b5c92173e8e..e3a4c988cca4cbc9e0ab8a20f0244dc5423f7a02 100644 (file)
@@ -86,7 +86,16 @@ My_midi_parser::error( char const* sz_l )
 void
 My_midi_parser::forward( int i )
 {
-       now_i64_ += i;
+       if ( Duration_convert::no_quantify_b_s ) {
+               now_i64_ += i;
+               return;
+       }
+       while ( i > Duration::division_1_i_s ) {
+               now_i64_ += Duration::division_1_i_s;
+               i -= Duration::division_1_i_s;
+       }
+       Duration dur = Duration_convert::ticks2standardised_dur( i );
+       now_i64_ += Duration_convert::dur2ticks_i( dur );
 }
 
 Moment
@@ -115,8 +124,15 @@ My_midi_parser::note_end_midi_event_p( int channel_i, int pitch_i, int dyn_i )
        Duration dur( 0 );
        if ( Duration_convert::no_quantify_b_s )
                dur = Duration_convert::ticks2_dur( (I64)now_i64_ - start_i64 );
-       else
+       else {
                dur = Duration_convert::ticks2standardised_dur( (I64)now_i64_ - start_i64 );
+               // checking myself iso using tor saves some time
+               if ( level_ver >= VERBOSE_ver ) { 
+                       Moment mom( (I64)now_i64_ - start_i64, Duration::division_1_i_s );
+                       if ( dur.length() != mom )
+                               warning( String( "duration not exact: " ) + String( (Real)mom ) );
+               }
+       }
        return new Midi_note( midi_key_p_->notename_str( pitch_i ), dur );
 }
 
index 6024aa9f1de327ad1b31ce87afcc1ace4744f2b8..24edd32cc4c7206078b35cb3270d2778ca9cc1e2 100644 (file)
@@ -17,9 +17,9 @@ class ostream;
 #include "plist.hh"
 #include "plist.tcc"
 
-IPL_instantiate(Midi_event);
+//IPL_instantiate(Midi_event);
 IPL_instantiate(Midi_track);
-PL_instantiate(Midi_voice);
-IPL_instantiate(Midi_voice);
-IPL_instantiate(Track_column);
+// PL_instantiate(Midi_voice);
+// IPL_instantiate(Midi_voice);
+//IPL_instantiate(Track_column);
 
index 57b072b3b9dcb5fd3051de8a478891deb70922ca..a7faedf16876ff73747fecc0e6e7d428cfd84b35 100644 (file)
@@ -13,7 +13,11 @@ Track_column::Track_column( Moment mom )
 void 
 Track_column::add_event( Midi_event* midi_event_p )
 {
+#ifdef MEVENT_LIST
        midi_event_p_list_.bottom().add( midi_event_p );
+#else
+       midi_event_p_array_.push( midi_event_p );
+#endif
 }
 
 Moment