From fc8a130c71529059bca416b76392faa6925dce72 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 17 Apr 2022 14:15:57 -0500 Subject: [PATCH] implement panning macro except for QSound --- src/engine/platform/gb.cpp | 5 +++++ src/engine/platform/genesis.cpp | 5 +++++ src/engine/platform/lynx.cpp | 14 ++++++++++++++ src/engine/platform/opl.cpp | 6 +++++- src/engine/platform/pce.cpp | 11 +++++++++++ src/engine/platform/saa.cpp | 20 ++++++++++++++++++++ src/engine/platform/segapcm.cpp | 24 ++++++++++++++++++++++-- src/engine/platform/swan.cpp | 11 +++++++++++ src/engine/platform/vera.cpp | 6 ++++++ src/engine/platform/x1_010.cpp | 10 ++++++++++ src/engine/platform/ym2610.cpp | 5 +++++ src/engine/platform/ym2610b.cpp | 5 +++++ src/gui/insEdit.cpp | 4 ++-- 13 files changed, 121 insertions(+), 5 deletions(-) diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index d3bb28e5e..eb7b6881e 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -192,6 +192,11 @@ void DivPlatformGB::tick(bool sysTick) { if (!chan[i].keyOff) chan[i].keyOn=true; } } + if (chan[i].std.panL.had) { + lastPan&=~(0x11<>1); + } + if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } @@ -286,7 +290,7 @@ void DivPlatformOPL::tick(bool sysTick) { chan[i].state.fb=chan[i].std.fb.val; } - if (chan[i].std.alg.had || chan[i].std.fb.had) { + if (chan[i].std.alg.had || chan[i].std.fb.had || (oplType==3 && chan[i].std.panL.had)) { if (isMuted[i]) { rWrite(chanMap[i]+ADDR_LR_FB_ALG,(chan[i].state.alg&1)|(chan[i].state.fb<<1)); if (ops==4) { diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 2c248db09..e1cbb6808 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -196,6 +196,17 @@ void DivPlatformPCE::tick(bool sysTick) { if (!chan[i].keyOff) chan[i].keyOn=true; } } + if (chan[i].std.panL.had) { + chan[i].pan&=0x0f; + chan[i].pan|=(chan[i].std.panL.val&15)<<4; + } + if (chan[i].std.panR.had) { + chan[i].pan&=0xf0; + chan[i].pan|=chan[i].std.panR.val&15; + } + if (chan[i].std.panL.had || chan[i].std.panR.had) { + chWrite(i,0x05,isMuted[i]?0:chan[i].pan); + } if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 0e06c3388..47b698051 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -166,6 +166,26 @@ void DivPlatformSAA1099::tick(bool sysTick) { if (chan[i].std.wave.had) { chan[i].psgMode=chan[i].std.wave.val&3; } + if (chan[i].std.panL.had) { + chan[i].pan&=0x0f; + chan[i].pan|=(chan[i].std.panL.val&15)<<4; + } + + if (chan[i].std.panR.had) { + chan[i].pan&=0xf0; + chan[i].pan|=chan[i].std.panR.val&15; + } + if (chan[i].std.panL.had || chan[i].std.panR.had) { + if (isMuted[i]) { + rWrite(i,0); + } else { + if (chan[i].std.vol.had) { + if (chan[i].active) rWrite(i,applyPan(chan[i].outVol&15,chan[i].pan)); + } else { + if (chan[i].active) rWrite(i,applyPan(chan[i].vol&15,chan[i].pan)); + } + } + } if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 79d7179a2..700924476 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -80,9 +80,10 @@ void DivPlatformSegaPCM::tick(bool sysTick) { for (int i=0; i<16; i++) { chan[i].std.next(); - if (chan[i].std.vol.had) { + // TODO: fix + /*if (chan[i].std.vol.had) { chan[i].outVol=(chan[i].vol*MIN(127,chan[i].std.vol.val))/127; - } + }*/ if (chan[i].std.arp.had) { if (!chan[i].inPorta) { @@ -99,6 +100,20 @@ void DivPlatformSegaPCM::tick(bool sysTick) { chan[i].freqChanged=true; } } + + if (chan[i].std.panL.had) { + chan[i].chVolL=chan[i].std.panL.val&127; + if (dumpWrites) { + addWrite(0x10002+(i<<3),chan[i].chVolL); + } + } + + if (chan[i].std.panR.had) { + chan[i].chVolR=chan[i].std.panR.val&127; + if (dumpWrites) { + addWrite(0x10003+(i<<3),chan[i].chVolR); + } + } if (chan[i].std.pitch.had) { chan[i].freqChanged=true; @@ -143,14 +158,17 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { if (dumpWrites) { addWrite(0x10086+(c.chan<<3),3); } + chan[c.chan].std.init(NULL); break; } chan[c.chan].pcm.pos=0; if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].note=c.value; chan[c.chan].baseFreq=(c.value<<6); chan[c.chan].freqChanged=true; } chan[c.chan].furnacePCM=true; + chan[c.chan].std.init(ins); if (dumpWrites) { // Sega PCM writes DivSample* s=parent->getSample(chan[c.chan].pcm.sample); addWrite(0x10086+(c.chan<<3),3+((s->offSegaPCM>>16)<<3)); @@ -167,6 +185,7 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { } } } else { + chan[c.chan].std.init(NULL); if (c.value!=DIV_NOTE_NULL) { chan[c.chan].note=c.value; } @@ -208,6 +227,7 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { chan[c.chan].keyOff=true; chan[c.chan].keyOn=false; chan[c.chan].active=false; + chan[c.chan].std.init(NULL); break; case DIV_CMD_NOTE_OFF_ENV: chan[c.chan].keyOff=true; diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 3b4a955ea..22790c641 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -173,6 +173,17 @@ void DivPlatformSwan::tick(bool sysTick) { chan[i].ws.changeWave1(chan[i].wave); } } + if (chan[i].std.panL.had) { + chan[i].pan&=0x0f; + chan[i].pan|=(chan[i].std.panL.val&15)<<4; + } + if (chan[i].std.panR.had) { + chan[i].pan&=0xf0; + chan[i].pan|=chan[i].std.panR.val&15; + } + if (chan[i].std.panL.had || chan[i].std.panR.had) { + calcAndWriteOutVol(i,chan[i].std.vol.will?chan[i].std.vol.val:15); + } if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index 99c6f8822..89cccb99d 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -184,6 +184,12 @@ void DivPlatformVERA::tick(bool sysTick) { if (chan[i].std.wave.had) { rWriteHi(i,3,chan[i].std.wave.val); } + if (i<16) { + if (chan[i].std.panL.had) { + chan[i].pan=chan[i].std.panL.val&3; + rWriteHi(i,2,isMuted[i]?0:chan[i].pan); + } + } if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index 229d8eab6..9c9b3e20d 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -372,6 +372,16 @@ void DivPlatformX1_010::tick(bool sysTick) { } } } + if (chan[i].std.panL.had) { + chan[i].pan&=0x0f; + chan[i].pan|=(chan[i].std.panL.val&15)<<4; + chan[i].envChanged=true; + } + if (chan[i].std.panR.had) { + chan[i].pan&=0xf0; + chan[i].pan|=chan[i].std.panR.val&15; + chan[i].envChanged=true; + } if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 6f4a1e46c..f955303d3 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -408,6 +408,11 @@ void DivPlatformYM2610::tick(bool sysTick) { } } + if (chan[i].std.panL.had) { + chan[i].pan=chan[i].std.panL.val&3; + rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); + } + if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 04bc096a9..75855f4fc 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -472,6 +472,11 @@ void DivPlatformYM2610B::tick(bool sysTick) { } } + if (chan[i].std.panL.had) { + chan[i].pan=chan[i].std.panL.val&3; + rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4)); + } + if (chan[i].std.pitch.had) { chan[i].freqChanged=true; } diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index d3f297d40..995cc6e31 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -176,7 +176,7 @@ const char* n163UpdateBits[8]={ }; const char* panBits[3]={ - "left", "right", NULL + "right", "left", NULL }; const char* oneBit[2]={ @@ -2826,7 +2826,7 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_AMIGA) { panMax=127; } - if (ins->type==DIV_INS_X1_010 || ins->type==DIV_INS_PCE) { + if (ins->type==DIV_INS_X1_010 || ins->type==DIV_INS_PCE || ins->type==DIV_INS_MIKEY || ins->type==DIV_INS_SAA1099) { panMax=15; }