jdkmidi class library documentation

Copyright © 2004 J.D. Koftinoff Software, Ltd.

Released under the GNU General Public License (GPL)




Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

jdkmidi::MIDISequencer Class Reference

#include <sequencer.h>

List of all members.

Public Member Functions

 MIDISequencer (MIDIMultiTrack *m, MIDISequencerGUIEventNotifier *n=0)
virtual ~MIDISequencer ()
void ResetTrack (int trk)
void ResetAllTracks ()
MIDIClockTime GetCurrentMIDIClockTime () const
double GetCurrentTimeInMs () const
int GetCurrentBeat () const
int GetCurrentMeasure () const
double GetCurrentTempoScale () const
double GetCurrentTempo () const
MIDISequencerStateGetState ()
const MIDISequencerStateGetState () const
void SetState (MIDISequencerState *)
MIDISequencerTrackStateGetTrackState (int trk)
const MIDISequencerTrackStateGetTrackState (int trk) const
MIDISequencerTrackProcessorGetTrackProcessor (int trk)
const MIDISequencerTrackProcessorGetTrackProcessor (int trk) const
int GetNumTracks () const
bool GetSoloMode () const
void SetCurrentTempoScale (float scale)
void SetSoloMode (bool m, int trk=-1)
void GoToZero ()
bool GoToTime (MIDIClockTime time_clk)
bool GoToTimeMs (float time_ms)
bool GoToMeasure (int measure, int beat=0)
bool GetNextEventTimeMs (float *t)
bool GetNextEventTime (MIDIClockTime *t)
bool GetNextEvent (int *tracknum, MIDITimedBigMessage *msg)
void ScanEventsAtThisTime ()

Protected Attributes

MIDITimedBigMessage beat_marker_msg
bool solo_mode
int tempo_scale
int num_tracks
MIDISequencerTrackProcessortrack_processors [64]
MIDISequencerState state


Constructor & Destructor Documentation

jdkmidi::MIDISequencer::MIDISequencer MIDIMultiTrack m,
MIDISequencerGUIEventNotifier n = 0
 

Definition at line 586 of file jdkmidi_sequencer.cpp.

References num_tracks, and track_processors.

00590     :
00591     solo_mode(false),
00592     tempo_scale(100),
00593     num_tracks( m->GetNumTracks() ),
00594     state( this, m,n ) // TODO: fix this hack
00595   {
00596     
00597     for( int i=0; i<num_tracks; ++i )
00598     {
00599       track_processors[i] = new MIDISequencerTrackProcessor;
00600     }
00601   } 
  

jdkmidi::MIDISequencer::~MIDISequencer  )  [virtual]
 

Definition at line 604 of file jdkmidi_sequencer.cpp.

References num_tracks, and track_processors.

00605   {
00606     for(int i=0; i<num_tracks; ++i )
00607     {
00608       delete track_processors[i];
00609     }
00610   } 


Member Function Documentation

int jdkmidi::MIDISequencer::GetCurrentBeat  )  const
 

Definition at line 652 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_beat, and state.

00653   {
00654     return state.cur_beat;
00655   } 

int jdkmidi::MIDISequencer::GetCurrentMeasure  )  const
 

Definition at line 658 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_measure, and state.

00659   {
00660     return state.cur_measure;
00661   } 

MIDIClockTime jdkmidi::MIDISequencer::GetCurrentMIDIClockTime  )  const
 

Definition at line 642 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDIClockTime, and state.

00643   {
00644     return state.cur_clock;
00645   } 

double jdkmidi::MIDISequencer::GetCurrentTempo  )  const
 

Definition at line 668 of file jdkmidi_sequencer.cpp.

References state, jdkmidi::MIDISequencerTrackState::tempobpm, and jdkmidi::MIDISequencerState::track_state.

00669   {
00670     return state.track_state[0]->tempobpm;
00671   } 

double jdkmidi::MIDISequencer::GetCurrentTempoScale  )  const
 

Definition at line 663 of file jdkmidi_sequencer.cpp.

References tempo_scale.

00664   {
00665     return ((double)tempo_scale)*0.01;
00666   } 

double jdkmidi::MIDISequencer::GetCurrentTimeInMs  )  const
 

Definition at line 647 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_time_ms, and state.

