From 4dfd413ead63fbe4b93305cd37670bb829772322 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 29 Jun 2022 01:32:52 -0500 Subject: [PATCH] OPLL: fix per-channel osc, part 1 --- extern/Nuked-OPLL/opll.c | 4 ++++ extern/Nuked-OPLL/opll.h | 2 ++ src/engine/platform/opll.cpp | 16 ++++++++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/extern/Nuked-OPLL/opll.c b/extern/Nuked-OPLL/opll.c index ecff69fd..bd59709a 100644 --- a/extern/Nuked-OPLL/opll.c +++ b/extern/Nuked-OPLL/opll.c @@ -1019,6 +1019,10 @@ static void OPLL_Operator(opll_t *chip) { } chip->ch_out = ismod1 ? routput : (output>>3); + + if (!ismod1) { + chip->output_ch[(chip->cycles+1)%9] = chip->ch_out; + } } static void OPLL_DoRhythm(opll_t *chip) { diff --git a/extern/Nuked-OPLL/opll.h b/extern/Nuked-OPLL/opll.h index 85c721a7..98113939 100644 --- a/extern/Nuked-OPLL/opll.h +++ b/extern/Nuked-OPLL/opll.h @@ -191,6 +191,8 @@ typedef struct { int16_t output_m; int16_t output_r; + int16_t output_ch[9]; + } opll_t; const opll_patch_t* OPLL_GetPatchROM(uint32_t chip_type); diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 6d77ca1f..2549c96f 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -97,6 +97,10 @@ const unsigned char drumSlot[11]={ 0, 0, 0, 0, 0, 0, 6, 7, 8, 8, 7 }; +const unsigned char visMapOPLL[9]={ + 6, 7, 8, 3, 4, 5, 0, 1, 2 +}; + void DivPlatformOPLL::acquire_nuked(short* bufL, short* bufR, size_t start, size_t len) { static int o[2]; static int os; @@ -124,10 +128,18 @@ void DivPlatformOPLL::acquire_nuked(short* bufL, short* bufR, size_t start, size OPLL_Clock(&fm,o); unsigned char nextOut=cycleMapOPLL[fm.cycles]; if ((nextOut>=6 && properDrums) || !isMuted[nextOut]) { - oscBuf[nextOut]->data[oscBuf[nextOut]->needle++]=(o[0]+o[1])<<6; os+=(o[0]+o[1]); + if (vrc7) oscBuf[nextOut]->data[oscBuf[nextOut]->needle++]=(o[0]+o[1])<<6; } else { - oscBuf[nextOut]->data[oscBuf[nextOut]->needle++]=0; + if (vrc7) oscBuf[nextOut]->data[oscBuf[nextOut]->needle++]=0; + } + } + if (!vrc7) for (int i=0; i<9; i++) { + unsigned char ch=visMapOPLL[i]; + if ((i>=6 && properDrums) || !isMuted[ch]) { + oscBuf[ch]->data[oscBuf[ch]->needle++]=(fm.output_ch[i])<<6; + } else { + oscBuf[ch]->data[oscBuf[ch]->needle++]=0; } } os*=50;