diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 1c04092b7..e8a5f65fb 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -69,7 +69,7 @@ void DivPlatformC64::tick() { rWrite(i*7+4,(isMuted[i]?0:(chan[i].wave<<4))|(chan[i].ring<<2)|(chan[i].sync<<1)|chan[i].active); } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE+chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)chan[i].pitch/(12.0*128.0))); if (chan[i].freq>0xffff) chan[i].freq=0xffff; if (chan[i].keyOn) { rWrite(i*7+5,(chan[i].attack<<4)|(chan[i].decay)); diff --git a/src/engine/platform/dummy.cpp b/src/engine/platform/dummy.cpp index 62f4298b9..d4497ef50 100644 --- a/src/engine/platform/dummy.cpp +++ b/src/engine/platform/dummy.cpp @@ -25,7 +25,7 @@ void DivPlatformDummy::tick() { if (chan[i].freqChanged) { chan[i].freqChanged=false; - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE+chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)chan[i].pitch/(12.0*128.0))); } } } diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index e5c4d4d80..5441f0fce 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -126,7 +126,7 @@ void DivPlatformGB::tick() { if (i==3) { // noise chan[i].freq=noiseTable[chan[i].baseFreq]; } else { - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE-chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)-chan[i].pitch/(12.0*128.0))); if (chan[i].freq>2047) chan[i].freq=2047; } if (chan[i].note>0x5d) chan[i].freq=0x01; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 988511b3a..055481625 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -94,7 +94,7 @@ void DivPlatformGenesis::tick() { for (int i=0; i<6; i++) { if (i==2 && extMode) continue; if (chan[i].freqChanged) { - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE+chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)chan[i].pitch/(12.0*128.0))); int freqt=toFreq(chan[i].freq); immWrite(chanOffs[i]+0xa4,freqt>>8); immWrite(chanOffs[i]+0xa0,freqt&0xff); diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 980e637a8..2997b9caa 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -241,7 +241,7 @@ void DivPlatformGenesisExt::tick() { unsigned char writeMask=2; if (extMode) for (int i=0; i<4; i++) { if (opChan[i].freqChanged) { - opChan[i].freq=(opChan[i].baseFreq*(ONE_SEMITONE+opChan[i].pitch))/ONE_SEMITONE; + opChan[i].freq=(opChan[i].baseFreq*pow(2,(double)opChan[i].pitch/(12.0*128.0))); if (opChan[i].freq>=82432) { opChan[i].freqH=((opChan[i].freq>>15)&7)|0x38; opChan[i].freqL=(opChan[i].freq>>7)&0xff; diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 1d12fb513..a6acb74df 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -111,7 +111,7 @@ void DivPlatformPCE::tick() { } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { //DivInstrument* ins=parent->getIns(chan[i].ins); - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE-chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)-chan[i].pitch/(12.0*128.0))); if (chan[i].freq>4095) chan[i].freq=4095; if (chan[i].note>0x5d) chan[i].freq=0x01; chWrite(i,0x02,chan[i].freq&0xff); diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index f62d0eb68..bf6ce7167 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -37,7 +37,7 @@ void DivPlatformSMS::tick() { } for (int i=0; i<3; i++) { if (chan[i].freqChanged) { - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE-chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)-chan[i].pitch/(12.0*128.0))); if (chan[i].note>0x5d) chan[i].freq=0x01; sn->write(0x80|i<<5|(chan[i].freq&15)); sn->write(chan[i].freq>>4); @@ -46,7 +46,7 @@ void DivPlatformSMS::tick() { } if (chan[3].freqChanged || updateSNMode) { updateSNMode=false; - chan[3].freq=(chan[3].baseFreq*(ONE_SEMITONE-chan[3].pitch))/ONE_SEMITONE; + chan[3].freq=(chan[3].baseFreq*pow(2,(double)-chan[3].pitch/(12.0*128.0))); if (chan[3].note>0x5d) chan[3].freq=0x01; chan[3].freqChanged=false; if (snNoiseMode&2) { // take period from channel 3 diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 26e631f63..538ef30fd 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -75,7 +75,7 @@ void DivPlatformYM2610::tick() { chan[i].psgMode|=(chan[i].std.wave+1)&3; } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE-chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)-chan[i].pitch/(12.0*128.0))); if (chan[i].freq>4095) chan[i].freq=4095; if (chan[i].keyOn) { //rWrite(16+i*5+1,((chan[i].duty&3)<<6)|(63-(ins->gb.soundLen&63))); @@ -119,7 +119,7 @@ void DivPlatformYM2610::tick() { for (int i=0; i<4; i++) { if (i==1 && extMode) continue; if (chan[i].freqChanged) { - chan[i].freq=(chan[i].baseFreq*(ONE_SEMITONE+chan[i].pitch))/ONE_SEMITONE; + chan[i].freq=(chan[i].baseFreq*pow(2,(double)chan[i].pitch/(12.0*128.0))); int freqt=toFreq(chan[i].freq); immWrite(chanOffs[i]+0xa4,freqt>>8); immWrite(chanOffs[i]+0xa0,freqt&0xff); diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 3505c9789..5a5e310a8 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -217,7 +217,7 @@ void DivPlatformYM2610Ext::tick() { unsigned char writeMask=2; if (extMode) for (int i=0; i<4; i++) { if (opChan[i].freqChanged) { - opChan[i].freq=(opChan[i].baseFreq*(ONE_SEMITONE+opChan[i].pitch))/ONE_SEMITONE; + opChan[i].freq=(opChan[i].baseFreq*pow(2,(double)opChan[i].pitch/(12.0*128.0))); int freqt=toFreq(opChan[i].freq); opChan[i].freqH=freqt>>8; opChan[i].freqL=freqt&0xff; diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index a8490b6b3..fbdf2f786 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -525,8 +525,15 @@ void DivEngine::processRow(int i, bool afterDelay) { for (int i=0; i0x80) { + for (int i=0; i>4)/15)));