From 0f69d504792776967b61f8987ad458c48b4a322f Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sun, 29 Jul 2018 20:52:26 -0700 Subject: Implemented optional soft panning support for the included chip emulators, disabled by default. --- src/adlmidi_opl3.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'src/adlmidi_opl3.cpp') 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(address), static_cast(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. -- cgit v1.2.3 From 6d48a253fe63b5e18ee03dd8c1f090323182f219 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Mon, 30 Jul 2018 19:42:28 +0300 Subject: [Experimental] Partially apply fixes to kode54's pull request --- src/adlmidi_opl3.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 7075f66..3752341 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -122,6 +122,7 @@ OPL3::OPL3() : m_deepTremoloMode(false), m_deepVibratoMode(false), m_rhythmMode(false), + m_softPanning(false), m_musicMode(MODE_MIDI), m_volumeScale(VOLUME_Generic) { @@ -198,6 +199,10 @@ void OPL3::writePan(size_t chip, uint32_t address, uint32_t value) { #ifndef ADLMIDI_HW_OPL m_chips[chip]->writePan(static_cast(address), static_cast(value)); +#else + ADL_UNUSED(chip); + ADL_UNUSED(address); + ADL_UNUSED(value); #endif } @@ -369,17 +374,24 @@ 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) { - if (m_softPanning) { + if(g_channelsMap[cc] != 0xFFF) + { +#ifndef ADLMIDI_HW_OPL + if (m_softPanning) + { writePan(chip, g_channelsMap[cc], value); writeRegI(chip, 0xC0 + g_channelsMap[cc], m_insCache[c].feedconn | 0x30); } - else { + else + { +#endif int panning = 0; - if (value < 64 + 32) panning |= OPL_PANNING_LEFT; - if (value >= 64 - 32) panning |= OPL_PANNING_RIGHT; + 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); +#ifndef ADLMIDI_HW_OPL } +#endif } } -- cgit v1.2.3 From 898ba6d561fa3f821b9766f3743d6a5758cbf814 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Tue, 31 Jul 2018 01:18:28 +0300 Subject: Use macro hint instead of absolute panning mask value --- src/adlmidi_opl3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 3752341..13394f7 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -380,7 +380,7 @@ void OPL3::setPan(size_t c, uint8_t value) if (m_softPanning) { writePan(chip, g_channelsMap[cc], value); - writeRegI(chip, 0xC0 + g_channelsMap[cc], m_insCache[c].feedconn | 0x30); + writeRegI(chip, 0xC0 + g_channelsMap[cc], m_insCache[c].feedconn | OPL_PANNING_BOTH); } else { -- cgit v1.2.3 From 4802570b77fde4aefa5a99c33cc012a2591e8361 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Tue, 31 Jul 2018 03:04:20 +0200 Subject: fix the gcc warning "class-memaccess" --- src/adlmidi_opl3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 13394f7..9365e8c 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -153,7 +153,7 @@ void OPL3::setEmbeddedBank(uint32_t bank) { size_t meta = banks[bank][i]; adlinsdata2 &ins = bank_pair[i / 128]->ins[i % 128]; - ins = adlinsdata2(adlins[meta]); + ins = adlinsdata2::from_adldata(::adlins[meta]); } #else ADL_UNUSED(bank); -- cgit v1.2.3 From d8394a61e0bf71b41851b4fdf2094ac2614204e0 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Thu, 2 Aug 2018 20:19:37 +0200 Subject: add safety check for emulator switching --- src/adlmidi_opl3.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index 9365e8c..bad9cf3 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -22,6 +22,8 @@ */ #include "adlmidi_private.hpp" +#include +#include #ifdef ADLMIDI_HW_OPL static const unsigned OPLBase = 0x388; @@ -42,6 +44,45 @@ static const unsigned OPLBase = 0x388; # endif #endif +static const unsigned adl_emulatorSupport = 0 +#ifndef ADLMIDI_HW_OPL +#ifndef ADLMIDI_DISABLE_NUKED_EMULATOR + | (1u << ADLMIDI_EMU_NUKED) | (1u << ADLMIDI_EMU_NUKED_174) +#endif +#ifndef ADLMIDI_DISABLE_DOSBOX_EMULATOR + | (1u << ADLMIDI_EMU_DOSBOX) +#endif +#endif +; + +//! Check emulator availability +bool adl_isEmulatorAvailable(int emulator) +{ + return (adl_emulatorSupport & (1u << (unsigned)emulator)) != 0; +} + +//! Find highest emulator +int adl_getHighestEmulator() +{ + int emu = -1; + for(unsigned m = adl_emulatorSupport; m > 0; m >>= 1) + ++emu; + return emu; +} + +//! Find lowest emulator +int adl_getLowestEmulator() +{ + int emu = -1; + unsigned m = adl_emulatorSupport; + if(m > 0) + { + for(emu = 0; (m & 1) == 0; m >>= 1) + ++emu; + } + return emu; +} + //! Per-channel and per-operator registers map static const uint16_t g_operatorsMap[23 * 2] = { @@ -578,6 +619,8 @@ void OPL3::reset(int emulator, unsigned long PCM_RATE, void *audioTickHandler) switch(emulator) { default: + assert(false); + abort(); #ifndef ADLMIDI_DISABLE_NUKED_EMULATOR case ADLMIDI_EMU_NUKED: /* Latest Nuked OPL3 */ chip = new NukedOPL3; -- cgit v1.2.3 From 0e2807a9d4c8c900e85c9b33ba96c69a82c58a68 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 3 Aug 2018 00:36:20 +0300 Subject: Minor cosmetical changes --- src/adlmidi_opl3.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/adlmidi_opl3.cpp') diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp index bad9cf3..94602ba 100644 --- a/src/adlmidi_opl3.cpp +++ b/src/adlmidi_opl3.cpp @@ -46,12 +46,13 @@ static const unsigned OPLBase = 0x388; static const unsigned adl_emulatorSupport = 0 #ifndef ADLMIDI_HW_OPL -#ifndef ADLMIDI_DISABLE_NUKED_EMULATOR +# ifndef ADLMIDI_DISABLE_NUKED_EMULATOR | (1u << ADLMIDI_EMU_NUKED) | (1u << ADLMIDI_EMU_NUKED_174) -#endif -#ifndef ADLMIDI_DISABLE_DOSBOX_EMULATOR +# endif + +# ifndef ADLMIDI_DISABLE_DOSBOX_EMULATOR | (1u << ADLMIDI_EMU_DOSBOX) -#endif +# endif #endif ; -- cgit v1.2.3