e@0
|
1 # -*- coding: utf-8 -*-
|
e@0
|
2 """
|
e@0
|
3 Created on Wed Mar 23 21:46:05 2016
|
e@0
|
4
|
e@0
|
5 @author: Emmanouil Theofanis Chourdakis
|
e@0
|
6 """
|
e@0
|
7 from mapping import *
|
e@0
|
8 from essentia import Pool
|
e@0
|
9 from essentia.standard import YamlInput, YamlOutput
|
e@0
|
10 from scikits.audiolab import Format, Sndfile
|
e@0
|
11 #from essentia import *
|
e@0
|
12 from essentia.standard import *
|
e@0
|
13 from sys import argv
|
e@0
|
14 from ui import zafar
|
e@0
|
15 from numpy import *
|
e@0
|
16 from scipy.signal import fftconvolve
|
e@0
|
17
|
e@0
|
18 def estimate_T60(d1, g1, gc, G, SR):
|
e@0
|
19 ga = 1/sqrt(2)
|
e@0
|
20 return d1/SR/log(g1)*log(10**-3/ga/(1-gc)/G)
|
e@0
|
21
|
e@0
|
22 if __name__=="__main__":
|
e@0
|
23 if len(argv) != 3:
|
e@0
|
24 print("Incorrect number of arguments:")
|
e@0
|
25 print("Usage: ")
|
e@0
|
26 print("%s <parameter_file> <audio_file>")
|
e@0
|
27 print("")
|
e@0
|
28
|
e@0
|
29 sys.exit(-1)
|
e@0
|
30
|
e@0
|
31
|
e@0
|
32 songfname = argv[2]
|
e@0
|
33 outfname = songfname.replace(".wav","_reverb_wav")
|
e@0
|
34 paramfname = argv[1]
|
e@0
|
35
|
e@0
|
36 parameters_pool = YamlInput(filename = paramfname)()
|
e@0
|
37
|
e@0
|
38 d1t = parameters_pool['parameters.d1']*d1_max + d1_min
|
e@0
|
39 dat = parameters_pool['parameters.da']*da_max + da_min
|
e@0
|
40 g1 = parameters_pool['parameters.g1']*g1_max + g1_min
|
e@0
|
41 gc = parameters_pool['parameters.gc']*gc_max + gc_min
|
e@0
|
42 G = parameters_pool['parameters.G']*G_max + G_min
|
e@0
|
43
|
e@0
|
44 print "[II] Applying reverb to %s" % songfname
|
e@0
|
45 print "[II] Loading file..."
|
e@0
|
46
|
e@0
|
47 alo = AudioLoader(filename=songfname)()
|
e@0
|
48
|
e@0
|
49 audio = alo[0]
|
e@0
|
50 SR = alo[1]
|
e@0
|
51 numChannels = alo[2]
|
e@0
|
52
|
e@0
|
53
|
e@0
|
54 lx = audio[:,0]
|
e@0
|
55 rx = audio[:,1]
|
e@0
|
56
|
e@0
|
57
|
e@0
|
58 print "[II] Applying reverb"
|
e@0
|
59
|
e@0
|
60 T = 1.0/SR
|
e@0
|
61
|
e@0
|
62 d1 = int(d1t*SR)
|
e@0
|
63 da = int(dat*SR)
|
e@0
|
64
|
e@0
|
65 print "[II] Parameters: "
|
e@0
|
66 print "[II] d1: %f" % (d1/SR)
|
e@0
|
67 print "[II] g1: %f" % g1
|
e@0
|
68 print "[II] da: %f" % (da/SR)
|
e@0
|
69 print "[II] gc: %f" % gc
|
e@0
|
70 print "[II] G: %f" % G
|
e@0
|
71
|
e@0
|
72 mt = 0.002
|
e@0
|
73 m = int(mt*SR)
|
e@0
|
74
|
e@0
|
75 T60 = estimate_T60(d1,g1,gc,G,SR)
|
e@0
|
76
|
e@0
|
77
|
e@0
|
78 delta = zeros((int(4*T60*SR),))
|
e@0
|
79 delta[0] = 1
|
e@0
|
80
|
e@0
|
81
|
e@0
|
82 (ly, ry) = zafar(delta,delta,d1,g1,da,G,gc,m)
|
e@0
|
83
|
e@0
|
84 lim = max(len(ly), len(ry))
|
e@0
|
85 t = arange(0, lim)*T
|
e@0
|
86
|
e@0
|
87 padded_y = zeros(shape(t))
|
e@0
|
88 padded_y[0:len(ly)] = ly
|
e@0
|
89 padded_y[0:len(ry)] = ry
|
e@0
|
90
|
e@0
|
91 print "[II] Convovling left channel"
|
e@0
|
92 l_out = 0.3*fftconvolve(ly, lx)
|
e@0
|
93
|
e@0
|
94 print "[II] Convolving right channel"
|
e@0
|
95 r_out = 0.3*fftconvolve(ry, rx)
|
e@0
|
96
|
e@0
|
97 lim = min(len(l_out), len(r_out))
|
e@0
|
98 if numChannels == 1:
|
e@0
|
99 audio_out = l_out[0:lim]
|
e@0
|
100 else:
|
e@0
|
101 audio_out = concatenate((matrix(l_out[0:lim]).T,
|
e@0
|
102 matrix(r_out[0:lim]).T),
|
e@0
|
103 axis=1)
|
e@0
|
104
|
e@0
|
105 audio_out = audio_out/max(audio_out)
|
e@0
|
106 audio_file = Sndfile(outfname, 'w', Format('wav'), numChannels, SR)
|
e@0
|
107 audio_file.write_frames(audio_out)
|
e@0
|
108 audio_file.close() |