allow instrument change during slides
This commit is contained in:
parent
a96fd5727e
commit
e009fc64f2
|
@ -29,6 +29,7 @@ furthermore, an `or reserved` indicates this field is always present, but is res
|
|||
|
||||
the format versions are:
|
||||
|
||||
- 66: Furnace dev66
|
||||
- 65: Furnace dev65
|
||||
- 64: Furnace dev64
|
||||
- 63: Furnace dev63
|
||||
|
@ -207,7 +208,8 @@ size | description
|
|||
1 | continuous vibrato (>=62) or reserved
|
||||
1 | broken DAC mode (>=64) or reserved
|
||||
1 | one tick cut (>=65) or reserved
|
||||
2 | reserved
|
||||
1 | instrument change allowed during porta (>=66) or reserved
|
||||
1 | reserved
|
||||
4?? | pointers to instruments
|
||||
4?? | pointers to wavetables
|
||||
4?? | pointers to samples
|
||||
|
|
|
@ -37,8 +37,8 @@
|
|||
warnings+=(String("\n")+x); \
|
||||
}
|
||||
|
||||
#define DIV_VERSION "dev65"
|
||||
#define DIV_ENGINE_VERSION 65
|
||||
#define DIV_VERSION "dev66"
|
||||
#define DIV_ENGINE_VERSION 66
|
||||
|
||||
enum DivStatusView {
|
||||
DIV_STATUS_NOTHING=0,
|
||||
|
@ -69,7 +69,7 @@ enum DivHaltPositions {
|
|||
|
||||
struct DivChannelState {
|
||||
std::vector<DivDelayedCommand> delayed;
|
||||
int note, oldNote, pitch, portaSpeed, portaNote;
|
||||
int note, oldNote, lastIns, pitch, portaSpeed, portaNote;
|
||||
int volume, volSpeed, cut, rowDelay, volMax;
|
||||
int delayOrder, delayRow, retrigSpeed, retrigTick;
|
||||
int vibratoDepth, vibratoRate, vibratoPos, vibratoDir, vibratoFine;
|
||||
|
@ -80,6 +80,7 @@ struct DivChannelState {
|
|||
DivChannelState():
|
||||
note(-1),
|
||||
oldNote(-1),
|
||||
lastIns(-1),
|
||||
pitch(0),
|
||||
portaSpeed(-1),
|
||||
portaNote(-1),
|
||||
|
|
|
@ -142,6 +142,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
|
|||
ds.ignoreDuplicateSlides=true;
|
||||
ds.brokenDACMode=true;
|
||||
ds.oneTickCut=false;
|
||||
ds.newInsTriggersInPorta=true;
|
||||
|
||||
// 1.1 compat flags
|
||||
if (ds.version>24) {
|
||||
|
@ -807,6 +808,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
|||
if (ds.version<65) {
|
||||
ds.oneTickCut=false;
|
||||
}
|
||||
if (ds.version<66) {
|
||||
ds.newInsTriggersInPorta=false;
|
||||
}
|
||||
ds.isDMF=false;
|
||||
|
||||
reader.readS(); // reserved
|
||||
|
@ -993,7 +997,12 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
|
|||
} else {
|
||||
reader.readC();
|
||||
}
|
||||
for (int i=0; i<2; i++) reader.readC();
|
||||
if (ds.version>=66) {
|
||||
ds.newInsTriggersInPorta=reader.readC();
|
||||
} else {
|
||||
reader.readC();
|
||||
}
|
||||
for (int i=0; i<1; i++) reader.readC();
|
||||
} else {
|
||||
for (int i=0; i<20; i++) reader.readC();
|
||||
}
|
||||
|
@ -1437,7 +1446,8 @@ SafeWriter* DivEngine::saveFur() {
|
|||
w->writeC(song.continuousVibrato);
|
||||
w->writeC(song.brokenDACMode);
|
||||
w->writeC(song.oneTickCut);
|
||||
for (int i=0; i<2; i++) {
|
||||
w->writeC(song.newInsTriggersInPorta);
|
||||
for (int i=0; i<1; i++) {
|
||||
w->writeC(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -654,6 +654,12 @@ void DivEngine::processRow(int i, bool afterDelay) {
|
|||
// instrument
|
||||
if (pat->data[whatRow][2]!=-1) {
|
||||
dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,i,pat->data[whatRow][2]));
|
||||
if (chan[i].lastIns!=pat->data[whatRow][2]) {
|
||||
chan[i].lastIns=pat->data[whatRow][2];
|
||||
if (chan[i].inPorta && song.newInsTriggersInPorta) {
|
||||
dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,i,DIV_NOTE_NULL));
|
||||
}
|
||||
}
|
||||
}
|
||||
// note
|
||||
if (pat->data[whatRow][0]==100) { // note off
|
||||
|
|
|
@ -297,6 +297,7 @@ struct DivSong {
|
|||
bool continuousVibrato;
|
||||
bool brokenDACMode;
|
||||
bool oneTickCut;
|
||||
bool newInsTriggersInPorta;
|
||||
|
||||
DivOrders orders;
|
||||
std::vector<DivInstrument*> ins;
|
||||
|
@ -363,7 +364,8 @@ struct DivSong {
|
|||
stopPortaOnNoteOff(false),
|
||||
continuousVibrato(false),
|
||||
brokenDACMode(false),
|
||||
oneTickCut(false) {
|
||||
oneTickCut(false),
|
||||
newInsTriggersInPorta(true) {
|
||||
for (int i=0; i<32; i++) {
|
||||
system[i]=DIV_SYSTEM_NULL;
|
||||
systemVol[i]=64;
|
||||
|
|
|
@ -2216,6 +2216,10 @@ void FurnaceGUI::drawCompatFlags() {
|
|||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip("behavior changed in 0.6");
|
||||
}
|
||||
ImGui::Checkbox("Allow instrument change during slides",&e->song.newInsTriggersInPorta);
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SetTooltip("behavior changed in 0.6");
|
||||
}
|
||||
}
|
||||
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_COMPAT_FLAGS;
|
||||
ImGui::End();
|
||||
|
|
Loading…
Reference in New Issue