00648   {
00649     return state.cur_time_ms;
00650   } 

bool jdkmidi::MIDISequencer::GetNextEvent int *  tracknum,
MIDITimedBigMessage msg
 

Definition at line 1016 of file jdkmidi_sequencer.cpp.

References beat_marker_msg, jdkmidi::MIDISequencerState::cur_beat, jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_measure, jdkmidi::MIDISequencerState::cur_time_ms, jdkmidi::MIDIMultiTrack::GetClksPerBeat(), jdkmidi::MIDIMultiTrackIterator::GetCurEvent(), jdkmidi::MIDIMultiTrackIterator::GetCurEventTime(), GetNextEventTime(), GetNextEventTimeMs(), jdkmidi::MIDIMultiTrackIterator::GoToNextEvent(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDIClockTime, jdkmidi::MIDISequencerState::multitrack, jdkmidi::MIDISequencerState::next_beat_time, jdkmidi::MIDISequencerState::notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), jdkmidi::MIDISequencerTrackProcessor::Process(), jdkmidi::MIDISequencerTrackState::Process(), jdkmidi::MIDIMessage::SetBeatMarker(), jdkmidi::MIDIMessage::SetNoOp(), jdkmidi::MIDITimedBigMessage::SetTime(), jdkmidi::MIDISequencerTrackProcessor::solo, solo_mode, state, jdkmidi::MIDISequencerTrackState::timesig_denominator, jdkmidi::MIDISequencerTrackState::timesig_numerator, track_processors, and jdkmidi::MIDISequencerState::track_state.

01017   {
01018     MIDIClockTime t;
01019     
01020     
01021     // ask the iterator for the current event time
01022     if( state.iterator.GetCurEventTime(&t) )
01023     {
01024       // move current time forward one event
01025       
01026       MIDIClockTime new_clock;
01027       float new_time_ms;
01028       
01029       GetNextEventTime( &new_clock );
01030       GetNextEventTimeMs( &new_time_ms );
01031       
01032       // must set cur_clock AFTER GetnextEventTimeMs() is called
01033       // since GetNextEventTimeMs() uses cur_clock to calculate
01034       
01035       state.cur_clock = new_clock;
01036       state.cur_time_ms = new_time_ms;
01037       
01038       
01039       // is the next beat marker before this event?
01040       
01041       if( state.next_beat_time<=t )
01042       {
01043         // yes, this is a beat event now.
01044         
01045         // say this event came on track 0, the conductor track
01046         *tracknum = 0;
01047         
01048         // put current info into beat marker message
01049         beat_marker_msg.SetBeatMarker();
01050         beat_marker_msg.SetTime( state.next_beat_time );
01051         *msg = beat_marker_msg;
01052         
01053         // update our beat count
01054         
01055         int new_beat = state.cur_beat+1;
01056         int new_measure = state.cur_measure;
01057         
01058         // do we need to update the measure number?
01059         
01060         if( new_beat>=state.track_state[0]->timesig_numerator )
01061         {
01062           // yup
01063           
01064           new_beat=0;
01065           ++new_measure;
01066         }
01067         
01068         // update our next beat time
01069         
01070         
01071         // denom=4  (16) ---> 4/16 midi file beats per symbolic beat
01072         // denom=3  (8)  ---> 4/8 midi file beats per symbolic beat
01073         // denom=2  (4)  ---> 4/4 midi file beat per symbolic beat
01074         // denom=1  (2)  ---> 4/2 midi file beats per symbolic beat
01075         // denom=0  (1)  ---> 4/1 midi file beats per symbolic beat
01076         
01077         state.next_beat_time +=
01078           state.multitrack->GetClksPerBeat()
01079           * 4 / (state.track_state[0]->timesig_denominator);
01080         
01081         state.cur_beat = new_beat;
01082         state.cur_measure = new_measure;
01083         
01084         // now notify the GUI that the beat number changed
01085         state.notifier->Notify(
01086           this,
01087           MIDISequencerGUIEvent(
01088             MIDISequencerGUIEvent::GROUP_TRANSPORT,
01089             0,
01090             MIDISequencerGUIEvent::GROUP_TRANSPORT_BEAT
01091             )
01092           );
01093         
01094         // if the new beat number is 0 then the measure changed too
01095         if( state.cur_beat==0 )
01096         {
01097           state.notifier->Notify(
01098             this,
01099             MIDISequencerGUIEvent(
01100               MIDISequencerGUIEvent::GROUP_TRANSPORT,
01101               0,
01102               MIDISequencerGUIEvent::GROUP_TRANSPORT_MEASURE
01103               )
01104             );
01105         }
01106         
01107         // give the beat marker event to the conductor track to process
01108         state.track_state[*tracknum]->Process(msg);
01109         
01110         
01111         return true;
01112       }
01113       else  // this event comes before the next beat
01114       {
01115         MIDITimedBigMessage *msg_ptr;
01116         
01117         if( state.iterator.GetCurEvent( tracknum, &msg_ptr ) )
01118         {
01119           int trk=*tracknum;
01120           
01121           // copy the event so Process can modify it
01122           
01123           *msg = *msg_ptr;
01124           
01125           bool allow_msg=true;
01126           
01127           // are we in solo mode?
01128           
01129           if( solo_mode )
01130           {
01131             // yes, only allow this message thru if
01132             // the track is either track 0
01133             // or it is explicitly solod.
01134             
01135             if( trk==0 || track_processors[trk]->solo )
01136             {
01137               allow_msg=true;
01138             }
01139             else
01140             {
01141               allow_msg=false;
01142             }
01143             
01144           }
01145           
01146           
01147           if( !(allow_msg
01148                 && track_processors[trk]->Process(msg)
01149                 && state.track_state[trk]->Process(msg))
01150             )
01151           {
01152             // the message is not allowed to come out!
01153             // erase it
01154             msg->SetNoOp();
01155           }
01156           
01157           // go to the next event on the multitrack
01158           state.iterator.GoToNextEvent();
01159           
01160           return true;
01161           
01162         }
01163       }
01164     }
01165     
01166     return false;
01167   } 

