From 5dd9b98daf186740d14839695c606cae68893f39 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 13 Oct 2025 04:52:15 -0500 Subject: [PATCH] prepare the motherfiretrucking refactor WOW --- src/engine/defines.h | 20 +++++++++++++++ src/engine/fileOps/dmf.cpp | 50 ++++++++++++++++++++++++-------------- src/engine/pattern.h | 2 +- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/engine/defines.h b/src/engine/defines.h index 974021fb2..3c2d4b9bd 100644 --- a/src/engine/defines.h +++ b/src/engine/defines.h @@ -31,6 +31,26 @@ #define DIV_MAX_COLS 32 #define DIV_MAX_EFFECTS 8 +// pattern fields +#define DIV_PAT_NOTE 0 +#define DIV_PAT_INS 1 +#define DIV_PAT_VOL 2 +#define DIV_PAT_BITS 3 +#define DIV_PAT_FXBITS 4 +#define DIV_PAT_VALBITS 5 +#define DIV_PAT_EFFECTS 16 +#define DIV_PAT_EFFECT_VALS 17 + +#define DIV_NOTE_NULL_PAT 252 +#define DIV_NOTE_OFF 253 +#define DIV_NOTE_REL 254 +#define DIV_MACRO_REL 255 + +#define DIV_NOTE_BIT 1 +#define DIV_INS_BIT 2 +#define DIV_VOL_BIT 4 +#define DIV_EFFECT_BIT(x) (1<<(x)); + // sample related #define DIV_MAX_SAMPLE_TYPE 4 diff --git a/src/engine/fileOps/dmf.cpp b/src/engine/fileOps/dmf.cpp index 910be0d1e..c902fe613 100644 --- a/src/engine/fileOps/dmf.cpp +++ b/src/engine/fileOps/dmf.cpp @@ -783,35 +783,49 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { DivPattern* pat=chan.getPattern(ds.subsong[0]->orders.ord[i][j],true); if (ds.version>0x08) { // current pattern format for (int k=0; kpatLen; k++) { - // note - pat->data[k][0]=reader.readS(); - // octave - pat->data[k][1]=reader.readS(); - if (ds.system[0]==DIV_SYSTEM_SMS && ds.version<0x0e && pat->data[k][1]>0) { + short note=reader.readS(); + short octave=reader.readS(); + if (ds.system[0]==DIV_SYSTEM_SMS && ds.version<0x0e && octave>0) { // apparently it was up one octave before - pat->data[k][1]--; - } else if (ds.system[0]==DIV_SYSTEM_GENESIS && ds.version<0x0e && pat->data[k][1]>0 && i>5) { + octave--; + } else if (ds.system[0]==DIV_SYSTEM_GENESIS && ds.version<0x0e && octave>0 && i>5) { // ditto - pat->data[k][1]--; - } else if (ds.system[0]==DIV_SYSTEM_MSX2 && pat->data[k][1]>0 && i<3) { + octave--; + } else if (ds.system[0]==DIV_SYSTEM_MSX2 && octave>0 && i<3) { // why the hell? - pat->data[k][1]++; + octave++; } if (ds.version<0x12) { - if (ds.system[0]==DIV_SYSTEM_GB && i==3 && pat->data[k][1]>0) { + if (ds.system[0]==DIV_SYSTEM_GB && i==3 && octave>0) { // back then noise was 2 octaves lower - pat->data[k][1]-=2; + octave-=2; } } - if (ds.system[0]==DIV_SYSTEM_YMU759 && pat->data[k][0]!=0) { + if (ds.system[0]==DIV_SYSTEM_YMU759 && note!=0) { // apparently YMU759 is stored 2 octaves lower - pat->data[k][1]+=2; + octave+=2; } - if (pat->data[k][0]==0 && pat->data[k][1]!=0) { - logD("what? %d:%d:%d note %d octave %d",i,j,k,pat->data[k][0],pat->data[k][1]); - pat->data[k][0]=12; - pat->data[k][1]--; + if (note==0 && octave!=0) { + logD("what? %d:%d:%d note %d octave %d",i,j,k,note,octave); + note=12; + octave--; } + + if (note==100) { + pat->newData[k][DIV_PAT_NOTE]=DIV_NOTE_OFF; + } else if (note==101) { + pat->newData[k][DIV_PAT_NOTE]=DIV_NOTE_REL; + } else if (note==102) { + pat->newData[k][DIV_PAT_NOTE]=DIV_MACRO_REL; + } else if (note==0 && octave!=0) { + // "BUG" note! + pat->newData[k][DIV_PAT_NOTE]=DIV_NOTE_NULL_PAT; + } else + int seek=(note+(signed char)octave*12)+60; + if (seek<0 || seek>=180) { + return "???"; + } + // volume pat->data[k][3]=reader.readS(); if (ds.version<0x0a) { diff --git a/src/engine/pattern.h b/src/engine/pattern.h index 15f976d96..e8f771e36 100644 --- a/src/engine/pattern.h +++ b/src/engine/pattern.h @@ -22,7 +22,7 @@ struct DivPattern { String name; - short data[DIV_MAX_ROWS][DIV_MAX_COLS]; + unsigned char newData[DIV_MAX_ROWS][DIV_MAX_COLS]; /** * clear the pattern.