Mercurial > hg > qm-vamp-plugins
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 |