From 8772d75e524042e5986f6369884d5de300ba33fa Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Jul 2024 03:17:40 -0500 Subject: [PATCH] XM import: loop + fade-out and a couple envelope fixes --- src/engine/fileOps/xm.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/engine/fileOps/xm.cpp b/src/engine/fileOps/xm.cpp index e2a1482ef..02b617ca0 100644 --- a/src/engine/fileOps/xm.cpp +++ b/src/engine/fileOps/xm.cpp @@ -87,7 +87,10 @@ void readEnvelope(DivInstrument* ins, int env, unsigned char flags, unsigned cha } } if ((point+1)>=numPoints) { - target->len=i; + target->len=i-1; + if ((flags&4) && (!(flags&2))) { + target->rel=i-2; + } //target->val[i]=p0; break; } @@ -527,11 +530,24 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { // add fade-out if (volFade!=0) { int cur=64; + int macroLen=ins->std.volMacro.len; + int curPos=ins->std.volMacro.len-1; + if (ins->std.volMacro.loopstd.volMacro.loop; + } if (ins->std.volMacro.len>0) { - cur=ins->std.volMacro.val[ins->std.volMacro.len-1]; + cur=ins->std.volMacro.val[curPos]; } for (int fadeOut=32767; fadeOut>0 && ins->std.volMacro.len<254; fadeOut-=volFade) { + cur=ins->std.volMacro.val[curPos]; ins->std.volMacro.val[ins->std.volMacro.len++]=(cur*fadeOut)>>15; + if (++curPos>=macroLen) { + if (ins->std.volMacro.loopstd.volMacro.loop; + } else { + curPos=macroLen-1; + } + } } if (ins->std.volMacro.len<255) { ins->std.volMacro.val[ins->std.volMacro.len++]=0;