Chris@12
|
1
|
Chris@12
|
2 program silvet;
|
Chris@12
|
3
|
Chris@12
|
4 { prepareTimeFrequency } = load timefreq;
|
Chris@13
|
5 { loadTemplates, extractRanges } = load templates;
|
Chris@14
|
6
|
Chris@14
|
7 em = load em;
|
Chris@19
|
8 em1 = load em_onecolumn;
|
Chris@12
|
9
|
Chris@12
|
10 mat = load may.matrix;
|
Chris@12
|
11 vec = load may.vector;
|
Chris@14
|
12 plot = load may.plot;
|
Chris@12
|
13
|
Chris@12
|
14 templates = loadTemplates ();
|
Chris@12
|
15
|
Chris@13
|
16 ranges = extractRanges templates;
|
Chris@13
|
17
|
Chris@13
|
18 eprintln "\nWe have \(length (keys templates)) instruments:";
|
Chris@13
|
19 for (sort (keys templates)) do k:
|
Chris@14
|
20 eprintln " * \(k) \(mat.size templates[k]) range \(ranges[k].lowest) -> \(ranges[k].highest)";
|
Chris@13
|
21 done;
|
Chris@12
|
22 eprintln "";
|
Chris@12
|
23
|
Chris@12
|
24 columns = prepareTimeFrequency "test.wav";
|
Chris@12
|
25
|
Chris@19
|
26 /*
|
Chris@12
|
27 height = if empty? columns then 0 else vec.length (head columns) fi;
|
Chris@12
|
28
|
Chris@13
|
29 chunkSize = { rows = height, columns = 100 };
|
Chris@13
|
30
|
Chris@14
|
31 emdata = em.initialise ranges templates 88 chunkSize;
|
Chris@13
|
32
|
Chris@14
|
33 eprintln "initialised EM data: overall pitch range \(emdata.lowest) -> \(emdata.highest)";
|
Chris@13
|
34
|
Chris@12
|
35 chunkify cols =
|
Chris@12
|
36 if empty? cols then []
|
Chris@12
|
37 else
|
Chris@13
|
38 (mat.resizedTo chunkSize
|
Chris@13
|
39 (mat.fromColumns (take chunkSize.columns cols)))
|
Chris@13
|
40 :. \(chunkify (drop chunkSize.columns cols));
|
Chris@12
|
41 fi;
|
Chris@12
|
42
|
Chris@12
|
43 chunks = chunkify columns;
|
Chris@12
|
44
|
Chris@12
|
45 eprintln "we have \(length chunks) chunks of size \(mat.size (head chunks))";
|
Chris@12
|
46
|
Chris@14
|
47 eprintln "attempting one expectation phase...";
|
Chris@13
|
48
|
Chris@14
|
49 error = em.performExpectation emdata (head chunks);
|
Chris@14
|
50
|
Chris@14
|
51 eprintln "done, result has dimension \(mat.size error)";
|
Chris@14
|
52
|
Chris@14
|
53 eprintln "attempting one maximisation phase...";
|
Chris@14
|
54
|
Chris@14
|
55 newP = em.performMaximisation emdata (head chunks) error;
|
Chris@14
|
56
|
Chris@14
|
57 eprintln "done";
|
Chris@14
|
58
|
Chris@14
|
59 \() (plot.plot [ Grid (head chunks) ]);
|
Chris@14
|
60 \() (plot.plot [ Grid error ]);
|
Chris@14
|
61
|
Chris@14
|
62 \() (plot.plot [ Grid newP ]);
|
Chris@19
|
63 */
|
Chris@19
|
64
|
Chris@19
|
65 em1data = em1.initialise ranges templates 88;
|
Chris@19
|
66
|
Chris@23
|
67 col = head (drop 50 columns); // (drop ((length columns) / 2) columns);
|
Chris@19
|
68
|
Chris@20
|
69 \() (plot.plot [ Caption "Source frequency distribution", Vector col ]);
|
Chris@19
|
70
|
Chris@22
|
71 \() (plot.plot [ Caption "Source distribution beforehand", Grid em1data.sources]);
|
Chris@20
|
72
|
Chris@20
|
73 oneIteration em1data col n =
|
Chris@19
|
74 (q = em1.performExpectation em1data col;
|
Chris@20
|
75 // \() (plot.plot [ Caption "Frequency distribution and output of E-step for iteration \(n)", Vector col, Vector q ]);
|
Chris@19
|
76 newdata = em1.performMaximisation em1data col q;
|
Chris@21
|
77 if (n % 6 == 0) then
|
Chris@20
|
78 \() (plot.plot [ Caption "Pitch distribution before and after M-step update for iteration \(n)", Vector (em1data.pitches), Vector (newdata.pitches) ]);
|
Chris@22
|
79 \() (plot.plot [ Caption "Source distribution after M-step update for iteration \(n)", Grid newdata.sources ]);
|
Chris@20
|
80 fi;
|
Chris@19
|
81 newdata);
|
Chris@19
|
82
|
Chris@21
|
83 iterations = 12;
|
Chris@19
|
84
|
Chris@20
|
85 var d = em1data;
|
Chris@20
|
86
|
Chris@20
|
87 for [1..iterations] do i:
|
Chris@20
|
88 d := oneIteration d col i;
|
Chris@20
|
89 done;
|
Chris@14
|
90
|
Chris@21
|
91 var sounding = [];
|
Chris@21
|
92
|
Chris@22
|
93 println "pitch distribution: \(vec.list d.pitches)";
|
Chris@21
|
94
|
Chris@21
|
95 for [d.lowest .. d.highest] do p:
|
Chris@21
|
96 if (vec.at d.pitches p) > 0.05 then
|
Chris@21
|
97 sounding := sounding ++ [p];
|
Chris@21
|
98 fi;
|
Chris@21
|
99 done;
|
Chris@21
|
100
|
Chris@21
|
101 println "Sounding: \(sounding)";
|
Chris@21
|
102
|
Chris@21
|
103 toNote p = (array ["A","A#","B","C","C#","D","D#","E","F","F#","G","G#"])[p % 12];
|
Chris@21
|
104
|
Chris@21
|
105 println "Notes: \(map toNote sounding)";
|
Chris@21
|
106
|
Chris@21
|
107 var instruments = [];
|
Chris@21
|
108 for sounding do p:
|
Chris@22
|
109 var best = 0;
|
Chris@21
|
110 var bestp = 0;
|
Chris@22
|
111 for [0..d.instCount-1] do i:
|
Chris@22
|
112 if mat.at d.sources p i > bestp then
|
Chris@22
|
113 bestp := mat.at d.sources p i;
|
Chris@21
|
114 best := i;
|
Chris@21
|
115 fi;
|
Chris@21
|
116 done;
|
Chris@21
|
117 if bestp > 0 then
|
Chris@21
|
118 instruments := instruments ++ [best];
|
Chris@21
|
119 else
|
Chris@22
|
120 instruments := instruments ++ [-1];
|
Chris@21
|
121 fi;
|
Chris@21
|
122 done;
|
Chris@21
|
123
|
Chris@22
|
124 println "Instruments: \(map do i: (d.instruments[i]) done instruments)";
|
Chris@21
|
125
|
Chris@21
|
126
|
Chris@14
|
127 ();
|
Chris@14
|
128
|
Chris@14
|
129
|