handle note data on any track and don't hard-code to track 1
This commit is contained in:
@@ -587,6 +587,24 @@ namespace Guitar
|
|||||||
channel_aftertouch = 0xD,
|
channel_aftertouch = 0xD,
|
||||||
pitch_bend = 0xE,
|
pitch_bend = 0xE,
|
||||||
};
|
};
|
||||||
|
enum MetaEventType
|
||||||
|
{
|
||||||
|
sequence_number = 0x00,
|
||||||
|
text_event = 0x01,
|
||||||
|
copyright_notice = 0x02,
|
||||||
|
track_name = 0x03,
|
||||||
|
instrument_name = 0x04,
|
||||||
|
lyrics = 0x05,
|
||||||
|
marker = 0x06,
|
||||||
|
cue_point = 0x07,
|
||||||
|
midi_channel_prefix = 0x20,
|
||||||
|
end_of_track = 0x2F,
|
||||||
|
set_tempo = 0x51,
|
||||||
|
smpte_offset = 0x54,
|
||||||
|
time_signature = 0x58,
|
||||||
|
key_signature = 0x59,
|
||||||
|
sequencer_specific = 0x7F,
|
||||||
|
};
|
||||||
struct MidiEvent
|
struct MidiEvent
|
||||||
{
|
{
|
||||||
long count;
|
long count;
|
||||||
@@ -681,12 +699,35 @@ static bool LoadFromMidi( const RString &sPath, Song &songOut )
|
|||||||
* step is helpful. */
|
* step is helpful. */
|
||||||
vector<MidiEvent> vMidiEvent[NUM_GuitarDifficulty][NUM_NoteNumberType];
|
vector<MidiEvent> vMidiEvent[NUM_GuitarDifficulty][NUM_NoteNumberType];
|
||||||
|
|
||||||
|
/* Iterate through each track looking for the track that contains notes by checking the track name.
|
||||||
|
* This is usually track 1, but sometimes is track 2. */
|
||||||
|
for( int iTrack = 1; iTrack<(int)midi.getNumberOfTracks(); iTrack++ )
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> event;
|
std::vector<unsigned char> event;
|
||||||
int iTrack = 1; // this track should be named "T1 GEMS" or "PART GUITAR"
|
|
||||||
unsigned long count = midi.getNextEvent( &event, iTrack );
|
unsigned long count = midi.getNextEvent( &event, iTrack );
|
||||||
double fSeconds = midi.getTickSeconds( iTrack );
|
double fSeconds = midi.getTickSeconds( iTrack );
|
||||||
while( event.size() )
|
while( event.size() )
|
||||||
|
{
|
||||||
|
if( event[0] == 0xFF ) // meta event
|
||||||
|
{
|
||||||
|
uint8_t uMetaEventType = event[1];
|
||||||
|
switch( uMetaEventType )
|
||||||
|
{
|
||||||
|
case track_name:
|
||||||
|
{
|
||||||
|
uint8_t uStringLength = event[2];
|
||||||
|
RString s;
|
||||||
|
for( int i=3; i<3 + uStringLength; i++ )
|
||||||
|
s += event[i];
|
||||||
|
if( s != "T1 GEMS" && s != "PART GUITAR" )
|
||||||
|
goto skip_track;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG->Trace( "Unhandled MIDI meta event type %X", uMetaEventType );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
MidiEventType midiEventType = (MidiEventType)(event[0] >> 4);
|
MidiEventType midiEventType = (MidiEventType)(event[0] >> 4);
|
||||||
//uint8_t uMidiChannel = event[0] & 0xF; // currently unused
|
//uint8_t uMidiChannel = event[0] & 0xF; // currently unused
|
||||||
@@ -719,10 +760,13 @@ static bool LoadFromMidi( const RString &sPath, Song &songOut )
|
|||||||
LOG->Trace( "Unhandled MIDI event type %X", midiEventType );
|
LOG->Trace( "Unhandled MIDI event type %X", midiEventType );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
count += midi.getNextEvent( &event, iTrack );
|
count += midi.getNextEvent( &event, iTrack );
|
||||||
fSeconds = midi.getTickSeconds( iTrack );
|
fSeconds = midi.getTickSeconds( iTrack );
|
||||||
}
|
}
|
||||||
|
skip_track:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user