示例#1
0
  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);
  }
示例#2
0
 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);
   }
   
 }
示例#3
0
 MIDITimedBigMessage *MIDITrack::GetEvent( int event_num )	
 {
   if( event_num >= num_events )
   {
     return 0;
   }
   else
   {
     return GetEventAddress( event_num );
   }
   
 } 
示例#4
0
 bool	MIDITrack::SetEvent( int event_num, const MIDITimedBigMessage &msg )	
 {
   if( event_num>=num_events )
   {
     return false;
   }
   else
   {
     GetEventAddress( event_num )->Copy( msg );
     return true;
   }
 } 
示例#5
0
 bool	MIDITrack::GetEvent( int event_num, MIDITimedBigMessage *msg ) const	
 {
   if( event_num >= num_events )
   {
     return false;
   }
   else
   {
     msg->Copy( *GetEventAddress( event_num ) );
     return true;
   }
 } 
示例#6
0
 bool	MIDITrack::PutEvent( const MIDITimedBigMessage &msg )	
 {
   if( num_events >= buf_size )
   {
     if( !Expand() )
       return false;
   }
   
   GetEventAddress( num_events++ )->Copy( msg );
   
   return true;
 } 
示例#7
0
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 ) );
    }
}
示例#8
0
 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;
 } 
示例#9
0
 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;
   }
 } 
示例#10
0
 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;
 }