]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 0.0.75.jcn4: midi op
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 24 Jul 1997 06:51:45 +0000 (08:51 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Thu, 24 Jul 1997 06:51:45 +0000 (08:51 +0200)
pl 75.jcn4
- midi output, notes only

pl 75.jcn3
- working midi output -- hacked

pl 75.jcn2
- doze compile, mingw32 configure (still triggers gcc ico)

25 files changed:
.version
NEWS
configure.in
init/performer.ini
input/scsii-menuetto.ly
lily/.version
lily/include/global-translator.hh
lily/include/note-performer.hh
lily/include/performer-group-performer.hh
lily/include/performer.hh
lily/include/score-performer.hh
lily/include/silent-performer.hh [new file with mode: 0644]
lily/include/staff-performer.hh
lily/midi-output.cc
lily/midi-walker.cc [new file with mode: 0644]
lily/note-performer.cc
lily/p-score.cc
lily/performer-group-performer.cc
lily/performer.cc
lily/score-performer.cc
lily/score.cc
lily/silent-performer.cc [new file with mode: 0644]
lily/staff-performer.cc
mi2mu/include/mi2mu.hh
mi2mu/template.cc

index cb59764d31574174637dfe786ba7dba58a75add6..0d744cf4c454aff29dc1da2c2c390f2fc4098801 100644 (file)
--- a/.version
+++ b/.version
@@ -4,4 +4,4 @@ TOPLEVEL_PATCH_LEVEL = 75
 # use to send patches, always empty for released version:
 # include separator: ".postfix", "-pl" makes rpm barf
 
-TOPLEVEL_MY_PATCH_LEVEL = .jcn1
+TOPLEVEL_MY_PATCH_LEVEL = .jcn4
diff --git a/NEWS b/NEWS
index 2656eca7b2eb8da4ca1e7e8f27df8c6bf51c9620..d2f72f88303c2c990e7a0158efa18afde78f8501 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,12 @@
+pl 75.jcn4
+       - midi output, notes only
+
+pl 75.jcn3
+       - working midi output -- hacked
+
+pl 75.jcn2
+       - doze compile, mingw32 configure (still triggers gcc ico)
+
 pl 75.jcn1
        - all of the above
 
index 5fbb758a3e010d1f7c7930647a5d772be2a2e08a..327a133d826c787064910915f9889a0a607de38a 100644 (file)
@@ -104,7 +104,7 @@ AC_ARG_ENABLE(profiling,
     [  enable-profiling        compile with gprof support],
     [profile_b=$enableval])
     
-AC_ARG_ENABLE(mingw32,
+AC_ARG_ENABLE(mingw-prefix,
     [  mingw-prefix=DIR        set the mingw32 directory (standalone windows32 exes)],
     [MINGWPREFIX=$enableval],
     [MINGWPREFIX=no])
index 6c77837edfc22b60236e60f983b190f8212c9857..093ac59b5fb629f5ef452d9ff2cab80ee6e12b6b 100644 (file)
@@ -22,6 +22,7 @@
                                Performer "Performer_group_performer"
                                \consists "Lyric_performer";
                                \consists "Note_performer";
+                               \consists "Silent_performer";
                        }
                }
        }
