bool MIDIFileReadMultiTrack::mf_metamisc ( MIDIClockTime time, int type, int len, unsigned char *data ) // funcVRM { // code for all miscellaneous meta events MIDITimedMessage msg; msg.SetTime ( time ); msg.SetStatus( META_EVENT ); msg.SetByte1( type ); if ( len <= 5 ) { if ( len > 0 ) msg.SetByte2( data[0] ); if ( len > 1 ) msg.SetByte3( data[1] ); if ( len > 2 ) msg.SetByte4( data[2] ); if ( len > 3 ) msg.SetByte5( data[3] ); if ( len > 4 ) msg.SetByte6( data[4] ); } // else msg add to track, but do'nt write to output midifile! msg.SetDataLength( len ); return AddEventToMultiTrack ( msg, 0, cur_track ); }
bool MIDIFileReadMultiTrack::mf_keysig ( MIDIClockTime time, int c, int v ) // VRM { MIDITimedMessage msg; msg.SetTime ( time ); msg.SetKeySig ( ( unsigned char ) c, ( unsigned char ) v ); msg.SetDataLength( 2 ); // VRM return AddEventToMultiTrack ( msg, 0, cur_track ); // VRM }
bool MIDIFileReadMultiTrack::mf_timesig ( MIDIClockTime time, int num, int den_pow, int clks_per_metro, int notated_32nd_per_quarter ) // funcVRM { MIDITimedMessage msg; msg.SetTime ( time ); msg.SetTimeSig ( num, den_pow, clks_per_metro, notated_32nd_per_quarter ); msg.SetDataLength( 5 ); // VRM // source 4 bytes + 1 byte for denominator return AddEventToMultiTrack ( msg, 0, cur_track ); }
bool MIDIFileReadMultiTrack::mf_eot ( MIDIClockTime time ) // VRM { MIDITimedMessage msg; msg.SetStatus ( META_EVENT ); msg.SetMetaType ( META_END_OF_TRACK ); // VRM msg.SetTime ( time ); msg.SetDataLength( 0 ); // VRM return AddEventToMultiTrack ( msg, 0, cur_track ); // VRM }
bool MIDIFileReadMultiTrack::mf_tempo ( MIDIClockTime time, unsigned char a, unsigned char b, unsigned char c ) // funcVRM { MIDITimedMessage msg; msg.SetTime ( time ); msg.SetMetaEvent ( MF_META_TEMPO, a, b ); msg.SetByte4( c ); msg.SetDataLength( 3 ); return AddEventToMultiTrack ( msg, 0, cur_track ); }
void MIDIFileReadMultiTrack::mf_keysig ( MIDIClockTime time, int c, int v ) { MIDITimedMessage msg; msg.SetKeySig ( ( unsigned char ) c, ( unsigned char ) v ); msg.SetTime ( time ); AddEventToMultiTrack ( msg, 0, cur_track ); }
void MIDIFileReadMultiTrack::mf_eot ( MIDIClockTime time ) { MIDITimedMessage msg; msg.SetStatus ( META_EVENT ); msg.SetMetaType ( META_END_OF_TRACK ); msg.SetTime ( time ); AddEventToMultiTrack ( msg, 0, cur_track ); }
bool MIDIFileReadMultiTrack::mf_sysex ( MIDIClockTime time, int type, int len, unsigned char *s ) // funcVRM { MIDITimedMessage msg; msg.SetSysEx( type ); // set msg status byte (0xF0 or 0xF7) int num = len; // number of possible SysExURT header data bytes in msg, 0...5 if ( num > 5 ) num = 5; // add up to 5 starting bytes for SysExURT functions if ( num > 0 ) msg.SetByte2( s[0] ); if ( num > 1 ) msg.SetByte3( s[1] ); if ( num > 2 ) msg.SetByte4( s[2] ); if ( num > 3 ) msg.SetByte5( s[3] ); if ( num > 4 ) msg.SetByte6( s[4] ); msg.SetTime ( time ); MIDISystemExclusive sysex( len ); for ( int i = 0; i < len; ++i ) { sysex.PutSysByte ( s[i] ); } msg.SetDataLength( num ); return AddEventToMultiTrack ( msg, &sysex, cur_track ); }
void MIDIFileReadMultiTrack::mf_sysex ( MIDIClockTime time, const MIDISystemExclusive &ex ) { MIDITimedMessage msg; msg.SetSysEx(); msg.SetTime ( time ); MIDISystemExclusive *sysex = new MIDISystemExclusive ( ex ); AddEventToMultiTrack ( msg, sysex, cur_track ); }
bool MIDIFileReadMultiTrack::mf_text ( MIDIClockTime time, int type, int len, unsigned char *s ) // VRM { MIDITimedMessage msg; msg.SetStatus ( META_EVENT ); msg.SetMetaType ( ( uchar ) type ); // remember - MF_META_* id codes match META_* codes msg.SetTime ( time ); MIDISystemExclusive sysex( len ); // VRM for ( int i = 0; i < len; ++i ) { sysex.PutSysByte ( s[i] ); // VRM } msg.SetDataLength( 0 ); // VRM // variable data length don't saved to data_length return AddEventToMultiTrack ( msg, &sysex, cur_track ); // VRM }
void MIDIFileReadMultiTrack::mf_text ( MIDIClockTime time, int type, int len, unsigned char *s ) { MIDITimedMessage msg; msg.SetStatus ( META_EVENT ); msg.SetMetaType ( ( uchar ) type ); // remember - MF_*_TEXT* id codes match META_*_TEXT codes msg.SetTime ( time ); MIDISystemExclusive *sysex = new MIDISystemExclusive ( len ); for ( int i=0; i<len; ++i ) { sysex->PutSysByte ( s[i] ); } AddEventToMultiTrack ( msg, sysex, cur_track ); }
void MIDIFileReadMultiTrack::ChanMessage ( const MIDITimedMessage &msg ) { if ( the_format == 0 || cur_track==0 ) { // split format 0 files into separate tracks, one for each channel, // keep track 0 for tempo and meta-events AddEventToMultiTrack ( msg, 0, msg.GetChannel() +1 ); } else { AddEventToMultiTrack ( msg, 0, cur_track ); } }
void MIDIFileReadMultiTrack::mf_tempo ( MIDIClockTime time, unsigned long tempo ) { unsigned long tempo_bpm_times_32; if ( tempo==0 ) tempo=1; // tempo is in microseconds per beat // calculate beats per second by float beats_per_second = static_cast<float> ( 1e6 / ( double ) tempo );// 1 million microseconds per second float beats_per_minute = beats_per_second * 60; tempo_bpm_times_32 = static_cast<unsigned long> ( beats_per_minute * 32.0 ); MIDITimedMessage msg; msg.SetTempo32 ( static_cast<unsigned short> ( tempo_bpm_times_32 ) ); msg.SetTime ( time ); AddEventToMultiTrack ( msg, 0, cur_track ); }
void MIDIFileReadMultiTrack::mf_timesig ( MIDIClockTime time, int num, int denom_power, int clks_per_metro, int notated_32nd_per_quarter ) { MIDITimedMessage msg; int denom= 1<<denom_power; msg.SetTimeSig ( ( unsigned char ) num, ( unsigned char ) denom ); msg.SetTime ( time ); MIDISystemExclusive *sysex = new MIDISystemExclusive ( 4 ); sysex->PutByte ( ( unsigned char ) num ); sysex->PutByte ( ( unsigned char ) denom_power ); sysex->PutByte ( ( unsigned char ) clks_per_metro ); sysex->PutByte ( ( unsigned char ) notated_32nd_per_quarter ); AddEventToMultiTrack ( msg, sysex, cur_track ); }