void MIDITrack::Sort() { // // A simple single buffer sorting algorithm. // // first, see if we need sorting by checking each element // with the next. they should all be in order. // // if not, do qsort algorithm unsigned int i; unsigned int first_out_of_order_item=0; for( i=0; i<num_events-1; ++i ) { first_out_of_order_item=i+1; if( MIDITimedMessage::CompareEvents( *GetEventAddress(i), *GetEventAddress(first_out_of_order_item) )==1 ) break; } if( first_out_of_order_item>=num_events-1 ) { // return; // no need for sort } QSort(0,num_events-1); }
void MIDITrack::QSort( int left, int right ) { int i,j; MIDITimedBigMessage *x, y; i=left; j=right; // search for a non NOP message for our median int pos=(left+right)/2; for( ;pos<=right;++pos ) { x=GetEventAddress(pos); if( x && !x->IsNoOp() ) break; } if( GetEventAddress( pos )->IsNoOp() ) { for( pos=(left+right)/2; pos>=left; --pos ) { x = GetEventAddress(pos); if( x && !x->IsNoOp() ) break; } } if( x && x->IsNoOp() ) return; do { while( MIDITimedMessage::CompareEvents( *GetEventAddress(i), *x ) == 2 && i<right ) ++i; while( MIDITimedMessage::CompareEvents( *x, *GetEventAddress(j) ) == 2 && j>left ) --j; if( i<=j ) { y=*GetEventAddress( i ); *GetEventAddress( i ) = *GetEventAddress( j ); *GetEventAddress( j ) = y; ++i; --j; } } while( i<=j ); if( left<j ) { QSort(left,j); } if( i<right ) { QSort(i,right); } }
MIDITimedBigMessage *MIDITrack::GetEvent( int event_num ) { if( event_num >= num_events ) { return 0; } else { return GetEventAddress( event_num ); } }
bool MIDITrack::SetEvent( int event_num, const MIDITimedBigMessage &msg ) { if( event_num>=num_events ) { return false; } else { GetEventAddress( event_num )->Copy( msg ); return true; } }
bool MIDITrack::GetEvent( int event_num, MIDITimedBigMessage *msg ) const { if( event_num >= num_events ) { return false; } else { msg->Copy( *GetEventAddress( event_num ) ); return true; } }
bool MIDITrack::PutEvent( const MIDITimedBigMessage &msg ) { if( num_events >= buf_size ) { if( !Expand() ) return false; } GetEventAddress( num_events++ )->Copy( msg ); return true; }
static void RepInitEv( event_record *ev ) { DIPHDL( cue, ch ); if( ev->cue == NULL ) { if( DeAliasAddrCue( NO_MOD, ev->ip, ch ) != SR_NONE ) { ev->cue = CopySourceLine( ch ); } if( ev->cue == NULL ) { UnAsm( ev->ip, TxtBuff, TXT_LEN ); ev->cue = DupStr( TxtBuff ); } } if( ev->addr_string == NULL ) { ev->addr_string = DupStr( GetEventAddress( ev ) ); } }
bool MIDITrack::PutEvent( const MIDITimedMessage &msg, MIDISystemExclusive *sysex ) { if( num_events >= buf_size ) { if( !Expand() ) return false; } MIDITimedBigMessage *e = GetEventAddress( num_events ); e->Copy( msg ); e->CopySysEx( sysex ); ++num_events; return true; }
bool MIDITrack::MakeEventNoOp( int event_num ) { if( event_num>=num_events ) { return false; } else { MIDITimedBigMessage *ev = GetEventAddress( event_num ); if( ev ) { ev->ClearSysEx(); ev->SetNoOp(); } return true; } }
bool MIDITrack::FindEventNumber( MIDIClockTime time, int *event_num ) const { ENTER("MIDITrack::FindEventNumber( int , int * )"); // TO DO: try make this a binary search for( int i=0; i<num_events; ++i ) { const MIDITimedBigMessage *msg = GetEventAddress( i ); if( msg->GetTime()>=time ) { *event_num=i; return true; } } *event_num=num_events; return false; }