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@36
|
45 def test_bihist_from_melodia():
|
Maria@36
|
46 melodia_file = 'data/sample_dataset/Melodia/mel_1_2_1.csv'
|
Maria@36
|
47 bihist = pbi.bihist_from_melodia(melodia_file, secondframedecomp=False)
|
Maria@36
|
48 assert bihist.shape == (60, 60)
|
Maria@36
|
49
|
Maria@36
|
50
|
Maria@36
|
51 def test_bihist_from_melodia_n_frames():
|
Maria@36
|
52 melodia_file = 'data/sample_dataset/Melodia/mel_1_2_1.csv'
|
Maria@36
|
53 bihist = pbi.bihist_from_melodia(melodia_file, secondframedecomp=True)
|
Maria@36
|
54 dur_sec = 11.5 # duration of first file in metadata.csv is > 11 seconds
|
Maria@36
|
55 n_frames_true = np.round((dur_sec - pbi.win2sec) * 2) # for .5 sec hop size
|
Maria@36
|
56 assert bihist.shape[1] == n_frames_true
|
Maria@36
|
57
|
Maria@36
|
58
|
Maria@36
|
59 def test_bihistogram():
|
Maria@36
|
60 melody = 440 * np.ones(1000)
|
Maria@36
|
61 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@36
|
62 bihist = pbi.bihistogram(melody_matrix, align=False)
|
Maria@36
|
63 assert np.array_equal(bihist, np.zeros((60, 60)))
|
Maria@36
|
64
|
Maria@36
|
65
|
Maria@36
|
66 def test_bihistogram_values():
|
Maria@36
|
67 melody = np.concatenate([440 * np.ones(500), 32.703 * np.ones(500)])
|
Maria@36
|
68 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@36
|
69 # melody transitions from A to C (bin 45/60 to bin 0/60)
|
Maria@36
|
70 bihist = pbi.bihistogram(melody_matrix, align=False)
|
Maria@36
|
71 # expect only element [45, 0] to be non-zero
|
Maria@36
|
72 assert bihist[45, 0] > 0 and (np.sum(bihist) - bihist[45, 0]) == 0
|
Maria@36
|
73
|
Maria@36
|
74
|
Maria@37
|
75 def test_bihistogram_align():
|
Maria@37
|
76 melody = np.concatenate([660 * np.ones(250), 440 * np.ones(500)])
|
Maria@37
|
77 melody_matrix = pbi.get_melody_matrix(melody)
|
Maria@37
|
78 # bin of max magnitude = A = 45/60
|
Maria@37
|
79 bihist = pbi.bihistogram(melody_matrix, align=True)
|
Maria@37
|
80 # bihist[20, 45] == 0
|
Maria@37
|
81 # we shift up 45 so rows 20-45 and left 45 so cols 45-45
|
Maria@37
|
82 assert bihist[20-45, 0] == 1
|