bool jdkmidi::MIDISequencer::GetNextEventTime MIDIClockTime t  ) 
 

Definition at line 995 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDIMultiTrackIterator::GetCurEventTime(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDIClockTime, jdkmidi::MIDISequencerState::next_beat_time, and state.

00996   {
00997     // ask the iterator for the current event time
00998     bool f = state.iterator.GetCurEventTime(t);
00999     
01000     if( f )
01001     {
01002       // if we have an event in the future, check to see if it is
01003       // further in time than the next beat marker
01004       
01005       if( (*t) >= state.next_beat_time )
01006       {
01007         // ok, the next event is a beat - return the next beat time
01008         
01009         *t = state.next_beat_time;
01010       }
01011     }
01012     
01013     return f;
01014   } 

bool jdkmidi::MIDISequencer::GetNextEventTimeMs float *  t  ) 
 

Definition at line 957 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_time_ms, jdkmidi::MIDIMultiTrack::GetClksPerBeat(), GetNextEventTime(), jdkmidi::MIDIClockTime, jdkmidi::MIDISequencerState::multitrack, state, tempo_scale, jdkmidi::MIDISequencerTrackState::tempobpm, and jdkmidi::MIDISequencerState::track_state.

00958   {
00959     MIDIClockTime ct;
00960     bool f = GetNextEventTime( &ct );
00961     
00962     if( f )
00963     {
00964       // calculate delta time from last event time
00965       
00966       double delta_clocks = (double)(ct - state.cur_clock);
00967       
00968       // calculate tempo in milliseconds per clock
00969       
00970       double clocks_per_sec = ((state.track_state[0]->tempobpm *
00971                                 (((double)tempo_scale)*0.01)
00972                                 * (1.0f/60.0f)) * state.multitrack->GetClksPerBeat());
00973       
00974       if( clocks_per_sec>0 )
00975       {
00976         float ms_per_clock = 1000.0f /clocks_per_sec;
00977         
00978         // calculate delta time in milliseconds
00979         
00980         float delta_ms = float(delta_clocks * ms_per_clock);
00981         
00982         // return it added with the current time in ms.
00983         
00984         *t = delta_ms + state.cur_time_ms;
00985       }
00986       else
00987       {
00988         f=false;
00989       }
00990     }
00991     
00992     return f;
00993   } 