index 9bc9fcf38fcf8bcfae4b9ac50534930bd7e4a716..96e400baf4b59a42ee441c9d5e5f0324b607f040 100644 (file)
@@ -101,7 +101,8 @@ IImenuetto = \melodic{
 }
 
 \score{
-       \melodic { \IImenuetto }
+       % huh? how to set id_str
+       \melodic{ \id "Melodic" "Cello"; \IImenuetto }
        \paper{
                unitspace= 9.0\mm  ;% to get lily to use only three lines
                geometric= 1.40;
index 926922006b7c79e67653e28843a0e0e8ce016fa4..85229439ead8a14e1148f409509978a1ae2fc295 100644 (file)
@@ -4,4 +4,4 @@ PATCH_LEVEL = 75
 # use to send patches, always empty for released version:
 # include separator: ".postfix", "-pl" makes rpm barf
 
-MY_PATCH_LEVEL = .jcn1
+MY_PATCH_LEVEL = .jcn2
index 8344d3d898f9e4214690c2277e97800b4582c99e..0c14172095a725ad52cd306dbb1661c15ce15763 100644 (file)
@@ -27,6 +27,7 @@ public:
     virtual void prepare(Moment);
     virtual void process() {}
     virtual void finish() {}
+    virtual void start() {}
     
 protected:
     virtual Global_translator *global_l() { return this; }
index 267deb1212eed457d93feccb3ba6ffec24b21e20..0105fc4b35a36e5819220dfc8c00d96253f754dd 100644 (file)
@@ -37,7 +37,7 @@ private:
 //    Rhythmic_req * note_req_l_;
 
 //    Melodic_req* current_l_;
-//    Moment off_mom_;
+    Moment off_mom_;
 //    Moment on_mom_;
 };
 
index 7219de0d6df97e2ebef2a87e01facc15daf2afba..aeba3222fe0fe06bdfb17863fd485ed63b8d14f3 100644 (file)
@@ -36,9 +36,13 @@ public:
     virtual Translator* get_default_interpreter();
 
     Translator * ancestor_l( int l = 1 );
-    int depth_i() const;
+    virtual int depth_i() const;
 
-    void process_requests();
+    virtual Moment get_mom() const;
+
+    virtual void midi_output( Midi_stream* midi_stream_l );
+    virtual void process_requests();
+    virtual void set_track( Midi_def* midi_l, int& track_i_r );
 
 private:
     Pointer_list<Performer*> perf_p_list_;
index 356b0c939b19f76de945e67b4751c71bf91fc7c7..4c6a8e2ec69ed81dbb1985456df786d005d57bf3 100644 (file)
@@ -22,12 +22,18 @@ public:
     Performer();
     virtual ~Performer();
 
+    virtual void midi_output( Midi_stream* midi_stream_l_ );
     void print() const;
     virtual void process_requests();
+
+    virtual void set( Moment mom );
+    virtual void set_track( Midi_def* midi_l, int& track_i_r );
+
     virtual bool try_request( Request* req_l );
 
 protected:
     virtual void do_print() const;
+    virtual Moment get_mom() const;
     virtual void play_event( Midi_item* l );
 };
 
index 980bbaa2e38dea4e12ecbe47a9bf3d19ccddfcdd..8ab61fe2ed6021f7ef60cc5c501a6ca187f002e9 100644 (file)
@@ -23,11 +23,17 @@ protected:
     virtual Translator* ancestor_l( int l );
     virtual int depth_i() const;
 
-    virtual void play_event( Midi_item* l );
+    virtual void finish();
+    virtual Moment get_mom() const;
     virtual void prepare( Moment mom );
     virtual void process();
+    virtual void set_score( Score* score_l );
+    virtual void start();
 
 private:
+    void header();
+
+    Midi_def* midi_l_;
     Midi_stream* midi_stream_p_;
     Moment prev_mom_;
     Moment now_mom_;
diff --git a/lily/include/silent-performer.hh b/lily/include/silent-performer.hh
new file mode 100644 (file)
index 0000000..b8d5d1a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+  silent-performer.hh -- declare Silent_performer
+
+  (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+                 Jan Nieuwenhuizen <jan@digicash.com>
+ */
+
+#ifndef SILENT_PERFORMER_HH
+#define SILENT_PERFORMER_HH
+
+#include "performer.hh"
+
+/**
+*/
+
+class Silent_performer : public Performer {
+public:
+    NAME_MEMBERS();
+
+    Silent_performer();
+    ~Silent_performer();
+
+    virtual bool try_request( Request *req_l ) ;
+};
+
+#endif // SILENT_PERFORMER_HH
index cf1eb20188961a65ef9e0b0599adb9385b27c8ff..32f6572f3485a6da7db0e525efd7b4a18869d721 100644 (file)
@@ -21,10 +21,17 @@ public:
     String instrument_str();
 
 protected:
+    virtual void midi_output( Midi_stream* midi_stream_l_ );
     virtual void play_event( Midi_item* l );
+    virtual void set_track( Midi_def* midi_l, int& track_i_r );
 
 private:
-    int midi_track_i_;
+    void header();
+
+    Midi_def* midi_l_;
+    Moment midi_mom_;
+    int track_i_;
+    Midi_track* midi_track_p_;
 };
 
 #endif // STAFF_PERFORMER_HH
