From ab1ac51d68740449242a2177ae50a1646064c63c Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 8 May 2022 17:56:52 +0900 Subject: [PATCH] Fix build, Transwave Checkpoint --- src/engine/instrument.h | 30 ++++++++++++++++++++--- src/engine/platform/es5506.cpp | 25 +++++++------------ src/engine/sysDef.cpp | 3 ++- src/gui/insEdit.cpp | 45 +++++++++++++++++++++++----------- 4 files changed, 68 insertions(+), 35 deletions(-) diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 0b853c25..a46686a6 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -302,7 +302,7 @@ struct DivInstrumentAmiga { struct NoteMap { int freq; short ind; - bool reversed; + unsigned char reversed; NoteMap(): freq(0), @@ -316,16 +316,38 @@ struct DivInstrumentAmiga { int ind; unsigned short slice; + // states + double sliceSize; + double sliceBound; + double sliceStart; + double sliceEnd; + + // inlines + inline double slicePos(double slice) { + double pos=sliceBound*slice; + if (sliceStart!=pos) { + sliceStart=pos; + } + if (sliceEnd!=(sliceSize+pos)) + sliceEnd=(sliceSize+pos); + } + return pos; + } + TransWave(): enable(false), sliceEnable(false), ind(0), - slice(0) {} + slice(0), + sliceSize(0), + sliceBound(0), + sliceStart(0), + sliceEnd(0) {} }; struct TransWaveMap { short ind; - bool reversed; + unsigned char reversed; int loopStart, loopEnd; DivSampleLoopMode loopMode; @@ -334,7 +356,7 @@ struct DivInstrumentAmiga { reversed(0), loopStart(-1), loopEnd(-1), - loopMode(DIV_SAMPLE_LOOPMODE_FORWARD) {} + loopMode(DIV_SAMPLE_LOOPMODE_ONESHOT) {} }; short initSample; diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index a85a806a..7aa2a498 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -622,7 +622,9 @@ int DivPlatformES5506::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { DivInstrument* ins=parent->getIns(chan[c.chan].ins); - chan[c.chan].sample=ins->amiga.useNoteMap?ins->amiga.noteMap[c.value].ind:ins->amiga.initSample; + DivInstrumentAmiga::TransWaveMap& transWaveInd=ins->amiga.transWaveMap[ins->amiga.transWave.ind]; + chan[c.chan].sample=ins->amiga.useTransWave?transWaveInd.ind: + (ins->amiga.useNoteMap?ins->amiga.noteMap[c.value].ind:ins->amiga.initSample); double off=1.0; if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { chan[c.chan].pcm.index=chan[c.chan].sample; @@ -635,31 +637,22 @@ int DivPlatformES5506::dispatch(DivCommand c) { const unsigned int start=s->offES5506<<10; const unsigned int length=s->samples-1; const unsigned int end=start+(length<<11); - chan[c.chan].pcm.loopMode=s->isLoopable()?s->loopMode:DIV_SAMPLE_LOOPMODE_ONESHOT; + chan[c.chan].pcm.loopMode=(ins->amiga.useTransWave&&transWaveInd.loopMode!=DIV_SAMPLE_LOOPMODE_ONESHOT)?transWaveInd.loopMode:(s->isLoopable()?s->loopMode:DIV_SAMPLE_LOOPMODE_ONESHOT); chan[c.chan].pcm.freqOffs=off; - chan[c.chan].pcm.reversed=ins->amiga.useNoteMap?ins->amiga.noteMap[c.value].reversed:ins->amiga.reversed; + chan[c.chan].pcm.reversed=(ins->amiga.useTransWave&&transWaveInd.reversed!=2)?transWaveInd.reversed:ins->amiga.useNoteMap?ins->amiga.noteMap[c.value].reversed:ins->amiga.reversed; chan[c.chan].pcm.bank=(s->offES5506>>22)&3; chan[c.chan].pcm.start=start; chan[c.chan].pcm.end=end; chan[c.chan].pcm.length=length; chan[c.chan].pcm.loopStart=(start+(s->loopStart<<11))&0xfffff800; chan[c.chan].pcm.loopEnd=(start+((s->loopEnd-1)<<11))&0xffffff80; - if (ins->type==DIV_INS_ES5506) { // Native format - chan[c.chan].volMacroMax=0xffff; - chan[c.chan].panMacroMax=0xffff; - chan[c.chan].filter=ins->es5506.filter; - chan[c.chan].envelope=ins->es5506.envelope; - } else { // Amiga format - chan[c.chan].volMacroMax=64; - chan[c.chan].panMacroMax=127; - chan[c.chan].filter=DivInstrumentES5506::Filter(); - chan[c.chan].envelope=DivInstrumentES5506::Envelope(); - } + chan[c.chan].volMacroMax=ins->type==DIV_INS_AMIGA?64:0xffff; + chan[c.chan].panMacroMax=ins->type==DIV_INS_AMIGA?127:0xffff; + chan[c.chan].filter=ins->es5506.filter; + chan[c.chan].envelope=ins->es5506.envelope; } else { chan[c.chan].sample=-1; chan[c.chan].pcm.index=-1; - chan[c.chan].volMacroMax=0xffff; - chan[c.chan].panMacroMax=0xffff; chan[c.chan].filter=DivInstrumentES5506::Filter(); chan[c.chan].envelope=DivInstrumentES5506::Envelope(); } diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 405f39d9..3386b196 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1755,8 +1755,9 @@ void DivEngine::registerSystems() { } else { return false; } + break; } - break; + return true; } ); diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 2ab9d523..b33754a6 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -2499,7 +2499,7 @@ void FurnaceGUI::drawInsEdit() { } ImGui::EndCombo(); } - ImGui::BeginDisabled(ins->amiga.useNoteMap||ins->amiga.useWave||ins->amiga.transWave.enable); + ImGui::BeginDisabled(ins->amiga.useWave); P(ImGui::Checkbox("Reversed playback",&ins->amiga.reversed)); ImGui::EndDisabled(); // Wavetable @@ -2585,26 +2585,25 @@ void FurnaceGUI::drawInsEdit() { if (size<=ins->amiga.transWave.ind) size=ins->amiga.transWave.ind+1; if (size<1) size=1; if (size>256) size=256; - if (ins->amiga.transWaveMap.size()!=size) { + if (ins->amiga.transWaveMap.size()!=(size_t)(size)) { ins->amiga.transWaveMap.resize(size,DivInstrumentAmiga::TransWaveMap()); - if (ins->amiga.transWaveMap.capacity()>size) { + if (ins->amiga.transWaveMap.capacity()>(size_t)(size)) { ins->amiga.transWaveMap.shrink_to_fit(); } } } if (ImGui::InputInt("Initial Transwave Index##TransWaveInit",&ins->amiga.transWave.ind,1,16)) { PARAMETER if (ins->amiga.transWave.ind<1) ins->amiga.transWave.ind=0; - if (ins->amiga.transWave.ind>=ins->amiga.transWaveMap.size()) ins->amiga.transWave.ind=ins->amiga.transWaveMap.size()-1; + if (ins->amiga.transWave.ind>=(int)(ins->amiga.transWaveMap.size())) ins->amiga.transWave.ind=ins->amiga.transWaveMap.size()-1; } P(ImGui::Checkbox("Use Transwave Slice##UseTransWaveSlice",&ins->amiga.transWave.sliceEnable)); DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind]; if (ins->amiga.transWave.sliceEnable && (ind.ind>=0 && ind.indsong.sampleLen)) { DivSample* s=e->song.sample[ind.ind]; - double sliceSize=(double)(ind.loopEnd)-(double)(ind.loopStart); - double sliceBound=((double)(s->samples)-sliceSize); - double slicePos=sliceBound*((double)(ins->amiga.transWave.slice)/4095.0); - double sliceStart=slicePos; - double sliceEnd=sliceSize+slicePos; + double sliceInit=(double)(ins->amiga.transWave.slice)/4095.0; + double slicePos=ins->amiga.transWave.slicePos(sliceInit); + double sliceStart=ins->amiga.transWave.sliceStart; + double sliceEnd=ins->amiga.transWave.sliceEnd; P(CWSliderScalar("Initial Transwave Slice##TransWaveSliceInit",ImGuiDataType_U16,&ins->amiga.transWave.slice,&_ZERO,&_FOUR_THOUSAND_NINETY_FIVE,fmt::sprintf("%d: %.6f - %.6f",ins->amiga.transWave.slice,sliceStart,sliceEnd).c_str())); rightClickable } if (ImGui::BeginTable("TransWaveMap",6,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { @@ -2629,7 +2628,7 @@ void FurnaceGUI::drawInsEdit() { ImGui::Text("Loop Mode"); ImGui::TableNextColumn(); ImGui::Text("Reversed"); - for (int i=0; iamiga.transWaveMap.size(); i++) { + for (size_t i=0; iamiga.transWaveMap.size(); i++) { DivInstrumentAmiga::TransWaveMap& transWaveMap=ins->amiga.transWaveMap[i]; ImGui::TableNextRow(); ImGui::PushID(fmt::sprintf("TransWaveMap_%d",i).c_str()); @@ -2653,12 +2652,14 @@ void FurnaceGUI::drawInsEdit() { id=fmt::sprintf("%d: %s",j,s->name); if (ImGui::Selectable(id.c_str(),transWaveMap.ind==j)) { PARAMETER transWaveMap.ind=j; - if (transWaveMap.loopStart<0 || transWaveMap.loopStart>s->samples) { + if (transWaveMap.loopStart<0 || transWaveMap.loopStart>(int)(s->samples)) { transWaveMap.loopStart=s->loopStart; } - if (transWaveMap.loopEnd<0 || transWaveMap.loopEnd>s->samples) { + if (transWaveMap.loopEnd<0 || transWaveMap.loopEnd>(int)(s->samples)) { transWaveMap.loopEnd=s->loopEnd; } + transWaveMap.sliceSize=(double)(transWaveMap.loopEnd)-(double)(transWaveMap.loopStart); + transWaveMap.sliceBound=((double)(s->samples)-transWaveMap.sliceSize); } } ImGui::EndCombo(); @@ -2668,8 +2669,11 @@ void FurnaceGUI::drawInsEdit() { ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); if (ImGui::InputInt(fmt::sprintf("##TransWaveMap_LoopStart_%d",i).c_str(),&transWaveMap.loopStart,256,4096)) { PARAMETER if (transWaveMap.ind>=0 && transWaveMap.indsong.sampleLen) { + DivSample* s=e->song.sample[transWaveMap.ind]; if (transWaveMap.loopStart<0) transWaveMap.loopStart=0; if (transWaveMap.loopStart>transWaveMap.loopEnd) transWaveMap.loopStart=transWaveMap.loopEnd; + transWaveMap.sliceSize=(double)(transWaveMap.loopEnd)-(double)(transWaveMap.loopStart); + transWaveMap.sliceBound=((double)(s->samples)-transWaveMap.sliceSize); } } ImGui::TableNextColumn(); @@ -2678,7 +2682,9 @@ void FurnaceGUI::drawInsEdit() { if (transWaveMap.ind>=0 && transWaveMap.indsong.sampleLen) { DivSample* s=e->song.sample[transWaveMap.ind]; if (transWaveMap.loopEnds->samples) transWaveMap.loopEnd=s->samples; + if (transWaveMap.loopEnd>(int)(s->samples)) transWaveMap.loopEnd=s->samples; + transWaveMap.sliceSize=(double)(transWaveMap.loopEnd)-(double)(transWaveMap.loopStart); + transWaveMap.sliceBound=((double)(s->samples)-transWaveMap.sliceSize); } } ImGui::TableNextColumn(); @@ -2691,8 +2697,19 @@ void FurnaceGUI::drawInsEdit() { if (ImGui::RadioButton(fmt::sprintf("Pingpong##TransWaveMap_LoopMode_Pingpong_%d",i).c_str(),transWaveMap.loopMode==DIV_SAMPLE_LOOPMODE_PINGPONG)) { MARK_MODIFIED transWaveMap.loopMode=DIV_SAMPLE_LOOPMODE_PINGPONG; } + if (ImGui::RadioButton(fmt::sprintf("Use sample setting##TransWaveMap_LoopMode_Default_%d",i).c_str(),transWaveMap.loopMode==DIV_SAMPLE_LOOPMODE_ONESHOT)) { MARK_MODIFIED + transWaveMap.loopMode=DIV_SAMPLE_LOOPMODE_ONESHOT; + } ImGui::TableNextColumn(); - P(ImGui::Checkbox(fmt::sprintf("##TransWaveMap_Reversed_%d",i).c_str(),&transWaveMap.reversed)); + if (ImGui::RadioButton(fmt::sprintf("Disable##TransWaveMap_Reversed_Disable_%d",i).c_str(),transWaveMap.reversed==0)) { MARK_MODIFIED + transWaveMap.reversed=0; + } + if (ImGui::RadioButton(fmt::sprintf("Enable##TransWaveMap_Reversed_Enable_%d",i).c_str(),transWaveMap.reversed==1)) { MARK_MODIFIED + transWaveMap.reversed=1; + } + if (ImGui::RadioButton(fmt::sprintf("Use instrument setting##TransWaveMap_Reversed_Default_%d",i).c_str(),transWaveMap.reversed==2)) { MARK_MODIFIED + transWaveMap.reversed=2; + } ImGui::EndDisabled(); ImGui::PopID(); }