diff options
author | Wohlstand <admin@wohlnet.ru> | 2025-03-25 22:29:00 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2025-03-25 22:29:00 +0300 |
commit | b6ee41ae3b0840ad80458d423553192344f9ef34 (patch) | |
tree | 45cf686ff26efefd6db5484f1960fd066cd7373b | |
parent | 7f6a54208bc9da2b100ef1a6d5ddbf19516aedd6 (diff) | |
download | libADLMIDI-b6ee41ae3b0840ad80458d423553192344f9ef34.tar.gz libADLMIDI-b6ee41ae3b0840ad80458d423553192344f9ef34.tar.bz2 libADLMIDI-b6ee41ae3b0840ad80458d423553192344f9ef34.zip |
Do cache the panning register
-rw-r--r-- | src/adlmidi_opl3.cpp | 10 | ||||
-rw-r--r-- | src/adlmidi_opl3.hpp | 2 |
2 files changed, 11 insertions, 1 deletions
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index cc3718d..bb59978 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -1541,6 +1541,8 @@ void OPL3::setPatch(size_t c, const OplTimbre &instrument) if(m_currentChipType == OPLChipBase::CHIPTYPE_OPL2) writeRegI(chip, 0xC0 + g_channelsMapPan[cc], instrument.feedconn); + else + writeRegI(chip, 0xC0 + g_channelsMapPan[cc], instrument.feedconn | (m_regC0[c] & OPL_PANNING_BOTH)); } void OPL3::setPan(size_t c, uint8_t value) @@ -1548,7 +1550,10 @@ void OPL3::setPan(size_t c, uint8_t value) size_t chip = c / NUM_OF_CHANNELS, cc = c % NUM_OF_CHANNELS; if(m_currentChipType == OPLChipBase::CHIPTYPE_OPL2) + { + m_regC0[c] = OPL_PANNING_BOTH; return; // OPL2 chip doesn't support panning at all + } if(g_channelsMapPan[cc] != 0xFFF) { @@ -1556,14 +1561,16 @@ void OPL3::setPan(size_t c, uint8_t value) if (m_softPanningSup && m_softPanning) { writePan(chip, g_channelsMapPan[cc], value); + m_regC0[c] = OPL_PANNING_BOTH; writeRegI(chip, 0xC0 + g_channelsMapPan[cc], m_insCache[c].feedconn | OPL_PANNING_BOTH); } else { #endif - int panning = 0; + uint8_t panning = 0; if(value < 64 + 16) panning |= OPL_PANNING_LEFT; if(value >= 64 - 16) panning |= OPL_PANNING_RIGHT; + m_regC0[c] = panning; writePan(chip, g_channelsMapPan[cc], 64); writeRegI(chip, 0xC0 + g_channelsMapPan[cc], m_insCache[c].feedconn | panning); #ifndef ADLMIDI_HW_OPL @@ -1804,6 +1811,7 @@ void OPL3::reset(int emulator, unsigned long PCM_RATE, void *audioTickHandler) m_insCache.resize(m_numChannels, defaultInsCache); m_keyBlockFNumCache.resize(m_numChannels, 0); m_regBD.resize(m_numChips, 0); + m_regC0.resize(m_numChips, OPL_PANNING_BOTH); m_channelCategory.resize(m_numChannels, 0); for(size_t i = 0; i < m_numChips; ++i) diff --git a/src/adlmidi_opl3.hpp b/src/adlmidi_opl3.hpp index 5b472f7..362b301 100644 --- a/src/adlmidi_opl3.hpp +++ b/src/adlmidi_opl3.hpp @@ -74,6 +74,8 @@ private: std::vector<uint32_t> m_keyBlockFNumCache; //! Cached BD registry value (flags register: DeepTremolo, DeepVibrato, and RhythmMode) std::vector<uint32_t> m_regBD; + //! Cached C0 register value (primarily for the panning state) + std::vector<uint8_t> m_regC0; #ifdef ADLMIDI_ENABLE_HW_SERIAL bool m_serial; |