mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-29 16:03:01 +00:00
PowerNoise: add octave param
This commit is contained in:
parent
9a6b5fb850
commit
ef9a629d76
3 changed files with 54 additions and 0 deletions
|
@ -150,6 +150,7 @@ the following feature codes are recognized:
|
||||||
- `X1`: X1-010 ins data
|
- `X1`: X1-010 ins data
|
||||||
- `NE`: NES DPCM sample map data
|
- `NE`: NES DPCM sample map data
|
||||||
- `EF`: ESFM ins data
|
- `EF`: ESFM ins data
|
||||||
|
- `PN`: PowerNoise ins data
|
||||||
- `EN`: end of features
|
- `EN`: end of features
|
||||||
- if you find this feature code, stop reading the instrument.
|
- if you find this feature code, stop reading the instrument.
|
||||||
- it will usually appear only when there sample/wave lists.
|
- it will usually appear only when there sample/wave lists.
|
||||||
|
@ -657,3 +658,11 @@ size | description
|
||||||
|
|
||||||
if some fields are missing, that's because they are defined in the SM feature.
|
if some fields are missing, that's because they are defined in the SM feature.
|
||||||
NES instruments with DPCM sample maps have both SM and NE features.
|
NES instruments with DPCM sample maps have both SM and NE features.
|
||||||
|
|
||||||
|
# PowerNoise data (PN)
|
||||||
|
|
||||||
|
```
|
||||||
|
size | description
|
||||||
|
-----|------------------------------------
|
||||||
|
1 | octave
|
||||||
|
```
|
||||||
|
|
|
@ -253,6 +253,10 @@ bool DivInstrumentESFM::Operator::operator==(const DivInstrumentESFM::Operator&
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DivInstrumentPowerNoise::operator==(const DivInstrumentPowerNoise& other) {
|
||||||
|
return _C(octave);
|
||||||
|
}
|
||||||
|
|
||||||
#undef _C
|
#undef _C
|
||||||
|
|
||||||
#define FEATURE_BEGIN(x) \
|
#define FEATURE_BEGIN(x) \
|
||||||
|
@ -782,6 +786,14 @@ void DivInstrument::writeFeatureEF(SafeWriter* w) {
|
||||||
FEATURE_END;
|
FEATURE_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DivInstrument::writeFeaturePN(SafeWriter* w) {
|
||||||
|
FEATURE_BEGIN("PN");
|
||||||
|
|
||||||
|
w->writeC(powernoise.octave);
|
||||||
|
|
||||||
|
FEATURE_END;
|
||||||
|
}
|
||||||
|
|
||||||
void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bool insName) {
|
void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bool insName) {
|
||||||
size_t blockStartSeek=0;
|
size_t blockStartSeek=0;
|
||||||
size_t blockEndSeek=0;
|
size_t blockEndSeek=0;
|
||||||
|
@ -826,6 +838,7 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bo
|
||||||
bool featureX1=false;
|
bool featureX1=false;
|
||||||
bool featureNE=false;
|
bool featureNE=false;
|
||||||
bool featureEF=false;
|
bool featureEF=false;
|
||||||
|
bool featurePN=false;
|
||||||
|
|
||||||
bool checkForWL=false;
|
bool checkForWL=false;
|
||||||
|
|
||||||
|
@ -1044,8 +1057,10 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bo
|
||||||
featureEF=true;
|
featureEF=true;
|
||||||
break;
|
break;
|
||||||
case DIV_INS_POWERNOISE:
|
case DIV_INS_POWERNOISE:
|
||||||
|
featurePN=true;
|
||||||
break;
|
break;
|
||||||
case DIV_INS_POWERNOISE_SLOPE:
|
case DIV_INS_POWERNOISE_SLOPE:
|
||||||
|
featurePN=true;
|
||||||
break;
|
break;
|
||||||
case DIV_INS_MAX:
|
case DIV_INS_MAX:
|
||||||
break;
|
break;
|
||||||
|
@ -1097,6 +1112,9 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bo
|
||||||
if (esfm!=defaultIns.esfm) {
|
if (esfm!=defaultIns.esfm) {
|
||||||
featureEF=true;
|
featureEF=true;
|
||||||
}
|
}
|
||||||
|
if (powernoise!=defaultIns.powernoise) {
|
||||||
|
featurePN=true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check ins name
|
// check ins name
|
||||||
|
@ -1242,6 +1260,9 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song, bo
|
||||||
if (featureEF) {
|
if (featureEF) {
|
||||||
writeFeatureEF(w);
|
writeFeatureEF(w);
|
||||||
}
|
}
|
||||||
|
if (featurePN) {
|
||||||
|
writeFeaturePN(w);
|
||||||
|
}
|
||||||
|
|
||||||
if (fui && (featureSL || featureWL)) {
|
if (fui && (featureSL || featureWL)) {
|
||||||
w->write("EN",2);
|
w->write("EN",2);
|
||||||
|
@ -2677,6 +2698,14 @@ void DivInstrument::readFeatureEF(SafeReader& reader, short version) {
|
||||||
READ_FEAT_END;
|
READ_FEAT_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DivInstrument::readFeaturePN(SafeReader& reader, short version) {
|
||||||
|
READ_FEAT_BEGIN;
|
||||||
|
|
||||||
|
powernoise.octave=reader.readC();
|
||||||
|
|
||||||
|
READ_FEAT_END;
|
||||||
|
}
|
||||||
|
|
||||||
DivDataErrors DivInstrument::readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song) {
|
DivDataErrors DivInstrument::readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song) {
|
||||||
unsigned char featCode[2];
|
unsigned char featCode[2];
|
||||||
bool volIsCutoff=false;
|
bool volIsCutoff=false;
|
||||||
|
@ -2747,6 +2776,8 @@ DivDataErrors DivInstrument::readInsDataNew(SafeReader& reader, short version, b
|
||||||
readFeatureNE(reader,version);
|
readFeatureNE(reader,version);
|
||||||
} else if (memcmp(featCode,"EF",2)==0) { // ESFM
|
} else if (memcmp(featCode,"EF",2)==0) { // ESFM
|
||||||
readFeatureEF(reader,version);
|
readFeatureEF(reader,version);
|
||||||
|
} else if (memcmp(featCode,"PN",2)==0) { // PowerNoise
|
||||||
|
readFeaturePN(reader,version);
|
||||||
} else {
|
} else {
|
||||||
if (song==NULL && (memcmp(featCode,"SL",2)==0 || (memcmp(featCode,"WL",2)==0))) {
|
if (song==NULL && (memcmp(featCode,"SL",2)==0 || (memcmp(featCode,"WL",2)==0))) {
|
||||||
// nothing
|
// nothing
|
||||||
|
|
|
@ -824,6 +824,17 @@ struct DivInstrumentESFM {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DivInstrumentPowerNoise {
|
||||||
|
unsigned char octave;
|
||||||
|
|
||||||
|
bool operator==(const DivInstrumentPowerNoise& other);
|
||||||
|
bool operator!=(const DivInstrumentPowerNoise& other) {
|
||||||
|
return !(*this==other);
|
||||||
|
}
|
||||||
|
DivInstrumentPowerNoise():
|
||||||
|
octave(0) {}
|
||||||
|
};
|
||||||
|
|
||||||
struct DivInstrument {
|
struct DivInstrument {
|
||||||
String name;
|
String name;
|
||||||
DivInstrumentType type;
|
DivInstrumentType type;
|
||||||
|
@ -841,6 +852,7 @@ struct DivInstrument {
|
||||||
DivInstrumentES5506 es5506;
|
DivInstrumentES5506 es5506;
|
||||||
DivInstrumentSNES snes;
|
DivInstrumentSNES snes;
|
||||||
DivInstrumentESFM esfm;
|
DivInstrumentESFM esfm;
|
||||||
|
DivInstrumentPowerNoise powernoise;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* these are internal functions.
|
* these are internal functions.
|
||||||
|
@ -866,6 +878,7 @@ struct DivInstrument {
|
||||||
void writeFeatureX1(SafeWriter* w);
|
void writeFeatureX1(SafeWriter* w);
|
||||||
void writeFeatureNE(SafeWriter* w);
|
void writeFeatureNE(SafeWriter* w);
|
||||||
void writeFeatureEF(SafeWriter* w);
|
void writeFeatureEF(SafeWriter* w);
|
||||||
|
void writeFeaturePN(SafeWriter* w);
|
||||||
|
|
||||||
void readFeatureNA(SafeReader& reader, short version);
|
void readFeatureNA(SafeReader& reader, short version);
|
||||||
void readFeatureFM(SafeReader& reader, short version);
|
void readFeatureFM(SafeReader& reader, short version);
|
||||||
|
@ -887,6 +900,7 @@ struct DivInstrument {
|
||||||
void readFeatureX1(SafeReader& reader, short version);
|
void readFeatureX1(SafeReader& reader, short version);
|
||||||
void readFeatureNE(SafeReader& reader, short version);
|
void readFeatureNE(SafeReader& reader, short version);
|
||||||
void readFeatureEF(SafeReader& reader, short version);
|
void readFeatureEF(SafeReader& reader, short version);
|
||||||
|
void readFeaturePN(SafeReader& reader, short version);
|
||||||
|
|
||||||
DivDataErrors readInsDataOld(SafeReader& reader, short version);
|
DivDataErrors readInsDataOld(SafeReader& reader, short version);
|
||||||
DivDataErrors readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song);
|
DivDataErrors readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song);
|
||||||
|
|
Loading…
Reference in a new issue