diff options
-rw-r--r-- | engines/agi/sound_2gs.cpp | 25 | ||||
-rw-r--r-- | engines/agi/sound_2gs.h | 10 |
2 files changed, 20 insertions, 15 deletions
diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index e054c16c12..af1ff435a6 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -206,16 +206,16 @@ uint SoundGen2GS::generateOutput() { // Take envelope and MIDI volume information into account. // Also amplify. - s0 *= vol * g->vel / 127 * 80 / 256; - s1 *= vol * g->vel / 127 * 80 / 256; + s0 *= vol * g->velocity / 127 * 80 / 256; + s1 *= vol * g->velocity / 127 * 80 / 256; // Select output channel. - if (g->osc[0].chn) + if (g->osc[0].rightChannel) outl += s0; else outr += s0; - if (g->osc[1].chn) + if (g->osc[1].rightChannel) outl += s1; else outr += s1; @@ -361,7 +361,7 @@ void SoundGen2GS::advanceMidiPlayer() { void SoundGen2GS::midiNoteOff(int channel, int note, int velocity) { // Release keys within the given MIDI channel for (int i = 0; i < MAX_GENERATORS; i++) { - if (_generators[i].chn == channel && _generators[i].key == note) + if (_generators[i].channel == channel && _generators[i].key == note) _generators[i].seg = _generators[i].ins->seg; } } @@ -384,8 +384,8 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { velocity = 127; g->key = note; - g->vel = velocity * _channels[channel].getVolume() / 127; - g->chn = channel; + g->velocity = velocity * _channels[channel].getVolume() / 127; + g->channel = channel; // Instruments can define different samples to be used based on // what the key is. Find the correct samples for our key. @@ -404,7 +404,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { g->osc[0].halt = i->wave[0][wa].halt; g->osc[0].loop = i->wave[0][wa].loop; g->osc[0].swap = i->wave[0][wa].swap; - g->osc[0].chn = i->wave[0][wa].chn; + g->osc[0].rightChannel = i->wave[0][wa].rightChannel; g->osc[1].base = i->base + i->wave[1][wb].offset; g->osc[1].size = i->wave[1][wb].size; @@ -413,7 +413,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { g->osc[1].halt = i->wave[1][wb].halt; g->osc[1].loop = i->wave[1][wb].loop; g->osc[1].swap = i->wave[1][wb].swap; - g->osc[1].chn = i->wave[1][wb].chn; + g->osc[1].rightChannel = i->wave[1][wb].rightChannel; g->seg = 0; g->a = 0; @@ -551,7 +551,12 @@ bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreA wave[i][k].halt = b & 0x1; // Bit 0 = HALT wave[i][k].loop = !(b & 0x2); // Bit 1 =!LOOP wave[i][k].swap = (b & 0x6) == 0x6; // Bit 1&2 = SWAP - wave[i][k].chn = (b >> 4) > 0; // Output channel (left or right) + // channels seem to be reversed, verified with emulator + captured apple IIgs music + if (b >> 4) { + wave[i][k].rightChannel = false; // Bit 4 set = left channel + } else { + wave[i][k].rightChannel = true; // Bit 4 not set = right channel + } } } diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index 4eaba528cc..51426e090e 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -85,7 +85,7 @@ struct IIgsInstrumentHeader { bool halt; ///< Oscillator halted? bool loop; ///< Loop mode? bool swap; ///< Swap mode? - bool chn; ///< Output channel (left / right) + bool rightChannel; ///< Output channel (left / right) int16 tune; ///< Fine tune in semitones (8.8 fixed point) } wave[2][MAX_OSCILLATOR_WAVES]; @@ -122,7 +122,7 @@ struct IIgsSampleHeader { class IIgsGenerator { public: - IIgsGenerator() : ins(NULL), key(-1), chn(-1) { + IIgsGenerator() : ins(NULL), key(-1), channel(-1) { memset(&osc, 0, sizeof(osc)); seg = 0; a = 0; @@ -130,8 +130,8 @@ public: const IIgsInstrumentHeader *ins; ///< Currently used instrument int key; ///< MIDI key - int vel; ///< MIDI velocity (& channel volume) - int chn; ///< MIDI channel + int velocity; ///< MIDI velocity (& channel volume) + int channel; ///< MIDI channel struct { int8 *base; ///< Sample base pointer uint size; ///< Sample size @@ -140,7 +140,7 @@ public: bool halt; ///< Is oscillator halted? bool loop; ///< Is looping enabled? bool swap; ///< Is swapping enabled? - bool chn; ///< Output channel (left / right) + bool rightChannel; ///< Output channel (left / right) } osc[2]; int seg; ///< Current envelope segment frac_t a; ///< Current envelope amplitude |