diff options
author | Christopher Snowhill <kode54@gmail.com> | 2018-07-29 20:52:26 -0700 |
---|---|---|
committer | Christopher Snowhill <kode54@gmail.com> | 2018-07-29 20:52:26 -0700 |
commit | 0f69d504792776967b61f8987ad458c48b4a322f (patch) | |
tree | 0884f6008b6433b3f25d454884d8c9f6b9f7fac1 /src/adlmidi_opl3.cpp | |
parent | b5a38c540d5a2b5b6750a49eb25ca3c7388b099c (diff) | |
download | libADLMIDI-0f69d504792776967b61f8987ad458c48b4a322f.tar.gz libADLMIDI-0f69d504792776967b61f8987ad458c48b4a322f.tar.bz2 libADLMIDI-0f69d504792776967b61f8987ad458c48b4a322f.zip |
Implemented optional soft panning support for the included chip emulators, disabled by default.
Diffstat (limited to 'src/adlmidi_opl3.cpp')
-rw-r--r-- | src/adlmidi_opl3.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 3e33e86..7075f66 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -194,6 +194,13 @@ void OPL3::writeRegI(size_t chip, uint32_t address, uint32_t value) #endif } +void OPL3::writePan(size_t chip, uint32_t address, uint32_t value) +{ +#ifndef ADLMIDI_HW_OPL + m_chips[chip]->writePan(static_cast<uint16_t>(address), static_cast<uint8_t>(value)); +#endif +} + void OPL3::noteOff(size_t c) { @@ -362,8 +369,18 @@ void OPL3::setPatch(size_t c, const adldata &instrument) void OPL3::setPan(size_t c, uint8_t value) { size_t chip = c / 23, cc = c % 23; - if(g_channelsMap[cc] != 0xFFF) - writeRegI(chip, 0xC0 + g_channelsMap[cc], m_insCache[c].feedconn | value); + if(g_channelsMap[cc] != 0xFFF) { + if (m_softPanning) { + writePan(chip, g_channelsMap[cc], value); + writeRegI(chip, 0xC0 + g_channelsMap[cc], m_insCache[c].feedconn | 0x30); + } + else { + int panning = 0; + if (value < 64 + 32) panning |= OPL_PANNING_LEFT; + if (value >= 64 - 32) panning |= OPL_PANNING_RIGHT; + writeRegI(chip, 0xC0 + g_channelsMap[cc], m_insCache[c].feedconn | panning); + } + } } void OPL3::silenceAll() // Silence all OPL channels. |