Fix playback and VGM export

This commit is contained in:
Natt Akuma 2022-03-07 01:26:59 +07:00
parent 840a6fa306
commit 25088d6032
4 changed files with 66 additions and 53 deletions

View file

@ -187,7 +187,7 @@ void DivPlatformWS::tick() {
} }
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true); chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true);
if (i==1 && furnaceDac) { if (i==1 && pcm && furnaceDac) {
double off=1.0; double off=1.0;
if (dacSample>=0 && dacSample<parent->song.sampleLen) { if (dacSample>=0 && dacSample<parent->song.sampleLen) {
DivSample* s=parent->getSample(dacSample); DivSample* s=parent->getSample(dacSample);
@ -237,12 +237,13 @@ int DivPlatformWS::dispatch(DivCommand c) {
switch (c.cmd) { switch (c.cmd) {
case DIV_CMD_NOTE_ON: { case DIV_CMD_NOTE_ON: {
DivInstrument* ins=parent->getIns(chan[c.chan].ins); DivInstrument* ins=parent->getIns(chan[c.chan].ins);
if (c.chan==1 && ins->type==DIV_INS_AMIGA) { if (c.chan==1) {
if (ins->type==DIV_INS_AMIGA) {
pcm=true; pcm=true;
} else if (furnaceDac) { } else if (furnaceDac) {
pcm=false; pcm=false;
} }
if (c.chan==1 && pcm) { if (pcm) {
if (skipRegisterWrites) break; if (skipRegisterWrites) break;
dacPos=0; dacPos=0;
dacPeriod=0; dacPeriod=0;
@ -288,6 +289,7 @@ int DivPlatformWS::dispatch(DivCommand c) {
} }
break; break;
} }
}
if (c.value!=DIV_NOTE_NULL) { if (c.value!=DIV_NOTE_NULL) {
chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); chan[c.chan].baseFreq=NOTE_PERIODIC(c.value);
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
@ -412,7 +414,7 @@ int DivPlatformWS::dispatch(DivCommand c) {
return 15; return 15;
break; break;
case DIV_ALWAYS_SET_VOLUME: case DIV_ALWAYS_SET_VOLUME:
return 0; return 1;
break; break;
default: default:
break; break;
@ -456,6 +458,7 @@ void DivPlatformWS::reset() {
chan[i]=Channel(); chan[i]=Channel();
chan[i].vol=15; chan[i].vol=15;
chan[i].pan=0xff; chan[i].pan=0xff;
rWrite(0x08+i,0xff);
} }
if (dumpWrites) { if (dumpWrites) {
addWrite(0xffffffff,0); addWrite(0xffffffff,0);

View file

@ -80,6 +80,10 @@ int SafeWriter::writeC(signed char val) {
int SafeWriter::writeS(short val) { int SafeWriter::writeS(short val) {
return write(&val,2); return write(&val,2);
} }
int SafeWriter::writeS_BE(short val) {
unsigned char bytes[2]{(val>>8)&0xff, val&0xff};
return write(bytes,2);
}
int SafeWriter::writeI(int val) { int SafeWriter::writeI(int val) {
return write(&val,4); return write(&val,4);

View file

@ -451,7 +451,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write
} else { } else {
// (Wave) RAM write // (Wave) RAM write
w->writeC(0xc6); w->writeC(0xc6);
w->writeS(baseAddr2S|(write.addr&0x3f)); w->writeS_BE(baseAddr2S|(write.addr&0x3f));
w->writeC(write.val&0xff); w->writeC(write.val&0xff);
} }
break; break;
@ -1061,9 +1061,9 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop) {
case DIV_SYSTEM_SWAN: case DIV_SYSTEM_SWAN:
w->writeC(0x90); w->writeC(0x90);
w->writeC(streamID); w->writeC(streamID);
w->writeC(33); w->writeC(isSecond[i]?0xa1:0x21);
w->writeC(0); // port w->writeC(0); // port
w->writeC(isSecond[i]?0x89:0x09); // DAC w->writeC(0x09); // DAC
w->writeC(0x91); w->writeC(0x91);
w->writeC(streamID); w->writeC(streamID);

View file

@ -6398,6 +6398,12 @@ FurnaceGUI::FurnaceGUI():
0 0
} }
)); ));
cat.systems.push_back(FurnaceGUISysDef(
"WonderSwan", {
DIV_SYSTEM_SWAN, 64, 0, 0,
0
}
));
sysCategories.push_back(cat); sysCategories.push_back(cat);
cat=FurnaceGUISysCategory("Computers"); cat=FurnaceGUISysCategory("Computers");