index 1a880fa58c56d0a35154ed329f18d57031429df1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,118 +0,0 @@
-/*
-  midioutput.cc -- implement Midi_output
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>, Jan Nieuwenhuizen <jan@digicash.com> 
-*/
-
-#if 0
-#include "time.h"
-#include "main.hh"
-#include "source.hh"
-#include "proto.hh"
-#include "plist.hh"
-#include "string.hh"
-#include "string-convert.hh"
-#include "debug.hh"
-#include "score.hh"
-#include "main.hh"
-#include "midi-stream.hh"
-#include "midi-def.hh"
-#include "midi-output.hh"
-#include "midi-walker.hh"
-#include "midi-item.hh"
-#include "staff-column.hh"
-#include "musical-request.hh"
-#include "p-score.hh"
-
-Midi_output::Midi_output(Score* score_l, Midi_def* midi_l )
-{
-    midi_l_ = midi_l;
-    score_l_ = score_l;
-
-    Midi_stream midi_stream(midi_l->outfile_str_, 
-        // don-t forget: extra track 0 for tempo/copyright stuff...
-       score_l_->staffs_.size() + 1, 
-       384 );
-    midi_stream_l_ = &midi_stream;
-
-    header();
-    staffs();
-}
-
-void
-Midi_output::do_staff(Staff*st_l,int track_i)
-{
-    Midi_track midi_track( track_i );
-
-    // set track name
-    Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( track_i, 0, '0' ) );
-    midi_track.add( Moment( 0 ), &track_name );
-
-    // set instrument :-)
-    Midi_text instrument_name( Midi_text::INSTRUMENT_NAME, "piano" );
-    midi_track.add( Moment( 0 ), &instrument_name );
-
-    Midi_tempo midi_tempo( midi_l_->get_tempo_i( Moment( 1, 4 ) ) );
-    midi_track.add( Moment( 0 ), &midi_tempo );
-
-    for (Midi_walker w (st_l, &midi_track); w.ok(); w++)
-       w.do_process_requests();
-
-    *midi_stream_l_  << midi_track;
-}  
-
-void
-Midi_output::header()
-{
-    Midi_track midi_track( 0 );
-    
-    time_t t = time( 0 );
-
-    // perhaps multiple text events?
-    String str = String( "Creator: " ) + get_version_str() + "\n";
-
-    Midi_text creator( Midi_text::TEXT, str );
-    midi_track.add( Moment( 0 ), &creator );
-
-    str = "Generated, at ";
-    str += ctime( &t );
-    str = str.left_str( str.length_i() - 1 );
-    str += ",\n";
-    Midi_text generate( Midi_text::TEXT, str );
-    midi_track.add( Moment( 0 ), &generate );
-
-#if 0 // TODO!
-    Source_file* sourcefile_l = source_l_g->sourcefile_l( score_l_->defined_ch_C_ );
-    if ( sourcefile_l ) {
-       str += "from musical definition: " 
-           + sourcefile_l->file_line_no_str(score_l_->defined_ch_C_);
-
-    }
-#endif
-    Midi_text from( Midi_text::TEXT, str );
-    midi_track.add( Moment( 0 ), &from );
-
-    // set track name
-    Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( 0, 0, '0' ) );
-    midi_track.add( Moment( 0 ), &track_name );
-
-    // ugh, to please lily when reparsing mi2mu output.
-    // lily currently barfs when no meter present.
-    /* are you sure? init is to 4/4 HWN */
-    Midi_time midi_time( 4, 4, 18 );
-    midi_track.add( Moment( 0.0 ), &midi_time );
-
-    *midi_stream_l_  << midi_track;
-}
-
-void
-Midi_output::staffs()
-{
-    int track_i = 1;
-    for (iter_top(score_l_->staffs_,i); i.ok(); i++)
-       do_staff(i, track_i++);
-}
-
-#endif
diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc
new file mode 100644 (file)
index 0000000..8cf348d
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+  midi-walker.cc -- implement Midi_walker
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>, Jan Nieuwenhuizen <jan@digicash.com>
+  
+  TODO
+
+  Ideally this should also use a register system, to process slurs,
+  dynamics, etc.
+  
+*/
+
+/* reincluded for code jatting */
+#if 0
+
+#include "command-request.hh"
+#include "musical-request.hh"
+#include "p-score.hh"
+#include "staff.hh"
+#include "midi-walker.hh"
+#include "midi-item.hh"
+#include "midi-stream.hh"
+#include "debug.hh"
+#include "staff-column.hh"
+
+Midi_walker::Midi_walker(Staff *st_l, Midi_track* track_l)
+    : PCursor<Staff_column*>(st_l->cols_)
+{
+    track_l_ = track_l;
+    last_moment_= 0;
+}
+
+/**
+  output notestop events for all notes which end before #max_moment#
+ */
+void
+Midi_walker::do_stop_notes(Moment max_moment)
+{
+    while (stop_notes.size() && stop_notes.front().key <= max_moment) {
+       Note_event  ent=stop_notes.get();
+       if (ent.ignore_b_) 
+           continue;
+       
+       Moment stop_moment = ent.key;
+       Melodic_req * req_l = ent.val;
+       
+       Midi_note note(req_l, track_l_->number_i_, false);
+       output_event(note, stop_moment);
+    }
+}
+/**
+  Find out if start_note event is needed,  and do it if needed.
+ */
+void 
+Midi_walker::do_start_note(Note_req*note_l)
+{
+    Moment stop = note_l->duration() + ptr()->when();
+    for(int i=0; i < stop_notes.size(); i++) {
+       if (stop_notes[i].val->melodic()->pitch() ==
+           note_l->pitch()) {
+           if ( stop_notes[i].key < stop){
+               stop_notes[i].ignore_b_=true;
+           }
+           else
+               return; // skip the stop note 
+       }
+    }
+    Note_event e;
+    e.val = note_l;
+    e.key = stop;
+    
+    stop_notes.insert(e);
+    
+    Midi_note note(note_l, track_l_->number_i_, true);
+    output_event(note, ptr()->when());
+}
+
+
+/** advance the track to #now#, output the item, and adjust current
+  "moment".  */
+void
+Midi_walker::output_event(Midi_item &i, Moment now)
+{
+    Moment delta_t = now - last_moment_ ;
+    last_moment_ += delta_t;
+    track_l_->add(delta_t, &i );    
+}
+
+void
+Midi_walker::process_requests()
+{
+    do_stop_notes(ptr()->when());
+
+    for ( int i = 0; i < ptr()->commandreq_l_arr_.size(); i++ )  {
+       Command_req *c_l = ptr()->commandreq_l_arr_[i]->command();
+       Meter_change_req* meter_l = c_l->meterchange();
+       if ( meter_l )
+           output_event( Midi_time( meter_l->beats_i_, meter_l->one_beat_i_, 18 ),  ptr()->when() );
+       Key_change_req* key_l = c_l->keychange();
+       if ( key_l ) {
+           int sharps_i = key_l->sharps_i();
+           int flats_i = key_l->flats_i();
+           // midi cannot handle non-conventional keys
+           if ( !( flats_i && sharps_i ) )
+               output_event( Midi_key( sharps_i - flats_i, key_l->minor_b() ), ptr()->when() );
+       }
+    }
+
+    for ( int i = 0; i < ptr()->musicalreq_l_arr_.size(); i++ )  {
+       Musical_req *m = ptr()->musicalreq_l_arr_[i]->musical();
+       if (!m)
+           return;
+       Rhythmic_req *n = m->rhythmic();
+       if ( !n)
+           continue;
+       Note_req * note_l = n->note();
+       if (!note_l)
+           continue;
+       do_start_note(note_l);
+    }
+}
+
+Midi_walker::~Midi_walker()
+{
+    do_stop_notes( last_moment_ + Moment(10,1)); // ugh
+}
+
+
+int
+compare(Note_event const&e1, Note_event const&e2)
+{
+    return sign(e1.key - e2.key);
+}
+
+#endif
index 03d53b1f0898706790c51a8f5d6f9e892cfd6c45..1543a56634ddb99ef2e9d0d0ba36a6f29306d14e 100644 (file)
@@ -1,8 +1,7 @@
 /*
   note-performer.cc -- implement Note_performer
 
-  (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-                 Jan Nieuwenhuizen <jan@digicash.com>
+  (c) 1996, 1997 Jan Nieuwenhuizen <jan@digicash.com>
  */
 
 #include "note-performer.hh"
