several important bug fixes to advanced arp macro

This commit is contained in:
tildearrow 2022-08-22 19:09:08 -05:00
parent c009cb3536
commit 226f43fea3
7 changed files with 46 additions and 24 deletions

View file

@ -1713,7 +1713,11 @@ int DivEngine::calcFreq(int base, int pitch, bool period, int octave, int pitch2
}
int DivEngine::calcArp(int note, int arp, int offset) {
if (arp&0x40000000) return (arp&(~0x40000000))+offset;
if (arp<0) {
if (!(arp&0x40000000)) return (arp|0x40000000)+offset;
} else {
if (arp&0x40000000) return (arp&(~0x40000000))+offset;
}
return note+arp;
}

View file

@ -510,9 +510,9 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
} else {
ins->std.arpMacro.mode=0;
for (int j=0; j<ins->std.arpMacro.len; j++) {
ins->std.arpMacro.val[i]|=0x40000000;
ins->std.arpMacro.val[j]^=0x40000000;
}
if (ins->std.arpMacro.loop<ins->std.arpMacro.len && ins->std.arpMacro.len<255) {
if (ins->std.arpMacro.loop>=ins->std.arpMacro.len && ins->std.arpMacro.len<255) {
ins->std.arpMacro.val[ins->std.arpMacro.len++]=0;
}
}
@ -2928,7 +2928,7 @@ bool DivEngine::loadFC(unsigned char* file, size_t len) {
logV("unhandled pitch!");
} else {
if (fm.val[j]>0x80) {
ins->std.arpMacro.val[ins->std.arpMacro.len]=(fm.val[j]-0x80+24)|0x40000000;
ins->std.arpMacro.val[ins->std.arpMacro.len]=(fm.val[j]-0x80+24)^0x40000000;
} else {
ins->std.arpMacro.val[ins->std.arpMacro.len]=fm.val[j];
}

View file

@ -1347,9 +1347,9 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) {
if (std.arpMacro.mode) {
std.arpMacro.mode=0;
for (int i=0; i<std.arpMacro.len; i++) {
std.arpMacro.val[i]|=0x40000000;
std.arpMacro.val[i]^=0x40000000;
}
if (std.arpMacro.loop<std.arpMacro.len && std.arpMacro.rel>std.arpMacro.loop && std.arpMacro.len<255) {
if ((std.arpMacro.loop>=std.arpMacro.len || std.arpMacro.rel>std.arpMacro.loop) && std.arpMacro.len<255) {
std.arpMacro.val[std.arpMacro.len++]=0;
}
}

View file

@ -169,7 +169,7 @@ void DivPlatformGB::tick(bool sysTick) {
if (chan[i].baseFreq>255) chan[i].baseFreq=255;
if (chan[i].baseFreq<0) chan[i].baseFreq=0;
} else {
chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val));
chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val,24));
}
chan[i].freqChanged=true;
}

View file

@ -90,7 +90,9 @@ void DivPlatformTIA::tick(bool sysTick) {
// TODO: the way arps work on TIA is really weird
if (chan[i].std.arp.had) {
if (!chan[i].inPorta) {
if (chan[i].std.arp.val&0x40000000) {
if (chan[i].std.arp.val<0 && (!(chan[i].std.arp.val&0x40000000))) {
chan[i].baseFreq=0x80000000|(chan[i].std.arp.val|0x40000000);
} else if (chan[i].std.arp.val&0x40000000) {
chan[i].baseFreq=0x80000000|(chan[i].std.arp.val&(~0x40000000));
} else {
chan[i].baseFreq=(chan[i].note+chan[i].std.arp.val)<<8;