diff --git a/ChangeLog b/ChangeLog index 79d722d5c..ba2d7c716 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-07-17 Tobias Doerffel + + * include/midi.h: + * plugins/midi_import/midi_import.h: + * plugins/midi_import/midi_import.cpp: + - initial incomplete handling for tempo-events + - properly aligned imported notes + 2007-07-16 Tobias Doerffel * src/core/mixer.cpp: diff --git a/include/midi.h b/include/midi.h index 7bf7a0570..12d50f8bd 100644 --- a/include/midi.h +++ b/include/midi.h @@ -58,7 +58,8 @@ enum midiEventTypes MIDI_ACTIVE_SENSING = 0xFE, MIDI_SYSTEM_RESET = 0xFF, // meta event - for midi files only - MIDI_META_EVENT = 0xFF + MIDI_META_EVENT = 0xFF, + MIDI_TEMPO = 0xFF51 } ; diff --git a/plugins/midi_import/midi_import.cpp b/plugins/midi_import/midi_import.cpp index 4e4d3d668..f323e6a1c 100644 --- a/plugins/midi_import/midi_import.cpp +++ b/plugins/midi_import/midi_import.cpp @@ -72,7 +72,10 @@ plugin::descriptor midiimport_plugin_descriptor = midiImport::midiImport( const QString & _file ) : - importFilter( _file, &midiimport_plugin_descriptor ) + importFilter( _file, &midiimport_plugin_descriptor ), + m_events(), + m_smpteTiming( FALSE ), + m_tempo( 120 ) { } @@ -270,8 +273,8 @@ invalid_format: NOTES_PER_OCTAVE * OCTAVES && keys[ev.key()][0] >= 0 ) { - note n( midiTime( ( tick - keys[ev.key()][0] ) / 10 ), - midiTime( keys[ev.key()][0] / 10 ), + note n( midiTime( ( tick - keys[ev.key()][0] ) * 16 / m_tempo ), + midiTime( keys[ev.key()][0] * 16 / m_tempo ), (tones)( ev.key() % NOTES_PER_OCTAVE ), (octaves)( ev.key() / NOTES_PER_OCTAVE ), keys[ev.key()][1] * 100 / 128 ); @@ -280,6 +283,10 @@ invalid_format: } break; + case MIDI_TEMPO: + + break; + default: /* printf( "Unhandled event: %#x\n", ev.m_type );*/ @@ -485,6 +492,15 @@ bool FASTCALL midiImport::readTrack( int _track_end ) } else { + int tempo = readByte() << 16; + tempo |= readByte() << 8; + tempo |= readByte(); + tempo = ( 60*1000*1000 ) / tempo; + m_events.push_back( qMakePair( tick, + midiEvent( MIDI_TEMPO, + 0, + tempo, + 0 ) ) ); /* event = new_event(track, 0); event->type = SND_SEQ_EVENT_TEMPO; event->port = port; @@ -493,7 +509,7 @@ bool FASTCALL midiImport::readTrack( int _track_end ) event->data.tempo |= read_byte() << 8; event->data.tempo |= read_byte(); skip( len -3 );*/ - skip( len ); + skip( len-3 ); } break; diff --git a/plugins/midi_import/midi_import.h b/plugins/midi_import/midi_import.h index 4accd41d6..88cc48588 100644 --- a/plugins/midi_import/midi_import.h +++ b/plugins/midi_import/midi_import.h @@ -134,6 +134,7 @@ private: typedef vvector > eventVector; eventVector m_events; bool m_smpteTiming; + int m_tempo; } ;