@@ -18,9 +17,8 @@ ADD_THIS_PERFORMER(Note_performer);
 
 Note_performer::Note_performer()
 {
-    // is this what we want? 
-    // or do we need to cache/keep note until it has ended?
     note_req_l_ = 0;
+    off_mom_ = 0;
 }
 
 Note_performer::~Note_performer()
@@ -45,11 +43,23 @@ Note_performer::process_requests()
 //Midi_note( Melodic_req* melreq_l, int channel_i, bool on_bo  )
 
     // this is _really_ braindead, but it generates some output
-    if ( note_req_l_ && note_req_l_->melodic() ) {
-       Midi_note n( note_req_l_->melodic(), 0, true  );
+    if ( !note_req_l_ || !note_req_l_->melodic()  || !note_req_l_->rhythmic() )
+       return;
+
+    // ugh, need to know channel (===track===staff) too
+    int channel_i = 0;
+    Moment mom = get_mom();
+    if ( !off_mom_ ) { // start note
+       off_mom_ = mom + note_req_l_->duration();
+       Midi_note n( note_req_l_->melodic(), channel_i, true );
        play_event( &n );
     }
-    note_req_l_ = 0;
+    else if ( mom == off_mom_ ) {
+       Midi_note n( note_req_l_->melodic(), channel_i, false );
+       play_event( &n );
+       note_req_l_ = 0;
+       off_mom_ = 0;
+    }
 }
 
 bool 
