History

add demo-tempo scripts add demo-tempo scripts

Paul Brossier committed 20 years ago

Commit aa3637a1 parent 742c9b82 files · +491 −0Browse files

Showing the changes to python (2 of 2 files). Show all

Unified · Split

2 files
  1. python/test/bench/tempo/demo-tempo +321 −0
  2. python/test/bench/tempo/demo-tempo-acf +170 −0
python/test/bench/tempo/demo-tempo+321−0
@@ -0,0 +1,321 @@
1#! /usr/bin/python
2
3""" this file was written by Paul Brossier
4 it is released under the GNU/GPL license.
5"""
6
7import sys,time
8from aubio.task import taskbeat,taskparams
9from aubio.aubioclass import fvec, aubio_autocorr
10from aubio.gnuplot import gnuplot_create
11from aubio.aubiowrapper import *
12from math import exp,log
13
14usage = "usage: %s [options] -i soundfile" % sys.argv[0]
15
16def parse_args():
17 from optparse import OptionParser
18 parser = OptionParser(usage=usage)
19 parser.add_option("-i","--input",
20 action="store", dest="filename",
21 help="input sound file")
22 parser.add_option("-n","--printframe",
23 action="store", dest="printframe", default=-1,
24 help="make a plot of the n_th frame")
25 parser.add_option("-x","--xsize",
26 action="store", dest="xsize", default=1.,
27 type='float', help="define xsize for plot")
28 parser.add_option("-y","--ysize",
29 action="store", dest="ysize", default=1.,
30 type='float', help="define ysize for plot")
31 parser.add_option("-O","--outplot",
32 action="store", dest="outplot", default=None,
33 help="save plot to output.{ps,png}")
34 (options, args) = parser.parse_args()
35 if not options.filename:
36 print "no file name given\n", usage
37 sys.exit(1)
38 return options, args
39
40def plotdata(x,y,plottitle="",**keyw):
41 import Gnuplot
42 return Gnuplot.Data(x, y, title="%s" % plottitle,**keyw)
43
44options, args = parse_args()
45filename = options.filename
46xsize = float(options.xsize)
47ysize = float(options.ysize)
48
49printframe = int(options.printframe)
50
51if options.outplot and printframe > 0:
52 extension = options.outplot.split('.')[-1]
53 outplot = '.'.join(options.outplot.split('.')[:-1])
54else:
55 extension = ''
56 outplot = None
57f = gnuplot_create(outplot=outplot,extension=extension)
58
59params = taskparams()
60params.onsetmode = 'specdiff'
61task = taskbeat(filename,params=params)
62
63hopsize = params.hopsize
64bufsize = params.bufsize
65btstep = task.btstep
66winlen = task.btwinlen
67laglen = winlen/4
68step = winlen/4
69
70timesig = 0
71maxnumelem = 4
72gp = 0
73counter = 0
74flagconst = 0
75constthresh = 3.901
76g_var = 3.901
77rp = 0
78rp1 = 0
79rp2 = 0
80g_mu = 0
81
82rayparam = 48/512.*winlen
83
84#t = [i for i in range(hopsize)]
85#tlong = [i for i in range(hopsize*(btstep-1))]
86#tall = [i for i in range(hopsize*btstep)]
87#a = [0 for i in range(hopsize*btstep)]
88dfx = [i for i in range(winlen)]
89dfframe = [0 for i in range(winlen)]
90dfrev = [0 for i in range(winlen)]
91acframe = [0 for i in range(winlen)]
92
93localacf = [0 for i in range(winlen)]
94inds = [0 for i in range(maxnumelem)]
95
96acx = [i for i in range(laglen)]
97acfout = [0 for i in range(laglen)]
98
99phwv = [0 for i in range(2*laglen)]
100phwvx = [i for i in range(2*laglen)]
101
102dfwvnorm = exp(log(2.0)*(winlen+2.)/rayparam);
103dfwv = [exp(log(2.)*(i+1.)/rayparam)/dfwvnorm for i in range(winlen)]
104
105gwv = [exp(-.5*(j+1.-g_mu)**2/g_var**2) for j in range(laglen)]
106rwv = [(i+1.)/rayparam**2 * exp(-(i+1.)**2 / (2.*rayparam)**2)
107 for i in range(0,laglen)]
108acf = fvec(winlen,1)
109
110nrframe = 0
111while (task.readsize == params.hopsize):
112 task()
113 #print task.pos2
114 #a[:-hopsize] = [i for i in a[-(btstep-1)*hopsize:]]
115 #a[-hopsize:] = [task.myvec.get(i,0) for i in t]
116
117 #g('set xrange [%f:%f]' % (t[0],t[-1]))
118 #time.sleep(.2)
119 if task.pos2==btstep-1:
120 nrframe += 1
121 dfframe = [task.dfframe.get(i,0) for i in range(winlen)]
122 if printframe == nrframe or printframe == -1:
123 d = [[plotdata(range(-winlen,0),dfframe,plottitle="onset detection", with='lines')]]
124 # start beattracking_do
125 for i in range(winlen):
126 dfrev[winlen-1-i] = 0.
127 dfrev[winlen-1-i] = dfframe[i]*dfwv[i]
128 aubio_autocorr(task.dfframe(),acf());
129 acframe = [acf.get(i,0) for i in range(winlen)]
130 if not timesig:
131 numelem = 4
132 else:
133 numelem = timesig
134
135 old = 0
136 acfout = [0 for i in range(winlen/4)]
137 for i in range(1,laglen-1):
138 for a in range(1,numelem+1):
139 for b in range (1-a,a):
140 acfout[i] += acframe[a*(i+1)+b-1] * 1./(2.*a-1.)*rwv[i]
141 if old < acfout[i]:
142 old = acfout[i]
143 maxi = i
144 rp = max(maxi,1);
145
146 if printframe == nrframe or printframe == -1:
147 rwvs = [rwv[i]*max(acframe) for i in range(len(rwv))]
148 d += [[plotdata(acx,acfout,plottitle="comb filterbank", with='lines', axes='x1y1'),
149 plotdata([rp,rp],[1.2*old,min(acfout)],plottitle="period", with='impulses', axes='x1y1'),
150 plotdata(acx,rwvs,plottitle="L_w", with='lines', axes='x1y1')]]
151
152 # getperiod
153 inds = [0 for i in range(maxnumelem)]
154 localacf = [0 for i in range(winlen)]
155 period = 0
156 for a in range(1,4+1):
157 for b in range(1-a,a):
158 localacf[a*rp+b-1] = acframe[a*rp+b-1]
159 for i in range(numelem):
160 maxindex = 0
161 maxval = 0.0
162 for j in range(rp*(i+1)+i):
163 if localacf[j] > maxval:
164 maxval = localacf[j]
165 maxind = j
166 localacf[j] = 0
167 inds[i] = maxind
168 for i in range(numelem):
169 period += inds[i]/(i+1.)
170 period = period/numelem
171 #print "period", period
172
173 # checkstate
174 if gp:
175 # context dependant model
176 acfout = [0 for i in range(winlen/4)]
177 old = 0
178 for i in range(laglen-1):
179 for a in range(timesig):
180 for b in range(1-a,a):
181 acfout[i] += acframe[a*(i+1)+b-1] * gwv[i]
182 if old < acfout[i]:
183 old = acfout[i]
184 maxi = i
185 gp = maxi
186 else:
187 # general model
188 gp = 0
189 #print "gp", gp
190 if printframe == nrframe or printframe == -1:
191 gwvs = [gwv[i]*max(acfout) for i in range(len(gwv))]
192 d += [[plotdata(acx,acfout,plottitle="comb filterbank", with='lines', axes='x1y1'),
193 plotdata(gp,old,plottitle="period", with='impulses', axes='x1y1'),
194 plotdata(acx,gwvs,plottitle="L_{gw}", with='lines', axes='x1y1')]]
195
196 if counter == 0:
197 # initial step
198 if abs(gp-rp) > 2.*constthresh:
199 flagstep = 1
200 counter = 3
201 else:
202 flagstep = 0
203 #print "flagstep", flagstep
204 #print "rp2,rp1,rp", rp2,rp1,rp
205 acfw = [dfframe[i]*dfwv[i] for i in range(winlen)]
206
207 if counter == 1 and flagstep == 1:
208 # "3rd frame after flagstep set"
209 if abs(2.*rp-rp1- rp2) < constthresh:
210 flagconst = 1
211 counter = 0
212 else:
213 flagconst = 0
214 counter = 2
215 elif counter > 0:
216 counter -= 1
217
218 rp2 = rp1; rp1 = rp
219
220 if flagconst:
221 # "first run of new hypothesis"
222 gp = rp
223 g_mu = gp
224 timesig = 4 #FIXME
225 gwv = [exp(-.5*(j+1.-g_mu)**2/g_var**2) for j in range(laglen)]
226 flagconst = 0
227 bp = gp
228 phwv = [1 for i in range(2*laglen)]
229 elif timesig:
230 # "contex dependant"
231 bp = gp
232 if step > lastbeat:
233 phwv = [exp(-.5*(1.+j-step+lastbeat)**2/(bp/8.)) for j in range(2*laglen)]
234 else:
235 print "NOT using phase weighting"
236 phwv = [1 for i in range(2*laglen)]
237 else:
238 # "initial state"
239 bp = rp
240 phwv = [1 for i in range(2*laglen)]
241
242 while bp < 25:
243 print "WARNING, doubling the beat period"
244 bp *= 2
245
246 #
247 phout = [0. for i in range(winlen)]
248
249 kmax = int(winlen/float(bp));
250
251 old = 0
252 for i in range(bp):
253 phout[i] = 0.
254 for k in range(kmax):
255 phout[i] += dfrev[i+bp*k] * phwv[i]
256 if phout[i] > old:
257 old = phout[i]
258 maxi = i
259 maxindex = maxi
260 if (maxindex == winlen - 1): maxindex = 0
261 phase = 1 + maxindex
262 i = 1
263 beat = bp - phase
264 beats= []
265 if beat >= 0: beats.append(beat)
266 while beat+bp < step:
267 beat += bp
268 beats.append(beat)
269 lastbeat = beat
270 #print beats,
271 #print "the lastbeat is", lastbeat
272
273 # plot all this
274 if printframe == nrframe or printframe == -1:
275 phwvs = [phwv[i]*max(phout) for i in range(len(phwv))]
276 d += [[plotdata(range(-laglen,0),phwvs[laglen:0:-1],plottitle="A_{gw}", with='lines',axes='x1y1'),
277 plotdata(range(-laglen,0),phout[laglen:0:-1],plottitle="df", with='lines'),
278 plotdata(-phase,old,plottitle="phase", with='impulses', axes='x1y1'),
279 plotdata([i for i in beats],[old for i in beats],plottitle="predicted", with='impulses')
280 ]]
281 #d += [[plotdata(dfx,dfwv,plottitle="phase weighting", with='lines', axes='x1y2'),
282 # plotdata(dfx,dfrev,plottitle="df reverse", with='lines', axes='x1y1')]]
283 #d += [[plotdata(dfx,phout,plottitle="phase", with='lines', axes='x1y2')]]
284 #d += [[plotdata(dfx,dfwv,plottitle="phase weighting", with='lines', axes='x1y2'),
285 # plotdata(dfx,dfrev,plottitle="df reverse", with='lines', axes='x1y1')]]
286 #d += [[plotdata(dfx,phout,plottitle="phase", with='lines', axes='x1y2')]]
287
288 f('set lmargin 4')
289 f('set rmargin 4')
290 f('set size %f,%f' % (1.0*xsize,1.0*ysize) )
291 f('set key spacing 1.3')
292 f('set multiplot')
293
294 f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
295 f('set orig %f,%f' % (0.0*xsize,0.66*ysize) )
296 f('set xrange [%f:%f]' % (-winlen,0) )
297 f.title('Onset detection function')
298 f.xlabel('time (df samples)')
299 f.plot(*d[0])
300 f('set size %f,%f' % (0.5*xsize,0.33*ysize) )
301 f('set orig %f,%f' % (0.0*xsize,0.33*ysize) )
302 f('set xrange [%f:%f]' % (0,laglen) )
303 f.title('Period detection: Rayleygh weighting')
304 f.xlabel('lag (df samples)')
305 f.plot(*d[1])
306 f('set size %f,%f' % (0.5*xsize,0.33*ysize) )
307 f('set orig %f,%f' % (0.5*xsize,0.33*ysize) )
308 f('set xrange [%f:%f]' % (0,laglen) )
309 f.title('Period detection: Gaussian weighting')
310 f.xlabel('lag (df samples)')
311 f.plot(*d[2])
312 f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
313 f('set orig %f,%f' % (0.0*xsize,0.00*ysize) )
314 f('set xrange [%f:%f]' % (-laglen,laglen) )
315 f.title('Phase detection and predicted beats')
316 f.xlabel('time (df samples)')
317 f.plot(*d[3])
318 f('set nomultiplot')
319 if printframe == -1: a = sys.stdin.read()
320 elif 0 < printframe and printframe < nrframe:
321 break
python/test/bench/tempo/demo-tempo-acf+170−0
@@ -0,0 +1,170 @@
1#! /usr/bin/python
2
3""" this file was written by Paul Brossier
4 it is released under the GNU/GPL license.
5"""
6
7import sys,time
8from aubio.task import taskbeat,taskparams
9from aubio.aubioclass import fvec, aubio_autocorr
10from aubio.gnuplot import gnuplot_create
11from aubio.aubiowrapper import *
12from math import exp,log
13
14usage = "usage: %s [options] -i soundfile" % sys.argv[0]
15
16def parse_args():
17 from optparse import OptionParser
18 parser = OptionParser(usage=usage)
19 parser.add_option("-i","--input",
20 action="store", dest="filename",
21 help="input sound file")
22 parser.add_option("-n","--printframe",
23 action="store", dest="printframe", default=-1,
24 help="make a plot of the n_th frame")
25 parser.add_option("-x","--xsize",
26 action="store", dest="xsize", default=1.,
27 type='float', help="define xsize for plot")
28 parser.add_option("-y","--ysize",
29 action="store", dest="ysize", default=1.,
30 type='float', help="define ysize for plot")
31 parser.add_option("-O","--outplot",
32 action="store", dest="outplot", default=None,
33 help="save plot to output.{ps,png}")
34 (options, args) = parser.parse_args()
35 if not options.filename:
36 print "no file name given\n", usage
37 sys.exit(1)
38 return options, args
39
40def plotdata(x,y,plottitle="",**keyw):
41 import Gnuplot
42 return Gnuplot.Data(x, y, title="%s" % plottitle,**keyw)
43
44options, args = parse_args()
45filename = options.filename
46xsize = float(options.xsize)
47ysize = float(options.ysize)
48
49printframe = int(options.printframe)
50
51if options.outplot and printframe > 0:
52 extension = options.outplot.split('.')[-1]
53 outplot = '.'.join(options.outplot.split('.')[:-1])
54else:
55 extension = ''
56 outplot = None
57f = gnuplot_create(outplot=outplot,extension=extension)
58
59params = taskparams()
60params.onsetmode = 'specdiff'
61task = taskbeat(filename,params=params)
62
63hopsize = params.hopsize
64bufsize = params.bufsize
65btstep = task.btstep
66winlen = task.btwinlen
67laglen = winlen/4
68step = winlen/4
69
70timesig = 0
71maxnumelem = 4
72gp = 0
73counter = 0
74flagconst = 0
75constthresh = 3.901
76g_var = 3.901
77rp = 0
78rp1 = 0
79rp2 = 0
80g_mu = 0
81
82rayparam = 48/512.*winlen
83
84t = [i for i in range(hopsize)]
85#tlong = [i for i in range(hopsize*(btstep-1))]
86#tall = [i for i in range(hopsize*btstep)]
87sig = [0 for i in range(hopsize*btstep)]
88dfx = [i for i in range(winlen)]
89dfframe = [0 for i in range(winlen)]
90dfrev = [0 for i in range(winlen)]
91acframe = [0 for i in range(winlen/2)]
92
93localacf = [0 for i in range(winlen)]
94inds = [0 for i in range(maxnumelem)]
95
96acx = [i for i in range(laglen)]
97acfout = [0 for i in range(laglen)]
98
99phwv = [0 for i in range(2*laglen)]
100phwvx = [i for i in range(2*laglen)]
101
102dfwvnorm = exp(log(2.0)*(winlen+2.)/rayparam);
103dfwv = [exp(log(2.)*(i+1.)/rayparam)/dfwvnorm for i in range(winlen)]
104
105gwv = [exp(-.5*(j+1.-g_mu)**2/g_var**2) for j in range(laglen)]
106rwv = [(i+1.)/rayparam**2 * exp(-(i+1.)**2 / (2.*rayparam)**2)
107 for i in range(0,laglen)]
108acf = fvec(winlen,1)
109
110if options.outplot and printframe > 0:
111 extension = options.outplot.split('.')[-1]
112 outplot = '.'.join(options.outplot.split('.')[:-1])
113else:
114 extension = ''
115 outplot = None
116f = gnuplot_create(outplot=outplot,extension=extension)
117nrframe = 0
118while (task.readsize == params.hopsize):
119 task()
120 #print task.pos2
121 sig[:-hopsize] = [i for i in sig[-(btstep-1)*hopsize:]]
122 sig[-hopsize:] = [task.myvec.get(i,0) for i in t]
123
124 #g('set xrange [%f:%f]' % (t[0],t[-1]))
125 #time.sleep(.2)
126 if task.pos2==btstep-1:
127 nrframe += 1
128 dfframe = [task.dfframe.get(i,0) for i in range(winlen)]
129 # start beattracking_do
130 for i in range(winlen):
131 dfrev[winlen-1-i] = 0.
132 dfrev[winlen-1-i] = dfframe[i]*dfwv[i]
133 aubio_autocorr(task.dfframe(),acf());
134 acframe = [acf.get(i,0) for i in range(winlen/2)]
135 if printframe == nrframe or printframe == -1:
136 d = [[plotdata(range(btstep*hopsize),sig,plottitle="input signal", with='lines')]]
137 d += [[plotdata(range(-winlen,0),dfframe,plottitle="onset detection", with='lines')]]
138 d += [[plotdata(range(winlen/2),acframe,plottitle="autocorrelation", with='lines')]]
139
140 # plot all this
141 if printframe == nrframe or printframe == -1:
142
143 f('set lmargin 4')
144 f('set rmargin 4')
145 f('set size %f,%f' % (1.0*xsize,1.0*ysize) )
146 f('set key spacing 1.3')
147 f('set multiplot')
148
149 f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
150 f('set orig %f,%f' % (0.0*xsize,0.66*ysize) )
151 f('set xrange [%f:%f]' % (0,btstep*hopsize) )
152 f.title('Input signal')
153 f.xlabel('time (samples)')
154 f.plot(*d[0])
155 f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
156 f('set orig %f,%f' % (0.0*xsize,0.33*ysize) )
157 f('set xrange [%f:%f]' % (-winlen,0) )
158 f.title('Onset detection function')
159 f.xlabel('time (df samples)')
160 f.plot(*d[1])
161 f('set size %f,%f' % (1.0*xsize,0.33*ysize) )
162 f('set orig %f,%f' % (0.0*xsize,0.00*ysize) )
163 f('set xrange [%f:%f]' % (0,winlen/2) )
164 f.title('Autocorrelation')
165 f.xlabel('lag (df samples)')
166 f.plot(*d[2])
167 f('set nomultiplot')
168 if printframe == -1: a = sys.stdin.read()
169 elif 0 < printframe and printframe < nrframe:
170 break

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t