peterf@2
|
1 #!/usr/bin/env python
|
peterf@2
|
2 # CREATED:2013-03-11 18:14:30 by Brian McFee <brm2132@columbia.edu>
|
peterf@2
|
3 # unit tests for librosa.beat
|
peterf@2
|
4
|
peterf@2
|
5 from nose.tools import nottest
|
peterf@2
|
6
|
peterf@2
|
7 import numpy
|
peterf@2
|
8 import librosa
|
peterf@2
|
9
|
peterf@2
|
10 from testLibrosaCore import files, load
|
peterf@2
|
11
|
peterf@2
|
12 def test_onset_strength():
|
peterf@2
|
13
|
peterf@2
|
14 def __test(infile):
|
peterf@2
|
15 DATA = load(infile)
|
peterf@2
|
16
|
peterf@2
|
17 # Compute onset envelope using the same spectrogram
|
peterf@2
|
18 onsets = librosa.onset.onset_strength(y=None, sr=8000, S=DATA['D'], centering=False, detrend=True)
|
peterf@2
|
19
|
peterf@2
|
20 assert numpy.allclose(onsets[1:], DATA['onsetenv'][0])
|
peterf@2
|
21
|
peterf@2
|
22 pass
|
peterf@2
|
23
|
peterf@2
|
24 for infile in files('data/beat-onset-*.mat'):
|
peterf@2
|
25 yield (__test, infile)
|
peterf@2
|
26 pass
|
peterf@2
|
27
|
peterf@2
|
28 def test_tempo():
|
peterf@2
|
29 def __test(infile):
|
peterf@2
|
30 DATA = load(infile)
|
peterf@2
|
31
|
peterf@2
|
32 # Estimate tempo from the given onset envelope
|
peterf@2
|
33 tempo = librosa.beat.estimate_tempo( DATA['onsetenv'][0],
|
peterf@2
|
34 sr=8000,
|
peterf@2
|
35 hop_length=32,
|
peterf@2
|
36 start_bpm=120.0)
|
peterf@2
|
37
|
peterf@2
|
38 assert (numpy.allclose(tempo, DATA['t'][0,0]) or
|
peterf@2
|
39 numpy.allclose(tempo, DATA['t'][0,1]))
|
peterf@2
|
40 pass
|
peterf@2
|
41
|
peterf@2
|
42 for infile in files('data/beat-tempo-*.mat'):
|
peterf@2
|
43 yield (__test, infile)
|
peterf@2
|
44 pass
|
peterf@2
|
45
|
peterf@2
|
46 # Beat tracking test is no longer enabled due to librosa's various corrections
|
peterf@2
|
47 @nottest
|
peterf@2
|
48 def test_beat():
|
peterf@2
|
49 def __test(infile):
|
peterf@2
|
50 DATA = load(infile)
|
peterf@2
|
51
|
peterf@2
|
52 (bpm, beats) = librosa.beat.beat_track(y=None, sr=8000, hop_length=32,
|
peterf@2
|
53 onsets=DATA['onsetenv'][0])
|
peterf@2
|
54
|
peterf@2
|
55 beat_times = librosa.frames_to_time(beats, sr=8000, hop_length=32)
|
peterf@2
|
56 print beat_times
|
peterf@2
|
57 print DATA['beats']
|
peterf@2
|
58 assert numpy.allclose(beat_times, DATA['beats'])
|
peterf@2
|
59 pass
|
peterf@2
|
60 for infile in files('data/beat-beat-*.mat'):
|
peterf@2
|
61 yield (__test, infile)
|
peterf@2
|
62 pass
|