diff options
author | Wohlstand <admin@wohlnet.ru> | 2018-07-30 19:42:28 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2018-07-30 19:42:28 +0300 |
commit | 6d48a253fe63b5e18ee03dd8c1f090323182f219 (patch) | |
tree | 2baa318d684fc741ad30c097b5e31f6d49ba273f | |
parent | 0f69d504792776967b61f8987ad458c48b4a322f (diff) | |
download | libADLMIDI-6d48a253fe63b5e18ee03dd8c1f090323182f219.tar.gz libADLMIDI-6d48a253fe63b5e18ee03dd8c1f090323182f219.tar.bz2 libADLMIDI-6d48a253fe63b5e18ee03dd8c1f090323182f219.zip |
[Experimental] Partially apply fixes to kode54's pull request
-rw-r--r-- | src/adlmidi.cpp | 6 | ||||
-rw-r--r-- | src/adlmidi_opl3.cpp | 22 | ||||
-rw-r--r-- | src/chips/nuked/nukedopl3.c | 37 | ||||
-rw-r--r-- | src/chips/nuked/nukedopl3_174.c | 47 | ||||
-rw-r--r-- | src/chips/opl_chip_base.h | 2 | ||||
-rw-r--r-- | utils/midiplay/adlmidiplay.cpp | 4 |
6 files changed, 87 insertions, 31 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp index 751afcf..09cf7ea 100644 --- a/src/adlmidi.cpp +++ b/src/adlmidi.cpp @@ -449,12 +449,12 @@ ADLMIDI_EXPORT void adl_setLoopEnabled(ADL_MIDIPlayer *device, int loopEn) ADLMIDI_EXPORT void adl_setSoftPanEnabled(ADL_MIDIPlayer *device, int softPanEn) { - if (!device) + if(!device) return; MidiPlayer *play = GET_MIDI_PLAYER(device); - if (!play) + if(!play) return; - play->m_synth.m_softPanning = softPanEn != 0; + play->m_synth.m_softPanning = (softPanEn != 0); } /* !!!DEPRECATED!!! */ 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<uint16_t>(address), static_cast<uint8_t>(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 } } diff --git a/src/chips/nuked/nukedopl3.c b/src/chips/nuked/nukedopl3.c index 94b1f9d..41f4ca3 100644 --- a/src/chips/nuked/nukedopl3.c +++ b/src/chips/nuked/nukedopl3.c @@ -36,10 +36,6 @@ #define RSM_FRAC 10 -#ifndef PI -#define PI 3.14159265358979323846 -#endif - /* Channel types */ enum { @@ -182,6 +178,31 @@ static const Bit8u ch_slot[18] = { }; /* + * Pan law table + */ + +static Bit16u panlawtable[] = +{ + 65535, 65529, 65514, 65489, 65454, 65409, 65354, 65289, + 65214, 65129, 65034, 64929, 64814, 64689, 64554, 64410, + 64255, 64091, 63917, 63733, 63540, 63336, 63123, 62901, + 62668, 62426, 62175, 61914, 61644, 61364, 61075, 60776, + 60468, 60151, 59825, 59489, 59145, 58791, 58428, 58057, + 57676, 57287, 56889, 56482, 56067, 55643, 55211, 54770, + 54320, 53863, 53397, 52923, 52441, 51951, 51453, 50947, + 50433, 49912, 49383, 48846, 48302, 47750, 47191, 46625, + 46052, /* Center */ + 45472, 44885, 44291, 43690, 43083, 42469, 41848, 41221, + 40588, 39948, 39303, 38651, 37994, 37330, 36661, 35986, + 35306, 34621, 33930, 33234, 32533, 31827, 31116, 30400, + 29680, 28955, 28225, 27492, 26754, 26012, 25266, 24516, + 23762, 23005, 22244, 21480, 20713, 19942, 19169, 18392, + 17613, 16831, 16046, 15259, 14469, 13678, 12884, 12088, + 11291, 10492, 9691, 8888, 8085, 7280, 6473, 5666, + 4858, 4050, 3240, 2431, 1620, 810, 0 +}; + +/* * Envelope generator */ @@ -1236,8 +1257,8 @@ void OPL3_Reset(opl3_chip *chip, Bit32u samplerate) chip->channel[channum].chtype = ch_2op; chip->channel[channum].cha = 0xffff; chip->channel[channum].chb = 0xffff; - chip->channel[channum].chl = 0xffff; - chip->channel[channum].chr = 0xffff; + chip->channel[channum].chl = 46052; + chip->channel[channum].chr = 46052; chip->channel[channum].ch_num = channum; OPL3_ChannelSetupAlg(&chip->channel[channum]); } @@ -1249,8 +1270,8 @@ void OPL3_Reset(opl3_chip *chip, Bit32u samplerate) static void OPL3_ChannelWritePan(opl3_channel *channel, Bit8u data) { - channel->chl = (Bit16u)(cos((float)data * (PI / 2.0f / 127.0f)) * 65535.0f); - channel->chr = (Bit16u)(sin((float)data * (PI / 2.0f / 127.0f)) * 65535.0f); + channel->chl = panlawtable[data & 0x7F]; + channel->chr = panlawtable[0x7F - (data & 0x7F)]; } void OPL3_WritePan(opl3_chip *chip, Bit16u reg, Bit8u v) diff --git a/src/chips/nuked/nukedopl3_174.c b/src/chips/nuked/nukedopl3_174.c index a8b1f40..23857c9 100644 --- a/src/chips/nuked/nukedopl3_174.c +++ b/src/chips/nuked/nukedopl3_174.c @@ -34,11 +34,7 @@ #define RSM_FRAC 10 -#ifndef PI -#define PI 3.14159265358979323846 -#endif - - /* Channel types */ +/* Channel types */ enum { ch_2op = 0, @@ -234,6 +230,31 @@ static const Bit8u ch_slot[18] = { }; /* + * Pan law table + */ + +static Bit16u panlawtable[] = +{ + 65535, 65529, 65514, 65489, 65454, 65409, 65354, 65289, + 65214, 65129, 65034, 64929, 64814, 64689, 64554, 64410, + 64255, 64091, 63917, 63733, 63540, 63336, 63123, 62901, + 62668, 62426, 62175, 61914, 61644, 61364, 61075, 60776, + 60468, 60151, 59825, 59489, 59145, 58791, 58428, 58057, + 57676, 57287, 56889, 56482, 56067, 55643, 55211, 54770, + 54320, 53863, 53397, 52923, 52441, 51951, 51453, 50947, + 50433, 49912, 49383, 48846, 48302, 47750, 47191, 46625, + 46052, /* Center */ + 45472, 44885, 44291, 43690, 43083, 42469, 41848, 41221, + 40588, 39948, 39303, 38651, 37994, 37330, 36661, 35986, + 35306, 34621, 33930, 33234, 32533, 31827, 31116, 30400, + 29680, 28955, 28225, 27492, 26754, 26012, 25266, 24516, + 23762, 23005, 22244, 21480, 20713, 19942, 19169, 18392, + 17613, 16831, 16046, 15259, 14469, 13678, 12884, 12088, + 11291, 10492, 9691, 8888, 8085, 7280, 6473, 5666, + 4858, 4050, 3240, 2431, 1620, 810, 0 +}; + +/* * Envelope generator */ @@ -1086,7 +1107,7 @@ void OPL3v17_Generate(opl3_chip *chip, Bit16s *buf) { accm += *chip->channel[ii].out[jj]; } - chip->mixbuff[0] += (Bit16s)(accm & chip->channel[ii].cha); + chip->mixbuff[0] += (Bit16s)((accm * chip->channel[ii].chl / 65535) & chip->channel[ii].cha); } for (ii = 15; ii < 18; ii++) @@ -1125,7 +1146,7 @@ void OPL3v17_Generate(opl3_chip *chip, Bit16s *buf) { accm += *chip->channel[ii].out[jj]; } - chip->mixbuff[1] += (Bit16s)(accm & chip->channel[ii].chb); + chip->mixbuff[1] += (Bit16s)((accm * chip->channel[ii].chr / 65535) & chip->channel[ii].chb); } for (ii = 33; ii < 36; ii++) @@ -1224,10 +1245,10 @@ void OPL3v17_Reset(opl3_chip *chip, Bit32u samplerate) chip->channel[channum].out[2] = &chip->zeromod; chip->channel[channum].out[3] = &chip->zeromod; chip->channel[channum].chtype = ch_2op; - chip->channel[channum].cha = ~0; - chip->channel[channum].chb = ~0; - chip->channel[channum].chl = ~0; - chip->channel[channum].chr = ~0; + chip->channel[channum].cha = 0xffff; + chip->channel[channum].chb = 0xffff; + chip->channel[channum].chl = 46052; + chip->channel[channum].chr = 46052; OPL3_ChannelSetupAlg(&chip->channel[channum]); } chip->noise = 0x306600; @@ -1238,8 +1259,8 @@ void OPL3v17_Reset(opl3_chip *chip, Bit32u samplerate) static void OPL3v17_ChannelWritePan(opl3_channel *channel, Bit8u data) { - channel->chl = (Bit16u)(cos((float)data * (PI / 2.0f / 127.0f)) * 65535.0f); - channel->chr = (Bit16u)(sin((float)data * (PI / 2.0f / 127.0f)) * 65535.0f); + channel->chl = panlawtable[data & 0x7F]; + channel->chr = panlawtable[0x7F - (data & 0x7F)]; } void OPL3v17_WritePan(opl3_chip *chip, Bit16u reg, Bit8u v) diff --git a/src/chips/opl_chip_base.h b/src/chips/opl_chip_base.h index faee307..723bbc9 100644 --- a/src/chips/opl_chip_base.h +++ b/src/chips/opl_chip_base.h @@ -62,7 +62,7 @@ public: virtual void writeReg(uint16_t addr, uint8_t data) = 0; // extended - virtual void writePan(uint16_t addr, uint8_t data) { }; + virtual void writePan(uint16_t addr, uint8_t data) { (void)addr; (void)data; } virtual void nativePreGenerate() = 0; virtual void nativePostGenerate() = 0; diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp index 16a9dde..9fedb64 100644 --- a/utils/midiplay/adlmidiplay.cpp +++ b/utils/midiplay/adlmidiplay.cpp @@ -247,6 +247,7 @@ int main(int argc, char **argv) " --solo <track> Selects a solo track to play\n" " --only <track1,...,trackN> Selects a subset of tracks to play\n" #ifndef HARDWARE_OPL3 + " -fp Enables full-panning stereo support" " --emu-nuked Uses Nuked OPL3 v 1.8 emulator\n" " --emu-nuked7 Uses Nuked OPL3 v 1.7.4 emulator\n" " --emu-dosbox Uses DosBox 0.74 OPL3 emulator\n" @@ -405,7 +406,8 @@ int main(int argc, char **argv) else if(!std::strcmp("--emu-dosbox", argv[2])) emulator = ADLMIDI_EMU_DOSBOX; #endif - + else if(!std::strcmp("-fp", argv[2])) + adl_setSoftPanEnabled(myDevice, 1); else if(!std::strcmp("-mb", argv[2])) multibankFromEnbededTest = true; else if(!std::strcmp("-s", argv[2])) |