// delete all text events from multitrack object bool DeleteAllTracksText( MIDIMultiTrack &tracks ) { bool text_deleted = false; int num_tracks = tracks.GetNumTracksWithEvents(); for ( int nt = 0; nt < num_tracks; ++nt ) { MIDITrack &trk = *tracks.GetTrack( nt ); int num_events = trk.GetNumEvents(); for ( int ne = 0; ne < num_events; ++ne ) { MIDITimedBigMessage *msg = trk.GetEvent( ne ); // convert any text midi event to NoOp event if ( msg->IsTextEvent() ) { trk.MakeEventNoOp( ne ); text_deleted = true; } } } return text_deleted; }
void AdvancedSequencer::ExtractMarkers ( std::vector< std::string > *list ) { if ( !file_loaded ) { list->clear(); num_markers = 0; return; } MIDITrack *t = tracks.GetTrack ( 0 ); list->clear(); int cnt = 0; int measure = 0; int beat = 0; int timesig_numerator = 4; int timesig_denominator = 4; MIDIClockTime last_beat_time = 0; MIDIClockTime last_event_time = 0; int clks_per_beat = tracks.GetClksPerBeat(); for ( int i = 0; i < t->GetNumEvents(); ++i ) { MIDITimedBigMessage *m = t->GetEventAddress ( i ); if ( m ) { // how many beats have gone by since the last event? long beats_gone_by = ( m->GetTime() - last_beat_time ) / clks_per_beat; if ( beats_gone_by > 0 ) { // calculate what our new measure/beat is beat += beats_gone_by; // carry over beat overflow to measure measure += beat / timesig_numerator; beat = beat % timesig_numerator; last_beat_time += ( clks_per_beat * beats_gone_by ); } if ( m->IsMetaEvent() && m->IsTimeSig() ) { timesig_numerator = m->GetTimeSigNumerator(); timesig_denominator = m->GetTimeSigDenominator(); clks_per_beat = tracks.GetClksPerBeat() * 4 / timesig_denominator; } if ( m->IsTextEvent() && m->GetSysEx() ) { if ( ( m->GetMetaType() == META_GENERIC_TEXT ) || m->GetMetaType() == META_MARKER_TEXT || m->GetMetaType() == META_CUE_TEXT ) { char buf[256]; char line[256]; memcpy ( buf, m->GetSysEx()->GetBuf(), m->GetSysEx()->GetLength() ); buf[ m->GetSysEx()->GetLength() ] = '\0'; FixQuotes ( buf ); sprintf ( line, "%03d:%d %s", measure + 1, beat + 1, buf ); list->push_back ( std::string ( line ) ); marker_times[ cnt++ ] = m->GetTime(); } } last_event_time = m->GetTime(); } } num_markers = cnt; }