Fix build, Transwave Checkpoint

This commit is contained in:
cam900 2022-05-08 17:56:52 +09:00
parent 0ab1f69c7c
commit ab1ac51d68
4 changed files with 68 additions and 35 deletions

View File

@ -302,7 +302,7 @@ struct DivInstrumentAmiga {
struct NoteMap { struct NoteMap {
int freq; int freq;
short ind; short ind;
bool reversed; unsigned char reversed;
NoteMap(): NoteMap():
freq(0), freq(0),
@ -316,16 +316,38 @@ struct DivInstrumentAmiga {
int ind; int ind;
unsigned short slice; 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(): TransWave():
enable(false), enable(false),
sliceEnable(false), sliceEnable(false),
ind(0), ind(0),
slice(0) {} slice(0),
sliceSize(0),
sliceBound(0),
sliceStart(0),
sliceEnd(0) {}
}; };
struct TransWaveMap { struct TransWaveMap {
short ind; short ind;
bool reversed; unsigned char reversed;
int loopStart, loopEnd; int loopStart, loopEnd;
DivSampleLoopMode loopMode; DivSampleLoopMode loopMode;
@ -334,7 +356,7 @@ struct DivInstrumentAmiga {
reversed(0), reversed(0),
loopStart(-1), loopStart(-1),
loopEnd(-1), loopEnd(-1),
loopMode(DIV_SAMPLE_LOOPMODE_FORWARD) {} loopMode(DIV_SAMPLE_LOOPMODE_ONESHOT) {}
}; };
short initSample; short initSample;

View File

@ -622,7 +622,9 @@ int DivPlatformES5506::dispatch(DivCommand c) {
switch (c.cmd) { switch (c.cmd) {
case DIV_CMD_NOTE_ON: { case DIV_CMD_NOTE_ON: {
DivInstrument* ins=parent->getIns(chan[c.chan].ins); 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; double off=1.0;
if (chan[c.chan].sample>=0 && chan[c.chan].sample<parent->song.sampleLen) { if (chan[c.chan].sample>=0 && chan[c.chan].sample<parent->song.sampleLen) {
chan[c.chan].pcm.index=chan[c.chan].sample; 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 start=s->offES5506<<10;
const unsigned int length=s->samples-1; const unsigned int length=s->samples-1;
const unsigned int end=start+(length<<11); 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.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.bank=(s->offES5506>>22)&3;
chan[c.chan].pcm.start=start; chan[c.chan].pcm.start=start;
chan[c.chan].pcm.end=end; chan[c.chan].pcm.end=end;
chan[c.chan].pcm.length=length; chan[c.chan].pcm.length=length;
chan[c.chan].pcm.loopStart=(start+(s->loopStart<<11))&0xfffff800; chan[c.chan].pcm.loopStart=(start+(s->loopStart<<11))&0xfffff800;
chan[c.chan].pcm.loopEnd=(start+((s->loopEnd-1)<<11))&0xffffff80; chan[c.chan].pcm.loopEnd=(start+((s->loopEnd-1)<<11))&0xffffff80;
if (ins->type==DIV_INS_ES5506) { // Native format chan[c.chan].volMacroMax=ins->type==DIV_INS_AMIGA?64:0xffff;
chan[c.chan].volMacroMax=0xffff; chan[c.chan].panMacroMax=ins->type==DIV_INS_AMIGA?127:0xffff;
chan[c.chan].panMacroMax=0xffff;
chan[c.chan].filter=ins->es5506.filter; chan[c.chan].filter=ins->es5506.filter;
chan[c.chan].envelope=ins->es5506.envelope; 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();
}
} else { } else {
chan[c.chan].sample=-1; chan[c.chan].sample=-1;
chan[c.chan].pcm.index=-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].filter=DivInstrumentES5506::Filter();
chan[c.chan].envelope=DivInstrumentES5506::Envelope(); chan[c.chan].envelope=DivInstrumentES5506::Envelope();
} }

View File

@ -1755,9 +1755,10 @@ void DivEngine::registerSystems() {
} else { } else {
return false; return false;
} }
}
break; break;
} }
return true;
}
); );
sysDefs[DIV_SYSTEM_Y8950]=new DivSysDef( sysDefs[DIV_SYSTEM_Y8950]=new DivSysDef(

View File

@ -2499,7 +2499,7 @@ void FurnaceGUI::drawInsEdit() {
} }
ImGui::EndCombo(); 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)); P(ImGui::Checkbox("Reversed playback",&ins->amiga.reversed));
ImGui::EndDisabled(); ImGui::EndDisabled();
// Wavetable // Wavetable
@ -2585,26 +2585,25 @@ void FurnaceGUI::drawInsEdit() {
if (size<=ins->amiga.transWave.ind) size=ins->amiga.transWave.ind+1; if (size<=ins->amiga.transWave.ind) size=ins->amiga.transWave.ind+1;
if (size<1) size=1; if (size<1) size=1;
if (size>256) size=256; 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()); 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(); ins->amiga.transWaveMap.shrink_to_fit();
} }
} }
} }
if (ImGui::InputInt("Initial Transwave Index##TransWaveInit",&ins->amiga.transWave.ind,1,16)) { PARAMETER 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<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)); P(ImGui::Checkbox("Use Transwave Slice##UseTransWaveSlice",&ins->amiga.transWave.sliceEnable));
DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind]; DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind];
if (ins->amiga.transWave.sliceEnable && (ind.ind>=0 && ind.ind<e->song.sampleLen)) { if (ins->amiga.transWave.sliceEnable && (ind.ind>=0 && ind.ind<e->song.sampleLen)) {
DivSample* s=e->song.sample[ind.ind]; DivSample* s=e->song.sample[ind.ind];
double sliceSize=(double)(ind.loopEnd)-(double)(ind.loopStart); double sliceInit=(double)(ins->amiga.transWave.slice)/4095.0;
double sliceBound=((double)(s->samples)-sliceSize); double slicePos=ins->amiga.transWave.slicePos(sliceInit);
double slicePos=sliceBound*((double)(ins->amiga.transWave.slice)/4095.0); double sliceStart=ins->amiga.transWave.sliceStart;
double sliceStart=slicePos; double sliceEnd=ins->amiga.transWave.sliceEnd;
double sliceEnd=sliceSize+slicePos;
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 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)) { if (ImGui::BeginTable("TransWaveMap",6,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) {
@ -2629,7 +2628,7 @@ void FurnaceGUI::drawInsEdit() {
ImGui::Text("Loop Mode"); ImGui::Text("Loop Mode");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text("Reversed"); ImGui::Text("Reversed");
for (int i=0; i<ins->amiga.transWaveMap.size(); i++) { for (size_t i=0; i<ins->amiga.transWaveMap.size(); i++) {
DivInstrumentAmiga::TransWaveMap& transWaveMap=ins->amiga.transWaveMap[i]; DivInstrumentAmiga::TransWaveMap& transWaveMap=ins->amiga.transWaveMap[i];
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::PushID(fmt::sprintf("TransWaveMap_%d",i).c_str()); ImGui::PushID(fmt::sprintf("TransWaveMap_%d",i).c_str());
@ -2653,12 +2652,14 @@ void FurnaceGUI::drawInsEdit() {
id=fmt::sprintf("%d: %s",j,s->name); id=fmt::sprintf("%d: %s",j,s->name);
if (ImGui::Selectable(id.c_str(),transWaveMap.ind==j)) { PARAMETER if (ImGui::Selectable(id.c_str(),transWaveMap.ind==j)) { PARAMETER
transWaveMap.ind=j; transWaveMap.ind=j;
if (transWaveMap.loopStart<0 || transWaveMap.loopStart>s->samples) { if (transWaveMap.loopStart<0 || transWaveMap.loopStart>(int)(s->samples)) {
transWaveMap.loopStart=s->loopStart; 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.loopEnd=s->loopEnd;
} }
transWaveMap.sliceSize=(double)(transWaveMap.loopEnd)-(double)(transWaveMap.loopStart);
transWaveMap.sliceBound=((double)(s->samples)-transWaveMap.sliceSize);
} }
} }
ImGui::EndCombo(); ImGui::EndCombo();
@ -2668,8 +2669,11 @@ void FurnaceGUI::drawInsEdit() {
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
if (ImGui::InputInt(fmt::sprintf("##TransWaveMap_LoopStart_%d",i).c_str(),&transWaveMap.loopStart,256,4096)) { PARAMETER if (ImGui::InputInt(fmt::sprintf("##TransWaveMap_LoopStart_%d",i).c_str(),&transWaveMap.loopStart,256,4096)) { PARAMETER
if (transWaveMap.ind>=0 && transWaveMap.ind<e->song.sampleLen) { if (transWaveMap.ind>=0 && transWaveMap.ind<e->song.sampleLen) {
DivSample* s=e->song.sample[transWaveMap.ind];
if (transWaveMap.loopStart<0) transWaveMap.loopStart=0; if (transWaveMap.loopStart<0) transWaveMap.loopStart=0;
if (transWaveMap.loopStart>transWaveMap.loopEnd) transWaveMap.loopStart=transWaveMap.loopEnd; 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(); ImGui::TableNextColumn();
@ -2678,7 +2682,9 @@ void FurnaceGUI::drawInsEdit() {
if (transWaveMap.ind>=0 && transWaveMap.ind<e->song.sampleLen) { if (transWaveMap.ind>=0 && transWaveMap.ind<e->song.sampleLen) {
DivSample* s=e->song.sample[transWaveMap.ind]; DivSample* s=e->song.sample[transWaveMap.ind];
if (transWaveMap.loopEnd<transWaveMap.loopStart) transWaveMap.loopEnd=transWaveMap.loopStart; if (transWaveMap.loopEnd<transWaveMap.loopStart) transWaveMap.loopEnd=transWaveMap.loopStart;
if (transWaveMap.loopEnd>s->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(); 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 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; 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(); 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::EndDisabled();
ImGui::PopID(); ImGui::PopID();
} }