From 58c9edf9c1354455da4b489eb9f5c0abf22d2e28 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 22 Jan 2022 22:21:21 -0500 Subject: [PATCH] store FM macros in file a few more steps and then we'll have functional FM macros --- papers/format.md | 4 + src/engine/engine.h | 4 +- src/engine/instrument.cpp | 205 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+), 2 deletions(-) diff --git a/papers/format.md b/papers/format.md index 057d11c13..235e8dce0 100644 --- a/papers/format.md +++ b/papers/format.md @@ -205,6 +205,10 @@ size | description 1 | fb macro open (>=29) 1 | fms macro open (>=29) 1 | ams macro open (>=29) + 4?? | alg macro (>=29) + 4?? | fb macro (>=29) + 4?? | fms macro (>=29) + 4?? | ams macro (>=29) --- | **operator macro headers** × 4 (>=29) 4 | AM macro length 4 | AR macro length diff --git a/src/engine/engine.h b/src/engine/engine.h index 7d127333c..2b0266ad3 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -11,8 +11,8 @@ #include #include -#define DIV_VERSION "0.4.6" -#define DIV_ENGINE_VERSION 28 +#define DIV_VERSION "0.4.7pre1" +#define DIV_ENGINE_VERSION 29 enum DivStatusView { DIV_STATUS_NOTHING=0, diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 6def88e2a..0268a5d4d 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -136,6 +136,123 @@ void DivInstrument::putInsData(SafeWriter* w) { for (int j=0; jwriteI(std.ex3Macro[j]); } + + // FM macros and open status + w->writeI(std.algMacroLen); + w->writeI(std.fbMacroLen); + w->writeI(std.fmsMacroLen); + w->writeI(std.amsMacroLen); + w->writeI(std.algMacroLoop); + w->writeI(std.fbMacroLoop); + w->writeI(std.fmsMacroLoop); + w->writeI(std.amsMacroLoop); + + w->writeC(std.volMacroOpen); + w->writeC(std.arpMacroOpen); + w->writeC(std.dutyMacroOpen); + w->writeC(std.waveMacroOpen); + w->writeC(std.pitchMacroOpen); + w->writeC(std.ex1MacroOpen); + w->writeC(std.ex2MacroOpen); + w->writeC(std.ex3MacroOpen); + w->writeC(std.algMacroOpen); + w->writeC(std.fbMacroOpen); + w->writeC(std.fmsMacroOpen); + w->writeC(std.amsMacroOpen); + + for (int j=0; jwriteI(std.algMacro[j]); + } + for (int j=0; jwriteI(std.fbMacro[j]); + } + for (int j=0; jwriteI(std.fmsMacro[j]); + } + for (int j=0; jwriteI(std.amsMacro[j]); + } + + for (int i=0; i<4; i++) { + DivInstrumentSTD::OpMacro& op=std.opMacros[i]; + + w->writeI(op.amMacroLen); + w->writeI(op.arMacroLen); + w->writeI(op.drMacroLen); + w->writeI(op.multMacroLen); + w->writeI(op.rrMacroLen); + w->writeI(op.slMacroLen); + w->writeI(op.tlMacroLen); + w->writeI(op.dt2MacroLen); + w->writeI(op.rsMacroLen); + w->writeI(op.dtMacroLen); + w->writeI(op.d2rMacroLen); + w->writeI(op.ssgMacroLen); + w->writeI(op.amMacroLoop); + w->writeI(op.arMacroLoop); + w->writeI(op.drMacroLoop); + w->writeI(op.multMacroLoop); + w->writeI(op.rrMacroLoop); + w->writeI(op.slMacroLoop); + w->writeI(op.tlMacroLoop); + w->writeI(op.dt2MacroLoop); + w->writeI(op.rsMacroLoop); + w->writeI(op.dtMacroLoop); + w->writeI(op.d2rMacroLoop); + w->writeI(op.ssgMacroLoop); + w->writeC(op.amMacroOpen); + w->writeC(op.arMacroOpen); + w->writeC(op.drMacroOpen); + w->writeC(op.multMacroOpen); + w->writeC(op.rrMacroOpen); + w->writeC(op.slMacroOpen); + w->writeC(op.tlMacroOpen); + w->writeC(op.dt2MacroOpen); + w->writeC(op.rsMacroOpen); + w->writeC(op.dtMacroOpen); + w->writeC(op.d2rMacroOpen); + w->writeC(op.ssgMacroOpen); + } + + for (int i=0; i<4; i++) { + DivInstrumentSTD::OpMacro& op=std.opMacros[i]; + for (int j=0; jwriteC(op.amMacro[j]); + } + for (int j=0; jwriteC(op.arMacro[j]); + } + for (int j=0; jwriteC(op.drMacro[j]); + } + for (int j=0; jwriteC(op.multMacro[j]); + } + for (int j=0; jwriteC(op.rrMacro[j]); + } + for (int j=0; jwriteC(op.slMacro[j]); + } + for (int j=0; jwriteC(op.tlMacro[j]); + } + for (int j=0; jwriteC(op.dt2Macro[j]); + } + for (int j=0; jwriteC(op.rsMacro[j]); + } + for (int j=0; jwriteC(op.dtMacro[j]); + } + for (int j=0; jwriteC(op.d2rMacro[j]); + } + for (int j=0; jwriteC(op.ssgMacro[j]); + } + } } DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) { @@ -274,6 +391,94 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) { } } + // FM macros + if (version>=29) { + std.algMacroLen=reader.readI(); + std.fbMacroLen=reader.readI(); + std.fmsMacroLen=reader.readI(); + std.amsMacroLen=reader.readI(); + std.algMacroLoop=reader.readI(); + std.fbMacroLoop=reader.readI(); + std.fmsMacroLoop=reader.readI(); + std.amsMacroLoop=reader.readI(); + std.volMacroOpen=reader.readC(); + std.arpMacroOpen=reader.readC(); + std.dutyMacroOpen=reader.readC(); + std.waveMacroOpen=reader.readC(); + std.pitchMacroOpen=reader.readC(); + std.ex1MacroOpen=reader.readC(); + std.ex2MacroOpen=reader.readC(); + std.ex3MacroOpen=reader.readC(); + std.algMacroOpen=reader.readC(); + std.fbMacroOpen=reader.readC(); + std.fmsMacroOpen=reader.readC(); + std.amsMacroOpen=reader.readC(); + + reader.read(std.algMacro,4*std.algMacroLen); + reader.read(std.fbMacro,4*std.fbMacroLen); + reader.read(std.fmsMacro,4*std.fmsMacroLen); + reader.read(std.amsMacro,4*std.amsMacroLen); + + for (int i=0; i<4; i++) { + DivInstrumentSTD::OpMacro& op=std.opMacros[i]; + + op.amMacroLen=reader.readI(); + op.arMacroLen=reader.readI(); + op.drMacroLen=reader.readI(); + op.multMacroLen=reader.readI(); + op.rrMacroLen=reader.readI(); + op.slMacroLen=reader.readI(); + op.tlMacroLen=reader.readI(); + op.dt2MacroLen=reader.readI(); + op.rsMacroLen=reader.readI(); + op.dtMacroLen=reader.readI(); + op.d2rMacroLen=reader.readI(); + op.ssgMacroLen=reader.readI(); + + op.amMacroLoop=reader.readI(); + op.arMacroLoop=reader.readI(); + op.drMacroLoop=reader.readI(); + op.multMacroLoop=reader.readI(); + op.rrMacroLoop=reader.readI(); + op.slMacroLoop=reader.readI(); + op.tlMacroLoop=reader.readI(); + op.dt2MacroLoop=reader.readI(); + op.rsMacroLoop=reader.readI(); + op.dtMacroLoop=reader.readI(); + op.d2rMacroLoop=reader.readI(); + op.ssgMacroLoop=reader.readI(); + + op.amMacroOpen=reader.readC(); + op.arMacroOpen=reader.readC(); + op.drMacroOpen=reader.readC(); + op.multMacroOpen=reader.readC(); + op.rrMacroOpen=reader.readC(); + op.slMacroOpen=reader.readC(); + op.tlMacroOpen=reader.readC(); + op.dt2MacroOpen=reader.readC(); + op.rsMacroOpen=reader.readC(); + op.dtMacroOpen=reader.readC(); + op.d2rMacroOpen=reader.readC(); + op.ssgMacroOpen=reader.readC(); + } + + for (int i=0; i<4; i++) { + DivInstrumentSTD::OpMacro& op=std.opMacros[i]; + reader.read(op.amMacro,op.amMacroLen); + reader.read(op.arMacro,op.arMacroLen); + reader.read(op.drMacro,op.drMacroLen); + reader.read(op.multMacro,op.multMacroLen); + reader.read(op.rrMacro,op.rrMacroLen); + reader.read(op.slMacro,op.slMacroLen); + reader.read(op.tlMacro,op.tlMacroLen); + reader.read(op.dt2Macro,op.dt2MacroLen); + reader.read(op.rsMacro,op.rsMacroLen); + reader.read(op.dtMacro,op.dtMacroLen); + reader.read(op.d2rMacro,op.d2rMacroLen); + reader.read(op.ssgMacro,op.ssgMacroLen); + } + } + return DIV_DATA_SUCCESS; }