several important bug fixes to advanced arp macro
This commit is contained in:
parent
c009cb3536
commit
226f43fea3
7 changed files with 46 additions and 24 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue