1 | #! /usr/bin/env python |
---|
2 | |
---|
3 | from numpy.testing import TestCase |
---|
4 | from nose2.tools import params |
---|
5 | import numpy as np |
---|
6 | import aubio |
---|
7 | |
---|
8 | class aubio_pitchshift(TestCase): |
---|
9 | |
---|
10 | def setUp(self): |
---|
11 | try: |
---|
12 | self.o = aubio.pitchshift(hop_size = 128) |
---|
13 | except RuntimeError as e: |
---|
14 | self.skipTest("creating aubio.pitchshift failed (recompile with rubberband?)") |
---|
15 | |
---|
16 | def test_default_creation(self): |
---|
17 | self.assertEqual(self.o.get_pitchscale(), 1) |
---|
18 | self.assertEqual(self.o.get_transpose(), 0) |
---|
19 | |
---|
20 | def test_on_zeros(self): |
---|
21 | test_length = self.o.hop_size * 100 |
---|
22 | read = 0 |
---|
23 | # test on zeros |
---|
24 | vec = aubio.fvec(self.o.hop_size) |
---|
25 | transpose_range = 24 |
---|
26 | while read < test_length: |
---|
27 | # transpose the samples |
---|
28 | out = self.o(vec) |
---|
29 | self.assertTrue((out == 0).all()) |
---|
30 | # position in the file (between 0. and 1.) |
---|
31 | percent_read = read / float(test_length) |
---|
32 | # variable transpose rate (in semitones) |
---|
33 | transpose = 2 * transpose_range * percent_read - transpose_range |
---|
34 | # set transpose rate |
---|
35 | self.o.set_transpose(transpose) |
---|
36 | read += len(vec) |
---|
37 | |
---|
38 | def test_on_ones(self): |
---|
39 | test_length = self.o.hop_size * 100 |
---|
40 | read = 0 |
---|
41 | # test on zeros |
---|
42 | vec = aubio.fvec(self.o.hop_size) + 1 |
---|
43 | transpose_range = 1.24 |
---|
44 | while read < test_length: |
---|
45 | # transpose the samples |
---|
46 | out = self.o(vec) |
---|
47 | # position in the file (between 0. and 1.) |
---|
48 | percent_read = read / float(test_length) |
---|
49 | # variable transpose rate (in semitones) |
---|
50 | transpose = 2 * transpose_range * percent_read - transpose_range |
---|
51 | # set transpose rate |
---|
52 | self.o.set_transpose(transpose) |
---|
53 | read += len(vec) |
---|
54 | |
---|
55 | def test_transpose_too_high(self): |
---|
56 | with self.assertRaises(ValueError): |
---|
57 | self.o.set_transpose(24.3) |
---|
58 | |
---|
59 | def test_transpose_too_low(self): |
---|
60 | with self.assertRaises(ValueError): |
---|
61 | self.o.set_transpose(-24.3) |
---|
62 | |
---|
63 | |
---|
64 | class aubio_pitchshift_testruns(TestCase): |
---|
65 | |
---|
66 | @params( |
---|
67 | ("default", 1.2, 128, 44100), |
---|
68 | ("crispness:0", 0.43, 64, 8000), |
---|
69 | ("crispness:3", 0.53, 256, 8000), |
---|
70 | ("crispness:3", 1.53, 512, 8000), |
---|
71 | ("crispness:6", 2.3, 4096, 192000), |
---|
72 | ) |
---|
73 | def test_run_with_params(self, mode, pitchscale, hop_size, samplerate): |
---|
74 | self.o = aubio.pitchshift(mode, pitchscale, hop_size, samplerate) |
---|
75 | test_length = self.o.hop_size * 50 |
---|
76 | read = 0 |
---|
77 | # test on random |
---|
78 | vec = np.random.rand(self.o.hop_size).astype(aubio.float_type) |
---|
79 | transpose_range = self.o.get_transpose() |
---|
80 | while read < test_length: |
---|
81 | # transpose the samples |
---|
82 | out = self.o(vec) |
---|
83 | # position in the file (between 0. and 1.) |
---|
84 | percent_read = read / float(test_length) |
---|
85 | # variable transpose rate (in semitones) |
---|
86 | transpose = transpose_range - 2 * transpose_range * percent_read |
---|
87 | # set transpose rate |
---|
88 | self.o.set_transpose(transpose) |
---|
89 | read += len(vec) |
---|
90 | |
---|
91 | if __name__ == '__main__': |
---|
92 | from nose2 import main |
---|
93 | main() |
---|