[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