diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sci/sound/drivers/cms.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/engines/sci/sound/drivers/cms.cpp b/engines/sci/sound/drivers/cms.cpp index 1eee102450..86529956be 100644 --- a/engines/sci/sound/drivers/cms.cpp +++ b/engines/sci/sound/drivers/cms.cpp @@ -341,7 +341,8 @@ void CMSVoice_V0::noteOff() { void CMSVoice_V0::stop() { _note = 0xFF; - _envState = kRelease; + if (_envState != kReady) + _envState = kRelease; if (_secondaryVoice) _secondaryVoice->stop(); } @@ -371,6 +372,8 @@ void CMSVoice_V0::programChange(int program) { _transOct = data.getInt8At(pos++); _transFreq = data.getInt8At(pos++); + debug("CMSVoice_V0::programChange: Voice: %02d, Envelope: %02d, TransOct: %02d, TransFreq: %02d", _id, data[_isSecondary ? 3 : 0], _transOct, _transFreq); + if (_isSecondary) _envPA = data.getUint8At(pos++); @@ -551,6 +554,9 @@ void CMSVoice_V0::selectEnvelope(int id) { _vbrMod = *in++; _vbrSteps = *in++; _vbrOn = _vbrMod; + _vbrCur = _vbrMod; + _vbrState = _vbrSteps & 0x0F; + _vbrPhase = 0; if (_id == 1) _envAR1 = _envAR; } @@ -774,7 +780,7 @@ const int CMSVoice_V1::_velocityTable[32] = { MidiDriver_CMS::MidiDriver_CMS(Audio::Mixer* mixer, ResourceManager* resMan, SciVersion version) : MidiDriver_Emulated(mixer), _resMan(resMan), _version(version), _cms(0), _rate(0), _playSwitch(true), _masterVolume(0), _numVoicesPrimary(version > SCI_VERSION_0_LATE ? 12 : 8), - _actualTimerInterval(1000000000 /(_baseFreq*1000)), _reqTimerInterval(1000000000/60000/*18206*/), _numVoicesSecondary(version > SCI_VERSION_0_LATE ? 0 : 4) { + _actualTimerInterval(1000000000 /(_baseFreq*1000)), _reqTimerInterval(1000000000/60000), _numVoicesSecondary(version > SCI_VERSION_0_LATE ? 0 : 4) { memset(_voice, 0, sizeof(_voice)); _updateTimer = _reqTimerInterval; } @@ -921,7 +927,7 @@ void MidiDriver_CMS::initTrack(SciSpan<const byte>& header) { _channel[i].pitchWheel = 0x2000; _channel[i].pan = 0; - if (i == numChan) + if (i >= numChan) continue; uint8 num = header.getInt8At(readPos++) & 0x0F; @@ -941,22 +947,18 @@ void MidiDriver_CMS::initTrack(SciSpan<const byte>& header) { // This weird driver will assign a second voice if the number of requested voices is exactly 1. // The secondary voice is configured differently (has its own instrument patch data). The secondary // voice is controlled through the primary voice. It will not receive its own separate commands. - // The main purpose seems to be to have stereo channels with 2 discrete voices for the left and - // right speaker output. However, the instrument patch can also turn this around so that both voices + // The main purpose seems providing stereo channels with 2 discrete voices for the left and right + // speaker output. However, the instrument patch can also turn this around so that both voices // use the same panning. What an awesome concept... bindVoices(i, num, num == 1, false); } } void MidiDriver_CMS::onTimer() { - _updateTimer -= _actualTimerInterval; - if (_updateTimer > 0) - return; - - _updateTimer += _reqTimerInterval; - - for (uint i = 0; i < ARRAYSIZE(_voice); ++i) - _voice[i]->update(); + for (_updateTimer -= _actualTimerInterval; _updateTimer <= 0; _updateTimer += _reqTimerInterval) { + for (uint i = 0; i < ARRAYSIZE(_voice); ++i) + _voice[i]->update(); + } } void MidiDriver_CMS::noteOn(int channelNr, int note, int velocity) { |