[Scummvm-git-logs] scummvm master -> 0a15c027b25d0ccc5bb8b5485749e1c099d3b701
athrxx
noreply at scummvm.org
Fri Oct 7 22:28:39 UTC 2022
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f5c421e52a SCUMM: (IMS) - some cleanup and fixes
8a487f0ff1 SCUMM: (SAMNMAX) - add some missing volume controls
0a15c027b2 SCUMM: (Amiga/Mac/PCSpk) - add detune/transpose to sound drivers.
Commit: f5c421e52a73941064179aa7c580c93012d9ad9f
https://github.com/scummvm/scummvm/commit/f5c421e52a73941064179aa7c580c93012d9ad9f
Author: athrxx (athrxx at scummvm.org)
Date: 2022-10-08T00:28:15+02:00
Commit Message:
SCUMM: (IMS) - some cleanup and fixes
Move some Midi related code into the new drivers. I have
kept some handling for Mac and PCSpk for now, since I'll
have to do more research, before I touch them. But eventually
it would be nice to get rid of as much of these sound
type checks/exceptions in the common code as possible.
Also, I finally verified that Samnmax does actually init the
pitchbend factor to 2, but it can be set to 0 by control
change 16. In this case the pitchbend message will alter
the volume instead of the pitch. I don't know if that method
is used anywhere, though.
Changed paths:
engines/scumm/imuse/drivers/midi.cpp
engines/scumm/imuse/drivers/midi.h
engines/scumm/imuse/imuse_internal.h
engines/scumm/imuse/imuse_part.cpp
engines/scumm/imuse/imuse_player.cpp
diff --git a/engines/scumm/imuse/drivers/midi.cpp b/engines/scumm/imuse/drivers/midi.cpp
index 8fdda1b8141..a6319eb8535 100644
--- a/engines/scumm/imuse/drivers/midi.cpp
+++ b/engines/scumm/imuse/drivers/midi.cpp
@@ -38,7 +38,7 @@ struct ChannelNode;
class IMuseChannel_Midi : public MidiChannel {
public:
IMuseChannel_Midi(IMuseDriver_GMidi *drv, int number);
- ~IMuseChannel_Midi() override {}
+ virtual ~IMuseChannel_Midi() override {}
MidiDriver *device() override { return _drv; }
byte getNumber() override { return _number; }
@@ -56,9 +56,9 @@ public:
void pitchBend(int16 bend) override;
// Control Change and SCUMM specific functions
- void pitchBendFactor(byte value) override { _pitchBendSensitivity = value; }
- void transpose(int8 value) override { _transpose = value; }
- void detune(byte value) override { _detune = value; }
+ void pitchBendFactor(byte value) override { pitchBend(0); _pitchBendSensitivity = value; }
+ void transpose(int8 value) override { _transpose = (int8)value; pitchBend(_pitchBendTemp); }
+ void detune(byte value) override { _detune = (int8)value; pitchBend(_pitchBendTemp); }
void priority(byte value) override { _prio = value; }
void sustain(bool value) override;
void allNotesOff() override;
@@ -152,11 +152,9 @@ void disconnect(ChannelNode *&chain, ChannelNode *node) {
}
IMuseChannel_Midi::IMuseChannel_Midi(IMuseDriver_GMidi *drv, int number) :MidiChannel(), _drv(drv), _number(number), _allocated(false), _sustain(false),
- _pitchBend(0x2000), _polyphony(1), _channelUsage(0), _exhaust(false), _prio(0x80), _detune(0), _transpose(0), _pitchBendTemp(0), _pitchBendSensitivity(0),
+ _pitchBend(0x2000), _polyphony(1), _channelUsage(0), _exhaust(false), _prio(0x80), _detune(0), _transpose(0), _pitchBendTemp(0), _pitchBendSensitivity(2),
_activeChain(drv ? _drv->_activeChain : _dummyNode), _idleChain(drv ? _drv->_idleChain : _dummyNode), _newSystem(drv ? drv->_newSystem : false) {
assert(_drv);
- if (!_newSystem)
- _pitchBendSensitivity = 2;
}
bool IMuseChannel_Midi::allocate() {
@@ -251,6 +249,16 @@ void IMuseChannel_Midi::programChange(byte program) {
}
void IMuseChannel_Midi::pitchBend(int16 bend) {
+ _pitchBendTemp = bend;
+
+ if (_newSystem) {
+ // SAMNMAX formula (same for Roland MT-32 and GM)
+ bend = (((bend * _pitchBendSensitivity) >> 5) + _detune + (_transpose << 8)) << 1;
+ } else {
+ // DOTT, INDY4 and MI2 formula (same for Roland MT-32 and GM)
+ bend = CLIP<int>(((bend * _pitchBendSensitivity) >> 6) + _detune + (_transpose << 7), -2048, 2047) << 2;
+ }
+
_pitchBend = bend + 0x2000;
sendMidi(0xE0, _pitchBend & 0x7F, (_pitchBend >> 7) & 0x7F);
}
diff --git a/engines/scumm/imuse/drivers/midi.h b/engines/scumm/imuse/drivers/midi.h
index 64c97f6e448..687a746986f 100644
--- a/engines/scumm/imuse/drivers/midi.h
+++ b/engines/scumm/imuse/drivers/midi.h
@@ -19,8 +19,8 @@
*
*/
-#ifndef SCUMM_IMUSE_DRV_GMIDI_H
-#define SCUMM_IMUSE_DRV_GMIDI_H
+#ifndef SCUMM_IMUSE_DRV_MIDI_H
+#define SCUMM_IMUSE_DRV_MIDI_H
#include "audio/mididrv.h"
diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index 6e395ad52ac..eef64252665 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -220,8 +220,6 @@ protected:
bool _isMIDI;
bool _isMT32;
- bool _isGM;
- bool _isAdLibOrFMTowns;
bool _supportsPercussion;
protected:
@@ -277,8 +275,6 @@ public:
bool isFadingOut() const;
bool isMIDI() const { return _isMIDI; }
bool isMT32() const { return _isMT32; }
- bool isGM() const { return _isGM; }
- bool isAdLibOrFMTowns() const { return _isAdLibOrFMTowns; }
bool jump(uint track, uint beat, uint tick);
void onTimer();
void removePart(Part *part);
diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp
index 7882a5a015c..899b65b7fc8 100644
--- a/engines/scumm/imuse/imuse_part.cpp
+++ b/engines/scumm/imuse/imuse_part.cpp
@@ -114,10 +114,10 @@ void Part::set_detune(int8 detune) {
_detune_eff = clamp((_detune = detune) + _player->getDetune(), -128, 127);
// Some drivers handle the transpose and the detune in pitchBend()...
- if (_player->isAdLibOrFMTowns())
- sendDetune();
- else
+ if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
sendPitchBend();
+ else
+ sendDetune();
}
void Part::pitchBend(int16 value) {
@@ -159,10 +159,10 @@ void Part::set_transpose(int8 transpose, int8 clipRangeLow, int8 clipRangeHi) {
// a value of 128 with a signed int8 (a signed int8 can never be 128). The playback depends on this being implemented exactly
// like in the original driver. I found this bug with the WinUAE debugger. The DOS versions do not have that bug.
_transpose_eff = (_se->_soundType != MDT_AMIGA && _transpose == -128) ? 0 : transpose_clamp(_transpose + _player->getTranspose(), clipRangeLow, clipRangeHi);
- if (_player->isAdLibOrFMTowns() || _se->_soundType == MDT_AMIGA)
- sendTranspose();
- else
+ if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
sendPitchBend();
+ else
+ sendTranspose();
}
void Part::sustain(bool value) {
@@ -203,7 +203,7 @@ void Part::pitchBendFactor(byte value) {
return;
pitchBend(0);
_pitchbend_factor = value;
- if (_mc && !(_player->isGM()))
+ if (_mc)
_mc->pitchBendFactor(value);
}
@@ -310,7 +310,7 @@ void Part::setup(Player *player) {
_transpose = 0;
_detune = 0;
_detune_eff = player->getDetune();
- _pitchbend_factor = _se->_newSystem ? 0 : 2;
+ _pitchbend_factor = 2;
_polyphony = 1;
_pitchbend = 0;
_effect_level = player->_se->isNativeMT32() ? 127 : 64;
@@ -377,40 +377,9 @@ void Part::sendPitchBend() {
return;
int16 bend = _pitchbend;
- int8 transpose = _transpose_eff;
- int8 detune = _detune_eff;
-
- // For Amiga, AdLib and FM-Towns we send some values separately due to the way the drivers have
- // been implemented (it must be avoided that the pitchbend factor gets applied on top). So we
- // neutralize them here for the pitch bend calculation.
- if (_se->_soundType == MDT_AMIGA) {
- transpose = 0;
- } else if (_player->isAdLibOrFMTowns()) {
- transpose = detune = 0;
- }
-
- bool oldPitchBendFormula = true;
-
- if (_player->isGM() || _player->_se->isNativeMT32()) {
- if (_se->_game_id == GID_SAMNMAX) {
- // SAMNMAX formula (same for Roland MT-32 and GM)
- bend = _pitchbend_factor ? (bend * _pitchbend_factor) >> 5 : bend >> 6;
- bend = (bend + detune + (transpose << 8)) << 1;
- oldPitchBendFormula = false;
- } else if (_se->_game_id == GID_TENTACLE || _se->_game_id == GID_INDY4 || _se->_game_id == GID_MONKEY2) {
- // DOTT, INDY4 and MI2 formula (same for Roland MT-32 and GM)
- bend = clamp(((bend * _pitchbend_factor) >> 6) + detune + (transpose << 7), -2048, 2047) << 2;
- oldPitchBendFormula = false;
- } else if (_se->isNativeMT32()) {
- // RPN-based pitchbend range doesn't work for the MT32, so we'll do the scaling ourselves.
- // athrxx: I haven't yet seen any evidence of this in any original driver. But I still
- // haven't checked absolutely everything, so let's keep it around until we know better...
- bend = bend * _pitchbend_factor / 12;
- }
- }
- if (oldPitchBendFormula)
- bend = clamp(bend + (detune * 64 / 12) + (transpose * 8192 / 12), -8192, 8191);
+ if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
+ bend = clamp(bend + (_detune_eff * 64 / 12) + (_transpose_eff * 8192 / 12), -8192, 8191);
_mc->pitchBend(bend);
}
@@ -420,7 +389,7 @@ void Part::sendTranspose() {
return;
// Some drivers handle the transpose and the detune in pitchBend()...
- if (_se->_soundType != MDT_AMIGA && !_player->isAdLibOrFMTowns())
+ if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
return;
_mc->transpose(_transpose_eff);
@@ -431,7 +400,7 @@ void Part::sendDetune() {
return;
// Some drivers handle the transpose and the detune in pitchBend()...
- if (!_player->isAdLibOrFMTowns())
+ if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
return;
_mc->detune(_detune_eff);
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index d2649f8207c..178885df402 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -77,8 +77,6 @@ Player::Player() :
_speed(128),
_isMT32(false),
_isMIDI(false),
- _isGM(false),
- _isAdLibOrFMTowns(false),
_supportsPercussion(false),
_se(nullptr),
_vol_chan(0),
@@ -109,10 +107,6 @@ bool Player::startSound(int sound, MidiDriver *midi) {
_isMT32 = _se->isMT32(sound);
_isMIDI = _se->isMIDI(sound);
_supportsPercussion = _se->supportsPercussion(sound);
- // IMuseInternal::supportsPercussion() filters out more non-MIDI things than IMuseInternal::isMIDI(),
- // but still not the AdLib in Samnmax, so we make an extra test for that...
- _isGM = (_supportsPercussion && !(_se->_game_id == GID_SAMNMAX && !_se->_midi_native && _se->_midi_adlib) && !_isMT32);
- _isAdLibOrFMTowns = (_se->_midi_adlib && !_isMT32 && !_isGM && _se->_soundType != MDT_PCSPK);
_parts = nullptr;
_active = true;
@@ -223,7 +217,7 @@ int Player::start_seq_sound(int sound, bool reset_vars) {
}
void Player::loadStartParameters(int sound) {
- _priority = 0x80;
+ _priority = _se->_newSystem ? 0x40 : 0x80;
_volume = 0x7F;
_vol_chan = 0xFFFF;
_vol_eff = (_se->get_channel_volume(0xFFFF) << 7) >> 7;
@@ -1040,10 +1034,6 @@ void Player::fixAfterLoad() {
_isMT32 = _se->isMT32(_id);
_isMIDI = _se->isMIDI(_id);
_supportsPercussion = _se->supportsPercussion(_id);
- // IMuseInternal::supportsPercussion() filters out more non-MIDI things than IMuseInternal::isMIDI(),
- // but still not the AdLib in SAMNMAX, so we make an extra test for that...
- _isGM = (_supportsPercussion && !(_se->_game_id == GID_SAMNMAX && !_se->_midi_native && _se->_midi_adlib) && !_isMT32);
- _isAdLibOrFMTowns = (_se->_midi_adlib && !_isMT32 && !_isGM && _se->_soundType != MDT_PCSPK);
}
}
Commit: 8a487f0ff11f05b3de55ffe7dccfd81218119d2a
https://github.com/scummvm/scummvm/commit/8a487f0ff11f05b3de55ffe7dccfd81218119d2a
Author: athrxx (athrxx at scummvm.org)
Date: 2022-10-08T00:28:18+02:00
Commit Message:
SCUMM: (SAMNMAX) - add some missing volume controls
(unsure if used)
Changed paths:
engines/scumm/imuse/imuse_internal.h
engines/scumm/imuse/imuse_part.cpp
engines/scumm/imuse/imuse_player.cpp
diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index eef64252665..064874af264 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -315,6 +315,7 @@ struct Part : public Common::Serializable {
Player *_player;
int16 _pitchbend;
byte _pitchbend_factor;
+ byte _volControlSensitivity;
int8 _transpose, _transpose_eff;
byte _vol, _vol_eff;
int8 _detune, _detune_eff;
@@ -377,6 +378,8 @@ struct Part : public Common::Serializable {
private:
void sendPitchBend();
+ void sendVolume(int8 fadeModifier);
+ void sendVolumeFade();
void sendTranspose();
void sendDetune();
void sendPanPosition(uint8 value);
diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp
index 899b65b7fc8..7bb329b1dc1 100644
--- a/engines/scumm/imuse/imuse_part.cpp
+++ b/engines/scumm/imuse/imuse_part.cpp
@@ -43,6 +43,7 @@ Part::Part() {
_player = nullptr;
_pitchbend = 0;
_pitchbend_factor = 0;
+ _volControlSensitivity = 127;
_transpose = 0;
_transpose_eff = 0;
_vol = 0;
@@ -126,9 +127,8 @@ void Part::pitchBend(int16 value) {
}
void Part::volume(byte value) {
- _vol_eff = ((_vol = value) + 1) * _player->getEffectiveVolume() >> 7;
- if (_mc)
- _mc->volume(_vol_eff);
+ _vol = value;
+ sendVolume(0);
}
void Part::set_pri(int8 pri) {
@@ -311,6 +311,7 @@ void Part::setup(Player *player) {
_detune = 0;
_detune_eff = player->getDetune();
_pitchbend_factor = 2;
+ _volControlSensitivity = 127;
_polyphony = 1;
_pitchbend = 0;
_effect_level = player->_se->isNativeMT32() ? 127 : 64;
@@ -376,6 +377,11 @@ void Part::sendPitchBend() {
if (!_mc)
return;
+ if (_se->_newSystem && !_pitchbend_factor) {
+ sendVolumeFade();
+ return;
+ }
+
int16 bend = _pitchbend;
if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
@@ -384,6 +390,26 @@ void Part::sendPitchBend() {
_mc->pitchBend(bend);
}
+void Part::sendVolume(int8 fadeModifier) {
+ if (!_mc)
+ return;
+
+ uint16 vol = (_vol + fadeModifier + 1) * _player->getEffectiveVolume();
+
+ if (_se->_newSystem)
+ vol = (vol * (_volControlSensitivity + 1)) >> 7;
+
+ _vol_eff = vol >> 7;
+
+ if (_mc)
+ _mc->volume(_vol_eff);
+}
+
+void Part::sendVolumeFade() {
+ int16 fadeModifier = ((((_pitchbend >= 0) ? 127 - _vol : _vol) + 1) * _pitchbend) >> 7;
+ sendVolume(fadeModifier);
+}
+
void Part::sendTranspose() {
if (!_mc)
return;
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index 178885df402..ac224ec8c7d 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -360,7 +360,7 @@ void Player::send(uint32 b) {
}
break;
- case 0xE: // Pitch Bend
+ case 0xE: // Pitch Bend (or also volume fade for Samnmax)
part = getPart(chan);
if (part)
part->pitchBend(((param2 << 7) | param1) - 0x2000);
Commit: 0a15c027b25d0ccc5bb8b5485749e1c099d3b701
https://github.com/scummvm/scummvm/commit/0a15c027b25d0ccc5bb8b5485749e1c099d3b701
Author: athrxx (athrxx at scummvm.org)
Date: 2022-10-08T00:28:21+02:00
Commit Message:
SCUMM: (Amiga/Mac/PCSpk) - add detune/transpose to sound drivers.
Changed paths:
engines/scumm/imuse/drivers/amiga.cpp
engines/scumm/imuse/drivers/mac_m68k.cpp
engines/scumm/imuse/drivers/mac_m68k.h
engines/scumm/imuse/drivers/pcspk.cpp
engines/scumm/imuse/drivers/pcspk.h
engines/scumm/imuse/imuse_part.cpp
diff --git a/engines/scumm/imuse/drivers/amiga.cpp b/engines/scumm/imuse/drivers/amiga.cpp
index d893e3fced7..08c3f2b8758 100644
--- a/engines/scumm/imuse/drivers/amiga.cpp
+++ b/engines/scumm/imuse/drivers/amiga.cpp
@@ -147,6 +147,7 @@ public:
void pitchBend(int16 bend) override;
void pitchBendFactor(byte value) override;
void transpose(int8 value) override;
+ void detune(uint8 value) override;
void priority(byte value) override;
void sysEx_customInstrument(uint32 type, const byte *instr, uint32 dataSize) override {}
@@ -164,6 +165,7 @@ private:
uint8 _program;
int8 _modulation;
int8 _transpose;
+ int8 _detune;
int16 _pitchBend;
uint8 _pitchBendSensitivity;
uint16 _volume;
@@ -475,7 +477,7 @@ SoundChannel_Amiga *SoundChannel_Amiga::_channels[4] = { nullptr, nullptr, nullp
const int8 SoundChannel_Amiga::_muteData[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IMusePart_Amiga::IMusePart_Amiga(IMuseDriver_Amiga *driver, int id) : _driver(driver), _id(id), _allocated(false), _out(nullptr), _priority(0), _program(0),
- _pitchBend(0), _pitchBendSensitivity(2), _volume(0), _modulation(0), _transpose(0), _sustain(false) {
+ _pitchBend(0), _pitchBendSensitivity(2), _volume(0), _modulation(0), _transpose(0), _detune(0), _sustain(false) {
}
bool IMusePart_Amiga::allocate() {
@@ -524,7 +526,7 @@ void IMusePart_Amiga::noteOn(byte note, byte velocity) {
chan->connect(this);
// The velocity parameter is ignored here.
- chan->noteOn(note, _volume, _program, _transpose, (_pitchBend * _pitchBendSensitivity) >> 6);
+ chan->noteOn(note, _volume, _program, _transpose, ((_pitchBend * _pitchBendSensitivity) >> 6) + _detune);
}
void IMusePart_Amiga::controlChange(byte control, byte value) {
@@ -557,19 +559,25 @@ void IMusePart_Amiga::programChange(byte program) {
void IMusePart_Amiga::pitchBend(int16 bend) {
_pitchBend = bend;
for (SoundChannel_Amiga *cur = _out; cur; cur = cur->next())
- cur->transposePitchBend(_transpose, (_pitchBend * _pitchBendSensitivity) >> 6);
+ cur->transposePitchBend(_transpose, ((_pitchBend * _pitchBendSensitivity) >> 6) + _detune);
}
void IMusePart_Amiga::pitchBendFactor(byte value) {
_pitchBendSensitivity = value;
for (SoundChannel_Amiga *cur = _out; cur; cur = cur->next())
- cur->transposePitchBend(_transpose, (_pitchBend * _pitchBendSensitivity) >> 6);
+ cur->transposePitchBend(_transpose, ((_pitchBend * _pitchBendSensitivity) >> 6) + _detune);
}
void IMusePart_Amiga::transpose(int8 value) {
_transpose = value << 1;
for (SoundChannel_Amiga *cur = _out; cur; cur = cur->next())
- cur->transposePitchBend(_transpose, (_pitchBend * _pitchBendSensitivity) >> 6);
+ cur->transposePitchBend(_transpose, ((_pitchBend * _pitchBendSensitivity) >> 6) + _detune);
+}
+
+void IMusePart_Amiga::detune(uint8 value) {
+ _detune = (int8)value;
+ for (SoundChannel_Amiga *cur = _out; cur; cur = cur->next())
+ cur->transposePitchBend(_transpose, ((_pitchBend * _pitchBendSensitivity) >> 6) + _detune);
}
void IMusePart_Amiga::priority(byte value) {
diff --git a/engines/scumm/imuse/drivers/mac_m68k.cpp b/engines/scumm/imuse/drivers/mac_m68k.cpp
index cc8669d5b69..9e5cc6df1c1 100644
--- a/engines/scumm/imuse/drivers/mac_m68k.cpp
+++ b/engines/scumm/imuse/drivers/mac_m68k.cpp
@@ -361,7 +361,7 @@ void IMuseDriver_MacM68k::MidiChannel_MacM68k::noteOn(byte note, byte velocity)
voice->out.end = voice->out.loopEnd;
// Set up the pitch
- _owner->setPitch(&voice->out, (note << 7) + _pitchBend);
+ _owner->setPitch(&voice->out, ((note + _transpose) << 7) + ((_pitchBend * _pitchBendFactor) >> 6) + _detune);
// Set up the sample position
voice->out.instrument = voice->out.soundStart;
@@ -373,9 +373,9 @@ void IMuseDriver_MacM68k::MidiChannel_MacM68k::programChange(byte program) {
}
void IMuseDriver_MacM68k::MidiChannel_MacM68k::pitchBend(int16 bend) {
- _pitchBend = (bend * _pitchBendFactor) >> 6;
+ _pitchBend = bend;
for (VoiceChannel *i = _voice; i; i = i->next) {
- _owner->setPitch(&i->out, (i->note << 7) + _pitchBend);
+ _owner->setPitch(&i->out, ((i->note + _transpose) << 7) + ((_pitchBend * _pitchBendFactor) >> 6) + _detune);
}
}
@@ -418,6 +418,21 @@ void IMuseDriver_MacM68k::MidiChannel_MacM68k::pitchBendFactor(byte value) {
_pitchBendFactor = value;
}
+
+void IMuseDriver_MacM68k::MidiChannel_MacM68k::transpose(int8 value) {
+ _transpose = value;
+ for (VoiceChannel *i = _voice; i; i = i->next) {
+ _owner->setPitch(&i->out, ((i->note + _transpose) << 7) + ((_pitchBend * _pitchBendFactor) >> 6) + _detune);
+ }
+}
+
+void IMuseDriver_MacM68k::MidiChannel_MacM68k::detune(uint8 value) {
+ _detune = (int8)value;
+ for (VoiceChannel *i = _voice; i; i = i->next) {
+ _owner->setPitch(&i->out, ((i->note + _transpose) << 7) + ((_pitchBend * _pitchBendFactor) >> 6) + _detune);
+ }
+};
+
void IMuseDriver_MacM68k::MidiChannel_MacM68k::priority(byte value) {
_priority = value;
}
@@ -440,7 +455,7 @@ bool IMuseDriver_MacM68k::MidiChannel_MacM68k::allocate() {
_priority = 0;
memset(&_instrument, 0, sizeof(_instrument));
_pitchBend = 0;
- _pitchBendFactor = 0;
+ _pitchBendFactor = 2;
_volume = 0;
return true;
}
diff --git a/engines/scumm/imuse/drivers/mac_m68k.h b/engines/scumm/imuse/drivers/mac_m68k.h
index b0fb064ba07..36a4546aef5 100644
--- a/engines/scumm/imuse/drivers/mac_m68k.h
+++ b/engines/scumm/imuse/drivers/mac_m68k.h
@@ -128,7 +128,8 @@ private:
class MidiChannel_MacM68k : public MidiChannel {
friend class IMuseDriver_MacM68k;
public:
- MidiChannel_MacM68k(IMuseDriver_MacM68k *driver, byte number) : MidiChannel(), _owner(driver), _number(number), _allocated(false) {}
+ MidiChannel_MacM68k(IMuseDriver_MacM68k *driver, byte number) : MidiChannel(), _owner(driver), _number(number), _allocated(false),
+ _priority(0), _sustain(0), _pitchBend(0), _pitchBendFactor(2), _transpose(0), _detune(0), _volume(0) {}
MidiDriver *device() override { return _owner; }
byte getNumber() override { return _number; }
void release() override;
@@ -140,6 +141,8 @@ private:
void pitchBend(int16 bend) override;
void controlChange(byte control, byte value) override;
void pitchBendFactor(byte value) override;
+ void transpose(int8 value) override;
+ void detune(byte value) override;
void priority(byte value) override;
void sysEx_customInstrument(uint32 type, const byte *instr, uint32 dataSize) override;
@@ -158,6 +161,8 @@ private:
Instrument _instrument;
int _pitchBend;
int _pitchBendFactor;
+ int8 _detune;
+ int8 _transpose;
int _volume;
};
diff --git a/engines/scumm/imuse/drivers/pcspk.cpp b/engines/scumm/imuse/drivers/pcspk.cpp
index 333ed30de5e..0854253c94a 100644
--- a/engines/scumm/imuse/drivers/pcspk.cpp
+++ b/engines/scumm/imuse/drivers/pcspk.cpp
@@ -171,8 +171,10 @@ void IMuseDriver_PCSpk::output(uint16 out) {
}
}
-IMuseDriver_PCSpk::MidiChannel_PcSpk::MidiChannel_PcSpk(IMuseDriver_PCSpk *owner, byte number) : MidiChannel(), _owner(owner), _number(number), _allocated(false) {
+IMuseDriver_PCSpk::MidiChannel_PcSpk::MidiChannel_PcSpk(IMuseDriver_PCSpk *owner, byte number) : MidiChannel(), _owner(owner), _number(number), _allocated(false),
+ _priority(0), _tl(0), _modWheel(0), _pitchBend(0), _programNr(0), _sustain(0), _pitchBendFactor(2), _pitchBendTmp(0), _transpose(0), _detune(0) {
memset(&_out, 0, sizeof(_out));
+ memset(_instrument, 0, sizeof(_instrument));
}
bool IMuseDriver_PCSpk::MidiChannel_PcSpk::allocate() {
@@ -285,7 +287,8 @@ void IMuseDriver_PCSpk::MidiChannel_PcSpk::programChange(byte program) {
}
void IMuseDriver_PCSpk::MidiChannel_PcSpk::pitchBend(int16 bend) {
- _pitchBend = (bend * _pitchBendFactor) >> 6;
+ _pitchBendTmp = bend;
+ _pitchBend = (_transpose << 7) + ((_pitchBendTmp * _pitchBendFactor) >> 6) + _detune;
}
void IMuseDriver_PCSpk::MidiChannel_PcSpk::controlChange(byte control, byte value) {
@@ -332,6 +335,16 @@ void IMuseDriver_PCSpk::MidiChannel_PcSpk::pitchBendFactor(byte value) {
_pitchBendFactor = value;
}
+void IMuseDriver_PCSpk::MidiChannel_PcSpk::transpose(int8 value) {
+ _transpose = value;
+ _pitchBend = (_transpose << 7) + ((_pitchBendTmp * _pitchBendFactor) >> 6) + _detune;
+}
+
+void IMuseDriver_PCSpk::MidiChannel_PcSpk::detune(byte value) {
+ _detune = (int8)value;
+ _pitchBend = (_transpose << 7) + ((_pitchBendTmp * _pitchBendFactor) >> 6) + _detune;
+}
+
void IMuseDriver_PCSpk::MidiChannel_PcSpk::priority(byte value) {
_priority = value;
}
diff --git a/engines/scumm/imuse/drivers/pcspk.h b/engines/scumm/imuse/drivers/pcspk.h
index 979bdf32567..5ffe2d6915c 100644
--- a/engines/scumm/imuse/drivers/pcspk.h
+++ b/engines/scumm/imuse/drivers/pcspk.h
@@ -116,6 +116,8 @@ private:
void pitchBend(int16 bend) override;
void controlChange(byte control, byte value) override;
void pitchBendFactor(byte value) override;
+ void transpose(int8 value) override;
+ void detune(byte value) override;
void priority(byte value) override;
void sysEx_customInstrument(uint32 type, const byte *instr, uint32 dataSize) override;
@@ -135,7 +137,9 @@ private:
uint8 _programNr;
uint8 _sustain;
uint8 _pitchBendFactor;
-
+ int16 _pitchBendTmp;
+ int8 _transpose;
+ int8 _detune;
};
void setupEffects(MidiChannel_PcSpk &chan, EffectEnvelope &env, EffectDefinition &def, byte flags, const byte *data);
diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp
index 7bb329b1dc1..9afdc21c9ba 100644
--- a/engines/scumm/imuse/imuse_part.cpp
+++ b/engines/scumm/imuse/imuse_part.cpp
@@ -114,11 +114,7 @@ void Part::set_detune(int8 detune) {
return;
_detune_eff = clamp((_detune = detune) + _player->getDetune(), -128, 127);
- // Some drivers handle the transpose and the detune in pitchBend()...
- if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
- sendPitchBend();
- else
- sendDetune();
+ sendDetune();
}
void Part::pitchBend(int16 value) {
@@ -159,10 +155,7 @@ void Part::set_transpose(int8 transpose, int8 clipRangeLow, int8 clipRangeHi) {
// a value of 128 with a signed int8 (a signed int8 can never be 128). The playback depends on this being implemented exactly
// like in the original driver. I found this bug with the WinUAE debugger. The DOS versions do not have that bug.
_transpose_eff = (_se->_soundType != MDT_AMIGA && _transpose == -128) ? 0 : transpose_clamp(_transpose + _player->getTranspose(), clipRangeLow, clipRangeHi);
- if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
- sendPitchBend();
- else
- sendTranspose();
+ sendTranspose();
}
void Part::sustain(bool value) {
@@ -382,12 +375,7 @@ void Part::sendPitchBend() {
return;
}
- int16 bend = _pitchbend;
-
- if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
- bend = clamp(bend + (_detune_eff * 64 / 12) + (_transpose_eff * 8192 / 12), -8192, 8191);
-
- _mc->pitchBend(bend);
+ _mc->pitchBend(_pitchbend);
}
void Part::sendVolume(int8 fadeModifier) {
@@ -414,10 +402,6 @@ void Part::sendTranspose() {
if (!_mc)
return;
- // Some drivers handle the transpose and the detune in pitchBend()...
- if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
- return;
-
_mc->transpose(_transpose_eff);
}
@@ -425,10 +409,6 @@ void Part::sendDetune() {
if (!_mc)
return;
- // Some drivers handle the transpose and the detune in pitchBend()...
- if (_se->_soundType == MDT_PCSPK || _se->_soundType == MDT_MACINTOSH)
- return;
-
_mc->detune(_detune_eff);
}
More information about the Scummvm-git-logs
mailing list