[Scummvm-cvs-logs] scummvm master -> 903309fbb7ce5c9dbc66c988169ac109def20e16
m-kiewitz
m_kiewitz at users.sourceforge.net
Thu Jul 2 13:17:47 CEST 2015
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
903309fbb7 AUDIO: Miles Audio AdLib: implement sustain
Commit: 903309fbb7ce5c9dbc66c988169ac109def20e16
https://github.com/scummvm/scummvm/commit/903309fbb7ce5c9dbc66c988169ac109def20e16
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2015-07-02T13:17:21+02:00
Commit Message:
AUDIO: Miles Audio AdLib: implement sustain
fixes broken music in Return To Zork (demo)
also added comments about those special cases (useful for testing)
Changed paths:
audio/miles_adlib.cpp
diff --git a/audio/miles_adlib.cpp b/audio/miles_adlib.cpp
index 6697122..a48aba3 100644
--- a/audio/miles_adlib.cpp
+++ b/audio/miles_adlib.cpp
@@ -34,6 +34,10 @@ namespace Audio {
// Miles Audio AdLib/OPL3 driver
//
// TODO: currently missing: OPL3 4-op voices
+//
+// Special cases (great for testing):
+// - sustain feature is used by Return To Zork (demo) right at the start
+// - sherlock holmes 2 does lots of priority sorts right at the start of the intro
#define MILES_ADLIB_VIRTUAL_FMVOICES_COUNT_MAX 20
#define MILES_ADLIB_PHYSICAL_FMVOICES_COUNT_MAX 18
@@ -255,6 +259,8 @@ private:
void releaseFmVoice(byte virtualFmVoice);
+ void releaseSustain(byte midiChannel);
+
void updatePhysicalFmVoice(byte virtualFmVoice, bool keyOn, uint16 registerUpdateFlags);
void controlChange(byte midiChannel, byte controllerNumber, byte controllerValue);
@@ -692,6 +698,19 @@ void MidiDriver_Miles_AdLib::releaseFmVoice(byte virtualFmVoice) {
_midiChannels[midiChannel].currentActiveVoicesCount--;
}
+void MidiDriver_Miles_AdLib::releaseSustain(byte midiChannel) {
+ // Search through all virtual FM-Voices for currently sustained notes and call noteOff on them
+ for (byte virtualFmVoice = 0; virtualFmVoice < _modeVirtualFmVoicesCount; virtualFmVoice++) {
+ if (_virtualFmVoices[virtualFmVoice].inUse) {
+ if ((_virtualFmVoices[virtualFmVoice].actualMidiChannel == midiChannel) && (_virtualFmVoices[virtualFmVoice].sustained)) {
+ // is currently sustained
+ // so do a noteOff (which will check current sustain controller)
+ noteOff(midiChannel, _virtualFmVoices[virtualFmVoice].currentOriginalMidiNote);
+ }
+ }
+ }
+}
+
void MidiDriver_Miles_AdLib::updatePhysicalFmVoice(byte virtualFmVoice, bool keyOn, uint16 registerUpdateFlags) {
byte midiChannel = _virtualFmVoices[virtualFmVoice].actualMidiChannel;
@@ -937,7 +956,7 @@ void MidiDriver_Miles_AdLib::controlChange(byte midiChannel, byte controllerNumb
case MILES_CONTROLLER_SUSTAIN:
_midiChannels[midiChannel].currentSustain = controllerValue;
if (controllerValue < 64) {
- // release sustain TODO
+ releaseSustain(midiChannel);
}
break;
@@ -948,7 +967,7 @@ void MidiDriver_Miles_AdLib::controlChange(byte midiChannel, byte controllerNumb
case MILES_CONTROLLER_RESET_ALL:
_midiChannels[midiChannel].currentSustain = 0;
- // release sustain TODO
+ releaseSustain(midiChannel);
_midiChannels[midiChannel].currentModulation = 0;
_midiChannels[midiChannel].currentVolumeExpression = 127;
_midiChannels[midiChannel].currentPitchBender = MILES_PITCHBENDER_DEFAULT;
More information about the Scummvm-git-logs
mailing list