From 93e50a4be2bb454e8224066273b5c50f9aeefecf Mon Sep 17 00:00:00 2001 From: nicco1690 <78063037+nicco1690@users.noreply.github.com> Date: Fri, 28 Oct 2022 02:45:12 +0000 Subject: [PATCH 1/8] add demo song --- demos/vaportrail_staffroll.fur | Bin 0 -> 6572 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/vaportrail_staffroll.fur diff --git a/demos/vaportrail_staffroll.fur b/demos/vaportrail_staffroll.fur new file mode 100644 index 0000000000000000000000000000000000000000..659bb0a66ce70b18418f8307ac75c44c1e4c8d5c GIT binary patch literal 6572 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 beSI=0L^)Vyji$XOlb?cZg-B+(3Yh#qiHt$j literal 0 HcmV?d00001 From 61c69324a1283292073ede01e2e1d0154beae2c0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 28 Oct 2022 01:56:07 -0500 Subject: [PATCH 2/8] SNES: big volume scaling blunder --- src/engine/platform/snes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index fd15cc74d..f7790e424 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -104,7 +104,7 @@ void DivPlatformSNES::tick(bool sysTick) { for (int i=0; i<8; i++) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol&127,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&127,MIN(127,chan[i].std.vol.val),127); } if (chan[i].std.arp.had) { if (!chan[i].inPorta) { From d7d744e633fcf7666b790a0260897d018694b99c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 28 Oct 2022 03:44:17 -0500 Subject: [PATCH 3/8] GUI: batch instrument loading --- src/gui/gui.cpp | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 522dcbed8..25e60f481 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1492,7 +1492,8 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { } } for (DivInstrument* i: instruments) delete i; - } + }, + (type==GUI_FILE_INS_OPEN) ); break; case GUI_FILE_INS_SAVE: @@ -4090,12 +4091,39 @@ bool FurnaceGUI::loop() { exportAudio(copyOfName,DIV_EXPORT_MODE_MANY_CHAN); break; case GUI_FILE_INS_OPEN: { - std::vector instruments=e->instrumentFromFile(copyOfName.c_str()); - if (!instruments.empty()) { - if (!e->getWarnings().empty()) { - showWarning(e->getWarnings(),GUI_WARN_GENERIC); + std::vector instruments; + bool ask=false; + bool warn=false; + String warns="there were some warnings/errors while loading instruments:\n"; + for (String i: fileDialog->getFileName()) { + std::vector insTemp=e->instrumentFromFile(i.c_str()); + if (insTemp.empty()) { + warn=true; + warns+=fmt::sprintf("> %s: cannot load instrument! (%s)\n",i,e->getLastError()); + } else if (!e->getWarnings().empty()) { + warn=true; + warns+=fmt::sprintf("> %s:\n%s\n",i,e->getWarnings()); } - if (instruments.size()>1) { // ask which instruments to load + if (insTemp.size()>1) ask=true; + for (DivInstrument* j: insTemp) { + instruments.push_back(j); + } + } + if (warn) { + if (instruments.empty()) { + if (fileDialog->getFileName().size()>1) { + showError(warns); + } else { + showError("cannot load instrument! ("+e->getLastError()+")"); + } + } else { + showWarning(warns,GUI_WARN_GENERIC); + } + } else if (instruments.empty()) { + showError("congratulations! you managed to load nothing.\nyou are entitled to a bug report."); + } + if (!instruments.empty()) { + if (ask) { // ask which instruments to load for (DivInstrument* i: instruments) { pendingIns.push_back(std::make_pair(i,false)); } @@ -4106,8 +4134,6 @@ bool FurnaceGUI::loop() { e->addInstrumentPtr(i); } } - } else { - showError("cannot load instrument! ("+e->getLastError()+")"); } break; } From c9d7b371e1065f324595bcae4a889287f6f150b5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 28 Oct 2022 04:11:27 -0500 Subject: [PATCH 4/8] GUI: batch wave/sample loading --- src/gui/gui.cpp | 72 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 25e60f481..e8bfb48b2 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1525,7 +1525,9 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { "all files", ".*"}, "compatible files{.fuw,.dmw},.*", workingDirWave, - dpiScale + dpiScale, + NULL, // TODO + (type==GUI_FILE_WAVE_OPEN) ); break; case GUI_FILE_WAVE_SAVE: @@ -1567,7 +1569,9 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { "all files", ".*"}, "compatible files{.wav,.dmc,.brr},.*", workingDirSample, - dpiScale + dpiScale, + NULL, // TODO + (type==GUI_FILE_SAMPLE_OPEN) ); break; case GUI_FILE_SAMPLE_OPEN_RAW: @@ -4038,16 +4042,33 @@ bool FurnaceGUI::loop() { } break; case GUI_FILE_SAMPLE_OPEN: { - DivSample* s=e->sampleFromFile(copyOfName.c_str()); - if (s==NULL) { - showError(e->getLastError()); - } else { - if (e->addSamplePtr(s)==-1) { - showError(e->getLastError()); + String errs="there were some errors while loading wavetables:\n"; + bool warn=false; + for (String i: fileDialog->getFileName()) { + DivSample* s=e->sampleFromFile(i.c_str()); + if (s==NULL) { + if (fileDialog->getFileName().size()>1) { + warn=true; + errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); + } else { + showError(e->getLastError()); + } } else { - MARK_MODIFIED; + if (e->addSamplePtr(s)==-1) { + if (fileDialog->getFileName().size()>1) { + warn=true; + errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); + } else { + showError(e->getLastError()); + } + } else { + MARK_MODIFIED; + } } } + if (warn) { + showWarning(errs,GUI_WARN_GENERIC); + } break; } case GUI_FILE_SAMPLE_OPEN_REPLACE: { @@ -4165,17 +4186,34 @@ bool FurnaceGUI::loop() { break; } case GUI_FILE_WAVE_OPEN: { - DivWavetable* wave=e->waveFromFile(copyOfName.c_str()); - if (wave==NULL) { - showError("cannot load wavetable! ("+e->getLastError()+")"); - } else { - if (e->addWavePtr(wave)==-1) { - showError("cannot load wavetable! ("+e->getLastError()+")"); + String errs="there were some errors while loading wavetables:\n"; + bool warn=false; + for (String i: fileDialog->getFileName()) { + DivWavetable* wave=e->waveFromFile(i.c_str()); + if (wave==NULL) { + if (fileDialog->getFileName().size()>1) { + warn=true; + errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); + } else { + showError("cannot load wavetable! ("+e->getLastError()+")"); + } } else { - MARK_MODIFIED; - RESET_WAVE_MACRO_ZOOM; + if (e->addWavePtr(wave)==-1) { + if (fileDialog->getFileName().size()>1) { + warn=true; + errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError()); + } else { + showError("cannot load wavetable! ("+e->getLastError()+")"); + } + } else { + MARK_MODIFIED; + RESET_WAVE_MACRO_ZOOM; + } } } + if (warn) { + showWarning(errs,GUI_WARN_GENERIC); + } break; } case GUI_FILE_WAVE_OPEN_REPLACE: { From e105cd588ed83f76b8b16514a4bbc40d2fbc3bcf Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 28 Oct 2022 04:16:07 -0500 Subject: [PATCH 5/8] GUI: fix IGFD crash if a file had % on its name --- extern/igfd/ImGuiFileDialog.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extern/igfd/ImGuiFileDialog.cpp b/extern/igfd/ImGuiFileDialog.cpp index 328bccb31..3a30ac2b5 100644 --- a/extern/igfd/ImGuiFileDialog.cpp +++ b/extern/igfd/ImGuiFileDialog.cpp @@ -3930,6 +3930,7 @@ namespace IGFD ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_SpanAvailWidth; // TODO BUG?! + // YES BUG: THIS JUST CRASHED FOR SOME REASON va_list args; va_start(args, vFmt); vsnprintf(fdi.puVariadicBuffer, MAX_FILE_DIALOG_NAME_BUFFER, vFmt, args); @@ -4137,7 +4138,8 @@ namespace IGFD if (ImGui::TableNextColumn()) // file name { // TODO BUG?!?!?! - needToBreakTheloop = prSelectableItem(i, infos, selected, _str.c_str()); + // YES BUG + needToBreakTheloop = prSelectableItem(i, infos, selected, "%s", _str.c_str()); if (needToBreakTheloop==2) escape=true; } if (ImGui::TableNextColumn()) // file type From 90ed617cf648e8088faae435738f106486afcc59 Mon Sep 17 00:00:00 2001 From: cam900 Date: Fri, 28 Oct 2022 22:36:50 +0900 Subject: [PATCH 6/8] Prepare for split volume scaling macro to 'log volume only' macro and 'log volume if compatibility flag set' macro --- src/engine/dispatch.h | 5 +++-- src/engine/platform/arcade.cpp | 16 ++++++++-------- src/engine/platform/genesis.cpp | 18 +++++++++--------- src/engine/platform/genesisext.cpp | 14 +++++++------- src/engine/platform/msm6295.cpp | 2 +- src/engine/platform/opl.cpp | 22 +++++++++++----------- src/engine/platform/opll.cpp | 16 ++++++++-------- src/engine/platform/pce.cpp | 2 +- src/engine/platform/sms.cpp | 2 +- src/engine/platform/t6w28.cpp | 2 +- src/engine/platform/tx81z.cpp | 18 +++++++++--------- src/engine/platform/ym2203.cpp | 18 +++++++++--------- src/engine/platform/ym2203ext.cpp | 8 ++++---- src/engine/platform/ym2608.cpp | 16 ++++++++-------- src/engine/platform/ym2608ext.cpp | 10 +++++----- src/engine/platform/ym2610.cpp | 16 ++++++++-------- src/engine/platform/ym2610b.cpp | 16 ++++++++-------- src/engine/platform/ym2610bext.cpp | 10 +++++----- src/engine/platform/ym2610ext.cpp | 10 +++++----- 19 files changed, 111 insertions(+), 110 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 0287f01c0..5607defc2 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -572,9 +572,10 @@ class DivDispatch { #define NOTE_FNUM_BLOCK(x,bits) parent->calcBaseFreqFNumBlock(chipClock,CHIP_FREQBASE,x,bits) // this is for volume scaling calculation. -#define VOL_SCALE_LINEAR_BROKEN(x,y,range) ((parent->song.newVolumeScaling)?(((x)*(y))/(range)):(CLAMP(((x)+(y))-(range),0,(range)))) #define VOL_SCALE_LINEAR(x,y,range) (((x)*(y))/(range)) -#define VOL_SCALE_LOG(x,y,range) ((parent->song.newVolumeScaling)?(CLAMP(((x)+(y))-(range),0,(range))):(((x)*(y))/(range))) +#define VOL_SCALE_LOG(x,y,range) (CLAMP(((x)+(y))-(range),0,(range))) +#define VOL_SCALE_LINEAR_BROKEN(x,y,range) ((parent->song.newVolumeScaling)?(VOL_SCALE_LINEAR(x,y,range)):(VOL_SCALE_LOG(x,y,range))) +#define VOL_SCALE_LOG_BROKEN(x,y,range) ((parent->song.newVolumeScaling)?(VOL_SCALE_LOG(x,y,range)):(VOL_SCALE_LINEAR(x,y,range))) // these are here for convenience. // it is encouraged to use these, since you get an exact value this way. diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index ee003b540..b782e2658 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -147,12 +147,12 @@ void DivPlatformArcade::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,chan[i].std.vol.val),127); for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -236,7 +236,7 @@ void DivPlatformArcade::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -294,7 +294,7 @@ void DivPlatformArcade::tick(bool sysTick) { if (m.tl.had) { op.tl=127-m.tl.val; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -396,7 +396,7 @@ int DivPlatformArcade::dispatch(DivCommand c) { DivInstrumentFM::Operator op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -453,7 +453,7 @@ int DivPlatformArcade::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -550,7 +550,7 @@ int DivPlatformArcade::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -751,7 +751,7 @@ void DivPlatformArcade::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 0eb4aebb3..063122cdd 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -261,7 +261,7 @@ void DivPlatformGenesis::tick(bool sysTick) { if (chan[i].furnaceDac && inVol>0) { inVol+=63; } - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,inVol),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,inVol),127); if (i<6) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; @@ -269,7 +269,7 @@ void DivPlatformGenesis::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -342,7 +342,7 @@ void DivPlatformGenesis::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -399,7 +399,7 @@ void DivPlatformGenesis::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -516,7 +516,7 @@ void DivPlatformGenesis::muteChannel(int ch, bool mute) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[ch].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -630,7 +630,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } else { if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -702,7 +702,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -875,7 +875,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -1066,7 +1066,7 @@ void DivPlatformGenesis::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 2134568af..3e2714101 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -60,7 +60,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } } if (opChan[ch].insChanged) { @@ -99,7 +99,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } break; } @@ -210,7 +210,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else if (KVS(2,c.value)) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -393,8 +393,8 @@ void DivPlatformGenesisExt::muteChannel(int ch, bool mute) { rWrite(baseAddr+0x40,127); immWrite(baseAddr+0x40,127); } else if (KVS(2,ordch)) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch-2].vol&0x7f,127)); - immWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch-2].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].vol&0x7f,127)); + immWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); immWrite(baseAddr+0x40,op.tl); @@ -527,7 +527,7 @@ void DivPlatformGenesisExt::forceIns() { if (isOpMuted[j]) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[j].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[j].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -536,7 +536,7 @@ void DivPlatformGenesisExt::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index d22aabd55..d46a9bb61 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -92,7 +92,7 @@ void DivPlatformMSM6295::tick(bool sysTick) { if (!parent->song.disableSampleMacro) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].std.vol.val,chan[i].vol,8); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].std.vol.val,chan[i].vol,8); } if (chan[i].std.duty.had) { if (rateSel!=(chan[i].std.duty.val&1)) { diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 1157bf500..e7152bca2 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -285,7 +285,7 @@ void DivPlatformOPL::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(63,chan[i].std.vol.val),63); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(63,chan[i].std.vol.val),63); for (int j=0; jmelodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -414,7 +414,7 @@ void DivPlatformOPL::tick(bool sysTick) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(i,j) || i>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -642,7 +642,7 @@ void DivPlatformOPL::muteChannel(int ch, bool mute) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(ch,i) || ch>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -778,7 +778,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-VOL_SCALE_LOG(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(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); @@ -820,7 +820,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(c.chan,i) || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -928,7 +928,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(c.chan,i) || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1077,7 +1077,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(c.chan,c.value) || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1307,7 +1307,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(c.chan,i) || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1324,7 +1324,7 @@ int DivPlatformOPL::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(c.chan,c.value) || c.chan>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6)); } else { rWrite(baseAddr+ADDR_KSL_TL,op.tl|(op.ksl<<6)); } @@ -1401,7 +1401,7 @@ void DivPlatformOPL::forceIns() { rWrite(baseAddr+ADDR_KSL_TL,63|(op.ksl<<6)); } else { if (KVSL(i,j) || i>melodicChans) { - rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6)); + rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(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 4c53350cc..264f3a7aa 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -99,9 +99,9 @@ void DivPlatformOPLL::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(15,chan[i].std.vol.val),15); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(15,chan[i].std.vol.val),15); if (i<9) { - rWrite(0x30+i,((15-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } } @@ -115,7 +115,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-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } } @@ -185,7 +185,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-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(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)); @@ -410,7 +410,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { } } if (c.chan<9) { - 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)); + rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } } } @@ -480,7 +480,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { break; } else if (c.chan<6 || !drums) { if (c.chan<9) { - 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)); + rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } } break; @@ -574,7 +574,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-VOL_SCALE_LOG(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_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } } break; @@ -790,7 +790,7 @@ void DivPlatformOPLL::forceIns() { rWrite(0x07,(car.sl<<4)|(car.rr)); } if (i<9) { - rWrite(0x30+i,((15-VOL_SCALE_LOG(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); + rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(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) { diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 518b598f2..b40fa92d3 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -153,7 +153,7 @@ void DivPlatformPCE::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol&31,MIN(31,chan[i].std.vol.val),31); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol&31,MIN(31,chan[i].std.vol.val),31); if (chan[i].furnaceDac && chan[i].pcm) { // ignore for now } else { diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 83ce707f6..d55e9349c 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -125,7 +125,7 @@ void DivPlatformSMS::tick(bool sysTick) { if (i==3) CHIP_DIVIDER=noiseDivider; chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].std.vol.val,chan[i].vol,15); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].std.vol.val,chan[i].vol,15); if (chan[i].outVol<0) chan[i].outVol=0; // old formula // ((chan[i].vol&15)*MIN(15,chan[i].std.vol.val))>>4; diff --git a/src/engine/platform/t6w28.cpp b/src/engine/platform/t6w28.cpp index 0abb39fa0..0f4dbf827 100644 --- a/src/engine/platform/t6w28.cpp +++ b/src/engine/platform/t6w28.cpp @@ -87,7 +87,7 @@ void DivPlatformT6W28::tick(bool sysTick) { if (i==3) CHIP_DIVIDER=15; chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15); } if (chan[i].std.arp.had) { if (!chan[i].inPorta) { diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index c205435e3..fb6369668 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -105,7 +105,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,chan[i].std.vol.val),127); for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; @@ -113,7 +113,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -180,7 +180,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -233,7 +233,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -325,7 +325,7 @@ void DivPlatformTX81Z::muteChannel(int ch, bool mute) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[ch].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -355,7 +355,7 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { } else { if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -420,7 +420,7 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -520,7 +520,7 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -812,7 +812,7 @@ void DivPlatformTX81Z::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index cd85731e0..d3a5e5ed3 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -214,7 +214,7 @@ void DivPlatformYM2203::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,chan[i].std.vol.val),127); for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; @@ -222,7 +222,7 @@ void DivPlatformYM2203::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -263,7 +263,7 @@ void DivPlatformYM2203::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -312,7 +312,7 @@ void DivPlatformYM2203::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -430,7 +430,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { } else { if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -489,7 +489,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -574,7 +574,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -766,7 +766,7 @@ void DivPlatformYM2203::muteChannel(int ch, bool mute) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[ch].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -783,7 +783,7 @@ void DivPlatformYM2203::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index 9c404ca6c..21465da77 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -49,7 +49,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } } if (opChan[ch].insChanged) { @@ -88,7 +88,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } break; } @@ -411,7 +411,7 @@ void DivPlatformYM2203Ext::muteChannel(int ch, bool mute) { if (isOpMuted[ch-2]) { rWrite(baseAddr+0x40,127); } else if (isOutput[ins->fm.alg][ordch]) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch-2].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -426,7 +426,7 @@ void DivPlatformYM2203Ext::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index ad31e4a45..79ae95111 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -364,12 +364,12 @@ void DivPlatformYM2608::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,chan[i].std.vol.val),127); for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -414,7 +414,7 @@ void DivPlatformYM2608::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -468,7 +468,7 @@ void DivPlatformYM2608::tick(bool sysTick) { if (m.tl.had) { op.tl=127-m.tl.val; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -787,7 +787,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -851,7 +851,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -969,7 +969,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -1172,7 +1172,7 @@ void DivPlatformYM2608::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 925e70844..331f3887c 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -49,7 +49,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } } if (opChan[ch].insChanged) { @@ -89,7 +89,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } break; } @@ -428,7 +428,7 @@ void DivPlatformYM2608Ext::muteChannel(int ch, bool mute) { if (isOpMuted[ch-2]) { rWrite(baseAddr+0x40,127); } else if (isOutput[ins->fm.alg][ordch]) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch-2].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -443,7 +443,7 @@ void DivPlatformYM2608Ext::forceIns() { if (isOpMuted[j]) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[j].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[j].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -452,7 +452,7 @@ void DivPlatformYM2608Ext::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index f4a7dbfee..12434b06c 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -301,12 +301,12 @@ void DivPlatformYM2610::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,chan[i].std.vol.val),127); for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -351,7 +351,7 @@ void DivPlatformYM2610::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -405,7 +405,7 @@ void DivPlatformYM2610::tick(bool sysTick) { if (m.tl.had) { op.tl=127-m.tl.val; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -767,7 +767,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -831,7 +831,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -949,7 +949,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -1145,7 +1145,7 @@ void DivPlatformYM2610::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index b19ad5d77..e005131ca 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -364,12 +364,12 @@ void DivPlatformYM2610B::tick(bool sysTick) { chan[i].std.next(); if (chan[i].std.vol.had) { - chan[i].outVol=VOL_SCALE_LOG(chan[i].vol,MIN(127,chan[i].std.vol.val),127); + chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol,MIN(127,chan[i].std.vol.val),127); for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -414,7 +414,7 @@ void DivPlatformYM2610B::tick(bool sysTick) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -468,7 +468,7 @@ void DivPlatformYM2610B::tick(bool sysTick) { if (m.tl.had) { op.tl=127-m.tl.val; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -830,7 +830,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { if (!chan[c.chan].active || chan[c.chan].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } } else { if (chan[c.chan].insChanged) { @@ -894,7 +894,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -1012,7 +1012,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[c.chan].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } @@ -1208,7 +1208,7 @@ void DivPlatformYM2610B::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index e09f0c579..0f9b38195 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -45,7 +45,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } } if (opChan[ch].insChanged) { @@ -85,7 +85,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } break; } @@ -424,7 +424,7 @@ void DivPlatformYM2610BExt::muteChannel(int ch, bool mute) { if (isOpMuted[ch-extChanOffs]) { rWrite(baseAddr+0x40,127); } else if (isOutput[ins->fm.alg][ordch]) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch-extChanOffs].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-extChanOffs].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -439,7 +439,7 @@ void DivPlatformYM2610BExt::forceIns() { if (isOpMuted[j]) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[j].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[j].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -448,7 +448,7 @@ void DivPlatformYM2610BExt::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 5a0fadabc..2a428b6d6 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -45,7 +45,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } } if (opChan[ch].insChanged) { @@ -85,7 +85,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].vol&0x7f,127)); } break; } @@ -424,7 +424,7 @@ void DivPlatformYM2610Ext::muteChannel(int ch, bool mute) { if (isOpMuted[ch]) { rWrite(baseAddr+0x40,127); } else if (isOutput[ins->fm.alg][ordch]) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[ch-extChanOffs].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-extChanOffs].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -439,7 +439,7 @@ void DivPlatformYM2610Ext::forceIns() { if (isOpMuted[j]) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG(127-op.tl,opChan[j].vol&0x7f,127)); + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[j].vol&0x7f,127)); } else { rWrite(baseAddr+0x40,op.tl); } @@ -448,7 +448,7 @@ void DivPlatformYM2610Ext::forceIns() { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG(127-op.tl,chan[i].outVol&0x7f,127)); + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); } From 896249ab93d0b3b376da53b2f5c0dc15fdf6fc68 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 28 Oct 2022 14:33:42 -0500 Subject: [PATCH 7/8] GUI; mark modified when typing in comments --- src/gui/songNotes.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/songNotes.cpp b/src/gui/songNotes.cpp index 338c7da24..eb63cbf3a 100644 --- a/src/gui/songNotes.cpp +++ b/src/gui/songNotes.cpp @@ -30,7 +30,9 @@ void FurnaceGUI::drawNotes() { } if (!notesOpen) return; if (ImGui::Begin("Song Comments",¬esOpen,globalWinFlags)) { - ImGui::InputTextMultiline("##SongNotes",&e->song.notes,ImGui::GetContentRegionAvail(),ImGuiInputTextFlags_UndoRedo); + if (ImGui::InputTextMultiline("##SongNotes",&e->song.notes,ImGui::GetContentRegionAvail(),ImGuiInputTextFlags_UndoRedo)) { + MARK_MODIFIED; + } } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_NOTES; ImGui::End(); From ddd9564b8c9fdc68a1e78d513f29c8bc8d3ec937 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 28 Oct 2022 15:05:59 -0500 Subject: [PATCH 8/8] another demo song --- demos/Princess_of_the_Dead.fur | Bin 0 -> 5271 bytes src/gui/about.cpp | 1 + 2 files changed, 1 insertion(+) create mode 100644 demos/Princess_of_the_Dead.fur diff --git a/demos/Princess_of_the_Dead.fur b/demos/Princess_of_the_Dead.fur new file mode 100644 index 0000000000000000000000000000000000000000..e8e9f4021dfcf3cc80d9473c3f80d444abb8a17e GIT binary patch literal 5271 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