@@ -62,6 +72,7 @@ Note_performer::try_request( Request* req_l )
 //    if (req_l->musical() && (req_l->musical()->note() || req_l->musical()->rest()))
 //     note_req_l_ = req_l->musical()->rhythmic();
     if ( req_l->musical() && req_l->musical()->note() )
+// huh?
        note_req_l_ = req_l->musical()->melodic();
     else
        return false;
index 92e8d4e871f029a83a07e0b910c8faf49c015df9..2c841887298f24c522fb045881f03b47f1851967 100644 (file)
 #include "break.hh"
 #include "p-col.hh"
 
+PScore::PScore(Paper_def*p)
+{
+    paper_l_ = p;
+    super_elem_l_   = new Super_elem;
+    typeset_element(super_elem_l_);
+}
+
+PScore::~PScore()
+{
+    super_elem_l_->unlink_all();
+}
+
 void
 PScore::typeset_element(Score_elem * elem_p)
 {
@@ -129,13 +141,6 @@ PScore::add(PCol *p)
     cols.bottom().add(p);
 }
 
-PScore::PScore(Paper_def*p)
-{
-    paper_l_ = p;
-    super_elem_l_   = new Super_elem;
-    typeset_element(super_elem_l_);
-}
-
 void
 PScore::output(Tex_stream &ts)
 {
@@ -145,11 +150,6 @@ PScore::output(Tex_stream &ts)
 }
 
 
-PScore::~PScore()
-{
-    super_elem_l_->unlink_all();
-}
-
 void
 PScore::OK()const
 {
index 1f09116811fe66173e15ac0fd709c5df0f6e596d..11e768585d718aad3e63800a029a04b27365f00c 100644 (file)
@@ -107,20 +107,42 @@ Performer_group_performer::get_default_interpreter()
        return perf_p->get_default_interpreter();
 }
 
+Moment
+Performer_group_performer::get_mom() const
+{
+    Moment mom = Performer::get_mom();
+
+    for ( int i = 0; i < nongroup_l_arr_.size(); i++ )
+       nongroup_l_arr_[ i ]->set( mom );
+    
+    return mom;
+}
+
 bool
 Performer_group_performer::is_bottom_performer_b() const
 {
     return !itrans_l_->get_default_itrans_l();
 }
 
+void
+Performer_group_performer::midi_output( Midi_stream* midi_stream_l )
+{
+    for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
+       i->midi_output( midi_stream_l );
+}
+
 void
 Performer_group_performer::process_requests()
 {
-    PCursor<Performer*> i( perf_p_list_.top() );
-    while( i.ok() ) {
-       Performer* perf_l = i++; 
-       perf_l->process_requests();
-    }
+    for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
+       i->process_requests();
+}
+
+void
+Performer_group_performer::set_track( Midi_def* midi_l, int& track_i_r )
+{
+    for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
+       i->set_track( midi_l, track_i_r );
 }
 
 bool
@@ -135,3 +157,4 @@ Performer_group_performer::try_request( Request* req_l )
        hebbes_b = daddy_perf_l_->try_request(req_l);
     return hebbes_b ;
 }
+
index 9523fc36cedf4ca892cc3d9cafd6bf969adfe7c7..76b93332533521bb2c1f8ee82c3a0cacfb36f7ab 100644 (file)
@@ -26,6 +26,17 @@ Performer::do_print() const
 {
 }
 
