diff --git a/src/engine/defines.h b/src/engine/defines.h index 3c2d4b9bd..919ca1f85 100644 --- a/src/engine/defines.h +++ b/src/engine/defines.h @@ -35,22 +35,14 @@ #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_PAT_FX(_x) (3+((_x)<<1)) +#define DIV_PAT_FXVAL(_x) (4+((_x)<<1)) #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 c902fe613..0c10aafec 100644 --- a/src/engine/fileOps/dmf.cpp +++ b/src/engine/fileOps/dmf.cpp @@ -820,54 +820,60 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { } 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 "???"; + } else if (note==0 && octave==0) { + pat->newData[k][DIV_PAT_NOTE]=-1; + } else { + int seek=(note+(signed char)octave*12)+60; + if (seek<0 || seek>=180) { + pat->newData[k][DIV_PAT_NOTE]=DIV_NOTE_NULL_PAT; + } else { + pat->newData[k][DIV_PAT_NOTE]=seek; + } } // volume - pat->data[k][3]=reader.readS(); + pat->newData[k][DIV_PAT_VOL]=reader.readS(); if (ds.version<0x0a) { // back then volume was stored as 00-ff instead of 00-7f/0-f if (i>5) { - pat->data[k][3]>>=4; + pat->newData[k][DIV_PAT_VOL]>>=4; } else { - pat->data[k][3]>>=1; + pat->newData[k][DIV_PAT_VOL]>>=1; } } if (ds.version<0x12) { - if (ds.system[0]==DIV_SYSTEM_GB && i==2 && pat->data[k][3]>0) { + if (ds.system[0]==DIV_SYSTEM_GB && i==2 && pat->newData[k][DIV_PAT_VOL]>0) { // volume range of GB wave channel was 0-3 rather than 0-F - pat->data[k][3]=(pat->data[k][3]&3)*5; + pat->newData[k][DIV_PAT_VOL]=(pat->data[k][DIV_PAT_VOL]&3)*5; } } for (int l=0; ldata[k][4+(l<<1)]=reader.readS(); - pat->data[k][5+(l<<1)]=reader.readS(); + pat->newData[k][DIV_PAT_FX(l)]=reader.readS(); + pat->newData[k][DIV_PAT_FXVAL(l)]=reader.readS(); if (ds.version<0x14) { - if (pat->data[k][4+(l<<1)]==0xe5 && pat->data[k][5+(l<<1)]!=-1) { - pat->data[k][5+(l<<1)]=128+((pat->data[k][5+(l<<1)]-128)/4); + // the range of E5xx was different back then + if (pat->newData[k][DIV_PAT_FX(l)]==0xe5 && pat->newData[k][DIV_PAT_FXVAL(l)]!=-1) { + pat->newData[k][DIV_PAT_FXVAL(l)]=128+((pat->newData[k][DIV_PAT_FXVAL(l)]-128)/4); } } } // instrument - pat->data[k][2]=reader.readS(); + pat->newData[k][DIV_PAT_INS]=reader.readS(); // this is sad if (ds.system[0]==DIV_SYSTEM_NES_FDS) { - if (i==5 && pat->data[k][2]!=-1) { - if (pat->data[k][2]>=0 && pat->data[k][2]data[k][2]]->type=DIV_INS_FDS; + if (i==5 && pat->newData[k][DIV_PAT_INS]!=-1) { + if (pat->newData[k][DIV_PAT_INS]>=0 && pat->newData[k][DIV_PAT_INS]newData[k][DIV_PAT_INS]]->type=DIV_INS_FDS; } } } if (ds.system[0]==DIV_SYSTEM_MSX2) { - if (i>=3 && pat->data[k][2]!=-1) { - if (pat->data[k][2]>=0 && pat->data[k][2]data[k][2]]->type=DIV_INS_SCC; + if (i>=3 && pat->newData[k][DIV_PAT_INS]!=-1) { + if (pat->newData[k][DIV_PAT_INS]>=0 && pat->newData[k][DIV_PAT_INS]newData[k][DIV_PAT_INS]]->type=DIV_INS_SCC; } } } diff --git a/src/engine/pattern.h b/src/engine/pattern.h index e8f771e36..977bb82a1 100644 --- a/src/engine/pattern.h +++ b/src/engine/pattern.h @@ -22,7 +22,7 @@ struct DivPattern { String name; - unsigned char newData[DIV_MAX_ROWS][DIV_MAX_COLS]; + short newData[DIV_MAX_ROWS][DIV_MAX_COLS]; /** * clear the pattern.