view experiment-reverb/code/apply_reverb.py @ 2:c87a9505f294 tip

Added LICENSE for code, removed .wav files
author Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk>
date Sat, 30 Sep 2017 13:25:50 +0100
parents 246d5546657c
children
line wrap: on
line source
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 23 21:46:05 2016

@author: Emmanouil Theofanis Chourdakis
"""
from mapping import *
from essentia import Pool
from essentia.standard import YamlInput, YamlOutput
from scikits.audiolab import Format, Sndfile
#from essentia import *
from essentia.standard import *
from sys import argv
from ui import zafar
from numpy import *
from scipy.signal import fftconvolve

def estimate_T60(d1, g1, gc, G, SR):
    ga = 1/sqrt(2)
    return d1/SR/log(g1)*log(10**-3/ga/(1-gc)/G)     
    
if __name__=="__main__":
    if len(argv) != 3:
        print("Incorrect number of arguments:")
        print("Usage: ")
        print("%s <parameter_file> <audio_file>")
        print("")
        
        sys.exit(-1)    
        
    
    songfname = argv[2]
    outfname = songfname.replace(".wav","_reverb_wav")
    paramfname = argv[1]
    
    parameters_pool = YamlInput(filename = paramfname)()
    
    d1t = parameters_pool['parameters.d1']*d1_max + d1_min
    dat = parameters_pool['parameters.da']*da_max + da_min
    g1 = parameters_pool['parameters.g1']*g1_max + g1_min
    gc = parameters_pool['parameters.gc']*gc_max + gc_min
    G = parameters_pool['parameters.G']*G_max + G_min       
    
    print "[II] Applying reverb to %s" % songfname
    print "[II] Loading file..."    
    
    alo = AudioLoader(filename=songfname)()
    
    audio = alo[0]
    SR = alo[1]
    numChannels = alo[2]
    
    
    lx = audio[:,0]
    rx = audio[:,1]    
    
    
    print "[II] Applying reverb"
            
    T = 1.0/SR    
    
    d1 = int(d1t*SR)
    da = int(dat*SR)
    
    print "[II] Parameters: "
    print "[II]  d1: %f" % (d1/SR)
    print "[II]  g1: %f" % g1
    print "[II]  da: %f" % (da/SR)
    print "[II]  gc:  %f" % gc
    print "[II]  G: %f" % G
    
    mt = 0.002
    m = int(mt*SR)
    
    T60 = estimate_T60(d1,g1,gc,G,SR)
    
    
    delta = zeros((int(4*T60*SR),))
    delta[0] = 1
    
    
    (ly, ry) = zafar(delta,delta,d1,g1,da,G,gc,m)    
    
    lim = max(len(ly), len(ry))
    t = arange(0, lim)*T
    
    padded_y = zeros(shape(t))
    padded_y[0:len(ly)] = ly
    padded_y[0:len(ry)] = ry    
    
    print "[II] Convovling left channel"
    l_out = 0.3*fftconvolve(ly, lx)
    
    print "[II] Convolving right channel"
    r_out = 0.3*fftconvolve(ry, rx)
    
    lim = min(len(l_out), len(r_out))
    if numChannels == 1:
        audio_out = l_out[0:lim]
    else:
        audio_out = concatenate((matrix(l_out[0:lim]).T,
                                 matrix(r_out[0:lim]).T),
                                 axis=1)
    
    audio_out = audio_out/max(audio_out)
    audio_file = Sndfile(outfname, 'w', Format('wav'), numChannels, SR)
    audio_file.write_frames(audio_out)
    audio_file.close()