Start BNK
This commit is contained in:
parent
ee14f0fa8c
commit
29ed73a157
|
@ -287,6 +287,7 @@ class DivEngine {
|
||||||
void loadVGI(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
void loadVGI(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
||||||
void loadS3I(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
void loadS3I(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
||||||
void loadSBI(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
void loadSBI(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
||||||
|
void loadBNK(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
||||||
void loadOPM(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
void loadOPM(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
||||||
void loadFF(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
void loadFF(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath);
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ enum DivInsFormats {
|
||||||
DIV_INSFORMAT_BTI,
|
DIV_INSFORMAT_BTI,
|
||||||
DIV_INSFORMAT_S3I,
|
DIV_INSFORMAT_S3I,
|
||||||
DIV_INSFORMAT_SBI,
|
DIV_INSFORMAT_SBI,
|
||||||
|
DIV_INSFORMAT_BNK,
|
||||||
DIV_INSFORMAT_OPM,
|
DIV_INSFORMAT_OPM,
|
||||||
DIV_INSFORMAT_FF,
|
DIV_INSFORMAT_FF,
|
||||||
};
|
};
|
||||||
|
@ -447,7 +448,7 @@ void DivEngine::loadS3I(SafeReader& reader, std::vector<DivInstrument*>& ret, St
|
||||||
logE("S3I PCM samples currently not supported.");
|
logE("S3I PCM samples currently not supported.");
|
||||||
}
|
}
|
||||||
ins->name = reader.readString(28);
|
ins->name = reader.readString(28);
|
||||||
ins->name = (ins->name[0] == '\0') ? stripPath : ins->name;
|
ins->name = (ins->name.length() == 0) ? stripPath : ins->name;
|
||||||
|
|
||||||
int s3i_signature = reader.readI();
|
int s3i_signature = reader.readI();
|
||||||
|
|
||||||
|
@ -544,9 +545,8 @@ void DivEngine::loadSBI(SafeReader& reader, std::vector<DivInstrument*>& ret, St
|
||||||
// Ignore rest of file - rest is 'reserved padding'.
|
// Ignore rest of file - rest is 'reserved padding'.
|
||||||
reader.seek(0, SEEK_END);
|
reader.seek(0, SEEK_END);
|
||||||
ret.push_back(ins);
|
ret.push_back(ins);
|
||||||
}
|
|
||||||
|
|
||||||
if (is_4op || is_6op) {
|
} else if (is_4op || is_6op) {
|
||||||
// Operator placement is different so need to place in correct registers.
|
// Operator placement is different so need to place in correct registers.
|
||||||
// Note: 6op is an unofficial extension of 4op SBIs by Darron Broad (Freq Monster 801).
|
// Note: 6op is an unofficial extension of 4op SBIs by Darron Broad (Freq Monster 801).
|
||||||
// We'll only use the 4op portion here for pure OPL3.
|
// We'll only use the 4op portion here for pure OPL3.
|
||||||
|
@ -624,8 +624,9 @@ void DivEngine::loadSBI(SafeReader& reader, std::vector<DivInstrument*>& ret, St
|
||||||
opC4.sl = ((sbi_C4eg_SR >> 4) & 0xF);
|
opC4.sl = ((sbi_C4eg_SR >> 4) & 0xF);
|
||||||
opC4.ws = sbi_C4wave;
|
opC4.ws = sbi_C4wave;
|
||||||
|
|
||||||
// Freq Monster 801 SBIs use a 4op+2op layout
|
|
||||||
if (is_6op) {
|
if (is_6op) {
|
||||||
|
// Freq Monster 801 6op SBIs use a 4+2op layout
|
||||||
|
// Save the 4op portion before reading the 2op part
|
||||||
ins->name = ins->name + " (4op)";
|
ins->name = ins->name + " (4op)";
|
||||||
ret.push_back(ins);
|
ret.push_back(ins);
|
||||||
|
|
||||||
|
@ -680,6 +681,7 @@ void DivEngine::loadSBI(SafeReader& reader, std::vector<DivInstrument*>& ret, St
|
||||||
|
|
||||||
// Ignore rest of file once we've read in all we need.
|
// Ignore rest of file once we've read in all we need.
|
||||||
// Note: Freq Monster 801 adds a ton of other additional fields irrelevant to chip registers.
|
// Note: Freq Monster 801 adds a ton of other additional fields irrelevant to chip registers.
|
||||||
|
// If instrument transpose is ever supported, we can read it in maybe?
|
||||||
reader.seek(0, SEEK_END);
|
reader.seek(0, SEEK_END);
|
||||||
ret.push_back(ins);
|
ret.push_back(ins);
|
||||||
}
|
}
|
||||||
|
@ -690,6 +692,22 @@ void DivEngine::loadSBI(SafeReader& reader, std::vector<DivInstrument*>& ret, St
|
||||||
delete ins;
|
delete ins;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void DivEngine::loadBNK(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath) {
|
||||||
|
DivInstrument* insList[256];
|
||||||
|
memset(insList, 0, 256 * sizeof(void*));
|
||||||
|
|
||||||
|
// First distinguish between GEMS BNK and Adlib BNK
|
||||||
|
bool is_gems = false; // TODO
|
||||||
|
bool is_adlib = true; // TODO
|
||||||
|
|
||||||
|
if (is_gems) {
|
||||||
|
logE("GEMS BNK currently not supported.");
|
||||||
|
|
||||||
|
} else if (is_adlib) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DivEngine::loadFF(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath) {
|
void DivEngine::loadFF(SafeReader& reader, std::vector<DivInstrument*>& ret, String& stripPath) {
|
||||||
DivInstrument* insList[256];
|
DivInstrument* insList[256];
|
||||||
|
@ -902,6 +920,8 @@ std::vector<DivInstrument*> DivEngine::instrumentFromFile(const char* path) {
|
||||||
format=DIV_INSFORMAT_S3I;
|
format=DIV_INSFORMAT_S3I;
|
||||||
} else if (extS==String(".sbi")) {
|
} else if (extS==String(".sbi")) {
|
||||||
format=DIV_INSFORMAT_SBI;
|
format=DIV_INSFORMAT_SBI;
|
||||||
|
} else if (ext5==String(".bnk")) {
|
||||||
|
format=DIV_INSFORMAT_BNK;
|
||||||
} else if (extS==String(".opm")) {
|
} else if (extS==String(".opm")) {
|
||||||
format=DIV_INSFORMAT_OPM;
|
format=DIV_INSFORMAT_OPM;
|
||||||
} else if (extS==String(".ff")) {
|
} else if (extS==String(".ff")) {
|
||||||
|
@ -932,6 +952,8 @@ std::vector<DivInstrument*> DivEngine::instrumentFromFile(const char* path) {
|
||||||
case DIV_INSFORMAT_SBI:
|
case DIV_INSFORMAT_SBI:
|
||||||
loadSBI(reader,ret,stripPath);
|
loadSBI(reader,ret,stripPath);
|
||||||
break;
|
break;
|
||||||
|
case DIV_INSFORMAT_BNK:
|
||||||
|
loadBNK(reader, ret, stripPath);
|
||||||
case DIV_INSFORMAT_FF:
|
case DIV_INSFORMAT_FF:
|
||||||
loadFF(reader,ret,stripPath);
|
loadFF(reader,ret,stripPath);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue