e@0: # -*- coding: utf-8 -*- e@0: """ e@0: Created on Wed Mar 23 21:46:05 2016 e@0: e@0: @author: Emmanouil Theofanis Chourdakis e@0: """ e@0: from mapping import * e@0: from essentia import Pool e@0: from essentia.standard import YamlInput, YamlOutput e@0: from scikits.audiolab import Format, Sndfile e@0: #from essentia import * e@0: from essentia.standard import * e@0: from sys import argv e@0: from ui import zafar e@0: from numpy import * e@0: from scipy.signal import fftconvolve e@0: e@0: def estimate_T60(d1, g1, gc, G, SR): e@0: ga = 1/sqrt(2) e@0: return d1/SR/log(g1)*log(10**-3/ga/(1-gc)/G) e@0: e@0: if __name__=="__main__": e@0: if len(argv) != 3: e@0: print("Incorrect number of arguments:") e@0: print("Usage: ") e@0: print("%s ") e@0: print("") e@0: e@0: sys.exit(-1) e@0: e@0: e@0: songfname = argv[2] e@0: outfname = songfname.replace(".wav","_reverb_wav") e@0: paramfname = argv[1] e@0: e@0: parameters_pool = YamlInput(filename = paramfname)() e@0: e@0: d1t = parameters_pool['parameters.d1']*d1_max + d1_min e@0: dat = parameters_pool['parameters.da']*da_max + da_min e@0: g1 = parameters_pool['parameters.g1']*g1_max + g1_min e@0: gc = parameters_pool['parameters.gc']*gc_max + gc_min e@0: G = parameters_pool['parameters.G']*G_max + G_min e@0: e@0: print "[II] Applying reverb to %s" % songfname e@0: print "[II] Loading file..." e@0: e@0: alo = AudioLoader(filename=songfname)() e@0: e@0: audio = alo[0] e@0: SR = alo[1] e@0: numChannels = alo[2] e@0: e@0: e@0: lx = audio[:,0] e@0: rx = audio[:,1] e@0: e@0: e@0: print "[II] Applying reverb" e@0: e@0: T = 1.0/SR e@0: e@0: d1 = int(d1t*SR) e@0: da = int(dat*SR) e@0: e@0: print "[II] Parameters: " e@0: print "[II] d1: %f" % (d1/SR) e@0: print "[II] g1: %f" % g1 e@0: print "[II] da: %f" % (da/SR) e@0: print "[II] gc: %f" % gc e@0: print "[II] G: %f" % G e@0: e@0: mt = 0.002 e@0: m = int(mt*SR) e@0: e@0: T60 = estimate_T60(d1,g1,gc,G,SR) e@0: e@0: e@0: delta = zeros((int(4*T60*SR),)) e@0: delta[0] = 1 e@0: e@0: e@0: (ly, ry) = zafar(delta,delta,d1,g1,da,G,gc,m) e@0: e@0: lim = max(len(ly), len(ry)) e@0: t = arange(0, lim)*T e@0: e@0: padded_y = zeros(shape(t)) e@0: padded_y[0:len(ly)] = ly e@0: padded_y[0:len(ry)] = ry e@0: e@0: print "[II] Convovling left channel" e@0: l_out = 0.3*fftconvolve(ly, lx) e@0: e@0: print "[II] Convolving right channel" e@0: r_out = 0.3*fftconvolve(ry, rx) e@0: e@0: lim = min(len(l_out), len(r_out)) e@0: if numChannels == 1: e@0: audio_out = l_out[0:lim] e@0: else: e@0: audio_out = concatenate((matrix(l_out[0:lim]).T, e@0: matrix(r_out[0:lim]).T), e@0: axis=1) e@0: e@0: audio_out = audio_out/max(audio_out) e@0: audio_file = Sndfile(outfname, 'w', Format('wav'), numChannels, SR) e@0: audio_file.write_frames(audio_out) e@0: audio_file.close()