Fix build, Transwave Checkpoint
This commit is contained in:
parent
0ab1f69c7c
commit
ab1ac51d68
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue