desc:Separate sinusoids, noise, transients (mono) // 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 = 512; nextStep = stepSize; inBuf = 0; // Length = analysisSize safety1 = inBuf+analysisSize; // Length = 1 tempBuf = safety1 + 1; // Length = analysisSize safety2 = tempBuf+analysisSize; // Length = 1 tempBuf2 = safety2+1; // Length = analysisSize accuBuf = tempBuf2 + analysisSize; // Length = analysisSize + stepSize k = 0; loop(analysisSize/2, affa = 1; ); i = 0; // Sample index inside inBuf currentStep = 0; @sample inBuf[i] = spl0; spl0 = accuBuf[i]*(2*stepSize/analysisSize); i += 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 ); mdct(tempBuf, analysisSize); k = 0; fil = 0; loop(analysisSize/2, tempBuf[k] >= 1/sqrt(k+0.5) ? ( tempBuf[k] = 1/sqrt(k+0.5); clip += 1; ); tempBuf[k] <= -1/sqrt(k+0.5) ? ( tempBuf[k] = -1/sqrt(k+0.5); clip += 1; );*/ a = 0.5*(tempBuf[k]) tempBuf2[k] = a; k += 1; ); k = 0; loop(analysisSize/2, tempBuf[k] = tempBuf2[k]; k += 1; ); imdct(tempBuf2, analysisSize); // currentStep i analysisSize // | | | // accuBuf: AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD // Accumulate output memcpy(accuBuf+currentStep, tempBuf+analysisSize-stepSize, stepSize); analysisSize <= i+analysisSize-stepSize ? ( //Must split into two memAdd(accuBuf+i, tempBuf, analysisSize-i); memAdd(accuBuf, tempBuf+analysisSize-i, currentStep); ) : ( memAdd(accuBuf+i, tempBuf, analysisSize-stepSize); ); currentStep = i; nextStep = i + stepSize; // Schedule next MDCT );