desc:Yehar dehowl // Version 0.1 // Written by Olli Niemitalo (o@iki.fi), 2016 // License: Do What the Fuck You Want to Public License. // // This effect separates sinusoidal, noise and transient // components of audio. It works on mono input so you need two // of these for stereo. @init function memAdd(dest, source, length) ( loop(length, dest[] = dest[] + source[]; dest += 1; source += 1; ); ); stepSize = 128; analysisSize = 4096; nextStep = stepSize; i = 0; // Sample index inside inBuf j = analysisSize-stepSize; // Sample index inside accuBuf inBuf = 0; // Length = analysisSize tempBuf = analysisSize; // Length = analysisSize accuBuf = tempBuf + analysisSize; // Length = analysisSize + stepSize @sample inBuf[i] = spl0; spl0 = accuBuf[i]*(2*stepSize/analysisSize); i += 1; j += 1; i === nextStep ? ( // We have enough data to do another MDCT // i analysisSize // | | // inbuf: AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD // Copy data for MDCT memcpy(tempBuf, inBuf+i, analysisSize-i); memcpy(tempBuf + analysisSize-i, inBuf, i); i === analysisSize ? ( i = 0; // Wraparound ); j === analysisSize ? ( j = 0; // Wraparound ); mdct(tempBuf, analysisSize); k = 0; loop(analysisSize/2, tempBuf[k] >= 1/sqrt(k+1) ? ( tempBuf[k] = 1/sqrt(k+1); clip += 1; ); tempBuf[k] <= -1/sqrt(k+1) ? ( tempBuf[k] = -1/sqrt(k+1); clip += 1; ); k += 1; ); imdct(tempBuf, analysisSize); // j i analysisSize // | | | // accuBuf: AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD // Accumulate output memcpy(accuBuf+j, tempBuf+analysisSize-stepSize, stepSize); analysisSize <= i+analysisSize-stepSize ? ( //Must split into two memAdd(accuBuf+i, tempBuf, analysisSize-i); memAdd(accuBuf, tempBuf+analysisSize-i, j); ) : ( memAdd(accuBuf+i, tempBuf, analysisSize-stepSize); ); nextStep = i + stepSize; // Schedule next MDCT );