giga-refactor, part 20

convert compat SegaPCM to normal SegaPCM with 5 channels
convert Neo Geo CD to YM2610
This commit is contained in:
tildearrow 2025-11-21 04:58:56 -05:00
parent 26993d2b40
commit 47e2910498
16 changed files with 79 additions and 120 deletions

View file

@ -397,7 +397,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
if (ds.system[0]==DIV_SYSTEM_C64_8580 || ds.system[0]==DIV_SYSTEM_C64_6581) {
ins->type=DIV_INS_C64;
}
if (ds.system[0]==DIV_SYSTEM_YM2610 || ds.system[0]==DIV_SYSTEM_YM2610_EXT
if (ds.system[0]==DIV_SYSTEM_YM2610_CRAP || ds.system[0]==DIV_SYSTEM_YM2610_CRAP_EXT
|| ds.system[0]==DIV_SYSTEM_YM2610_FULL || ds.system[0]==DIV_SYSTEM_YM2610_FULL_EXT
|| ds.system[0]==DIV_SYSTEM_YM2610B || ds.system[0]==DIV_SYSTEM_YM2610B_EXT) {
if (!mode) {
@ -629,7 +629,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
}
// piece of crap offset by 1
if (ds.system[0]==DIV_SYSTEM_YM2610 || ds.system[0]==DIV_SYSTEM_YM2610_EXT) {
if (ds.system[0]==DIV_SYSTEM_YM2610_CRAP || ds.system[0]==DIV_SYSTEM_YM2610_CRAP_EXT) {
ins->std.waveMacro.val[j]++;
}
}
@ -1169,8 +1169,21 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
ds.systemFlags[0].set("brokenPitch",true);
}
ds.systemName=getSongSystemLegacyName(ds,!getConfInt("noMultiSystem",0));
ds.initDefaultSystemChans();
// flatten 5-channel SegaPCM and Neo Geo CD
for (int i=0; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_SEGAPCM_COMPAT) {
ds.system[i]=DIV_SYSTEM_SEGAPCM;
} else if (ds.system[i]==DIV_SYSTEM_YM2610_CRAP) {
ds.system[i]=DIV_SYSTEM_YM2610_FULL;
} else if (ds.system[i]==DIV_SYSTEM_YM2610_CRAP_EXT) {
ds.system[i]=DIV_SYSTEM_YM2610_FULL_EXT;
}
}
ds.systemName=getSongSystemLegacyName(ds,!getConfInt("noMultiSystem",0));
ds.recalcChans();
if (active) quitDispatch();
@ -1209,6 +1222,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
lastError="invalid version to save in! this is a bug!";
return NULL;
}
int actualChans=song.chans;
// check whether system is compound
bool isFlat=false;
if (song.systemLen==2) {
@ -1218,8 +1232,10 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
if (song.system[0]==DIV_SYSTEM_YM2612_EXT && song.system[1]==DIV_SYSTEM_SMS) {
isFlat=true;
}
if (song.system[0]==DIV_SYSTEM_YM2151 && song.system[1]==DIV_SYSTEM_SEGAPCM_COMPAT) {
if (song.system[0]==DIV_SYSTEM_YM2151 && song.system[1]==DIV_SYSTEM_SEGAPCM) {
isFlat=true;
addWarning("only first 5 channels of SegaPCM.");
actualChans=13;
}
if (song.system[0]==DIV_SYSTEM_SMS && song.system[1]==DIV_SYSTEM_OPLL) {
isFlat=true;
@ -1235,6 +1251,10 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
addWarning("your song will sound different. I am not going to bother adding further compatibility.");
}
}
if (song.system[0]==DIV_SYSTEM_YM2610_FULL || song.system[0]==DIV_SYSTEM_YM2610_FULL_EXT) {
addWarning("ADPCM-B not supported.");
actualChans--;
}
// fail if more than one system
if (!isFlat && song.systemLen!=1) {
logE("cannot save multiple systems in this format!");
@ -1293,7 +1313,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
lastError="maximum number of wavetables in .dmf is 64";
return NULL;
}
for (int i=0; i<song.chans; i++) {
for (int i=0; i<actualChans; i++) {
for (int j=0; j<curSubSong->ordersLen; j++) {
if (curOrders->ord[i][j]>0x7f) {
logE("order %d, %d is out of range (0-127)!",i,j);
@ -1320,7 +1340,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
} else if (song.system[0]==DIV_SYSTEM_YM2612_EXT && song.system[1]==DIV_SYSTEM_SMS) {
w->writeC(systemToFileDMF(DIV_SYSTEM_GENESIS_EXT));
sys=DIV_SYSTEM_GENESIS_EXT;
} else if (song.system[0]==DIV_SYSTEM_YM2151 && song.system[1]==DIV_SYSTEM_SEGAPCM_COMPAT) {
} else if (song.system[0]==DIV_SYSTEM_YM2151 && song.system[1]==DIV_SYSTEM_SEGAPCM) {
w->writeC(systemToFileDMF(DIV_SYSTEM_ARCADE));
sys=DIV_SYSTEM_ARCADE;
} else if (song.system[0]==DIV_SYSTEM_SMS && song.system[1]==DIV_SYSTEM_OPLL) {
@ -1335,6 +1355,12 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
} else if (song.system[0]==DIV_SYSTEM_AY8910 && song.system[1]==DIV_SYSTEM_SCC) {
w->writeC(systemToFileDMF(DIV_SYSTEM_MSX2));
sys=DIV_SYSTEM_MSX2;
} else if (song.system[0]==DIV_SYSTEM_YM2610_FULL) {
w->writeC(systemToFileDMF(DIV_SYSTEM_YM2610_CRAP));
sys=DIV_SYSTEM_YM2610_CRAP;
} else if (song.system[0]==DIV_SYSTEM_YM2610_FULL_EXT) {
w->writeC(systemToFileDMF(DIV_SYSTEM_YM2610_CRAP_EXT));
sys=DIV_SYSTEM_YM2610_CRAP_EXT;
} else {
w->writeC(systemToFileDMF(song.system[0]));
sys=song.system[0];
@ -1360,7 +1386,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
w->writeI(curSubSong->patLen);
w->writeC(curSubSong->ordersLen);
for (int i=0; i<song.chans; i++) {
for (int i=0; i<actualChans; i++) {
for (int j=0; j<curSubSong->ordersLen; j++) {
w->writeC(curOrders->ord[i][j]);
if (version>=25) {
@ -1429,8 +1455,8 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
case DIV_SYSTEM_PCE:
i->type=DIV_INS_PCE;
break;
case DIV_SYSTEM_YM2610:
case DIV_SYSTEM_YM2610_EXT:
case DIV_SYSTEM_YM2610_FULL:
case DIV_SYSTEM_YM2610_FULL_EXT:
i->type=DIV_INS_AY;
break;
default:
@ -1582,7 +1608,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
w->writeC(realWaveMacroLen);
for (int j=0; j<realWaveMacroLen; j++) {
// piece of crap offset by 1
if (song.system[0]==DIV_SYSTEM_YM2610 || song.system[0]==DIV_SYSTEM_YM2610_EXT) {
if (song.system[0]==DIV_SYSTEM_YM2610_FULL || song.system[0]==DIV_SYSTEM_YM2610_FULL_EXT) {
w->writeI(i->std.waveMacro.val[j]-1);
} else {
w->writeI(i->std.waveMacro.val[j]);
@ -1646,7 +1672,7 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
bool relWarning=false;
for (int i=0; i<getChannelCount(sys); i++) {
for (int i=0; i<actualChans; i++) {
short note, octave;
w->writeC(curPat[i].effectCols);
@ -1675,13 +1701,13 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) {
alwaysConvert=true;
}
break;
case DIV_SYSTEM_YM2610:
case DIV_SYSTEM_YM2610_CRAP:
if (i>=7) {
convertSampleUsage=true;
alwaysConvert=true;
}
break;
case DIV_SYSTEM_YM2610_EXT:
case DIV_SYSTEM_YM2610_CRAP_EXT:
if (i>=10) {
convertSampleUsage=true;
alwaysConvert=true;

View file

@ -166,8 +166,8 @@ void DivEngine::convertOldFlags(unsigned int oldFlags, DivConfig& newFlags, DivS
break;
}
break;
case DIV_SYSTEM_YM2610:
case DIV_SYSTEM_YM2610_EXT:
case DIV_SYSTEM_YM2610_CRAP:
case DIV_SYSTEM_YM2610_CRAP_EXT:
case DIV_SYSTEM_YM2610_FULL:
case DIV_SYSTEM_YM2610_FULL_EXT:
case DIV_SYSTEM_YM2610B:
@ -1234,6 +1234,17 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
ds.initDefaultSystemChans();
ds.chans=tchans;
// flatten 5-channel SegaPCM and Neo Geo CD
for (int i=0; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_SEGAPCM_COMPAT) {
ds.system[i]=DIV_SYSTEM_SEGAPCM;
} else if (ds.system[i]==DIV_SYSTEM_YM2610_CRAP) {
ds.system[i]=DIV_SYSTEM_YM2610_FULL;
} else if (ds.system[i]==DIV_SYSTEM_YM2610_CRAP_EXT) {
ds.system[i]=DIV_SYSTEM_YM2610_FULL_EXT;
}
}
ds.name=reader.readString();
ds.author=reader.readString();
logI("%s by %s",ds.name.c_str(),ds.author.c_str());
@ -2095,8 +2106,6 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
case DIV_SYSTEM_OPZ:
opmCount++;
break;
case DIV_SYSTEM_YM2610:
case DIV_SYSTEM_YM2610_EXT:
case DIV_SYSTEM_YM2610_FULL:
case DIV_SYSTEM_YM2610_FULL_EXT:
case DIV_SYSTEM_YM2610B:
@ -2131,7 +2140,6 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
for (int i=0; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_YM2612_EXT ||
ds.system[i]==DIV_SYSTEM_YM2612_DUALPCM_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_FULL_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610B_EXT ||
ds.system[i]==DIV_SYSTEM_YM2203_EXT ||
@ -2208,7 +2216,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len, int variantID) {
// SegaPCM slide compat
if (ds.version<153) {
for (int i=0; i<ds.systemLen; i++) {
if (ds.system[i]==DIV_SYSTEM_SEGAPCM || ds.system[i]==DIV_SYSTEM_SEGAPCM_COMPAT) {
if (ds.system[i]==DIV_SYSTEM_SEGAPCM) {
ds.systemFlags[i].set("oldSlides",true);
}
}