#include <manager.h>
Inheritance diagram for jdkmidi::MIDIManager:
Public Member Functions | |
MIDIManager (MIDIDriver *drv, MIDISequencerGUIEventNotifier *n=0, MIDISequencer *seq_=0) | |
virtual | ~MIDIManager () |
void | Reset () |
void | SetSeq (MIDISequencer *seq) |
MIDISequencer * | GetSeq () |
const MIDISequencer * | GetSeq () const |
MIDIDriver * | GetDriver () |
void | SetTimeOffset (unsigned long off) |
unsigned long | GetTimeOffset () |
void | SetSeqOffset (unsigned long seqoff) |
unsigned long | GetSeqOffset () |
void | SeqPlay () |
void | SeqStop () |
void | SetRepeatPlay (bool flag, unsigned long start_measure, unsigned long end_measure) |
bool | IsSeqPlay () const |
bool | IsSeqStop () const |
bool | IsSeqRepeat () const |
virtual void | TimeTick (unsigned long sys_time) |
Protected Member Functions | |
virtual void | TimeTickPlayMode (unsigned long sys_time_) |
virtual void | TimeTickStopMode (unsigned long sys_time_) |
Protected Attributes | |
MIDIDriver * | driver |
MIDISequencer * | sequencer |
unsigned long | sys_time_offset |
unsigned long | seq_time_offset |
volatile bool | play_mode |
volatile bool | stop_mode |
MIDISequencerGUIEventNotifier * | notifier |
volatile bool | repeat_play_mode |
long | repeat_start_measure |
long | repeat_end_measure |
|
Definition at line 31 of file jdkmidi_manager.cpp. References driver, and jdkmidi::MIDIDriver::SetTickProc().
00036 : 00037 driver(drv), 00038 sequencer(seq_), 00039 sys_time_offset(0), 00040 seq_time_offset(0), 00041 play_mode(false), 00042 stop_mode(true), 00043 notifier( n ), 00044 repeat_play_mode(false), 00045 repeat_start_measure(0), 00046 repeat_end_measure(0) 00047 { 00048 driver->SetTickProc( this ); 00049 } |
|
Definition at line 51 of file jdkmidi_manager.cpp.
00052 { 00053 } |
|
Definition at line 54 of file manager.h. References driver.
00055 { 00056 return driver; 00057 } |
|
Definition at line 88 of file jdkmidi_manager.cpp. References sequencer.
00089 { 00090 return sequencer; 00091 } |
|
Definition at line 83 of file jdkmidi_manager.cpp. References sequencer.
00084 { 00085 return sequencer; 00086 } |
|
Definition at line 111 of file jdkmidi_manager.cpp. References seq_time_offset.
00112 { 00113 return seq_time_offset; 00114 } |
|
Definition at line 100 of file jdkmidi_manager.cpp. References sys_time_offset.
00101 { 00102 return sys_time_offset; 00103 } |
|
Definition at line 168 of file jdkmidi_manager.cpp. References play_mode.
00169 { 00170 return play_mode; 00171 } |
|
Definition at line 178 of file jdkmidi_manager.cpp. References play_mode, and repeat_play_mode.
00179 { 00180 return repeat_play_mode && play_mode; 00181 } |
|
Definition at line 173 of file jdkmidi_manager.cpp. References stop_mode.
00174 { 00175 return stop_mode; 00176 } |
|
Definition at line 56 of file jdkmidi_manager.cpp. References notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), play_mode, seq_time_offset, SeqStop(), sequencer, stop_mode, and sys_time_offset.
00057 { 00058 SeqStop(); 00059 sys_time_offset = 0; 00060 seq_time_offset = 0; 00061 play_mode = false; 00062 stop_mode = true; 00063 00064 if( notifier ) 00065 { 00066 notifier->Notify( sequencer, MIDISequencerGUIEvent( MIDISequencerGUIEvent::GROUP_ALL ) ); 00067 } 00068 } |
|
Definition at line 117 of file jdkmidi_manager.cpp. References notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), play_mode, sequencer, and stop_mode.
|
|
Definition at line 150 of file jdkmidi_manager.cpp. References notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), play_mode, sequencer, and stop_mode.
|
|
Definition at line 135 of file jdkmidi_manager.cpp. References repeat_end_measure, repeat_play_mode, and repeat_start_measure.
00140 { 00141 // shut off repeat play while we muck with values 00142 repeat_play_mode = false; 00143 repeat_start_measure = start_measure; 00144 repeat_end_measure = end_measure; 00145 00146 // set repeat mode flag to how we want it. 00147 repeat_play_mode = flag; 00148 } |
|
Definition at line 72 of file jdkmidi_manager.cpp. References notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), and sequencer.
|
|
Definition at line 106 of file jdkmidi_manager.cpp. References seq_time_offset.
00107 { 00108 seq_time_offset = seqoff; 00109 } |
|
Definition at line 95 of file jdkmidi_manager.cpp. References sys_time_offset.
00096 { 00097 sys_time_offset = off; 00098 } |
|
Implements jdkmidi::MIDITick. Definition at line 183 of file jdkmidi_manager.cpp. References play_mode, stop_mode, TimeTickPlayMode(), and TimeTickStopMode().
00184 { 00185 if( play_mode ) 00186 { 00187 TimeTickPlayMode(sys_time_); 00188 } 00189 else if( stop_mode ) 00190 { 00191 TimeTickStopMode(sys_time_); 00192 } 00193 00194 00195 } |
|
Definition at line 197 of file jdkmidi_manager.cpp. References jdkmidi::MIDIDriver::AllNotesOff(), jdkmidi::MIDIDriver::CanOutputMessage(), driver, jdkmidi::MIDISequencer::GetCurrentMeasure(), jdkmidi::MIDISequencer::GetCurrentTimeInMs(), jdkmidi::MIDISequencer::GetNextEvent(), jdkmidi::MIDISequencer::GetNextEventTimeMs(), jdkmidi::MIDISequencer::GoToMeasure(), notifier, jdkmidi::MIDISequencerGUIEventNotifier::Notify(), jdkmidi::MIDIDriver::OutputMessage(), play_mode, repeat_end_measure, repeat_play_mode, repeat_start_measure, seq_time_offset, sequencer, stop_mode, and sys_time_offset.
00198 { 00199 double sys_time = (double)sys_time_ - (double)sys_time_offset; 00200 float next_event_time = 0.0; 00201 int ev_track; 00202 MIDITimedBigMessage ev; 00203 00204 // if we are in repeat mode, repeat if we hit end of the repeat region 00205 if( repeat_play_mode 00206 && sequencer->GetCurrentMeasure()>=repeat_end_measure 00207 ) 00208 { 00209 // yes we hit the end of our repeat block 00210 // shut off all notes on 00211 driver->AllNotesOff(); 00212 00213 // now move the sequencer to our start position 00214 00215 sequencer->GoToMeasure( repeat_start_measure ); 00216 00217 // our current raw system time is now the new system time offset 00218 00219 sys_time_offset = sys_time_; 00220 00221 sys_time = 0; 00222 00223 // the sequencer time offset now must be reset to the 00224 // time in milliseconds of the sequence start point 00225 00226 seq_time_offset = (unsigned long)sequencer->GetCurrentTimeInMs(); 00227 } 00228 00229 // find all events that exist before or at this time, 00230 // but only if we have space in the output queue to do so! 00231 00232 // also limit ourselves to 100 midi events max. 00233 00234 int output_count=100; 00235 00236 while( 00237 sequencer->GetNextEventTimeMs( &next_event_time ) 00238 && (next_event_time-seq_time_offset)<=sys_time 00239 && driver->CanOutputMessage() 00240 && (--output_count)>0 00241 ) 00242 { 00243 // found an event! get it! 00244 00245 if( sequencer->GetNextEvent( &ev_track, &ev ) ) 00246 { 00247 // ok, tell the driver the send this message now 00248 00249 driver->OutputMessage( ev ); 00250 } 00251 } 00252 00253 00254 00255 00256 // auto stop at end of sequence 00257 00258 if( !sequencer->GetNextEventTimeMs( &next_event_time ) ) 00259 { 00260 // no events left 00261 stop_mode = true; 00262 play_mode = false; 00263 00264 if( notifier ) 00265 { 00266 notifier->Notify( sequencer, 00267 MIDISequencerGUIEvent( 00268 MIDISequencerGUIEvent::GROUP_TRANSPORT, 00269 0, 00270 MIDISequencerGUIEvent::GROUP_TRANSPORT_MODE 00271 ) ); 00272 00273 notifier->Notify( sequencer, 00274 MIDISequencerGUIEvent( 00275 MIDISequencerGUIEvent::GROUP_TRANSPORT, 00276 0, 00277 MIDISequencerGUIEvent::GROUP_TRANSPORT_ENDOFSONG 00278 ) ); 00279 00280 } 00281 } 00282 00283 } |
|
Definition at line 285 of file jdkmidi_manager.cpp.
00286 { 00287 } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|