add broken speed alternation flag - dev70

This commit is contained in:
tildearrow 2022-03-23 01:35:57 -05:00
parent afc701b0b9
commit ac79e7d6af
6 changed files with 44 additions and 9 deletions

View file

@ -38,8 +38,8 @@
warnings+=(String("\n")+x); \
}
#define DIV_VERSION "dev69"
#define DIV_ENGINE_VERSION 69
#define DIV_VERSION "dev70"
#define DIV_ENGINE_VERSION 70
// for imports
#define DIV_VERSION_MOD 0xff01

View file

@ -144,6 +144,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
ds.oneTickCut=false;
ds.newInsTriggersInPorta=true;
ds.arp0Reset=true;
ds.brokenSpeedSel=true;
// 1.1 compat flags
if (ds.version>24) {
@ -1067,6 +1068,14 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
ds.masterVol=2.0f;
}
if (ds.version>=70) {
// extended compat flags
ds.brokenSpeedSel=reader.readC();
for (int i=0; i<31; i++) {
reader.readC();
}
}
// read instruments
for (int i=0; i<ds.insLen; i++) {
DivInstrument* ins=new DivInstrument;
@ -1905,6 +1914,12 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) {
w->writeF(song.masterVol);
// extended compat flags
w->writeC(song.brokenSpeedSel);
for (int i=0; i<31; i++) {
w->writeC(0);
}
/// INSTRUMENT
for (int i=0; i<song.insLen; i++) {
DivInstrument* ins=song.ins[i];

View file

@ -1179,14 +1179,24 @@ void DivEngine::nextRow() {
if (haltOn==DIV_HALT_PATTERN) halted=true;
}
if (speedAB) {
ticks=speed2*(song.timeBase+1);
nextSpeed=speed1;
if (song.brokenSpeedSel) {
if ((song.patLen&1) && curOrder&1) {
ticks=((curRow&1)?speed2:speed1)*(song.timeBase+1);
nextSpeed=(curRow&1)?speed1:speed2;
} else {
ticks=((curRow&1)?speed1:speed2)*(song.timeBase+1);
nextSpeed=(curRow&1)?speed2:speed1;
}
} else {
ticks=speed1*(song.timeBase+1);
nextSpeed=speed2;
if (speedAB) {
ticks=speed2*(song.timeBase+1);
nextSpeed=speed1;
} else {
ticks=speed1*(song.timeBase+1);
nextSpeed=speed2;
}
speedAB=!speedAB;
}
speedAB=!speedAB;
// post row details
for (int i=0; i<chans; i++) {

View file

@ -301,6 +301,7 @@ struct DivSong {
bool oneTickCut;
bool newInsTriggersInPorta;
bool arp0Reset;
bool brokenSpeedSel;
DivOrders orders;
std::vector<DivInstrument*> ins;
@ -373,7 +374,8 @@ struct DivSong {
brokenDACMode(false),
oneTickCut(false),
newInsTriggersInPorta(true),
arp0Reset(true) {
arp0Reset(true),
brokenSpeedSel(false) {
for (int i=0; i<32; i++) {
system[i]=DIV_SYSTEM_NULL;
systemVol[i]=64;