diff --git a/papers/format.md b/papers/format.md index 1a8cd7219..5dd7d206a 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 107: Furnace dev107 - 106: Furnace dev106 - 105: Furnace dev105 - 104: Furnace dev104 @@ -850,6 +851,21 @@ size | description --- | **Game Boy extra flags** (>=106) 1 | use software envelope 1 | always init hard env on new note + --- | **ES5506 data** (>=107) + 1 | filter mode + | - 0: HPK2_HPK2 + | - 1: HPK2_LPK1 + | - 2: LPK2_LPK2 + | - 3: LPK2_LPK1 + 2 | K1 + 2 | K2 + 2 | envelope count + 1 | left volume ramp + 1 | right volume ramp + 1 | K1 ramp + 1 | K2 ramp + 1 | K1 slow + 1 | K2 slow ``` # wavetable diff --git a/src/engine/engine.h b/src/engine/engine.h index 191414f5f..8e2c094da 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -46,8 +46,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev106" -#define DIV_ENGINE_VERSION 106 +#define DIV_VERSION "dev107" +#define DIV_ENGINE_VERSION 107 // for imports #define DIV_VERSION_MOD 0xff01 diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 2836e6f95..1720bf56a 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -543,6 +543,18 @@ void DivInstrument::putInsData(SafeWriter* w) { w->writeC(gb.softEnv); w->writeC(gb.alwaysInit); + // ES5506 + w->writeC(es5506.filter.mode); + w->writeS(es5506.filter.k1); + w->writeS(es5506.filter.k2); + w->writeS(es5506.envelope.ecount); + w->writeC(es5506.envelope.lVRamp); + w->writeC(es5506.envelope.rVRamp); + w->writeC(es5506.envelope.k1Ramp); + w->writeC(es5506.envelope.k2Ramp); + w->writeC(es5506.envelope.k1Slow); + w->writeC(es5506.envelope.k2Slow); + blockEndSeek=w->tell(); w->seek(blockStartSeek,SEEK_SET); w->writeI(blockEndSeek-blockStartSeek-4); @@ -1111,6 +1123,20 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) { gb.alwaysInit=reader.readC(); } + // ES5506 + if (version>=107) { + es5506.filter.mode=(DivInstrumentES5506::Filter::FilterMode)reader.readC(); + es5506.filter.k1=reader.readS(); + es5506.filter.k2=reader.readS(); + es5506.envelope.ecount=reader.readS(); + es5506.envelope.lVRamp=reader.readC(); + es5506.envelope.rVRamp=reader.readC(); + es5506.envelope.k1Ramp=reader.readC(); + es5506.envelope.k2Ramp=reader.readC(); + es5506.envelope.k1Slow=reader.readC(); + es5506.envelope.k2Slow=reader.readC(); + } + return DIV_DATA_SUCCESS; } diff --git a/src/engine/instrument.h b/src/engine/instrument.h index cfbed65a3..d3df4b631 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -468,7 +468,7 @@ struct DivInstrumentSoundUnit { struct DivInstrumentES5506 { struct Filter { enum FilterMode: unsigned char { // filter mode for pole 4,3 - FILTER_MODE_HPK2_HPK2, + FILTER_MODE_HPK2_HPK2=0, FILTER_MODE_HPK2_LPK1, FILTER_MODE_LPK2_LPK2, FILTER_MODE_LPK2_LPK1, @@ -494,12 +494,9 @@ struct DivInstrumentES5506 { k1Slow(false), k2Slow(false) {} }; - signed int lVol, rVol; Filter filter; Envelope envelope; - DivInstrumentES5506(): - lVol(0xffff), - rVol(0xffff) {} + DivInstrumentES5506() {} }; struct DivInstrument {