int jdkmidi::MIDISequencer::GetNumTracks  )  const [inline]
 

Definition at line 305 of file sequencer.h.

References jdkmidi::MIDISequencerState::num_tracks, and state.

00305 {   return state.num_tracks;  }

bool jdkmidi::MIDISequencer::GetSoloMode  )  const
 

Definition at line 693 of file jdkmidi_sequencer.cpp.

References solo_mode.

00694   {
00695     return solo_mode;
00696   } 

const MIDISequencerState * jdkmidi::MIDISequencer::GetState  )  const
 

Definition at line 632 of file jdkmidi_sequencer.cpp.

References state.

00633   {
00634     return &state;
00635   }

MIDISequencerState * jdkmidi::MIDISequencer::GetState  ) 
 

Definition at line 627 of file jdkmidi_sequencer.cpp.

References state.

00628   {
00629     return &state;
00630   }

const MIDISequencerTrackProcessor * jdkmidi::MIDISequencer::GetTrackProcessor int  trk  )  const
 

Definition at line 688 of file jdkmidi_sequencer.cpp.

References track_processors.

00689   {
00690     return track_processors[ trk ];
00691   } 

MIDISequencerTrackProcessor * jdkmidi::MIDISequencer::GetTrackProcessor int  trk  ) 
 

Definition at line 683 of file jdkmidi_sequencer.cpp.

References track_processors.

00684   {
00685     return track_processors[trk];
00686   } 

const MIDISequencerTrackState * jdkmidi::MIDISequencer::GetTrackState int  trk  )  const
 

Definition at line 678 of file jdkmidi_sequencer.cpp.

References state, and jdkmidi::MIDISequencerState::track_state.

00679   {
00680     return state.track_state[ trk ];
00681   } 

MIDISequencerTrackState * jdkmidi::MIDISequencer::GetTrackState int  trk  ) 
 

Definition at line 673 of file jdkmidi_sequencer.cpp.

References state, and jdkmidi::MIDISequencerState::track_state.

00674   {
00675     return state.track_state[trk];
00676   } 

bool jdkmidi::MIDISequencer::GoToMeasure int  measure,
int  beat = 0
 

Definition at line 880 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_beat, jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_measure, jdkmidi::MIDISequencerState::cur_time_ms, jdkmidi::MIDIMultiTrack::GetClksPerBeat(), jdkmidi::MIDISequencerGUIEventNotifier::GetEnable(), GetNextEvent(), GetNextEventTime(), jdkmidi::MIDIMultiTrackIterator::GoToTime(), jdkmidi::MIDISequencerTrackState::GoToZero(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDIClockTime, jdkmidi::MIDISequencerState::multitrack, jdkmidi::MIDISequencerState::next_beat_time, jdkmidi::MIDISequencerState::notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), jdkmidi::MIDISequencerState::num_tracks, ScanEventsAtThisTime(), jdkmidi::MIDISequencerGUIEventNotifier::SetEnable(), state, jdkmidi::MIDISequencerTrackState::timesig_denominator, and jdkmidi::MIDISequencerState::track_state.

00881   {
00882     // temporarily disable the gui notifier
00883     
00884     bool notifier_mode=false;
00885     if( state.notifier )
00886     {
00887       notifier_mode = state.notifier->GetEnable();
00888       state.notifier->SetEnable(false);
00889     }
00890     
00891     if( measure < state.cur_measure || measure==0 )
00892     {
00893       for( int i=0; i<state.num_tracks; ++i )
00894       {
00895         state.track_state[i]->GoToZero();
00896       }
00897       
00898       state.iterator.GoToTime( 0 );
00899       
00900       state.cur_time_ms = 0.0;
00901       state.cur_clock = 0;
00902       state.cur_beat = 0;
00903       state.cur_measure = 0;
00904 //    state.next_beat_time = state.multitrack->GetClksPerBeat();
00905       state.next_beat_time =
00906         state.multitrack->GetClksPerBeat()
00907         * 4 / (state.track_state[0]->timesig_denominator);
00908       
00909     }
00910     
00911     MIDIClockTime t=0;
00912     int trk;
00913     MIDITimedBigMessage ev;
00914     
00915     // iterate thru all the events until cur-measure and cur_beat are
00916     // where we want them.
00917     
00918     while(
00919       GetNextEventTime( &t )
00920       && GetNextEvent(&trk,&ev)
00921       && state.cur_measure<=measure
00922       )
00923     {
00924       if( state.cur_measure==measure && state.cur_beat>=beat )
00925       {
00926         break;
00927       }
00928     }
00929     
00930     
00931     // examine all the events at this specific time
00932     // and update the track states to reflect this time
00933     
00934     
00935     ScanEventsAtThisTime();
00936     
00937     
00938     
00939     // re-enable the gui notifier if it was enabled previously
00940     if( state.notifier )
00941     {
00942       state.notifier->SetEnable( notifier_mode );
00943       
00944       // cause a full gui refresh now
00945       
00946       state.notifier->Notify( this, MIDISequencerGUIEvent::GROUP_ALL );
00947     }
00948     
00949     // return true if we actually found the measure requested
00950     
00951     return state.cur_measure == measure && state.cur_beat == beat;
00952     
00953   } 

