comparison plugins/Transcription.cpp @ 120:52d84f7f6ad3

* Add Ruohua's Transcription plugin
author Chris Cannam <c.cannam@qmul.ac.uk>
date Tue, 09 Jun 2009 15:07:19 +0000
parents
children dcf5800f0f00
comparison
equal deleted inserted replaced
119:2416ef0e9319 120:52d84f7f6ad3
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
3 /*
4 QM Vamp Plugin Set
5
6 Centre for Digital Music, Queen Mary, University of London.
7 All rights reserved.
8 */
9
10 /*transcription vamp plugin: Ruohua Zhou, Josh Reiss, josh.reiss@elec.qmul.ac.uk */
11
12 #include "Transcription.h"
13 #include <vamp-sdk/PluginAdapter.h>
14 #include <math.h>
15 #include <stdlib.h>
16
17 using std::string;
18 using std::vector;
19 using std::cerr;
20 using std::endl;
21
22 const double CNum[8] = {
23 3.025328153863e-005,0.0002117729707704,0.0006353189123113, 0.001058864853852,
24 0.001058864853852,0.0006353189123113,0.0002117729707704,3.025328153863e-005
25 };
26
27 const double CDen[8] = {
28 1, -4.647847898799, 9.540784706769, -11.14354542746,
29 7.967285533211, -3.477244449085, 0.8559660579522, -0.09152610255505
30 };
31
32 const int A[10] = {0, 120, 190, 240, 279, 310, 337, 360, 380, 399};
33
34
35
36 const double EualCurve960[960] = {
37 83.750025,83.532690,83.315770,83.099260,82.883159,82.667463,82.452170,82.237276,82.022779,81.808675,
38 81.594963,81.381639,81.168699,80.956142,80.743964,80.532163,80.320735,80.109677,79.898987,79.688663,79.478700,79.269096,79.059848,78.850953,
39 78.642408,78.434211,78.226359,78.018848,77.811676,77.604839,77.398336,77.192162,76.986316,76.780794,76.575593,76.370710,76.166143,75.961889,
40 75.757945,75.554307,75.350973,75.147940,74.945205,74.742766,74.540618,74.338761,74.137189,73.935902,73.734895,73.534166,73.333712,73.133529,
41 72.933616,72.733970,72.534586,72.335463,72.136598,71.937987,71.739628,71.541517,71.343653,71.146032,70.948650,70.751506,70.554597,70.357919,
42 70.161469,69.965245,69.769244,69.573462,69.377898,69.182548,68.987408,68.792477,68.597752,68.403228,68.208905,68.014781,67.820873,67.627197,
43 67.433772,67.240617,67.047749,66.855187,66.662949,66.471053,66.279516,66.088358,65.897597,65.707250,65.517336,65.327873,65.138879,64.950373,
44 64.762372,64.574894,64.387959,64.201583,64.015785,63.830584,63.645997,63.462043,63.278739,63.096105,62.914158,62.732915,62.552397,62.372620,
45 62.193602,62.015363,61.837920,61.661291,61.485494,61.310549,61.136471,60.963274,60.790941,60.619447,60.448770,60.278885,60.109770,59.941401,
46 59.773755,59.606807,59.440536,59.274916,59.109924,58.945538,58.781733,58.618486,58.455773,58.293572,58.131858,57.970608,57.809799,57.649407,
47 57.489408,57.329780,57.170498,57.011539,56.852880,56.694496,56.536366,56.378464,56.220768,56.063255,55.905900,55.748680,55.591571,55.434551,
48 55.277595,55.120681,54.963784,54.806886,54.649983,54.493077,54.336169,54.179261,54.022353,53.865448,53.708546,53.551650,53.394759,53.237877,
49 53.081003,52.924139,52.767287,52.610448,52.453624,52.296815,52.140023,51.983250,51.826496,51.669763,51.513053,51.356366,51.199705,51.043070,
50 50.886463,50.729885,50.573337,50.416821,50.260338,50.103890,49.947478,49.791103,49.634766,49.478469,49.322214,49.166001,49.009832,48.853710,
51 48.697648,48.541659,48.385757,48.229958,48.074273,47.918719,47.763308,47.608055,47.452974,47.298080,47.143385,46.988904,46.834652,46.680642,
52 46.526889,46.373405,46.220207,46.067307,45.914720,45.762460,45.610540,45.458976,45.307780,45.156968,45.006553,44.856549,44.706971,44.557832,
53 44.409146,44.260928,44.113192,43.965951,43.819220,43.673013,43.527344,43.382227,43.237676,43.093703,42.950305,42.807478,42.665218,42.523520,
54 42.382381,42.241794,42.101757,41.962264,41.823311,41.684894,41.547008,41.409648,41.272811,41.136491,41.000685,40.865387,40.730594,40.596301,
55 40.462503,40.329195,40.196375,40.064036,39.932175,39.800787,39.669867,39.539412,39.409417,39.279876,39.150787,39.022143,38.893942,38.766178,
56 38.638846,38.511944,38.385465,38.259405,38.133761,38.008525,37.883679,37.759203,37.635076,37.511278,37.387789,37.264588,37.141656,37.018971,
57 36.896513,36.774262,36.652197,36.530298,36.408545,36.286918,36.165395,36.043957,35.922583,35.801253,35.679947,35.558643,35.437322,35.315964,
58 35.194547,35.073052,34.951458,34.829745,34.707892,34.585879,34.463686,34.341293,34.218678,34.095822,33.972704,33.849303,33.725600,33.601574,
59 33.477205,33.352481,33.227425,33.102069,32.976445,32.850585,32.724520,32.598284,32.471906,32.345420,32.218858,32.092250,31.965629,31.839028,
60 31.712477,31.586009,31.459655,31.333448,31.207419,31.081601,30.956024,30.830722,30.705725,30.581067,30.456777,30.332890,30.209436,30.086447,
61 29.963955,29.841993,29.720591,29.599783,29.479599,29.360071,29.241233,29.123114,29.005748,28.889166,28.773400,28.658474,28.544378,28.431095,
62 28.318607,28.206897,28.095947,27.985740,27.876257,27.767481,27.659396,27.551982,27.445224,27.339102,27.233599,27.128699,27.024383,26.920633,
63 26.817433,26.714764,26.612609,26.510951,26.409772,26.309053,26.208779,26.108930,26.009491,25.910442,25.811766,25.713446,25.615465,25.517804,
64 25.420446,25.323374,25.226570,25.130016,25.033695,24.937589,24.841681,24.745955,24.650409,24.555043,24.459856,24.364847,24.270016,24.175363,
65 24.080887,23.986588,23.892466,23.798520,23.704751,23.611156,23.517737,23.424492,23.331422,23.238526,23.145803,23.053253,22.960877,22.868672,
66 22.776640,22.684779,22.593090,22.501572,22.410224,22.319046,22.228038,22.137200,22.046530,21.956029,21.865697,21.775532,21.685535,21.595704,
67 21.506041,21.416544,21.327213,21.238047,21.149047,21.060211,20.971540,20.883034,20.794691,20.706512,20.618496,20.530642,20.442952,20.355423,
68 20.268057,20.180852,20.093808,20.006925,19.920202,19.833640,19.747237,19.660994,19.574910,19.488985,19.403218,19.317610,19.232159,19.146866,
69 19.061729,18.976750,18.891927,18.807260,18.722749,18.638393,18.554193,18.470147,18.386255,18.302518,18.218934,18.135504,18.052227,17.969105,
70 17.886151,17.803379,17.720805,17.638444,17.556310,17.474419,17.392786,17.311425,17.230351,17.149581,17.069127,16.989007,16.909233,16.829822,
71 16.750789,16.672148,16.593914,16.516103,16.438729,16.361808,16.285354,16.209382,16.133907,16.058945,15.984510,15.910617,15.837282,15.764518,
72 15.692342,15.620768,15.549811,15.479486,15.409809,15.340793,15.272455,15.204808,15.137869,15.071646,15.006129,14.941300,14.877144,14.813643,
73 14.750781,14.688540,14.626906,14.565860,14.505386,14.445467,14.386088,14.327231,14.268879,14.211016,14.153626,14.096691,14.040195,13.984121,
74 13.928453,13.873174,13.818267,13.763716,13.709504,13.655615,13.602031,13.548736,13.495714,13.442948,13.390420,13.338115,13.286016,13.234107,
75 13.182369,13.130788,13.079346,13.028026,12.976813,12.925693,12.874671,12.823756,12.772958,12.722285,12.671746,12.621351,12.571107,12.521025,
76 12.471113,12.421380,12.371835,12.322488,12.273346,12.224419,12.175717,12.127248,12.079020,12.031044,11.983328,11.935880,11.888711,11.841828,
77 11.795242,11.748960,11.702993,11.657348,11.612035,11.567063,11.522441,11.478178,11.434282,11.390764,11.347631,11.304893,11.262558,11.220637,
78 11.179137,11.138068,11.097437,11.057252,11.017521,10.978252,10.939452,10.901129,10.863290,10.825944,10.789098,10.752760,10.716937,10.681638,
79 10.646869,10.612640,10.578956,10.545827,10.513259,10.481261,10.449840,10.419004,10.388760,10.359117,10.330082,10.301663,10.273867,10.246702,
80 10.220176,10.194296,10.169071,10.144508,10.120615,10.097399,10.074868,10.053030,10.031892,10.011463,9.991749,9.972762,9.954523,9.937056,9.920385,
81 9.904534,9.889527,9.875389,9.862144,9.849815,9.838428,9.828005,9.818572,9.810152,9.802770,9.796449,9.791214,9.787089,9.784099,9.782266,9.781616,
82 9.782172,9.783959,9.787001,9.791322,9.796946,9.803897,9.812200,9.821878,9.832956,9.845457,9.859407,9.874829,9.891747,9.910185,9.930168,9.951720,
83 9.974864,9.999625,10.026008,10.053933,10.083304,10.114023,10.145991,10.179112,10.213287,10.248419,10.284410,10.321161,10.358576,10.396556,10.435004,
84 10.473821,10.512911,10.552175,10.591516,10.630835,10.670035,10.709018,10.747686,10.785942,10.823688,10.860826,10.897258,10.932886,10.967613,11.001341,
85 11.033972,11.065408,11.095552,11.124305,11.151570,11.177249,11.201245,11.223459,11.243793,11.262151,11.278450,11.292676,11.304827,11.314906,11.322913,
86 11.328848,11.332713,11.334508,11.334233,11.331889,11.327477,11.320998,11.312453,11.301841,11.289164,11.274422,11.257616,11.238747,11.217816,11.194822,
87 11.169767,11.142652,11.113476,11.082241,11.048948,11.013597,10.976189,10.936724,10.895203,10.851627,10.805996,10.758312,10.708574,10.656784,10.602942,
88 10.547049,10.489106,10.429113,10.367082,10.303073,10.237155,10.169399,10.099876,10.028655,9.955807,9.881403,9.805512,9.728206,9.649554,9.569627,9.488495,
89 9.406228,9.322897,9.238573,9.153325,9.067225,8.980341,8.892745,8.804508,8.715698,8.626388,8.536646,8.446544,8.356152,8.265539,8.174778,8.083937,7.993087,
90 7.902299,7.811643,7.721190,7.631008,7.541170,7.451746,7.362804,7.274417,7.186644,7.099504,7.013003,6.927151,6.841956,6.757424,6.673565,6.590385,6.507894,
91 6.426099,6.345008,6.264629,6.184970,6.106039,6.027843,5.950392,5.873692,5.797752,5.722579,5.648183,5.574570,5.501748,5.429727,5.358512,5.288114,5.218538,
92 5.149794,5.081890,5.014832,4.948630,4.883292,4.818824,4.755236,4.692535,4.630729,4.569826,4.509834,4.450761,4.392616,4.335415,4.279172,4.223905,4.169630,
93 4.116362,4.064118,4.012914,3.962766,3.913691,3.865703,3.818820,3.773058,3.728432,3.684960,3.642656,3.601538,3.561621,3.522921,3.485455,3.449239,3.414289,
94 3.380620,3.348250,3.317194,3.287469,3.259090,3.232074,3.206437,3.182194,3.159363,3.137959,3.117999,3.099498,3.082473,3.066939,3.052914,3.040413,3.029451,
95 3.020039,3.012186,3.005904,3.001201,2.998087,2.996571,2.996665,2.998377,3.001718,3.006696,3.013323,3.021607,3.031559,3.043187,3.056503,3.071516,3.088235,
96 3.106671,3.126833,3.148731,3.172374,3.197773,3.224938,3.253877,3.284601,3.317120,3.351444,3.387581,3.425543,3.465339,3.506978,3.550470,3.595826,3.643054,
97 3.692166,3.743169,3.796075,3.850896,3.907655,3.966377,4.027088,4.089815,4.154581,4.221415,4.290340,4.361382,4.434569,4.509924,4.587474,4.667245,4.749261,
98 4.833550,4.920136,5.009046,5.100305,5.193938,5.289972,5.388432,5.489343,5.592732,5.698625,5.807046,5.918022,6.031578,6.147741,6.266535,6.387986,6.512121,
99 6.638964,6.768542,6.900880,7.036004,7.173939,7.314712,7.458348,7.604856,7.754175,7.906227,8.060936,8.218223,8.378012,8.540225,8.704784,8.871612,9.040631,
100 9.211765,9.384934,9.560063,9.737073,9.915888,10.096429,10.278619,10.462380,10.647636,10.834309,11.022321,11.211594,11.402052,11.593616,11.786210,11.979755,
101 12.174175,12.369392,12.565329,12.761907,12.959049,13.156679,13.354718,13.553089,13.751715,13.950518,14.149420,14.348345,14.547211,14.745925,14.944391,
102 15.142512,15.340191,15.537333,15.733840,15.929615,16.124564
103 };
104 void Transcribe(int Len,int inputLen,double *SoundIn,double *out,double *outArray2,double *outArray3,double SampleRate);
105
106 Transcription::Transcription(float inputSampleRate) :
107 Plugin(inputSampleRate),
108 m_stepSize(0)
109 {
110 m_SoundIn=0;
111 m_SampleN=0;
112 m_AllocN = 0;
113 m_Excess = false;
114 }
115
116 Transcription::~Transcription()
117 {
118 free(m_SoundIn);
119 }
120
121 string
122 Transcription::getIdentifier() const
123 {
124 return "qm-transcription";
125 }
126
127 string
128 Transcription::getName() const
129 {
130 return "Polyphonic Transcription";
131 }
132
133 string
134 Transcription::getDescription() const
135 {
136 return "Transcribe the input audio to estimated notes";
137 }
138
139 string
140 Transcription::getMaker() const
141 {
142 return "Queen Mary, University of London";
143 }
144
145 int
146 Transcription::getPluginVersion() const
147 {
148 return 1;
149 }
150
151 string
152 Transcription::getCopyright() const
153 {
154 return "Plugin by Dr. Ruohua Zhou. Copyright (c) 2008-2009 QMUL - All Rights Reserved";
155 }
156
157 size_t
158 Transcription::getPreferredStepSize() const
159 {
160 return 441;
161 }
162
163 size_t
164 Transcription::getPreferredBlockSize() const
165 {
166 return 441;
167 }
168
169 bool
170 Transcription::initialise(size_t channels, size_t stepSize, size_t blockSize)
171 {
172 if (channels < getMinChannelCount() ||
173 channels > getMaxChannelCount()) return false;
174
175 if (m_inputSampleRate < 4410 || m_inputSampleRate > 441000) return false;
176
177 m_stepSize = std::min(stepSize, blockSize);
178 m_blockSize=blockSize;
179
180 m_SampleN = 0;
181
182 return true;
183 }
184
185 void
186 Transcription::reset()
187 {
188 free(m_SoundIn);
189 m_SoundIn = 0;
190 m_SampleN = 0;
191 m_AllocN = 0;
192 m_Excess = false;
193 m_Base = Vamp::RealTime();
194 }
195
196 Transcription::OutputList
197 Transcription::getOutputDescriptors() const
198 {
199 OutputList list;
200
201 OutputDescriptor zc;
202 zc.identifier = "transcription";
203 zc.name = "Transcription";
204 zc.description = "Estimated note pitch (MIDI note number from 0 to 127)";
205 zc.unit = "MIDI units";
206 zc.hasFixedBinCount = true;
207 zc.binCount = 1;
208 zc.hasKnownExtents = true;
209 zc.minValue = 0;
210 zc.maxValue = 127;
211 zc.isQuantized = true;
212 zc.quantizeStep = 1.0;
213 zc.hasDuration = true;
214 zc.sampleType = OutputDescriptor::VariableSampleRate;
215
216 /* no -- this is the result of a confusion between bin indices and values
217 {
218
219 zc.binNames.push_back("A0");// MIDI Note 21
220 zc.binNames.push_back("A0#");
221 zc.binNames.push_back("B0");
222 zc.binNames.push_back("C1");
223 zc.binNames.push_back("C1#");
224 zc.binNames.push_back("D1");
225 zc.binNames.push_back("D1#");
226 zc.binNames.push_back("E1");
227 zc.binNames.push_back("F1");
228 zc.binNames.push_back("F1#");
229 zc.binNames.push_back("G1");
230 zc.binNames.push_back("G1#");
231
232 zc.binNames.push_back("A1");// MIDI Note 33
233 zc.binNames.push_back("A1#");
234 zc.binNames.push_back("B1");
235 zc.binNames.push_back("C2");
236 zc.binNames.push_back("C2#");
237 zc.binNames.push_back("D2");
238 zc.binNames.push_back("D2#");
239 zc.binNames.push_back("E2");
240 zc.binNames.push_back("F2");
241 zc.binNames.push_back("F2#");
242 zc.binNames.push_back("G2");
243 zc.binNames.push_back("G2#");
244
245 zc.binNames.push_back("A2");// MIDI Note 45
246 zc.binNames.push_back("A2#");
247 zc.binNames.push_back("B3");
248 zc.binNames.push_back("C3");
249 zc.binNames.push_back("C3#");
250 zc.binNames.push_back("D3");
251 zc.binNames.push_back("D3#");
252 zc.binNames.push_back("E3");
253 zc.binNames.push_back("F3");
254 zc.binNames.push_back("F3#");
255 zc.binNames.push_back("G3");
256 zc.binNames.push_back("G3#");
257
258 zc.binNames.push_back("A3");// MIDI Note 57
259 zc.binNames.push_back("A3#");
260 zc.binNames.push_back("B0");
261 zc.binNames.push_back("C4");
262 zc.binNames.push_back("C4#");
263 zc.binNames.push_back("D4");
264 zc.binNames.push_back("D4#");
265 zc.binNames.push_back("E4");
266 zc.binNames.push_back("F4");
267 zc.binNames.push_back("F4#");
268 zc.binNames.push_back("G4");
269 zc.binNames.push_back("G4#");
270
271 zc.binNames.push_back("A4");// MIDI Note 69
272 zc.binNames.push_back("A4#");
273 zc.binNames.push_back("B0");
274 zc.binNames.push_back("C5");
275 zc.binNames.push_back("C5#");
276 zc.binNames.push_back("D5");
277 zc.binNames.push_back("D5#");
278 zc.binNames.push_back("E5");
279 zc.binNames.push_back("F5");
280 zc.binNames.push_back("F5#");
281 zc.binNames.push_back("G5");
282 zc.binNames.push_back("G5#");
283
284 zc.binNames.push_back("A5");// MIDI Note 85
285 zc.binNames.push_back("A5#");
286 zc.binNames.push_back("B0");
287 zc.binNames.push_back("C6");
288 zc.binNames.push_back("C6#");
289 zc.binNames.push_back("D6");
290 zc.binNames.push_back("D6#");
291 zc.binNames.push_back("E6");
292 zc.binNames.push_back("F6");
293 zc.binNames.push_back("F6#");
294 zc.binNames.push_back("G6");
295 zc.binNames.push_back("G6#");
296
297 zc.binNames.push_back("A6");// MIDI Note 93
298 zc.binNames.push_back("A6#");
299 zc.binNames.push_back("B0");
300 zc.binNames.push_back("C7");
301 zc.binNames.push_back("C7#");
302 zc.binNames.push_back("D7");
303 zc.binNames.push_back("D7#");
304 zc.binNames.push_back("E7");
305 zc.binNames.push_back("F7");
306 zc.binNames.push_back("F7#");
307 zc.binNames.push_back("G7");
308 zc.binNames.push_back("G7#");
309
310 zc.binNames.push_back("A7");// MIDI Note 105
311 zc.binNames.push_back("A7#");
312 zc.binNames.push_back("B0");
313 zc.binNames.push_back("C8");
314 }
315 */
316
317 list.push_back(zc);
318
319 /* zc.identifier = "Transcriptions";
320 zc.name = "Polyphonic Transcription";
321 zc.description = "Polyphonic Music Transcription";
322 zc.unit = "";
323 zc.hasFixedBinCount = true;
324 zc.binCount = 0;
325 zc.sampleType = OutputDescriptor::VariableSampleRate;
326 zc.sampleRate = m_inputSampleRate;
327 list.push_back(zc);*/
328
329 return list;
330 }
331
332 Transcription::FeatureSet
333 Transcription::process(const float *const *inputBuffers,
334 Vamp::RealTime timestamp)
335 {
336 if (m_stepSize == 0) {
337 cerr << "ERROR: Transcription::process: "
338 << "Transcription has not been initialised"
339 << endl;
340 return FeatureSet();
341 }
342
343 if (m_SampleN == 0) {
344 m_Base = timestamp;
345 }
346
347 if (m_Excess) return FeatureSet();
348
349 for (size_t i = 0; i < m_blockSize;i++) {
350
351 if (m_SampleN >= m_AllocN) {
352 size_t newsize = m_AllocN * 2;
353 if (newsize < 10000) newsize = 10000;
354 double *newbuf = (double *)realloc(m_SoundIn, newsize * sizeof(double));
355 if (!newbuf) {
356 m_Excess = true;
357 break;
358 }
359 m_SoundIn = newbuf;
360 m_AllocN = newsize;
361 }
362
363 m_SoundIn[m_SampleN]=inputBuffers[0][i];
364 m_SampleN=m_SampleN+1;
365 }
366
367 return FeatureSet();
368 }
369
370 Transcription::FeatureSet
371 Transcription::getRemainingFeatures()
372 {
373 FeatureSet returnFeatures;
374
375 double * OutArray;
376 double *OutArray2;
377 double *hello1;
378 double *hello2;
379 int Msec;
380 size_t i;
381 size_t j;
382 size_t n;
383 size_t count;
384
385 Msec=(int)(100*m_SampleN/m_inputSampleRate);
386
387 if (Msec < 100) return returnFeatures;
388
389 OutArray=(double *)malloc(3*3000*sizeof(double));
390 OutArray2=(double *)malloc(88*Msec*sizeof(double));
391 hello1=(double *)malloc(112*Msec*sizeof(double));
392 hello2=(double *)malloc(112*Msec*sizeof(double));
393
394 for (j = 0; j <Msec; j++) {
395
396 for(n=0;n<88;n++)
397 {
398
399 OutArray2[j*88+n]=0;
400 }
401
402 }
403
404
405 Transcribe(Msec,m_SampleN,m_SoundIn,hello1,hello2,OutArray,m_inputSampleRate);
406 int start;
407 int endd;
408
409
410 /* for (i = 0; i < 3000; i++) {
411
412 if((OutArray[3*i]>0)&&(OutArray[3*i]<88))
413 {
414 start=OutArray[3*i+1];endd=OutArray[3*i+2];
415 for(j=start;j<(start+0.05);j=j+0.01)
416 {
417
418 Feature feature;
419 Vamp::RealTime ts;
420
421 feature.hasTimestamp = true;
422
423 feature.timestamp =ts.fromSeconds(j);
424 feature.values.push_back(OutArray[3*i]+21);
425 returnFeatures[0].push_back(feature);
426
427 }
428
429
430
431 }
432 else
433 {
434
435 break;
436 }
437
438
439 }
440
441 */
442
443
444 for (i = 0; i < 3000; i++) {
445
446 if((OutArray[3*i]>0)&&(OutArray[3*i]<88))
447 {
448 start=100*OutArray[3*i+1];
449 endd=100*OutArray[3*i+2]-5;
450 for(j=start;j<endd;j++)
451 {
452 n=OutArray[3*i];
453 OutArray2[j*88+n]=OutArray[3*i];
454 }
455
456 }
457 else
458 {
459
460 break;
461 }
462
463
464 }
465
466 double starts[88];
467 for (n = 0; n < 88; ++n) starts[n] = -1.0;
468
469 int nn;
470 for (j = 0; j <Msec; j++) {
471
472
473 for(n=0;n<88;n++)
474 {
475 if(OutArray2[j*88+n]>0)
476 {
477
478 if (starts[n] < 0.)
479 {
480 starts[n] = j * 0.01;
481 }
482 }
483 else
484 {
485 if (starts[n] > 0.)
486 {
487 Feature feature;
488 feature.hasTimestamp = true;
489 feature.timestamp = m_Base + Vamp::RealTime::fromSeconds(starts[n]);
490 feature.hasDuration = true;
491 feature.duration = Vamp::RealTime::fromSeconds(j * 0.01 - starts[n]);
492 feature.values.push_back(n+20);
493 returnFeatures[0].push_back(feature);
494
495 starts[n] = -1.0;
496 }
497 }
498 }
499 }
500
501
502 for(n=0;n<88;n++)
503 {
504 if (starts[n] > 0.)
505 {
506 Feature feature;
507 feature.hasTimestamp = true;
508 feature.timestamp = m_Base + Vamp::RealTime::fromSeconds(starts[n]);
509 feature.hasDuration = true;
510 feature.duration = Vamp::RealTime::fromSeconds(j * 0.01 - starts[n]);
511 feature.values.push_back(n+20);
512 returnFeatures[0].push_back(feature);
513
514 starts[n] = -1.0;
515 }
516 }
517
518 free(OutArray2);
519 free(OutArray);
520
521 free(hello1);
522 free(hello2);
523
524 return returnFeatures;
525
526 }
527
528
529
530
531
532 void sofacomplexMex(double *y, double *z, int ncols,double StartNote,double NoteInterval1,double NoteNum,double C,double D,double SR)
533 {
534 int mseconds,i,j,el,count,count2;
535 double Snote,NoteInterval,NoteN, BasicR;
536 double *signs;
537 double *rwork,*buffer;
538 double freq,R,gain,gainI,gainII,coefI,coefM;
539 double output,input,outputI,outputM;
540 double *x;
541 double *sum,*sum2;
542 double power;
543 double temp;
544
545
546 //SR=44100;
547 Snote=StartNote;
548 NoteInterval=NoteInterval1;
549 NoteN=NoteNum;
550
551 signs=(double*)malloc((int)NoteN*5*sizeof(double));
552
553 for (i = 0; i <NoteN; i++) {
554
555 freq=exp((log(2.0))*(Snote+i*NoteInterval-69)/12)*440;
556 R=exp(-(D+C*freq*2*3.1415926)/(SR*3.1415926));
557 gain=(1*(sqrt(1+R*R-2*R*cos(2*freq*2*3.1415926/SR)))-1*R*(sqrt(1+R*R-2*R*cos(2*freq*2*3.1415926/SR))))/sin(freq*2*3.1415926/SR);
558 gainI=-2*R*cos(freq*2*3.1415926/SR);
559 gainII =R*R ;
560 coefI=cos(freq*2*3.1415926/SR);
561 coefM=sin(freq*2*3.1415926/SR);
562
563 signs[i*5+0]=gain*gain;
564 signs[i*5+1]=gainI;
565 signs[i*5+2]=gainII;
566 signs[i*5+3]=coefI;
567 signs[i*5+4]=coefM;
568
569 }
570
571 x=(double*)malloc((int)NoteN*2*sizeof(double));
572 rwork=(double*)malloc((int)NoteN*sizeof(double));
573 sum=(double*)malloc((int)NoteN*sizeof(double));
574 sum2=(double*)malloc((int)NoteN*sizeof(double));
575 mseconds=(int)(100*ncols/SR);
576 power=0;
577 for (i=0;i<mseconds*(int)(SR/100);i++)
578 {
579 power=power+y[i]*y[i];
580 }
581 power=sqrt(power);
582 for(i=0;i<NoteN*2;i++)
583 x[i]=0;
584 for (i=0;i<NoteN;i++)
585 {
586 sum[i]=0;
587 sum2[i]=0;
588 };
589 count=0;
590 count2=0;
591 for (i=0;i<(mseconds*(int)(SR/100));i++)
592 {
593 count=count+1;
594 input=y[i];
595 for(el=0;el<NoteN;el++)
596 {
597 output=(input-signs[5*el+1]*x[2*el+0]-signs[5*el+2]*x[2*el+1]);
598 outputI=output-signs[5*el+3]*x[2*el+0];
599 outputM=signs[5*el+4]*x[2*el+0];
600 sum[el]=sum[el]+signs[5*el+0]*(outputI*outputI+ outputM*outputM);
601 rwork[el]=output;
602 x[el+el+1]=x[el+el+0];
603 x[el+el+0]=rwork[el];
604
605 }
606 if(count==(int)(SR/100))
607 {
608 for(el=0;el<NoteN;el++)
609 {
610 *(z+count2*(int)NoteN+el)=1000000*(sum[el]+sum2[el])/(2*(int)(SR/100))+0.00001;
611 sum2[el]=sum[el];
612 sum[el]=0;
613 }
614 count2=count2+1;
615 count=0;
616 }
617
618 }
619 for (i=0;i<NoteN;i++)
620 {
621 sum[i]=0;
622 sum2[i]=0;
623 };
624 for (el=0;el<NoteN;el++)
625 {
626 for (i=0;i<mseconds;i++)
627 {
628 sum[el]=sum[el]+*(z+i*(int)NoteN+el);
629 }
630
631 }
632
633 free(x);
634 free(rwork);
635 free(sum);
636 free(sum2);
637 free(signs);
638
639 }
640
641 void FindMaxN( double *InputArray, int InputLen,int MaxOrder)
642 {
643 int i,j,MaxIndex = 0;
644 double MaxValue;
645 double *In2;
646
647 In2=(double*)malloc(InputLen*sizeof(double));
648 for (i=0;i<InputLen;i++)
649 {
650 In2[i]=InputArray[i];
651 InputArray[i]=0;
652 }
653 for (i=0;i<MaxOrder;i++)
654 {
655 MaxValue=0;
656 for (j=0;j<InputLen;j++)
657 {
658 if(In2[j]>MaxValue)
659 {
660 MaxValue=In2[j];
661 MaxIndex=j;
662 }
663 }
664 InputArray[MaxIndex]=In2[MaxIndex];
665 In2[MaxIndex]=0;
666 }
667
668 free(In2);
669 }
670
671 double SumF(double *InputArray,int Start, int End)
672 {
673 double Value;
674 int i;
675 Value=0;
676 for (i=Start;i<(End+1);i++)
677 {
678 Value=Value+InputArray[i];
679 }
680
681 return Value;
682
683 }
684
685 int round10(int x)
686 {
687 int I,I2;
688 I=((int)(x/10));
689 I2=x-I*10;
690
691 if(I2>5)
692 return (I+1);
693 else
694 return I;
695
696 }
697
698
699 void ConToPitch1250(double *In, int InLen)
700 {
701 int i,j,k, nn,col;
702 double *Out;
703 const int A[12]={0, 120, 190, 240, 279, 310, 337, 360, 380, 399, 415, 430};
704 Out=(double*)malloc(InLen*sizeof(double));
705
706
707 col=InLen;
708
709 for (i=0;i<col;i++)
710 {
711 Out[i]=0;
712 }
713
714 for (i=0;i<col;i++)
715 {
716 k=0;
717 nn=5;
718 for (j=0;j<nn;j++)
719 {
720 if((i+A[j])<col)
721 {
722 k=k+1;
723 Out[i]=Out[i]+In[i+A[j]];
724 }
725
726 if((i+A[j])>(col-1))
727 {
728 k=k+1;
729 Out[i]=Out[i]+In[col-1];
730 }
731 }
732 if(k>0)
733 {
734 Out[i]=Out[i]/k;
735 }
736 }
737 for (i=0;i<col;i++)
738 {
739 In[i]=Out[i];
740 }
741
742
743 free(Out);
744 }
745
746 void Norm1(double *In, int InLen)
747 {
748 double MaxValue;
749 int i;
750 double *Out;
751 Out=(double*)malloc(InLen*sizeof(double));
752
753 MaxValue=In[0];
754 for (i=1;i<InLen;i++)
755 {
756 if(In[i]>MaxValue)
757 MaxValue=In[i];
758 }
759
760 for (i=0;i<InLen;i++)
761 {
762 Out[i]=In[i]-MaxValue;
763 }
764
765 for (i=0;i<InLen;i++)
766 {
767 In[i]=Out[i];
768 }
769
770 free(Out);
771 }
772
773 void Smooth(double *In, int InLen,int smoothLen)
774 {
775 double sum;
776 int i,j,nn,n,count;
777 double *Out;
778 Out=(double*)malloc(InLen*sizeof(double));
779 nn=InLen;
780 n=(smoothLen-1)/2;
781 for (i=0;i<nn;i++)
782 {
783 sum=0;
784 count=0;
785 for (j=0;j<(n+1);j++)
786 {
787 if ((i-j)>-1)
788 {
789 sum=sum+In[i-j];
790 count=count+1;
791 }
792 }
793
794 for (j=1;j<(n+1);j++)
795 {
796 if ((i+j)<nn)
797 {
798 sum=sum+In[i+j];
799 count=count+1;
800 }
801 }
802 Out[i]=sum/count;
803 }
804 for (i=0;i<InLen;i++)
805 In[i]=Out[i];
806
807 free(Out);
808 }
809
810
811 void FindPeaks(double *In, int InLen,double *Out1,double *Out2, int db, int db2, int db3)
812 {
813 int i,lastout;
814 for (i=0;i<InLen;i++)
815 {
816 Out1[i]=0;
817 Out2[1]=0;
818 }
819
820 for (i=20;i<(InLen-20-1);i++)
821 {
822 if( /**/ ((In[i]>(db2+In[i-6]))||(In[i]>(db2+In[i+6]))
823 ||(In[i]>(db3+In[i+20]))||(In[i]>(db3+In[i-20])))
824 /*&&(In[i]>db)*/&&(In[i]>In[i+3])&&(In[i]>In[i-3])
825 &&(In[i]>In[i+2])&&(In[i]>In[i-2])
826 &&(In[i]>In[i+1])&&(In[i]>In[i-1]))
827 {
828 Out1[i]=In[i];
829 Out2[i]=1;
830 }
831
832 }
833
834 lastout=1;
835 for(i=0;i<InLen;i++)
836 {
837
838 if(Out2[i]==1)
839 {
840 if((i-lastout)<5)
841 {
842 if(Out1[i]>Out1[lastout])
843 {
844 Out2[lastout]=0;
845 Out1[lastout]=0;
846 lastout=i;
847 }
848 else
849 {
850 Out2[i]=0;
851 Out1[i]=0;
852 }
853
854 }
855 else
856 {
857 lastout=i;
858 }
859 }
860
861 }
862
863 }
864
865
866 void ConFrom1050To960(double *In, double *out, int InputLen)
867 {
868 int i,j;
869
870 for(i=0;i<960;i++)
871 {
872 for (j=0;j<InputLen;j++)
873 {
874 out[i+j*960]=In[i+j*1050];
875
876 }
877 }
878
879
880 }
881
882 void Move( double *InputArray, int InputLen,int m)
883 {
884 int i;
885 double *OutArray;
886
887 OutArray=(double *)malloc(InputLen*sizeof(double));
888 for (i=0;i<InputLen;i++)
889 OutArray[i]=0;
890
891 for (i=0;i<InputLen;i++)
892 { if(((i+m)>-1)&&((i+m)<InputLen))
893 OutArray[i+m]=InputArray[i];
894 }
895
896 for (i=0;i<InputLen;i++)
897 {
898 InputArray[i]=OutArray[i];
899 }
900
901 free(OutArray);
902 }
903
904
905 double SumArray( double *InputArray, int InputHLen, int InputVLen)
906 {
907 int i;
908 int j;
909 double sum;
910 int count;
911 count=0;
912 sum=0;
913 for (j=0;j<InputHLen;j++)
914 {
915 for (i=0;i<InputVLen;i++)
916 {
917 count=count+1;
918 sum=sum+InputArray[i+j*InputVLen];
919
920 }
921 }
922 return sum;
923 }
924
925 double Sum( double *InputArray, int InputHLen)
926 {
927 int i;
928 double sum;
929 int count;
930 count=0;
931 sum=0;
932 for (i=0;i<InputHLen;i++)
933 {
934 count=count+1;
935 sum=sum+InputArray[i];
936
937 }
938 return sum;
939 }
940
941 void MeanV2( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
942 {
943 int i;
944 int j;
945 double sum;
946 for (i=0;i<InputVLen;i++)
947 {
948 sum=0;
949 for (j=0;j<InputHLen;j++)
950 {
951
952 sum=sum+InputArray[i+j*InputVLen];
953
954 }
955 OutArray[i]=sum/InputHLen;
956 }
957
958 }
959
960 void SumV( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
961 {
962 int i;
963 int j;
964 double sum;
965
966 for (j=0;j<InputHLen;j++)
967 {
968 sum=0;
969 for (i=0;i<InputVLen;i++)
970 {
971
972 sum=sum+InputArray[i+j*InputVLen];
973
974 }
975 OutArray[j]=sum;
976 }
977
978 }
979
980
981
982 void SumV2( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
983 {
984 int i;
985 int j;
986 double sum;
987 for (i=0;i<InputVLen;i++)
988 {
989 sum=0;
990 for (j=0;j<InputHLen;j++)
991 {
992
993 sum=sum+InputArray[i+j*InputVLen];
994
995 }
996 OutArray[i]=sum;
997 }
998
999 }
1000
1001 void MaxV( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
1002 {
1003 int i;
1004 int j;
1005 double MaxVal;
1006
1007 for (j=0;j<InputHLen;j++)
1008 {
1009 MaxVal=InputArray[j*InputVLen];
1010 for (i=0;i<InputVLen;i++)
1011 {
1012 if(InputArray[i+j*InputVLen]>MaxVal)
1013 {
1014 MaxVal=InputArray[i+j*InputVLen];
1015 }
1016
1017 }
1018 OutArray[j]=MaxVal;
1019 }
1020
1021 }
1022
1023 void MaxV2( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
1024 {
1025 int i;
1026 int j;
1027 double MaxVal;
1028 for (i=0;i<InputVLen;i++)
1029 {
1030 MaxVal=InputArray[i];
1031 for (j=0;j<InputHLen;j++)
1032 {
1033 if(InputArray[i+j*InputVLen]>MaxVal)
1034 {
1035 MaxVal=InputArray[i+j*InputVLen];
1036 }
1037
1038 }
1039 OutArray[i]=MaxVal;
1040 }
1041
1042 }
1043
1044
1045
1046 void MinArray( double *InputArray, int InputHLen, int InputVLen, double MinValue)
1047 {
1048 int i;
1049 int j;
1050
1051 for (i=0;i<InputVLen;i++)
1052 {
1053 for (j=0;j<InputHLen;j++)
1054 {
1055 if(InputArray[i+j*InputVLen]<MinValue)
1056 InputArray[i+j*InputVLen]=MinValue;
1057
1058 }
1059
1060 }
1061
1062 }
1063
1064
1065 void MaxArray( double *InputArray, int InputHLen, int InputVLen, double MaxValue)
1066 {
1067 int i;
1068 int j;
1069
1070 for (i=0;i<InputVLen;i++)
1071 {
1072 for (j=0;j<InputHLen;j++)
1073 {
1074 if(InputArray[i+j*InputVLen]>MaxValue)
1075 InputArray[i+j*InputVLen]=MaxValue;
1076
1077 }
1078
1079 }
1080
1081 }
1082
1083 double GetMaxValue( double *InputArray, int InputHLen, int InputVLen)
1084 {
1085 int i;
1086 int j;
1087
1088 double MaxValue;
1089 MaxValue=InputArray[0];
1090 for (i=0;i<InputVLen;i++)
1091 {
1092 for (j=0;j<InputHLen;j++)
1093 {
1094 if(InputArray[i*InputHLen+j]>MaxValue)
1095 MaxValue=InputArray[i*InputHLen+j];
1096
1097 }
1098
1099 }
1100
1101 return MaxValue;
1102 }
1103
1104 void RemoveNoise( double *InputArray, int InputHLen, int InputVLen)
1105 {
1106 int i;
1107 int j;
1108
1109 for (i=0;i<InputVLen;i++)
1110 {
1111 for (j=0;j<InputHLen;j++)
1112 {
1113
1114 InputArray[i+j*InputVLen]=InputArray[i+j*InputVLen]-EualCurve960[i];
1115
1116 }
1117
1118 }
1119
1120 }
1121 double MeanArray( double *InputArray, int InputHLen, int InputVLen)
1122 {
1123 int i;
1124 int j;
1125 double sum;
1126 int count;
1127 count=0;
1128 sum=0;
1129 for (j=0;j<InputHLen;j++)
1130 {
1131 for (i=0;i<InputVLen;i++)
1132 {
1133 count=count+1;
1134 sum=sum+InputArray[i+j*InputVLen];
1135
1136 }
1137 }
1138 return sum/count;
1139 }
1140 void Mydiff( double *InputArray, int InputHLen, int InputVLen,int n)
1141 {
1142 int i;
1143 int j;
1144 double * OutArray;
1145
1146 OutArray=(double*)malloc(InputHLen*InputVLen*sizeof(double));
1147
1148 for (i=0;i<InputVLen;i++)
1149 {
1150 for (j=n;j<InputHLen;j++)
1151 {
1152 OutArray[i+j*InputVLen]=InputArray[i+j*InputVLen]-InputArray[i+(j-n)*InputVLen];
1153
1154 }
1155 }
1156
1157 for (i=0;i<InputVLen;i++)
1158 {
1159 for (j=n;j<InputHLen;j++)
1160 {
1161 InputArray[i+j*InputVLen]=OutArray[i+j*InputVLen];
1162
1163 }
1164 }
1165
1166 for (i=0;i<InputVLen;i++)
1167 {
1168 for (j=0;j<n;j++)
1169 {
1170 InputArray[i+j*InputVLen]=0;
1171
1172 }
1173 }
1174
1175 free(OutArray);
1176 }
1177
1178 void PeakDetect(double *In, int InLen)
1179 {
1180 int i,j;
1181 double *Out1;
1182
1183 Out1=(double*)malloc(InLen*sizeof(double));
1184 for (i=0;i<InLen;i++)
1185 {
1186 Out1[i]=0;
1187 }
1188
1189
1190
1191 for (i=2;i<(InLen-3);i++)
1192 {
1193 if( (In[i]>In[i+2])&&(In[i]>In[i-2])
1194 &&(In[i]>In[i+1])&&(In[i]>In[i-1]))
1195 {
1196 Out1[i]=In[i];
1197 }
1198
1199 }
1200
1201 for(i=0;i<InLen;i++)
1202 {
1203
1204 In[i]=Out1[i];
1205 }
1206
1207 free(Out1);
1208 }
1209 void MeanV( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
1210 {
1211 int i;
1212 int j;
1213 double sum;
1214
1215 for (j=0;j<InputHLen;j++)
1216 {
1217 sum=0;
1218 for (i=0;i<InputVLen;i++)
1219 {
1220
1221 sum=sum+InputArray[i+j*InputVLen];
1222
1223 }
1224 OutArray[j]=sum/InputVLen;
1225 }
1226
1227 }
1228 void Edetect(double *InputArray, int InputHLen, int InputVLen, double MinT, double db1,double *OutOne)
1229 {
1230 int i;
1231 int j;
1232 double MaxValue;
1233
1234 // printf(" Starting Energy Onset Detection.. %f\n",db1);
1235 RemoveNoise(InputArray, InputHLen, InputVLen);
1236
1237
1238 MaxValue=GetMaxValue(InputArray,InputHLen,InputVLen);
1239
1240 for (i=0;i<InputVLen;i++)
1241 {
1242 for (j=0;j<InputHLen;j++)
1243 {
1244 InputArray[i*InputHLen+j]=InputArray[i*InputHLen+j]-MaxValue;
1245
1246 }
1247
1248 }
1249
1250 MinArray(InputArray, InputHLen, InputVLen, -100);
1251 Mydiff(InputArray, InputHLen, InputVLen,3);
1252 MinArray(InputArray, InputHLen, InputVLen, MinT);
1253
1254 for (i=0;i<InputVLen;i++)
1255 {
1256 for (j=0;j<InputHLen;j++)
1257 {
1258 InputArray[i*InputHLen+j]=InputArray[i*InputHLen+j]-MinT;
1259
1260 }
1261
1262 }
1263
1264 MeanV(InputArray,InputHLen,InputVLen,OutOne);
1265 Smooth(OutOne, InputHLen,3);
1266 Smooth(OutOne, InputHLen,3);
1267 Move(OutOne,InputHLen,-2);
1268 PeakDetect(OutOne,InputHLen);
1269 MinArray(OutOne, InputHLen,1, db1);
1270
1271 for (j=0;j<InputHLen;j++)
1272 {
1273 OutOne[j]=OutOne[j]-db1;
1274
1275 }
1276 }
1277
1278
1279
1280 void OnsetDetection2(double *In,int InputLen,double *OutOne,double a,double b)
1281 {
1282 int mseconds;
1283 double *Input;
1284
1285
1286 mseconds=InputLen;
1287
1288 Input=(double *)malloc(mseconds*960*sizeof(double));
1289
1290 ConFrom1050To960(In,Input,InputLen);
1291
1292
1293
1294
1295 if(a>0)
1296 {
1297 Edetect(Input,mseconds,960, a,b,OutOne);
1298 }
1299
1300
1301 free(Input);
1302
1303 }
1304
1305 void PitchEstimation(double *In, int InLen, double *OutArray,double *OutArray2)
1306 {
1307 double *xx,*x,*y,*y1,*PeakPitch1, *PeakPitch2,*PeakInput1, *PeakInput2;
1308 double *out,*outValue;
1309 double *output,*output1;
1310 double notefloat,hh0,hh1,hh28;
1311 double outM12[12];
1312 int *outc;
1313 int *yI;
1314 double temp;
1315 int i,j,sumI;
1316 int Len;
1317 int NN,NN2;
1318 int count;
1319 double Th;
1320
1321 Len=1050;
1322 xx=(double*)malloc(Len*sizeof(double));
1323 x=(double*)malloc(Len*sizeof(double));
1324 y=(double*)malloc(Len*sizeof(double));
1325 y1=(double*)malloc(Len*sizeof(double));
1326 PeakPitch1=(double*)malloc(Len*sizeof(double));
1327 PeakPitch2=(double*)malloc(Len*sizeof(double));
1328 PeakInput1=(double*)malloc(Len*sizeof(double));
1329 PeakInput2=(double*)malloc(Len*sizeof(double));
1330 out=(double*)malloc(Len*sizeof(double));
1331 outValue=(double*)malloc(Len*sizeof(double));
1332 output=(double*)malloc(112*sizeof(double));
1333 output1=(double*)malloc(112*sizeof(double));
1334 outc=(int*)malloc(112*sizeof(int));
1335 // yI=(double*)malloc(12*sizeof(double));
1336
1337
1338 for (i=0;i<Len;i++)
1339 {
1340 x[i]=In[i];
1341 }
1342
1343 for (i=0;i<Len;i++)
1344 {
1345 y1[i]=x[i];
1346 }
1347
1348 ConToPitch1250(y1,Len);
1349
1350 for (i=0;i<Len;i++)
1351 {
1352 y[i]=y1[i];
1353 }
1354
1355 Smooth(y,Len,30);
1356
1357 for (i=0;i<Len;i++)
1358 {
1359 y1[i]=y1[i]-y[i];
1360 }
1361
1362 for (i=0;i<Len;i++)
1363 {
1364 y1[i]=y1[i]+20;
1365 }
1366
1367 temp=0;
1368 for (i=0;i<Len;i++)
1369 {
1370 temp=temp+x[i];
1371 }
1372 temp=temp/Len;
1373 for (i=0;i<Len;i++)
1374 {
1375 y[i]=x[i]-temp;
1376 }
1377
1378
1379 for (i=0;i<Len;i++)
1380 {
1381 PeakPitch2[i]=0;
1382 PeakPitch1[i]=0;
1383 PeakInput1[i]=0;
1384 PeakInput2[i]=0;
1385 }
1386 FindPeaks(y1, Len,PeakPitch1,PeakPitch2, 0, -1000, -1000);
1387 FindPeaks(y, Len,PeakInput1,PeakInput2, 0, 6, 15);
1388
1389
1390
1391 sumI=0;
1392 for (i=0;i<Len;i++)
1393 {
1394 sumI=sumI+PeakPitch2[i];
1395 }
1396
1397
1398 if (sumI>12)
1399 {
1400 FindMaxN(PeakPitch1,Len,12);
1401
1402 for (i=0;i<Len;i++)
1403 {
1404 if(PeakPitch1[i]==0)
1405 {
1406 PeakPitch2[i]=0;
1407 }
1408 }
1409
1410 }
1411
1412 for (i=0;i<Len;i++)
1413 {
1414 out[i]=0;
1415 outValue[i]=0;
1416 }
1417
1418 for (i=0;i<(Len-300);i++)
1419 {
1420 if(PeakPitch2[i]==1)
1421
1422 {
1423 if (
1424 ((SumF(PeakInput2,i-4,i+4)>0)&&(SumF(PeakInput2,i+120-4,i+120+4)>0))
1425 ||((SumF(PeakInput2,i-4,i+4)>0)&&(SumF(PeakInput2,i+190-4,i+190+4)>0))
1426 ||((SumF(PeakInput2,i+190-4,i+190+4)>0)&&(SumF(PeakInput2,i+120-4,i+120+4)>0))
1427 )
1428 {
1429 out[i]=1;
1430 outValue[i]=y1[i];
1431
1432 }
1433 }
1434 }
1435
1436 for (i=0;i<112;i++)
1437 {
1438 output[i]=0;
1439 outc[i]=0;
1440 }
1441
1442
1443
1444 for (i=0;i<Len;i++)
1445 {
1446 if(out[i]==1)
1447 {
1448 output[20+round10(i+1)-1]=1;
1449 outc[20+round10(i+1)-1]=i;
1450 }
1451 }
1452
1453
1454 for (i=0;i<112;i++)
1455 {
1456 output1[i]=output[i];
1457 }
1458
1459
1460
1461 for (i=20;i<(112-28);i++)
1462 {
1463 if((output[i]>0)&&(SumF(PeakInput2,outc[i]-5,outc[i]+5)==0))
1464 {
1465 output1[i]=0;
1466 }
1467 }
1468
1469
1470 for (i=0;i<112;i++)
1471 {
1472 OutArray[i]=0;
1473 OutArray2[i]=0;
1474
1475 }
1476
1477 Th=30;
1478 for(i=20;i<105;i++)
1479 {
1480 if(output1[i]==1)
1481 {
1482 OutArray[i]=outc[i]+200+2;
1483 OutArray2[i]=y[outc[i]];
1484
1485 }
1486
1487 }
1488
1489 free(xx); // xx=(double*)malloc(Len*sizeof(double));
1490 free(x); // x=(double*)malloc(Len*sizeof(double));
1491 free(y); // y=(double*)malloc(Len*sizeof(double));
1492 free(y1); // y1=(double*)malloc(Len*sizeof(double));
1493 free(PeakPitch1); //=(double*)malloc(Len*sizeof(double));
1494 free(PeakPitch2); //=(double*)malloc(Len*sizeof(double));
1495 free(PeakInput1); //=(double*)malloc(Len*sizeof(double));
1496 free(PeakInput2); //=(double*)malloc(Len*sizeof(double));
1497 free(out); //=(double*)malloc(Len*sizeof(double));
1498 free(outValue); //=(double*)malloc(Len*sizeof(double));
1499 free(output); //=(double*)malloc(112*sizeof(double));
1500 free(output1); //=(double*)malloc(112*sizeof(double));
1501 free(outc); //=(double*)malloc(112*sizeof(int));
1502 //free(yI); //=(double*)malloc(12*sizeof(int));
1503 // printf(" end free \n");
1504 }
1505
1506 void DoMultiPitch(double *In, int RLen,int CLen, double *Out1, double *Out2)
1507 {
1508
1509 int i, j;
1510 double *sum1,*mean1;
1511 double MaxV;
1512 double *OutArray1, *OutArray2,*tempArray;
1513
1514 OutArray1=(double *)malloc(112*sizeof(double));
1515 OutArray2=(double *)malloc(112*sizeof(double));
1516 tempArray=(double *)malloc(RLen*sizeof(double));
1517
1518 sum1=(double*)malloc(CLen*sizeof(double));
1519 mean1=(double*)malloc(CLen*sizeof(double));
1520
1521 for (j=0;j<CLen;j++)
1522 {
1523 sum1[j]=0;
1524 for (i=0;i<RLen;i++)
1525 {
1526 sum1[j]=sum1[j]+In[j*RLen+i];
1527 }
1528
1529 mean1[j]=sum1[j]/CLen;
1530 }
1531 MaxV=mean1[0];
1532 for (j=0;j<CLen;j++)
1533 {
1534 if(mean1[j]>MaxV)
1535 {
1536 MaxV=mean1[j];
1537 }
1538 }
1539
1540 for (j=0;j<CLen;j++)
1541 {
1542 mean1[j]=mean1[j]-MaxV;
1543 }
1544
1545
1546 for (j=0;j<CLen;j++)
1547 {
1548
1549 for (i=0;i<112;i++)
1550 {
1551
1552 OutArray1[i]=0;
1553 OutArray2[i]=0;;
1554
1555 }
1556 MaxV=In[j*RLen];
1557 for(i=0;i<RLen;i++)
1558 {
1559 tempArray[i]=In[j*RLen+i];
1560 if(tempArray[i]>MaxV)
1561 MaxV=tempArray[i];
1562 }
1563
1564 if(mean1[j]>-55)
1565 {
1566
1567 PitchEstimation(tempArray,RLen,OutArray1,OutArray2);
1568
1569 for(i=0;i<112;i++)
1570 {
1571 if(OutArray1[i]>0)
1572 {
1573 if((MaxV-tempArray[(int)OutArray1[i]-201-1])>40)
1574 {
1575 OutArray1[i]=0;
1576 OutArray2[i]=0;
1577 }
1578
1579 }
1580 }
1581
1582 }
1583
1584 for (i=0;i<112;i++)
1585 {
1586
1587 Out1[j*112+i]=OutArray1[i];
1588 Out2[j*112+i]=OutArray2[i];
1589
1590 }
1591
1592 }
1593
1594 free(OutArray1);
1595 free(OutArray2);
1596 free(tempArray);
1597 free(sum1);
1598 free(mean1);
1599 }
1600
1601
1602 int OnsetToArray(double *In, int Len, double *OutStart,double *OutEnd)
1603 {
1604 int count,i;
1605
1606 count=0;
1607
1608 for (i=0;i<Len;i++)
1609 {
1610 if(In[i]>0)
1611 {
1612 OutStart[count]=i+1;
1613 if(count>0)
1614 {
1615 OutEnd[count-1]=i+1;
1616 }
1617 count=count+1;
1618 }
1619 }
1620 if (count>0)
1621 {
1622 OutEnd[count-1]=Len;
1623 }
1624 return count;
1625
1626 }
1627 void dbfunction( double *InputArray, int InputHLen, int InputVLen,double *OutArray)
1628 {
1629 int i;
1630 int j;
1631 double temp;
1632
1633 for (i=0;i<InputVLen;i++)
1634 {
1635 for (j=0;j<InputHLen;j++)
1636 {
1637 OutArray[i*InputHLen+j]=20*log10(InputArray[i*InputHLen+j]);
1638
1639 }
1640
1641 }
1642 }
1643
1644 void Transcribe(int Len,int inputLen,double *SoundIn,double *out,double *outArray2,double *outArray3,double SampleRate)
1645 {
1646 int OnsetN;
1647 int i,j,k;
1648 int count;
1649 int index;
1650 double *OutStart,*OutEnd;
1651 int start,endd,startb=1,start2,endd2;
1652 double *A1,*A2,*A3,*A4,*A5,*A6,*D,*D2;
1653 double *A6A;
1654 double *out2, *PitchOut1,*PitchOut2,*PitchOut3;
1655 double sum,maxV,maxVal;
1656 double *tempArray;
1657 double temp;
1658 double p;
1659 double M1,M2;
1660 double *In;
1661 int Len2;
1662 double *dbs,*ss,*dbs1,*jj;
1663 int TempInt;
1664
1665
1666 A1=(double *)malloc(112*sizeof(double));
1667 A2=(double *)malloc(112*sizeof(double));
1668 A3=(double *)malloc(112*sizeof(double));
1669 A4=(double *)malloc(112*sizeof(double));
1670 A5=(double *)malloc(112*sizeof(double));
1671 A6=(double *)malloc(112*sizeof(double));
1672 D=(double *)malloc(112*sizeof(double));
1673 D2=(double *)malloc(112*sizeof(double));
1674 PitchOut1=(double *)malloc(112*Len*sizeof(double));
1675 PitchOut2=(double *)malloc(112*Len*sizeof(double));
1676 PitchOut3=(double *)malloc(112*Len*sizeof(double));
1677 OutStart=(double *)malloc(Len*sizeof(double));
1678 OutEnd=(double *)malloc(Len*sizeof(double));
1679 tempArray=(double *)malloc(sizeof(double)*Len);
1680 In=(double *)malloc(sizeof(double)*Len);
1681 dbs=(double *)malloc(1050*sizeof(double)*Len);
1682 dbs1=(double *)malloc(210*sizeof(double)*Len);
1683 ss=(double *)malloc(210*sizeof(double)*Len);
1684 jj=(double *)malloc(1050*sizeof(double));
1685
1686
1687
1688
1689 for(k=0;k<1050;k++)
1690 {
1691
1692 jj[k]=k/5.0;
1693
1694 }
1695
1696 sofacomplexMex(SoundIn,ss,inputLen,20,0.5,210,0.03,20,SampleRate);
1697 dbfunction(ss, Len, 210,dbs1);
1698
1699 for(i=0;i<Len;i++)
1700 {
1701 for(k=0;k<1045;k++)
1702 {
1703 TempInt=(int)jj[k];
1704 dbs[k+i*1050]=(jj[k]-TempInt)*dbs1[TempInt+1+i*210]+(TempInt+1-jj[k])*dbs1[TempInt+i*210];
1705
1706 }
1707
1708 for (k=1045;k<1050;k++)
1709 {
1710 dbs[k+i*1050]=dbs[1044+i*1050];
1711 }
1712
1713 }
1714
1715 OnsetDetection2(dbs,Len,In,3,1.2);
1716 for (i=0;i<Len;i++)
1717 {
1718 outArray2[i]=In[i];
1719
1720 }
1721
1722 OnsetN=0;
1723 count=0;
1724 for (i=0;i<Len;i++)
1725 {
1726 if(In[i]>0)
1727 {
1728 OnsetN=OnsetN+1;
1729 count=count+1;
1730 }
1731 }
1732 Len2=count;
1733 out2=(double *)malloc(112*Len2*sizeof(double));
1734 A6A=(double *)malloc(112*Len2*sizeof(double));
1735 OnsetToArray(In,Len,OutStart,OutEnd);
1736 DoMultiPitch(dbs,1050,Len, PitchOut1, PitchOut2);
1737
1738
1739 for (i=0;i<Len;i++)
1740 {
1741 for (j=0;j<112;j++)
1742 {
1743 PitchOut3[i*112+j]=PitchOut1[i*112+j];
1744 if(PitchOut3[i*112+j]>1)
1745 PitchOut3[i*112+j]=1;
1746 }
1747
1748 }
1749
1750
1751 for (i=0;i<OnsetN;i++)
1752 {
1753 for(j=0;j<112;j++)
1754 {
1755 A1[j]=0;A2[j]=0;A3[j]=0;A4[j]=0;A5[j]=0;A6[j]=0;
1756
1757 }
1758 maxV=0;
1759 start=(int)OutStart[i];
1760 endd=(int)OutEnd[i];
1761 if(i>0)
1762 {
1763 startb=(int)OutStart[i-1];
1764 }
1765
1766 for (j=0;j<112;j++)
1767 {
1768 sum=0;
1769 count=0;
1770 for (k=(start-1);k<endd;k++)
1771 {
1772 sum=sum+PitchOut3[k*112+j];
1773 count=count+1;
1774 }
1775
1776 A1[j]=sum;
1777 A6[j]=sum/count;
1778 A6A[i*112+j]=sum/count;
1779
1780 }
1781
1782 for (j=0;j<112;j++)
1783 {
1784 maxVal=PitchOut2[start*112+j];
1785 for (k=(start-1);k<endd;k++)
1786 {
1787 if(PitchOut2[k*112+j]>maxVal)
1788 {
1789 maxVal=PitchOut2[k*112+j];
1790 }
1791
1792 }
1793
1794 A3[j]=maxVal;
1795
1796 }
1797
1798 for (j=0;j<112;j++)
1799 {
1800 sum=0;
1801 count=0;
1802 for (k=(start-1);k<endd;k++)
1803 {
1804 if(PitchOut2[k*112+j]>0)
1805 {
1806 sum=sum+PitchOut2[k*112+j];
1807 count=count+1;
1808 }
1809 }
1810 if(count>0)
1811 A4[j]=sum/count;
1812 else
1813 A4[j]=0;
1814 }
1815
1816
1817 for (j=0;j<112;j++)
1818 {
1819 sum=0;
1820 count=0;
1821 for (k=(start-1);k<endd;k++)
1822 {
1823 if(PitchOut1[k*112+j]>0)
1824 {
1825 sum=sum+PitchOut1[k*112+j];
1826 count=count+1;
1827 }
1828 }
1829 if(count>0)
1830 A5[j]=sum/count;
1831 else
1832 A5[j]=0;
1833 }
1834
1835 maxV=A3[0];
1836 for (j=0;j<112;j++)
1837 {
1838 if(A3[j]>maxV)
1839 maxV=A3[j];
1840 }
1841
1842 for (j=0;j<112;j++)
1843 {
1844
1845 if(A1[j]>0)
1846 {
1847 D[j]=A1[j];D2[j]=A1[j];
1848 }
1849
1850 else
1851 {
1852 D[j]=A1[j];D2[j]=A1[j];
1853 }
1854 }
1855
1856 for (j=0;j<112;j++)
1857 {
1858 if(A1[j]<8)
1859 {
1860 D[j]=0;D2[j]=0;
1861 }
1862
1863 }
1864
1865 for(j=0;j<112;j++)
1866 {
1867
1868 if ((j>12)&&(D[j]>0)&&(D[j-12]>0))
1869 {
1870 D[j]=0; D2[j]=0;
1871 if((A3[j]>45)&&(A3[j]>(A3[j-12]+3)))
1872 {
1873 D[j]=1;
1874 }
1875 }
1876
1877
1878 if ((j>19)&&(D[j]>0)&&(D[j-19]>0))
1879 {
1880
1881 D[j]=0; D2[j]=0;
1882 if((A3[j]>50))
1883 {
1884 D[j]=1;
1885 }
1886 }
1887
1888 if ((j>24)&&(D[j]>0)&&(D[j-24]>0))
1889 {
1890
1891 D[j]=0; D2[j]=0;
1892 if((A3[j]>50))
1893 {
1894 D[j]=1;
1895 }
1896 }
1897
1898 if ((j>28)&&(D[j]>0)&&(D[j-28]>0))
1899 {
1900
1901 D[j]=0; D2[j]=0;
1902 if((A3[j]>50))
1903 {
1904 D[j]=1;
1905 }
1906 }
1907
1908 if ((j>34)&&(abs(A5[j]-337.0-A5[j-34])<3.0)&&(D[j]>0)&&(D[j-34]>0))
1909 {
1910
1911 D[j]=0; D2[j]=0;
1912 if((A4[j]>25)&&(A3[j]>40)&&(A3[j]>(A3[j-34]-3))&&((A1[j]>8)||(A6[j]>0.8)))
1913 {
1914 D[j]=1;
1915 }
1916 }
1917
1918 if((j>48)&&(j<59)&&(A3[j]<20))
1919 {
1920 D[j]=0;
1921 }
1922
1923 if((j>58)&&(j<69)&&(A3[j]<28))
1924 {
1925 D[j]=0;
1926 }
1927
1928
1929 if((j>68)&&(j<79)&&(A3[j]<40))
1930 {
1931 D[j]=0;
1932 }
1933
1934 if((j>78)&&(A3[j]<50))
1935 {
1936 D[j]=0;
1937 }
1938
1939 if((j>85)&&(A3[j]<55))
1940 {
1941 D[j]=0;
1942 }
1943
1944 if((D2[j]>0)&&(A1[j]>15))
1945 {
1946 D[j]=1;
1947 }
1948 if(i>1)
1949 {
1950
1951 for (k=(startb-1);k<start;k++)
1952 {
1953 tempArray[k-startb+1]=PitchOut3[j+k*112];
1954
1955 }
1956 temp=Sum(tempArray,start-startb+1);
1957 if(((maxV-A3[j])>20)&&(temp>3))
1958 {
1959 D[j]=0;
1960 }
1961
1962 }
1963
1964 }
1965
1966 for(j=0;j<112;j++)
1967 {
1968 out[j+i*112]=D[j];
1969 out2[j+i*112]=D[j];
1970 }
1971 }
1972
1973 for (i=1;i<OnsetN;i++)
1974 {
1975 start2=(int)OutStart[i];
1976 endd2=(int)OutEnd[i];
1977
1978 for (j=0;j<112;j++)
1979 {
1980 sum=0;
1981 count=0;
1982 for (k=(start2-1);k<endd2;k++)
1983 {
1984 sum=sum+PitchOut3[k*112+j];
1985 count=count+1;
1986 }
1987
1988 A1[j]=sum;
1989 }
1990
1991 for (j=0;j<112;j++)
1992 {
1993 if((out2[(i-1)*112+j]>0)&&(out[j+i*112]>0))
1994 {
1995 out[j+i*112]=0;
1996 sum=0;
1997 for(k=(start2-1);k<endd2;k++)
1998 {
1999 sum=sum+PitchOut1[j+k*112];
2000
2001 }
2002 p=sum/A1[j];
2003
2004 index=(int)(p+0.5)-200;
2005
2006 if((index>0)&&(i<(OnsetN-1))&&(start2>5))
2007 {
2008
2009 M1=dbs[index+(start2-1)*1050];
2010 for (k=(start2-1);k<(start2+10);k++)
2011 {
2012 if(dbs[index+k*1050]>M1)
2013 M1=dbs[index+k*1050];
2014
2015 }
2016
2017 M2=dbs[index+(start2-5-1)*1050];
2018 for (k=(start2-5-1);k<start2;k++)
2019 {
2020 if(dbs[index+k*1050]<M2)
2021 M2=dbs[index+k*1050];
2022
2023 }
2024
2025 if((M1-M2)>10)
2026 {
2027 out[j+i*112]=1;
2028 }
2029 }
2030 }
2031 }
2032 }
2033
2034 count=0;
2035 for (i=0;i<OnsetN;i++)
2036 {
2037
2038 start=(int)OutStart[i];
2039 endd=(int)OutEnd[i];
2040
2041 for(j=0;j<112;j++)
2042 {
2043 if(out[j+i*112]>0)
2044 {
2045 outArray3[count*3+0]=j+1-21;//exp((log(2.0))*(j+1-69)/12)*440;
2046 outArray3[count*3+1]=start*0.01;
2047
2048 if(i==(OnsetN-1))
2049 {
2050 outArray3[count*3+2]=0.01*OutEnd[i];
2051 }
2052 else
2053 {
2054
2055 for(k=(i+1);k<OnsetN;k++)
2056 {
2057
2058 if(k==(OnsetN-1))
2059 {
2060 outArray3[count*3+2]=0.01*OutEnd[k];
2061 }
2062
2063 if(out[j+k*112]>0)
2064 {
2065 outArray3[count*3+2]=0.01*OutStart[k];
2066 break;
2067 }
2068
2069 if(A6A[k*112+j]<0.5)
2070 {
2071 outArray3[count*3+2]=0.01*OutStart[k];
2072 break;
2073
2074 }
2075
2076 }
2077
2078 }
2079
2080 count=count+1;
2081 }
2082
2083 }
2084
2085 }
2086 outArray3[count*3+0]=0;
2087 outArray3[count*3+1]=0;
2088 outArray3[count*3+2]=0;
2089
2090 free(tempArray);
2091 free(OutStart);
2092 free(OutEnd);
2093 free(A1);
2094 free(A2);
2095 free(A3);
2096 free(A4);
2097 free(A5);
2098 free(A6);
2099 free(A6A);
2100 free(D);
2101 free(D2);
2102 free(out2);
2103 free(PitchOut1);
2104 free(PitchOut2);
2105 free(PitchOut3);
2106 free(In);
2107 free(dbs);
2108 free(dbs1);
2109 free(ss);
2110 free(jj);
2111 }
2112