Last active
September 18, 2016 10:29
-
-
Save Sciss/9eac0b4f1f3f5456979fd0090509e205 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| val in = AudioFileIn("file-in") | |
| val inLen = in.numFrames | |
| // 'analysis' | |
| val fftSize = 131072 | |
| val winStep = fftSize / 4 | |
| val inW = Sliding (in = in , size = fftSize, step = winStep) | |
| val fft = Real1FullFFT (in = inW, size = fftSize) | |
| case class CepCoef(crr: Int, cri: Int, clr: Int, cli: Int, | |
| ccr: Int, cci: Int, car: Int, cai: Int, | |
| gain: Double) | |
| val One = CepCoef( | |
| crr = 0, cri = 0, | |
| clr = +1, cli = +1, | |
| ccr = +1, cci = -1, | |
| car = +1, cai = -1, | |
| gain = 1.0/2097152 // XXX TODO --- what's this factor? | |
| ) | |
| val Two = CepCoef( | |
| crr = +1, cri = +1, | |
| clr = 0, cli = 0, | |
| ccr = +1, cci = -1, | |
| car = +1, cai = -1, | |
| gain = 1.0/32 // XXX TODO --- what's this factor? | |
| ) | |
| // 'percussion' | |
| val logC = fft.complex.log.max(-80) | |
| val cep = Complex1IFFT (in = logC, size = fftSize) / fftSize | |
| val coef = One | |
| val cepOut = { | |
| import coef._ | |
| FoldCepstrum (in = cep, size = fftSize, | |
| crr = crr, cri = cri, clr = clr, cli = cli, | |
| ccr = ccr, cci = cci, car = car, cai = cai) | |
| } | |
| val freq = Complex1FFT (in = cepOut, size = fftSize) * fftSize | |
| val fftOut = freq.complex.exp | |
| // 'synthesis' | |
| val outW = Real1FullIFFT (in = fftOut, size = fftSize) | |
| val winIn = GenWindow(size = fftSize, shape = GenWindow.Hann) | |
| val winOut = outW * winIn | |
| val lap = OverlapAdd(in = winOut, size = fftSize, step = winStep) | |
| val inLen1 = BinaryOp(BinaryOp.Plus.id, inLen, (winStep - 1)) // bloody scala.Predef | |
| val lapLen = inLen1 - (inLen1 % winStep) | |
| Progress(Timer(DC(0)).matchLen(lap) / (2 * lapLen), Metro(44100), "process") | |
| def normalize(in: GE): GE = { | |
| val abs = in.abs | |
| val run = RunningMax(abs) | |
| val max = run.last | |
| val headroom = -0.2.dbamp | |
| val gain = max.reciprocal * headroom | |
| val buf = BufferDisk(in) | |
| val sig = buf * gain | |
| sig | |
| } | |
| val sig = normalize(lap) | |
| val sigLen = Length(lap) | |
| val out = AudioFileOut("file-out", in = sig) | |
| Progress(out / (2 * sigLen), Metro(44100), "normalize") | |
| OnComplete("done") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment