Maria@36
|
1 # -*- coding: utf-8 -*-
|
Maria@36
|
2 """
|
Maria@36
|
3 Created on Fri Sep 1 19:11:52 2017
|
Maria@36
|
4
|
Maria@36
|
5 @author: mariapanteli
|
Maria@36
|
6 """
|
Maria@36
|
7
|
Maria@36
|
8 import pytest
|
Maria@36
|
9
|
Maria@36
|
10 import numpy as np
|
Maria@36
|
11
|
Maria@36
|
12 import scripts.PitchBihist as PitchBihist
|
Maria@36
|
13
|
Maria@36
|
14
|
Maria@36
|
15 pbi = PitchBihist.PitchBihist()
|
Maria@36
|
16
|
Maria@36
|
17
|
Maria@36
|
18 def test_hz_to_cents():
|
Maria@36
|
19 freq_Hz = np.array([32.703, 65.406, 55, 110])
|
Maria@36
|
20 freq_cents = pbi.hz_to_cents(freq_Hz)
|
Maria@36
|
21 freq_cents_true = np.array([0, 1200, 900, 2100])
|
Maria@36
|
22 assert np.array_equal(freq_cents, freq_cents_true)
|
Maria@36
|
23
|
Maria@36
|
24
|
Maria@36
|
25 def test_wrap_to_octave():
|
Maria@36
|
26 cents = np.array([900, 2100, 1200])
|
Maria@36
|
27 octave_cents = pbi.wrap_to_octave(cents)
|
Maria@36
|
28 octave_cents_true = np.array([900, 900, 0])
|
Maria@36
|
29 assert np.array_equal(octave_cents, octave_cents_true)
|
Maria@36
|
30
|
Maria@36
|
31
|
Maria@36
|
32 def test_get_melody_from_file():
|
Maria@36
|
33 melodia_file = 'data/sample_dataset/Melodia/mel_1_2_1.csv'
|
Maria@36
|
34 melody = pbi.get_melody_from_file(melodia_file)
|
Maria@37
|
35 assert len(melody) < 12. * pbi.melody_sr
|
Maria@36
|
36
|
Maria@36
|
37
|
Maria@36
|
38 def test_get_melody_matrix():
|
Maria@36
|
39 melody = 440 * np.ones(1000)
|
Maria@36
|
40 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@36
|
41 n_frames = melody_matrix.shape[1]
|
Maria@36
|
42 assert np.array_equal(melody_matrix[45, :], np.ones(n_frames))
|
Maria@36
|
43
|
Maria@36
|
44
|
Maria@39
|
45 def test_second_frame_decomposition():
|
Maria@39
|
46 norigframes = 100
|
Maria@39
|
47 nframes, win2, hop2 = pbi.second_frame_decomposition(norigframes)
|
Maria@39
|
48 assert nframes == 1
|
Maria@39
|
49
|
Maria@39
|
50
|
Maria@39
|
51 def test_second_frame_decomposition():
|
Maria@39
|
52 norigframes = np.ceil(pbi.melody_sr * 16.)
|
Maria@39
|
53 nframes, win2, hop2 = pbi.second_frame_decomposition(norigframes)
|
Maria@39
|
54 # for 16-sec segment with .5 hop size expect ~16 frames round up
|
Maria@39
|
55 assert nframes == 17
|
Maria@39
|
56
|
Maria@39
|
57
|
Maria@36
|
58 def test_bihist_from_melodia():
|
Maria@36
|
59 melodia_file = 'data/sample_dataset/Melodia/mel_1_2_1.csv'
|
Maria@36
|
60 bihist = pbi.bihist_from_melodia(melodia_file, secondframedecomp=False)
|
Maria@36
|
61 assert bihist.shape == (60, 60)
|
Maria@36
|
62
|
Maria@36
|
63
|
Maria@36
|
64 def test_bihist_from_melodia_n_frames():
|
Maria@36
|
65 melodia_file = 'data/sample_dataset/Melodia/mel_1_2_1.csv'
|
Maria@36
|
66 bihist = pbi.bihist_from_melodia(melodia_file, secondframedecomp=True)
|
Maria@36
|
67 dur_sec = 11.5 # duration of first file in metadata.csv is > 11 seconds
|
Maria@36
|
68 n_frames_true = np.round((dur_sec - pbi.win2sec) * 2) # for .5 sec hop size
|
Maria@36
|
69 assert bihist.shape[1] == n_frames_true
|
Maria@36
|
70
|
Maria@36
|
71
|
Maria@36
|
72 def test_bihistogram():
|
Maria@36
|
73 melody = 440 * np.ones(1000)
|
Maria@36
|
74 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@36
|
75 bihist = pbi.bihistogram(melody_matrix, align=False)
|
Maria@36
|
76 assert np.array_equal(bihist, np.zeros((60, 60)))
|
Maria@36
|
77
|
Maria@36
|
78
|
Maria@36
|
79 def test_bihistogram_values():
|
Maria@36
|
80 melody = np.concatenate([440 * np.ones(500), 32.703 * np.ones(500)])
|
Maria@36
|
81 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@36
|
82 # melody transitions from A to C (bin 45/60 to bin 0/60)
|
Maria@36
|
83 bihist = pbi.bihistogram(melody_matrix, align=False)
|
Maria@36
|
84 # expect only element [45, 0] to be non-zero
|
Maria@36
|
85 assert bihist[45, 0] > 0 and (np.sum(bihist) - bihist[45, 0]) == 0
|
Maria@36
|
86
|
Maria@36
|
87
|
Maria@37
|
88 def test_bihistogram_align():
|
Maria@37
|
89 melody = np.concatenate([660 * np.ones(250), 440 * np.ones(500)])
|
Maria@37
|
90 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@37
|
91 # bin of max magnitude = A = 45/60
|
Maria@37
|
92 bihist = pbi.bihistogram(melody_matrix, align=True)
|
Maria@37
|
93 # bihist[20, 45] == 0
|
Maria@37
|
94 # we shift up 45 so rows 20-45 and left 45 so cols 45-45
|
Maria@37
|
95 assert bihist[20-45, 0] == 1
|