From ad1ed7fe3567e4c2a5bd9771077c1c55dce30a31 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 1 Jun 2022 18:10:50 -0500 Subject: [PATCH] newVolumeScaling, part 3 --- src/engine/platform/opl.cpp | 22 +++++++++++----------- src/engine/platform/opll.cpp | 31 ++++++++----------------------- 2 files changed, 19 insertions(+), 34 deletions(-) diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index c8d728292..666826ba3 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -342,7 +342,7 @@ void DivPlatformOPL::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=(chan[i].vol*MIN(63,chan[i].std.vol.val))/63; + chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(63,chan[i].std.vol.val),63); for (int j=0; jmelodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[i].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -480,7 +480,7 @@ void DivPlatformOPL::tick(bool sysTick) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[i].state.alg][j] || i>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[i].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -689,7 +689,7 @@ void DivPlatformOPL::muteChannel(int ch, bool mute) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[ch].state.alg][i] || ch>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[ch].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -820,7 +820,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { if (isMuted[ch]) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[ch].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); } rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,(op.am<<7)|(op.vib<<6)|(op.sus<<5)|(op.ksr<<4)|op.mult); @@ -855,7 +855,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[c.chan].state.alg][i] || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[c.chan].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -971,7 +971,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[c.chan].state.alg][i] || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[c.chan].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1120,7 +1120,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[c.chan].state.alg][c.value] || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[c.chan].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1350,7 +1350,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[c.chan].state.alg][i] || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[c.chan].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1367,7 +1367,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[c.chan].state.alg][c.value] || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[c.chan].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1441,7 +1441,7 @@ void DivPlatformOPL::forceIns() { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (isOutputL[ops==4][chan[i].state.alg][j] || i>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-(((63-op.tl)*(chan[i].outVol&0x3f))/63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 58893d465..8ce215346 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -149,9 +149,9 @@ void DivPlatformOPLL::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=(chan[i].vol*MIN(15,chan[i].std.vol.val))/15; + chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(15,chan[i].std.vol.val),15); if (i<9) { - rWrite(0x30+i,((15-(chan[i].outVol*(15-chan[i].state.op[1].tl))/15)&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } } @@ -174,7 +174,7 @@ void DivPlatformOPLL::tick(bool sysTick) { if (chan[i].std.wave.had && chan[i].state.opllPreset!=16) { chan[i].state.opllPreset=chan[i].std.wave.val; if (i<9) { - rWrite(0x30+i,((15-(chan[i].outVol*(15-chan[i].state.op[1].tl))/15)&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } } @@ -244,7 +244,7 @@ void DivPlatformOPLL::tick(bool sysTick) { op.tl=((j==1)?15:63)-m.tl.val; if (j==1) { if (i<9) { - rWrite(0x30+i,((15-(chan[i].outVol*(15-chan[i].state.op[1].tl))/15)&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } } else { rWrite(0x02,(chan[i].state.op[0].ksl<<6)|(op.tl&63)); @@ -384,21 +384,6 @@ int DivPlatformOPLL::toFreq(int freq) { void DivPlatformOPLL::muteChannel(int ch, bool mute) { isMuted[ch]=mute; - /* - for (int j=0; j<4; j++) { - unsigned short baseAddr=chanOffs[ch]|opOffs[j]; - DivInstrumentFM::Operator& op=chan[ch].state.op[j]; - if (isMuted[ch]) { - rWrite(baseAddr+ADDR_TL,127); - } else { - if (isOutput[chan[ch].state.alg][j]) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[ch].outVol&0x7f,127)); - } else { - rWrite(baseAddr+ADDR_TL,op.tl); - } - } - } - rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4));*/ } int DivPlatformOPLL::dispatch(DivCommand c) { @@ -483,7 +468,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { } } if (c.chan<9) { - rWrite(0x30+c.chan,((15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15)&15)|(chan[c.chan].state.opllPreset<<4)); + rWrite(0x30+c.chan,((15-VOL_SCALE_LOG(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } } } @@ -553,7 +538,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { break; } else if (c.chan<6 || !drums) { if (c.chan<9) { - rWrite(0x30+c.chan,((15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15)&15)|(chan[c.chan].state.opllPreset<<4)); + rWrite(0x30+c.chan,((15-VOL_SCALE_LOG(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } } break; @@ -647,7 +632,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { DivInstrumentFM::Operator& car=chan[c.chan].state.op[1]; car.tl=c.value2&15; if (c.chan<9) { - rWrite(0x30+c.chan,((15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15)&15)|(chan[c.chan].state.opllPreset<<4)); + rWrite(0x30+c.chan,((15-VOL_SCALE_LOG(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } } break; @@ -862,7 +847,7 @@ void DivPlatformOPLL::forceIns() { rWrite(0x07,(car.sl<<4)|(car.rr)); } if (i<9) { - rWrite(0x30+i,((15-(chan[i].outVol*(15-chan[i].state.op[1].tl))/15)&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } if (!(i>=6 && properDrums)) { if (chan[i].active) {