diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 46e4b00f7..61423b6d1 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -2685,6 +2685,11 @@ DivDataErrors DivInstrument::readInsDataNew(SafeReader& reader, short version, b std.volMacro=DivInstrumentMacro(DIV_MACRO_VOL,true); } + // <187 special/test/gate merge + if (type==DIV_INS_C64 && version<187) { + convertC64SpecialMacro(); + } + return DIV_DATA_SUCCESS; } @@ -3426,6 +3431,11 @@ DivDataErrors DivInstrument::readInsDataOld(SafeReader &reader, short version) { std.volMacro=DivInstrumentMacro(DIV_MACRO_VOL,true); } + // <187 special/test/gate merge + if (type==DIV_INS_C64 && version<187) { + convertC64SpecialMacro(); + } + return DIV_DATA_SUCCESS; } @@ -3455,6 +3465,27 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version, DivS return readInsDataOld(reader,version); } +void DivInstrument::convertC64SpecialMacro() { + // merge special and test/gate macros into new special macro + int maxLen=MAX(std.ex3Macro.len,std.ex4Macro.len); + + // skip if ex4 is not a sequence macro + if (std.ex4Macro.open&6) return; + + // move ex4 macro up and fill in gate + for (int i=0; iinit(); diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 33f140b24..31440d7aa 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -834,6 +834,8 @@ struct DivInstrument { DivDataErrors readInsDataOld(SafeReader& reader, short version); DivDataErrors readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song); + + void convertC64SpecialMacro(); /** * save the instrument to a SafeWriter.