bool jdkmidi::MIDISequencer::GoToTime MIDIClockTime  time_clk  ) 
 

Definition at line 747 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_beat, jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_measure, jdkmidi::MIDISequencerState::cur_time_ms, jdkmidi::MIDIMultiTrack::GetClksPerBeat(), jdkmidi::MIDISequencerGUIEventNotifier::GetEnable(), GetNextEvent(), GetNextEventTime(), jdkmidi::MIDIMultiTrackIterator::GoToTime(), jdkmidi::MIDISequencerTrackState::GoToZero(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDIClockTime, jdkmidi::MIDISequencerState::multitrack, jdkmidi::MIDISequencerState::next_beat_time, jdkmidi::MIDISequencerState::notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), jdkmidi::MIDISequencerState::num_tracks, ScanEventsAtThisTime(), jdkmidi::MIDISequencerGUIEventNotifier::SetEnable(), state, jdkmidi::MIDISequencerTrackState::timesig_denominator, and jdkmidi::MIDISequencerState::track_state.

00748   {
00749     // temporarily disable the gui notifier
00750     
00751     bool notifier_mode=false;
00752     if( state.notifier )
00753     {
00754       notifier_mode = state.notifier->GetEnable();
00755       state.notifier->SetEnable(false);
00756     }
00757     
00758     if( time_clk < state.cur_clock || time_clk==0 )
00759     {
00760       // start from zero if desired time is before where we are
00761       for( int i=0; i<state.num_tracks; ++i )
00762       {
00763         state.track_state[i]->GoToZero();
00764       }
00765       
00766       state.iterator.GoToTime( 0 );
00767       
00768       state.cur_time_ms = 0.0;
00769       state.cur_clock = 0;
00770 //    state.next_beat_time = state.multitrack->GetClksPerBeat();
00771       state.next_beat_time =
00772         state.multitrack->GetClksPerBeat()
00773         * 4 / (state.track_state[0]->timesig_denominator);
00774       
00775       state.cur_beat = 0;
00776       state.cur_measure = 0;
00777       
00778     }
00779     
00780     MIDIClockTime t=0;
00781     int trk;
00782     MIDITimedBigMessage ev;
00783     
00784     while(
00785       GetNextEventTime( &t )
00786       && t<time_clk
00787       && GetNextEvent(&trk,&ev)
00788       )
00789     {
00790       ;
00791     }
00792     
00793     
00794     // examine all the events at this specific time
00795     // and update the track states to reflect this time
00796     
00797     ScanEventsAtThisTime();
00798     
00799     // re-enable the gui notifier if it was enabled previously
00800     if( state.notifier )
00801     {
00802       state.notifier->SetEnable( notifier_mode );
00803       
00804       // cause a full gui refresh now
00805       
00806       state.notifier->Notify( this, MIDISequencerGUIEvent::GROUP_ALL );
00807     }
00808     
00809     
00810     
00811     return true;
00812     
00813   } 

bool jdkmidi::MIDISequencer::GoToTimeMs float  time_ms  ) 
 

