]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/midi-walker.hh
release: 0.0.72pre
[lilypond.git] / lily / include / midi-walker.hh
index dea2478d24006fe5d38b9570c995d35bdd837dda..d99b6efe67c9ad3b365d855a2be506468db296c9 100644 (file)
 
 #if 0
 
-// sketch. . .
-class Midi_register {
-};
-
-class Midi_group_reg : public Midi_register, public Acceptor {
+/* 
+   sketch. . .
+
+   It would be totally cool to share code with the Engraver hierarchy,
+   but this is very tough i think.
+   
+   */
+class Performer {
+    Performer_group_performer * daddy_perf_l_;
     
+    virtual bool try_request(Request*r)
+    {
+       return daddy_perf_l_->try_request(r);
+    }
+    virtual void play_event( Midi_item i ) { daddy_perf_l_->play_event (i ); }
 };
 
-class Midi_staff_reg : public Midi_group_reg {
-};
-
-
-class Midi_note_reg : public Midi_register {
+class Performer_group_performer : public Performer, public Translator {
+    Pointer_list<Performer*> perf_p_list_;
     
-};
-
-class Midi_voice_reg : public Midi_group_reg, public Interpreter {
+    Link_array<Performer_group_performer> group_l_arr_;
+    Link_array<Performer> nongroup_l_arr_;
+    
+    bool try_request(Request*r)
+    {
+        bool hebbes_b =false;
+        for (int i =0; !hebbes_b && i < nongroup_l_arr_.size() ; i++)
+            hebbes_b =nongroup_l_arr_[i]->try_request(req_l);
+        if (!hebbes_b)
+            hebbes_b = daddy_grav_l_->try_request(req_l);
+        return hebbes_b ;
+    }
     
 };
 
-class Midi_score_reg: public Midi_group_reg, public Global_acceptor {
+class Staff_performer : public Performer_group_performer 
+{
+    int midi_track_i_;
+    String instrument_str() { 
+       return Translator::id_str_; 
+    }
+    virtual void play_event ( Midi_item i)
+    {
+       i.track_i_ = midi_track_i_;
+       Performer::play_event(i);
+    }
 };
 
+class Voice_performer_group_performer : public Performer_group_performer {
 
-#include "grouping.hh"
-#include "staff-walker.hh"
-#include "pcursor.hh"
-#include "pqueue.hh"
-
-
-struct Note_event : PQueue_ent<Moment,Melodic_req*>
-{
-    bool ignore_b_;
-    Note_event() { 
-       ignore_b_ = false;
-    }
 };
 
-int compare(Note_event const&, Note_event const&);
+class Note_performer : public Performer {
+    Melodic_req * current_l_;
+    Moment switch_off_at_,switch_on_at_;
 
-/**
-  a simple walker which collects midi stuff, and then outputs.
 
-  Should derive from Staff_walker
-  */
-class Midi_walker : public PCursor<Staff_column*> 
+    virtual void process_request() {
+       if (when() == switch_off_at_ )
+           play_event( Note_event(current_l_->pitch()  ))
+};
+
+class Voice_performer : 
+       public Performer_group_performer, public Interpreter 
 {
-    Midi_track *track_l_;
     
-    PQueue< Note_event > stop_notes;
-
-    Moment last_moment_;
+};
 
-    /* *************** */
-    void do_stop_notes(Moment);
-    void do_start_note(Note_req *note_l);
-    void output_event(Midi_item&, Moment);
-public:
-    
-    Midi_walker(Staff*, Midi_track*);
-    void do_process_requests();
-    ~Midi_walker();
+class Score_performer: 
+    public Performer_group_performer, public Global_translator 
+{
+    Midi_file * file_p_;
+    Moment prev_;
+    virtual void play_event(Midi_item i)
+    {
+       file_p_->output (i);
+    }
+    virtual void prepare(Moment m){
+       file_p_->move ( m -prev_ );
+    }
 };
+
 #endif
 
 #endif // MIDIWALKER_HH