aboutsummaryrefslogtreecommitdiff
path: root/sound/midiparser_smf.cpp
diff options
context:
space:
mode:
authorJamieson Christian2003-05-20 20:58:59 +0000
committerJamieson Christian2003-05-20 20:58:59 +0000
commit4584cb9616ffa78324544c140ef7fc0ad71744a1 (patch)
tree0795a0bcc0608699a762de899a43983b55be9276 /sound/midiparser_smf.cpp
parent49e7f7564a6d33e0079898cc9584fb69c0fcdcfd (diff)
downloadscummvm-rg350-4584cb9616ffa78324544c140ef7fc0ad71744a1.tar.gz
scummvm-rg350-4584cb9616ffa78324544c140ef7fc0ad71744a1.tar.bz2
scummvm-rg350-4584cb9616ffa78324544c140ef7fc0ad71744a1.zip
Corrections to SMF Type 1 compression to Type 0.
Fixes simon2win title music. svn-id: r7755
Diffstat (limited to 'sound/midiparser_smf.cpp')
-rw-r--r--sound/midiparser_smf.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/sound/midiparser_smf.cpp b/sound/midiparser_smf.cpp
index 61b6c0ac4a..f45ddf491d 100644
--- a/sound/midiparser_smf.cpp
+++ b/sound/midiparser_smf.cpp
@@ -225,6 +225,7 @@ bool MidiParser_SMF::loadMusic (byte *data, uint32 size) {
// our tracks down into a single Type 0 track.
if (_buffer) {
free (_buffer);
+ _buffer = 0;
}
if (midi_type == 1) {
@@ -258,6 +259,7 @@ void MidiParser_SMF::compressToType0() {
running_status[i] = 0;
track_pos[i] = _tracks[i];
track_timer[i] = readVLQ (track_pos[i]);
+ running_status[i] = 0;
}
int best_i;
@@ -285,7 +287,7 @@ void MidiParser_SMF::compressToType0() {
delta = 0;
length = track_timer[best_i];
for (i = 0; length; ++i) {
- delta = (delta << 8) | (length & 0x7F);
+ delta = (delta << 8) | (length & 0x7F) | (i ? 0x80 : 0);
length >>= 7;
}
@@ -326,19 +328,24 @@ void MidiParser_SMF::compressToType0() {
track_pos[best_i] = 0;
}
- if (track_pos[best_i]) {
- // Update all tracks' deltas
+ // Update all tracks' deltas
+ if (write) {
for (i = 0; i < _num_tracks; ++i) {
if (track_pos[i] && i != best_i)
track_timer[i] -= track_timer[best_i];
}
+ }
+ if (track_pos[best_i]) {
if (write) {
+ track_timer[best_i] = 0;
+
// Write VLQ delta
- do {
- *output++ = (byte) (delta & 0xFF | (delta > 0xFF ? 0x80 : 0));
+ while (delta & 0x80) {
+ *output++ = (byte) (delta & 0xFF);
delta >>= 8;
- } while (delta);
+ }
+ *output++ = (byte) (delta & 0xFF);
// Write MIDI data
memcpy (output, track_pos[best_i], copy_bytes);
@@ -347,7 +354,8 @@ void MidiParser_SMF::compressToType0() {
// Fetch new VLQ delta for winning track
track_pos[best_i] += copy_bytes;
- track_timer[best_i] = readVLQ (track_pos[best_i]);
+ if (active_tracks)
+ track_timer[best_i] += readVLQ (track_pos[best_i]);
}
}