Definition at line 815 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_beat, jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_measure, jdkmidi::MIDISequencerState::cur_time_ms, jdkmidi::MIDIMultiTrack::GetClksPerBeat(), jdkmidi::MIDISequencerGUIEventNotifier::GetEnable(), GetNextEvent(), GetNextEventTimeMs(), jdkmidi::MIDIMultiTrackIterator::GoToTime(), jdkmidi::MIDISequencerTrackState::GoToZero(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDISequencerState::multitrack, jdkmidi::MIDISequencerState::next_beat_time, jdkmidi::MIDISequencerState::notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), jdkmidi::MIDISequencerState::num_tracks, jdkmidi::MIDISequencerGUIEventNotifier::SetEnable(), state, jdkmidi::MIDISequencerTrackState::timesig_denominator, and jdkmidi::MIDISequencerState::track_state.

00816   {
00817     // temporarily disable the gui notifier
00818     
00819     bool notifier_mode=false;
00820     if( state.notifier )
00821     {
00822       notifier_mode = state.notifier->GetEnable();
00823       state.notifier->SetEnable(false);
00824     }
00825     
00826     if( time_ms < state.cur_time_ms || time_ms==0.0 )
00827     {
00828       // start from zero if desired time is before where we are
00829       for( int i=0; i<state.num_tracks; ++i )
00830       {
00831         state.track_state[i]->GoToZero();
00832       }
00833       
00834       state.iterator.GoToTime( 0 );
00835       
00836       state.cur_time_ms = 0.0;
00837       state.cur_clock = 0;
00838 //    state.next_beat_time = state.multitrack->GetClksPerBeat();
00839       state.next_beat_time =
00840         state.multitrack->GetClksPerBeat()
00841         * 4 / (state.track_state[0]->timesig_denominator);
00842       
00843       state.cur_beat = 0;
00844       state.cur_measure = 0;
00845     }
00846     
00847     float t=0;
00848     int trk;
00849     MIDITimedBigMessage ev;
00850     
00851     while(
00852       GetNextEventTimeMs( &t )
00853       && t<time_ms
00854       && GetNextEvent(&trk,&ev)
00855       )
00856     {
00857       ;
00858     }
00859     
00860     // examine all the events at this specific time
00861     // and update the track states to reflect this time
00862     
00863 //  ScanEventsAtThisTime();
00864     
00865     // re-enable the gui notifier if it was enabled previously
00866     if( state.notifier )
00867     {
00868       state.notifier->SetEnable( notifier_mode );
00869       
00870       // cause a full gui refresh now
00871       
00872       state.notifier->Notify( this, MIDISequencerGUIEvent::GROUP_ALL );
00873     }
00874     
00875     
00876     return true;
00877     
00878   } 

void jdkmidi::MIDISequencer::GoToZero  ) 
 

Definition at line 722 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_time_ms, jdkmidi::MIDIMultiTrack::GetClksPerBeat(), jdkmidi::MIDIMultiTrackIterator::GoToTime(), jdkmidi::MIDISequencerTrackState::GoToZero(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDISequencerState::multitrack, jdkmidi::MIDISequencerState::next_beat_time, num_tracks, ScanEventsAtThisTime(), state, jdkmidi::MIDISequencerTrackState::timesig_denominator, and jdkmidi::MIDISequencerState::track_state.

00723   {
00724     // go to time zero
00725     
00726     for( int i=0; i<num_tracks; ++i )
00727     {
00728       state.track_state[i]->GoToZero();
00729     }
00730     
00731     state.iterator.GoToTime( 0 );
00732     
00733     state.cur_time_ms = 0.0;
00734     state.cur_clock = 0;
00735     
00736 //  state.next_beat_time = state.multitrack->GetClksPerBeat();
00737     state.next_beat_time =
00738       state.multitrack->GetClksPerBeat()
00739       * 4 / (state.track_state[0]->timesig_denominator);
00740     
00741     // examine all the events at this specific time
00742     // and update the track states to reflect this time
00743     
00744     ScanEventsAtThisTime();
00745   } 

void jdkmidi::MIDISequencer::ResetAllTracks  ) 
 

Definition at line 618 of file jdkmidi_sequencer.cpp.

References num_tracks, jdkmidi::MIDISequencerTrackProcessor::Reset(), jdkmidi::MIDISequencerTrackState::Reset(), state, track_processors, and jdkmidi::MIDISequencerState::track_state.

