XM import: improve envelope conversion
still buggy
This commit is contained in:
parent
93f3ff3500
commit
3fae6a4ba8
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -20,7 +20,7 @@
|
||||||
#include "fileOpsCommon.h"
|
#include "fileOpsCommon.h"
|
||||||
|
|
||||||
void readEnvelope(DivInstrument* ins, int env, unsigned char flags, unsigned char numPoints, unsigned char loopStart, unsigned char loopEnd, unsigned char susPoint, short* points) {
|
void readEnvelope(DivInstrument* ins, int env, unsigned char flags, unsigned char numPoints, unsigned char loopStart, unsigned char loopEnd, unsigned char susPoint, short* points) {
|
||||||
if (numPoints>24) numPoints=24;
|
if (numPoints>12) numPoints=12;
|
||||||
|
|
||||||
if (loopStart>=numPoints) loopStart=numPoints-1;
|
if (loopStart>=numPoints) loopStart=numPoints-1;
|
||||||
if (loopEnd>=numPoints) loopEnd=numPoints-1;
|
if (loopEnd>=numPoints) loopEnd=numPoints-1;
|
||||||
|
@ -49,12 +49,45 @@ void readEnvelope(DivInstrument* ins, int env, unsigned char flags, unsigned cha
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
target->len=0;
|
target->len=0;
|
||||||
int point=0;
|
|
||||||
bool pointJustBegan=true;
|
|
||||||
// mark loop end as end of envelope
|
// mark loop end as end of envelope
|
||||||
if (flags&4) {
|
if (flags&4) {
|
||||||
if (loopEnd<numPoints) numPoints=loopEnd+1;
|
if (loopEnd<numPoints) numPoints=loopEnd+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// new freaking algorithm
|
||||||
|
for (int i=0; i<numPoints; i++) {
|
||||||
|
int curPoint=MIN(i,numPoints-1);
|
||||||
|
int nextPoint=MIN(i+1,numPoints-1);
|
||||||
|
int p0=pointVal[curPoint];
|
||||||
|
int p1=pointVal[nextPoint];
|
||||||
|
int t0=pointTime[curPoint];
|
||||||
|
int t1=pointTime[nextPoint];
|
||||||
|
|
||||||
|
if (t0==t1) {
|
||||||
|
if (t0<255) {
|
||||||
|
target->val[t0]=p0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int j=t0; j<t1 && j<255; j++) {
|
||||||
|
target->val[j]=p0+(((p1-p0)*(j-t0))/(t1-t0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (flags&4) { // loop
|
||||||
|
if (loopStart!=loopEnd && loopStart<numPoints) {
|
||||||
|
target->loop=CLAMP(pointTime[loopStart],0,254);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (flags&2 && susPoint<numPoints) { // sustain
|
||||||
|
target->rel=CLAMP(pointTime[susPoint]-1,0,254);
|
||||||
|
}
|
||||||
|
target->len=MIN(pointTime[numPoints-1]+1,255);
|
||||||
|
if (((flags&4) && (!(flags&2))) || ((flags&6)==0)) {
|
||||||
|
target->rel=target->len-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// old crap
|
||||||
|
/*
|
||||||
for (int i=0; i<255; i++) {
|
for (int i=0; i<255; i++) {
|
||||||
int curPoint=MIN(point,numPoints-1);
|
int curPoint=MIN(point,numPoints-1);
|
||||||
int nextPoint=MIN(point+1,numPoints-1);
|
int nextPoint=MIN(point+1,numPoints-1);
|
||||||
|
@ -102,6 +135,7 @@ void readEnvelope(DivInstrument* ins, int env, unsigned char flags, unsigned cha
|
||||||
target->len=i+1;
|
target->len=i+1;
|
||||||
target->val[i]=p0+(((p1-p0)*curTime)/timeDiff);
|
target->val[i]=p0+(((p1-p0)*curTime)/timeDiff);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// split L/R
|
// split L/R
|
||||||
if (env==1) {
|
if (env==1) {
|
||||||
|
|
Loading…
Reference in a new issue