From 26f9540d3c7d9ec2c769ef5d7e26f7cf56d0e753 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Sat, 4 Aug 2012 01:42:49 +0000 Subject: [PATCH] - Fixed: I missed a nuance of the MIDI spec when writing MIDIStreamer::CreateSMF(): Running status is supposed to be canceled by sysex events and meta events. This confused FMOD when the resulting song used used running status right after these events. SVN r3803 (trunk) --- src/sound/music_midistream.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sound/music_midistream.cpp b/src/sound/music_midistream.cpp index 30d8ba6f6..08edc2961 100644 --- a/src/sound/music_midistream.cpp +++ b/src/sound/music_midistream.cpp @@ -1130,7 +1130,7 @@ void MIDIStreamer::Precache() void MIDIStreamer::CreateSMF(TArray &file, int looplimit) { DWORD delay = 0; - BYTE running_status = 0; + BYTE running_status = 255; // Always create songs aimed at GM devices. CheckCaps(MOD_MIDIPORT); @@ -1163,6 +1163,7 @@ void MIDIStreamer::CreateSMF(TArray &file, int looplimit) file.Push(BYTE(tempo >> 16)); file.Push(BYTE(tempo >> 8)); file.Push(BYTE(tempo)); + running_status = 255; } else if (MEVT_EVENTTYPE(event[2]) == MEVT_LONGMSG) { @@ -1176,6 +1177,7 @@ void MIDIStreamer::CreateSMF(TArray &file, int looplimit) file.Push(MIDI_SYSEX); WriteVarLen(file, len); memcpy(&file[file.Reserve(len - 1)], bytes, len); + running_status = 255; } } else if (MEVT_EVENTTYPE(event[2]) == 0)