annotate 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
rev   line source
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()