From 626120da8c0fe4982001b91c678055c93bd63123 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 17 Oct 2025 20:58:01 -0500 Subject: [PATCH] pattern data refactor, part 9 fix MOD/S3M/XM/IT import: - MOD was off by one octave - S3M was off by a couple octaves - several effects went missing in S3M/XM/IT --- src/engine/engine.h | 4 ++-- src/engine/fileOps/it.cpp | 12 ++++++------ src/engine/fileOps/mod.cpp | 3 +-- src/engine/fileOps/s3m.cpp | 12 ++++++------ src/engine/fileOps/xm.cpp | 12 ++++++------ 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 674fffffb..9fb3f34a8 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -54,8 +54,8 @@ class DivWorkPool; #define DIV_UNSTABLE -#define DIV_VERSION "dev234" -#define DIV_ENGINE_VERSION 234 +#define DIV_VERSION "dev235" +#define DIV_ENGINE_VERSION 235 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps/it.cpp b/src/engine/fileOps/it.cpp index 78ec218a4..12513621b 100644 --- a/src/engine/fileOps/it.cpp +++ b/src/engine/fileOps/it.cpp @@ -1062,7 +1062,7 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { int readRow=0; bool mustCommitInitial=true; - memset(effectCol,4,64); + memset(effectCol,0,64); memset(vibStatus,0,64); memset(vibStatusChanged,0,64*sizeof(bool)); memset(vibing,0,64*sizeof(bool)); @@ -1217,8 +1217,8 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { p->newData[readRow][DIV_PAT_FX(0)+effectCol[j]++]=0; } - if ((effectCol[j]>>1)-2>ds.subsong[0]->pat[j].effectCols) { - ds.subsong[0]->pat[j].effectCols=(effectCol[j]>>1)-1; + if ((effectCol[j]>>1)>=ds.subsong[0]->pat[j].effectCols) { + ds.subsong[0]->pat[j].effectCols=(effectCol[j]>>1)+1; } } @@ -1253,13 +1253,13 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) { p->newData[readRow-1][DIV_PAT_FX(0)+effectCol[0]++]=0x0d; p->newData[readRow-1][DIV_PAT_FX(0)+effectCol[0]++]=0; - if ((effectCol[0]>>1)-2>ds.subsong[0]->pat[0].effectCols) { - ds.subsong[0]->pat[0].effectCols=(effectCol[0]>>1)-1; + if ((effectCol[0]>>1)>=ds.subsong[0]->pat[0].effectCols) { + ds.subsong[0]->pat[0].effectCols=(effectCol[0]>>1)+1; } } break; } - memset(effectCol,4,64); + memset(effectCol,0,64); continue; } diff --git a/src/engine/fileOps/mod.cpp b/src/engine/fileOps/mod.cpp index 55e8d8b9e..6672a0242 100644 --- a/src/engine/fileOps/mod.cpp +++ b/src/engine/fileOps/mod.cpp @@ -198,8 +198,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { int period=data[1]+((data[0]&0x0f)<<8); if (period>0 && period<0x0fff) { short note=(short)round(log2(3424.0/period)*12); - // TODO: refactor test - dstrowN[DIV_PAT_NOTE]=note+60; + dstrowN[DIV_PAT_NOTE]=note+72; if (period<114) { bypassLimits=true; } diff --git a/src/engine/fileOps/s3m.cpp b/src/engine/fileOps/s3m.cpp index 1b92306ed..1000273fb 100644 --- a/src/engine/fileOps/s3m.cpp +++ b/src/engine/fileOps/s3m.cpp @@ -771,7 +771,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { bool mustCommitInitial=true; - memset(effectCol,4,32); + memset(effectCol,0,32); memset(vibStatus,0,32); memset(vibStatusChanged,0,32*sizeof(bool)); memset(vibing,0,32*sizeof(bool)); @@ -889,17 +889,17 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { p->newData[readRow][DIV_PAT_FX(0)+effectCol[j]++]=0; } - if (effectCol[j]>=4+8*2) { + if (effectCol[j]>=8*2) { logE("oh crap!"); } - if ((effectCol[j]>>1)-2>ds.subsong[0]->pat[j].effectCols) { - ds.subsong[0]->pat[chanMap[j]].effectCols=(effectCol[j]>>1)-1; + if ((effectCol[j]>>1)>=ds.subsong[0]->pat[j].effectCols) { + ds.subsong[0]->pat[chanMap[j]].effectCols=(effectCol[j]>>1)+1; } } readRow++; - memset(effectCol,4,32); + memset(effectCol,0,32); memcpy(vibingOld,vibing,32*sizeof(bool)); memcpy(volSlidingOld,volSliding,32*sizeof(bool)); memcpy(portingOld,porting,32*sizeof(bool)); @@ -937,7 +937,7 @@ bool DivEngine::loadS3M(unsigned char* file, size_t len) { if (note==254) { // note off p->newData[readRow][DIV_PAT_NOTE]=DIV_NOTE_OFF; } else if (note!=255) { - p->newData[readRow][DIV_PAT_NOTE]=(note&15)+(note>>4)*12; + p->newData[readRow][DIV_PAT_NOTE]=(note&15)+(note>>4)*12+60; } p->newData[readRow][DIV_PAT_INS]=(short)ins-1; } diff --git a/src/engine/fileOps/xm.cpp b/src/engine/fileOps/xm.cpp index 5c3f68d97..bf6ac53a0 100644 --- a/src/engine/fileOps/xm.cpp +++ b/src/engine/fileOps/xm.cpp @@ -786,7 +786,7 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { bool mustCommitInitial=true; - memset(effectCol,4,128); + memset(effectCol,0,128); memset(vibStatus,0,128); memset(vibStatusChanged,0,128*sizeof(bool)); memset(vibing,0,128*sizeof(bool)); @@ -1319,8 +1319,8 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { p->newData[j][DIV_PAT_FX(0)+effectCol[k]++]=0; } - if ((effectCol[k]>>1)-2>ds.subsong[0]->pat[k].effectCols) { - ds.subsong[0]->pat[k].effectCols=(effectCol[k]>>1)-1; + if ((effectCol[k]>>1)>=ds.subsong[0]->pat[k].effectCols) { + ds.subsong[0]->pat[k].effectCols=(effectCol[k]>>1)+1; } } @@ -1343,11 +1343,11 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { p->newData[j][DIV_PAT_FX(0)+effectCol[0]++]=0x0d; p->newData[j][DIV_PAT_FX(0)+effectCol[0]++]=0; - if ((effectCol[0]>>1)-2>ds.subsong[0]->pat[0].effectCols) { - ds.subsong[0]->pat[0].effectCols=(effectCol[0]>>1)-1; + if ((effectCol[0]>>1)>=ds.subsong[0]->pat[0].effectCols) { + ds.subsong[0]->pat[0].effectCols=(effectCol[0]>>1)+1; } } - memset(effectCol,4,64); + memset(effectCol,0,64); } logV("seeking to %x...",packedSeek);