+Moment
+Performer::get_mom() const
+{
+    return daddy_perf_l_->get_mom();
+}
+
+void
+Performer::midi_output( Midi_stream* )
+{
+}
+
 void 
 Performer::play_event( Midi_item* l ) 
 { 
@@ -47,6 +58,16 @@ Performer::process_requests()
 {
 }
 
+void
+Performer::set( Moment )
+{
+} 
+
+void
+Performer::set_track( Midi_def*, int& )
+{
+} 
+
 bool 
 Performer::try_request( Request* req_l )
 {
index 944f44e0cca3c3bbf149636c647390fa104ad8ba..2e3853964609b2f35fb0a7b037405afbbc23f7e0 100644 (file)
@@ -1,16 +1,21 @@
 /*
   score-performer.cc -- implement Score_performer
 
-  (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-                 Jan Nieuwenhuizen <jan@digicash.com>
+  (c) 1996, 1997 Jan Nieuwenhuizen <jan@digicash.com>
  */
 
+#include <time.h>
 #include "score-performer.hh"
 #include "input-translator.hh"
+#include "midi-def.hh"
 #include "midi-item.hh"
 #include "midi-stream.hh"
 #include "string-convert.hh"
 #include "debug.hh"
+#include "main.hh"
+#include "score.hh"
+#include "source-file.hh"
+#include "source.hh"
 
 IMPLEMENT_IS_TYPE_B1(Score_performer,Performer_group_performer);
 IMPLEMENT_STATIC_NAME(Score_performer);
@@ -18,13 +23,8 @@ ADD_THIS_PERFORMER(Score_performer);
 
 Score_performer::Score_performer()
 {
-    // not so much ugh, as [todo]
-    *mlog << "MIDI output to " << "lelie.midi" << " ...\n";    
-    midi_stream_p_ = new Midi_stream( "lelie.midi", 
-        // don-t forget: extra track 0 for tempo/copyright stuff...
-       //score_l_->staffs_.size() + 1, 
-       1, 
-       384 );
+    midi_stream_p_ = 0;
+    midi_l_ = 0;
 }
 
 Score_performer::~Score_performer()
@@ -44,15 +44,68 @@ Score_performer::depth_i() const
     return Global_translator::depth_i();
 }
 
-void 
-Score_performer::play_event( Midi_item* l )
+void
+Score_performer::finish()
+{
+    *mlog << "MIDI output to " << midi_l_->outfile_str_ << " ..." << endl;    
+    *mlog << "tracks: ";
+    header();
+    Performer_group_performer::midi_output( midi_stream_p_ );
+    *mlog << endl;
+}
+
+Moment
+Score_performer::get_mom() const
 {
-//    file_p_->output( l );
-//    cerr << String_convert::bin2hex_str( l->str() );
-    // this should be done at staff level, 
-    // cached per staff probably.
-    // but it generates output...
-    *midi_stream_p_ << *l;
+    return now_mom_;
+}
+
+void
+Score_performer::header()
+{
+    int track_i = 0;
+    Midi_track midi_track( track_i );
+    
+    time_t t = time( 0 );
+
+    // perhaps multiple text events?
+    String str = String( "Creator: " ) + get_version_str() + "\n";
+
+    Midi_text creator( Midi_text::TEXT, str );
+    midi_track.add( Moment( 0 ), &creator );
+
+    str = "Generated, at ";
+    str += ctime( &t );
+    str = str.left_str( str.length_i() - 1 );
+    str += ",\n";
+    Midi_text generate( Midi_text::TEXT, str );
+    midi_track.add( Moment( 0 ), &generate );
+
+    str = "from musical definition: ";
+#if 0    
+    Source_file* sourcefile_l = source_l_g->sourcefile_l( score_l_->defined_ch_C_ );
+    if ( sourcefile_l )
+       str += sourcefile_l->name_str();
+#elif 1
+    str += score_l_->location_str();
+#else
+    str += score_l_->
+#endif
+    Midi_text from( Midi_text::TEXT, str );
+    midi_track.add( Moment( 0 ), &from );
+
+    // set track name
+    Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( 0, 0, '0' ) );
+    midi_track.add( Moment( 0 ), &track_name );
+
+    // ugh, to please lily when reparsing mi2mu output.
+    // lily currently barfs when no meter present.
+    /* are you sure? init is to 4/4 HWN */
+    Midi_time midi_time( 4, 4, 18 );
+    midi_track.add( Moment( 0.0 ), &midi_time );
+
+    *mlog << "[" << track_i << "]";
+    *midi_stream_p_  << midi_track;
 }
 
 void 
@@ -68,3 +121,26 @@ Score_performer::process()
     prev_mom_ = now_mom_;
 }
 
