implement extra FM effects (OPN, OPM and OPZ)

issue #38
This commit is contained in:
tildearrow 2022-05-04 14:09:43 -05:00
parent 28e7b86728
commit 467036df2a
12 changed files with 1171 additions and 17 deletions

View file

@ -26,6 +26,7 @@
#define DIV_READ_SIZE 131072
#define DIV_DMF_MAGIC ".DelekDefleMask."
#define DIV_FUR_MAGIC "-Furnace module-"
#define DIV_FTM_MAGIC "FamiTracker Module"
struct InflateBlock {
unsigned char* buf;
@ -1617,8 +1618,6 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
return true;
}
bool DivEngine::loadMod(unsigned char* file, size_t len) {
struct InvalidHeaderException {};
bool success=false;
@ -2029,10 +2028,43 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) {
return success;
}
bool DivEngine::loadFTM(unsigned char* file, size_t len) {
SafeReader reader=SafeReader(file,len);
warnings="";
try {
DivSong ds;
if (!reader.seek(18,SEEK_SET)) {
logE("premature end of file!");
lastError="incomplete file";
delete[] file;
return false;
}
ds.version=(unsigned short)reader.readS();
logI("module version %d (0x%.4x)",ds.version,ds.version);
if (ds.version>0x0440) {
logE("incompatible version %x!",ds.version);
lastError="incompatible version";
delete[] file;
return false;
}
} catch (EndOfFileException& e) {
logE("premature end of file!");
lastError="incomplete file";
delete[] file;
return false;
}
delete[] file;
return true;
}
bool DivEngine::load(unsigned char* f, size_t slen) {
unsigned char* file;
size_t len;
if (slen<16) {
if (slen<18) {
logE("too small!");
lastError="file is too small";
delete[] f;
@ -2137,6 +2169,8 @@ bool DivEngine::load(unsigned char* f, size_t slen) {
// step 2: try loading as .fur or .dmf
if (memcmp(file,DIV_DMF_MAGIC,16)==0) {
return loadDMF(file,len);
} else if (memcmp(file,DIV_FTM_MAGIC,18)==0) {
return loadFTM(file,len);
} else if (memcmp(file,DIV_FUR_MAGIC,16)==0) {
return loadFur(file,len);
}