aboutsummaryrefslogtreecommitdiff
path: root/sky/music
diff options
context:
space:
mode:
authorRobert Göffringmann2003-08-20 12:12:11 +0000
committerRobert Göffringmann2003-08-20 12:12:11 +0000
commitaf17c1ac5161b261c4c8c41e360dd5d11b7859d7 (patch)
tree4c5b3a0dcda7056175951a0a747f303b3318e721 /sky/music
parent123af301474cac28e53f96b5f23f229429d32eaa (diff)
downloadscummvm-rg350-af17c1ac5161b261c4c8c41e360dd5d11b7859d7.tar.gz
scummvm-rg350-af17c1ac5161b261c4c8c41e360dd5d11b7859d7.tar.bz2
scummvm-rg350-af17c1ac5161b261c4c8c41e360dd5d11b7859d7.zip
copied some fixes which only were in 0.5.1 branch.
svn-id: r9799
Diffstat (limited to 'sky/music')
-rw-r--r--sky/music/gmchannel.cpp19
-rw-r--r--sky/music/gmchannel.h1
-rw-r--r--sky/music/gmmusic.cpp1
3 files changed, 13 insertions, 8 deletions
diff --git a/sky/music/gmchannel.cpp b/sky/music/gmchannel.cpp
index 31c5e97847..7442b171c9 100644
--- a/sky/music/gmchannel.cpp
+++ b/sky/music/gmchannel.cpp
@@ -21,11 +21,6 @@
#include "gmchannel.h"
-// the MT32 is a lot more sensitive to velocities than most general midi devices,
-// so we need to boost them a little
-
-
-
SkyGmChannel::SkyGmChannel(uint8 *pMusicData, uint16 startOfData, MidiDriver *pMidiDrv, byte *pInstMap, uint8 *veloTab)
{
_musicData = pMusicData;
@@ -38,7 +33,8 @@ SkyGmChannel::SkyGmChannel(uint8 *pMusicData, uint16 startOfData, MidiDriver *pM
_mt32_to_gm = pInstMap;
_veloTab = veloTab;
- _musicVolume = 0x100;
+ _musicVolume = 0x7F;
+ _lastVolume = 0xFF;
}
bool SkyGmChannel::isActive(void) {
@@ -49,6 +45,12 @@ bool SkyGmChannel::isActive(void) {
void SkyGmChannel::updateVolume(uint16 pVolume) {
_musicVolume = pVolume;
+ if (_musicVolume > 0)
+ _musicVolume = (_musicVolume * 2) / 3 + 43;
+ if (_lastVolume < 0xFF) {
+ uint8 newVol = (_lastVolume * _musicVolume) >> 7;
+ _midiDrv->send((0xB0 | _channelData.midiChannelNumber) | 0x700 | (newVol << 16));
+ }
}
void SkyGmChannel::stopNote(void) {
@@ -166,8 +168,9 @@ void SkyGmChannel::com90_getPitch(void) {
void SkyGmChannel::com90_getChannelVolume(void) {
- _midiDrv->send((0xB0 | _channelData.midiChannelNumber) | 0x700 | (_musicData[_channelData.eventDataPtr] << 16));
- _channelData.eventDataPtr++;
+ _lastVolume = _musicData[_channelData.eventDataPtr];
+ uint8 newVol = (uint8)((_musicData[_channelData.eventDataPtr++] * _musicVolume) >> 7);
+ _midiDrv->send((0xB0 | _channelData.midiChannelNumber) | 0x700 | (newVol << 16));
}
void SkyGmChannel::com90_rewindMusic(void) {
diff --git a/sky/music/gmchannel.h b/sky/music/gmchannel.h
index 4684678c45..1cf2e02177 100644
--- a/sky/music/gmchannel.h
+++ b/sky/music/gmchannel.h
@@ -50,6 +50,7 @@ private:
uint8 *_musicData;
uint16 _musicVolume;
MidiChannelType _channelData;
+ uint8 _lastVolume;
//- normal subs
void setRegister(uint8 regNum, uint8 value);
int32 getNextEventTime(void);
diff --git a/sky/music/gmmusic.cpp b/sky/music/gmmusic.cpp
index f274be95db..b4fdeeb510 100644
--- a/sky/music/gmmusic.cpp
+++ b/sky/music/gmmusic.cpp
@@ -86,6 +86,7 @@ void SkyGmMusic::setupChannels(uint8 *channelData) {
for (uint8 cnt = 0; cnt < _numberOfChannels; cnt++) {
uint16 chDataStart = ((channelData[(cnt << 1) | 1] << 8) | channelData[cnt << 1]) + _musicDataLoc;
_channels[cnt] = new SkyGmChannel(_musicData, chDataStart, _midiDrv, _mt32_to_gm, _veloTab);
+ _channels[cnt]->updateVolume(_musicVolume);
}
}