+void
+Score_performer::set_score( Score* score_l )
+{
+    /*
+     why's there no start() when there's a finish()?
+     let's misuse this for start()
+     */
+    Global_translator::set_score( score_l );
+    midi_l_ = score_l->midi_p_;
+}
+
+void
+Score_performer::start()
+{
+    int track_i = 1;
+    Performer_group_performer::set_track( midi_l_, track_i );
+
+    if ( midi_l_->outfile_str_ == "" )
+       midi_l_->outfile_str_ = default_out_fn + ".midi";
+    
+    midi_stream_p_ = new Midi_stream( midi_l_->outfile_str_, track_i, 384 );
+}
+
index 320c752caf55a4c858be1df303ca53410a52824f..15b9b3fcc6570bbafb2412bffe7bf9d23d614fd2 100644 (file)
 
 extern String default_out_fn;
 
+Score::Score()
+{
+    pscore_p_=0;
+    paper_p_ = 0;
+    midi_p_ = 0;
+    errorlevel_i_ = 0;
+}
+
 Score::Score(Score const &s)
 {
     assert(!pscore_p_);
@@ -32,6 +40,14 @@ Score::Score(Score const &s)
     paper_p_ = new Paper_def(*s.paper_p_);
 }
 
+Score::~Score()
+{
+    delete music_p_;
+    delete pscore_p_;
+    delete paper_p_;
+    delete midi_p_;
+}
+
 void
 Score::run_translator(Global_translator * trans_l)
 {
@@ -40,6 +56,7 @@ Score::run_translator(Global_translator * trans_l)
                                                                  trans_l);
     iter->construct_children();
 
+    trans_l->start();
     while ( iter->ok() || trans_l->moments_left_i() ) {
        Moment w = INFTY;
        if (iter->ok() ) {
@@ -55,7 +72,6 @@ Score::run_translator(Global_translator * trans_l)
     trans_l->finish();
 }
 
-
 void
 Score::process()
 {
@@ -66,11 +82,10 @@ Score::process()
 void
 Score::midi()
 {
-    if (!midi_p_)
+    if ( !midi_p_ )
        return;
     
-    *mlog << "\nCreating elements ..." << endl; //flush;
-//    pscore_p_ = new PScore(paper_p_);
+    *mlog << "\nCreating elements ..." << flush;
     
     Global_translator* score_trans=  midi_p_->get_global_translator_p();
     run_translator( score_trans );
@@ -78,15 +93,11 @@ Score::midi()
     
     if( errorlevel_i_){
        // should we? hampers debugging. 
-       warning("Errors found, /*not processing score*/");
+       warning( "Errors found, /*not processing score*/" );
 //     return;
     }
     print();
     *mlog << endl;
-//    pscore_p_->process();
-
-    // output
-    midi_output();
 }
     
 void
@@ -206,22 +217,6 @@ Score::print() const
 #endif
 }
 
-Score::Score()
-{
-    pscore_p_=0;
-    paper_p_ = 0;
-    midi_p_ = 0;
-    errorlevel_i_ = 0;
-}
-
-Score::~Score()
-{
-    delete music_p_;
-    delete pscore_p_;
-    delete paper_p_;
-    delete midi_p_;
-}
-
 void
 Score::paper_output()
 {
diff --git a/lily/silent-performer.cc b/lily/silent-performer.cc
new file mode 100644 (file)
index 0000000..b62f8c7
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+  silent-performer.cc -- implement Silent_performer
+
+  (c) 1996, 1997 Jan Nieuwenhuizen <jan@digicash.com>
+ */
+
+#include "silent-performer.hh"
+#include "translator.hh"
+#include "input-translator.hh"
+#include "command-request.hh"
+#include "musical-request.hh"
+#include "debug.hh"
+
+IMPLEMENT_IS_TYPE_B1(Silent_performer,Performer);
+IMPLEMENT_STATIC_NAME(Silent_performer);
+ADD_THIS_PERFORMER(Silent_performer);
+
+Silent_performer::Silent_performer()
+{
+}
+
+Silent_performer::~Silent_performer()
+{
+}
+
+bool 
+Silent_performer::try_request( Request* req_l )
+{
+    return true;
+#if 0
+    Command_req* com_l = req_l->command();
+    Musical_req* mus_l = req_l->musical();
+
+    if ( com_l ) {
+       if ( com_l->bar() )
+           return true;
+
+       if ( com_l->barcheck() )
+           return true;
+    }
+
+    if ( mus_l ) {
+       if ( mus_l->beam() )
+           return true;
+       
+       if( mus_l->rest() )
+           return true;
+
+       if( mus_l->slur() )
+           return true;
+
+       if ( mus_l->stem() )
+           return true;
+
+       if ( mus_l->tie() )
+           return true;
+    }
+
+    return false;
+#endif
+}
+
index 1609a571e114252aeaf0dcdb6be0b3f662f1d75d..1ffffd7ab08d74cda72219f71775cfd414bc602e 100644 (file)
@@ -1,8 +1,7 @@
 /*
   staff-performer.cc -- implement Staff_performer
 
-  (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-                 Jan Nieuwenhuizen <jan@digicash.com>
+  (c) 1996, 1997 Jan Nieuwenhuizen <jan@digicash.com>
  */
 
 
@@ -10,6 +9,11 @@
 #include "translator.hh"
 #include "input-translator.hh"
 #include "debug.hh"
+#include "midi-def.hh"
+#include "midi-item.hh"
+#include "midi-stream.hh"
+#include "string.hh"
+#include "string-convert.hh"
 
 IMPLEMENT_STATIC_NAME(Staff_performer);
 IMPLEMENT_IS_TYPE_B1(Staff_performer,Performer_group_performer);
@@ -17,10 +21,29 @@ ADD_THIS_PERFORMER(Staff_performer);
 
 Staff_performer::Staff_performer()
 {
+    midi_mom_ = 0;
+    track_i_ = 0;
+    midi_track_p_ = 0;
 }
 
 Staff_performer::~Staff_performer()
 {
+     delete midi_track_p_;
+}
+
+void
+Staff_performer::header()
+{
+    // set track name
+    Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( track_i_, 0, '0' ) );
+    midi_track_p_->add( Moment( 0 ), &track_name );
+
+    // set instrument :-)
+    Midi_text instrument_name( Midi_text::INSTRUMENT_NAME, instrument_str() );
+    midi_track_p_->add( Moment( 0 ), &instrument_name );
+
+    Midi_tempo midi_tempo( midi_l_->get_tempo_i( Moment( 1, 4 ) ) );
+    midi_track_p_->add( Moment( 0 ), &midi_tempo );
 }
 
 String 
@@ -29,10 +52,28 @@ Staff_performer::instrument_str()
     return Translator::id_str_; 
 }
 
