diff --git a/papers/format.md b/papers/format.md index 97e22a4e..26395502 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,8 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 105: Furance dev105 +- 104: Furnace dev104 - 103: Furnace dev103 - 102: Furnace 0.6pre1 (dev102) - 101: Furnace 0.6pre1 (dev101) @@ -813,6 +815,37 @@ size | description --- | **Sound Unit data** (>=104) 1 | use sample 1 | switch roles of phase reset timer and frequency + --- | **Game Boy envelope sequence** (>=105) + 1 | length + ??? | hardware sequence data + | size is length*3: + | 1 byte: command + | - 0: set envelope + | - 1: set sweep + | - 2: wait + | - 3: wait for release + | - 4: loop + | - 5: loop until release + | 2 bytes: data + | - for set envelope: + | - 1 byte: parameter + | - bit 4-7: volume + | - bit 3: direction + | - bit 0-2: length + | - 1 byte: sound length + | - for set sweep: + | - 1 byte: parameter + | - bit 4-6: length + | - bit 3: direction + | - bit 0-2: shift + | - 1 byte: nothing + | - for wait: + | - 1 byte: length (in ticks) + | - 1 byte: nothing + | - for wait for release: + | - 2 bytes: nothing + | - for loop/loop until release: + | - 2 bytes: position ``` # wavetable diff --git a/src/engine/engine.h b/src/engine/engine.h index 256b0c96..f5422423 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -45,8 +45,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev104" -#define DIV_ENGINE_VERSION 104 +#define DIV_VERSION "dev105" +#define DIV_ENGINE_VERSION 105 // for imports #define DIV_VERSION_MOD 0xff01 diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 4d274e18..37c6a9b2 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -532,6 +532,13 @@ void DivInstrument::putInsData(SafeWriter* w) { w->writeC(su.useSample); w->writeC(su.switchRoles); + // GB hardware sequence + w->writeC(gb.hwSeqLen); + for (int i=0; gb.hwSeqLen; i++) { + w->writeC(gb.hwSeq[i].cmd); + w->writeS(gb.hwSeq[i].data); + } + blockEndSeek=w->tell(); w->seek(blockStartSeek,SEEK_SET); w->writeI(blockEndSeek-blockStartSeek-4); @@ -1085,6 +1092,15 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) { su.switchRoles=reader.readC(); } + // GB hardware sequence + if (version>=105) { + gb.hwSeqLen=reader.readC(); + for (int i=0; i