aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_opl3.cpp
diff options
context:
space:
mode:
authorChristopher Snowhill <kode54@gmail.com>2018-07-29 20:52:26 -0700
committerChristopher Snowhill <kode54@gmail.com>2018-07-29 20:52:26 -0700
commit0f69d504792776967b61f8987ad458c48b4a322f (patch)
tree0884f6008b6433b3f25d454884d8c9f6b9f7fac1 /src/adlmidi_opl3.cpp
parentb5a38c540d5a2b5b6750a49eb25ca3c7388b099c (diff)
downloadlibADLMIDI-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.cpp21
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.