+void
+Staff_performer::midi_output( Midi_stream* midi_stream_l )
+{
+    *mlog << "[" << track_i_ << "]";
+    *midi_stream_l << *midi_track_p_;
+}
+
 void 
 Staff_performer::play_event( Midi_item* l )
 {
-//    l.track_i_ = midi_track_i_;
-    Performer::play_event( l );
+    Moment mom = get_mom();
+    Moment delta_t = mom - midi_mom_ ;
+    midi_mom_ += delta_t;
+    midi_track_p_->add( delta_t, l );    
+}
+
+void
+Staff_performer::set_track( Midi_def* midi_l, int& track_i_r ) 
+{ 
+    midi_l_ = midi_l;
+    track_i_ = track_i_r++;
+    midi_track_p_ = new Midi_track( track_i_ );
+    header();
 }
 
index 493b2c76cd4b610c9a9bf22da4e5da07815d80c6..7885afd0d2ba51477ca039d20d3ad90f44df68ae 100644 (file)
@@ -28,8 +28,8 @@
 #endif
 
 // arrays are 20% faster, but we have no Pointer_array yet
-#define MVOICE_LIST  // does this work?
-#define MEVENT_LIST
+#define MEVENT_LIST  // does this work?
+#define MVOICE_LIST
 #define TCOL_LIST
 
 #include "string.hh"
index e7f367a8a1aad5750b60f84acab5a4059b863e21..e0b9a925135684da2e701a9f357f1773898a0357 100644 (file)
@@ -17,9 +17,19 @@ class ostream;
 #include "plist.hh"
 #include "plist.tcc"
 
-//IPL_instantiate(Midi_event);
+#ifdef MEVENT_LIST
+IPL_instantiate(Midi_event);
+#endif
+
 IPL_instantiate(Midi_track);
-// PL_instantiate(Midi_voice);
+
+#ifdef MVOICE_LIST
+PL_instantiate(Midi_voice);
+#endif
+
 IPL_instantiate(Midi_voice);
-//IPL_instantiate(Track_column);
+
+#ifdef TCOL_LIST
+IPL_instantiate(Track_column);
+#endif