00619   {
00620     for( int i=0; i<num_tracks; ++i )
00621     {
00622       state.track_state[i]->Reset();
00623       track_processors[i]->Reset();
00624     }
00625   }

void jdkmidi::MIDISequencer::ResetTrack int  trk  ) 
 

Definition at line 612 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerTrackProcessor::Reset(), jdkmidi::MIDISequencerTrackState::Reset(), state, track_processors, and jdkmidi::MIDISequencerState::track_state.

00613   {
00614     state.track_state[trk]->Reset();
00615     track_processors[trk]->Reset();
00616   }

void jdkmidi::MIDISequencer::ScanEventsAtThisTime  ) 
 

Definition at line 1169 of file jdkmidi_sequencer.cpp.

References jdkmidi::MIDISequencerState::cur_beat, jdkmidi::MIDISequencerState::cur_clock, jdkmidi::MIDISequencerState::cur_measure, jdkmidi::MIDISequencerState::cur_time_ms, GetNextEvent(), GetNextEventTime(), jdkmidi::MIDIMultiTrackIterator::GetState(), jdkmidi::MIDISequencerState::iterator, jdkmidi::MIDIClockTime, jdkmidi::MIDIMultiTrackIterator::SetState(), and state.

01170   {
01171     // save the current iterator state
01172     
01173     MIDIMultiTrackIteratorState istate( state.iterator.GetState() );
01174     int prev_measure = state.cur_measure;
01175     int prev_beat = state.cur_beat;
01176     
01177     
01178     // process all messages up to and including this time only
01179     
01180     MIDIClockTime orig_clock = state.cur_clock;
01181     double orig_time_ms = state.cur_time_ms;
01182     
01183     
01184     MIDIClockTime t=0;
01185     int trk;
01186     MIDITimedBigMessage ev;
01187     
01188     while(
01189       GetNextEventTime( &t )
01190       && t==orig_clock
01191       && GetNextEvent(&trk,&ev)
01192       )
01193     {
01194       ;
01195     }
01196     
01197     // restore the iterator state
01198     state.iterator.SetState( istate );
01199     
01200     // and current time
01201     state.cur_clock = orig_clock;
01202     state.cur_time_ms = float(orig_time_ms);
01203     
01204     state.cur_measure=prev_measure;
01205     state.cur_beat = prev_beat;
01206     
01207   } 

void jdkmidi::MIDISequencer::SetCurrentTempoScale float  scale  ) 
 

Definition at line 698 of file jdkmidi_sequencer.cpp.

References tempo_scale.

00699   {
00700     tempo_scale = (int)(scale*100);
00701   } 

void jdkmidi::MIDISequencer::SetSoloMode bool  m,
int  trk = -1
 

Definition at line 703 of file jdkmidi_sequencer.cpp.

References num_tracks, jdkmidi::MIDISequencerTrackProcessor::solo, solo_mode, and track_processors.

00704   {
00705     int i;
00706     solo_mode = m;
00707     
00708     for( i=0; i<num_tracks; ++i )
00709     {
00710       if( i==trk )
00711       {
00712         track_processors[i]->solo = true;
00713       }
00714       else
00715       {
00716         track_processors[i]->solo = false;
00717       }
00718     }
00719     
00720   } 

void jdkmidi::MIDISequencer::SetState MIDISequencerState  ) 
 

Definition at line 637 of file jdkmidi_sequencer.cpp.

References state.

00638   {
00639     state = *s;
00640   }


Member Data Documentation

MIDITimedBigMessage jdkmidi::MIDISequencer::beat_marker_msg [protected]
 

Definition at line 325 of file sequencer.h.

int jdkmidi::MIDISequencer::num_tracks [protected]
 

Definition at line 330 of file sequencer.h.

bool jdkmidi::MIDISequencer::solo_mode [protected]
 

Definition at line 327 of file sequencer.h.

MIDISequencerState jdkmidi::MIDISequencer::state [protected]
 

Definition at line 333 of file sequencer.h.

int jdkmidi::MIDISequencer::tempo_scale [protected]
 

Definition at line 328 of file sequencer.h.

MIDISequencerTrackProcessor* jdkmidi::MIDISequencer::track_processors[64] [protected]
 

Definition at line 331 of file sequencer.h.


The documentation for this class was generated from the following files: