c@120
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
c@120
|
2
|
c@120
|
3 /*
|
c@120
|
4 QM Vamp Plugin Set
|
c@120
|
5
|
c@120
|
6 Centre for Digital Music, Queen Mary, University of London.
|
c@135
|
7
|
c@135
|
8 This program is free software; you can redistribute it and/or
|
c@135
|
9 modify it under the terms of the GNU General Public License as
|
c@135
|
10 published by the Free Software Foundation; either version 2 of the
|
c@135
|
11 License, or (at your option) any later version. See the file
|
c@135
|
12 COPYING included with this distribution for more information.
|
c@120
|
13 */
|
c@120
|
14
|
c@120
|
15 /*transcription vamp plugin: Ruohua Zhou, Josh Reiss, josh.reiss@elec.qmul.ac.uk */
|
c@120
|
16
|
c@120
|
17 #include "Transcription.h"
|
c@120
|
18 #include <vamp-sdk/PluginAdapter.h>
|
c@120
|
19 #include <math.h>
|
c@120
|
20 #include <stdlib.h>
|
c@190
|
21 #include <algorithm>
|
c@120
|
22
|
c@120
|
23 using std::string;
|
c@120
|
24 using std::vector;
|
c@120
|
25 using std::cerr;
|
c@120
|
26 using std::endl;
|
c@120
|
27
|
c@120
|
28 const double EualCurve960[960] = {
|
c@120
|
29 83.750025,83.532690,83.315770,83.099260,82.883159,82.667463,82.452170,82.237276,82.022779,81.808675,
|
c@120
|
30 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,
|
c@120
|
31 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,
|
c@120
|
32 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,
|
c@120
|
33 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,
|
c@120
|
34 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,
|
c@120
|
35 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,
|
c@120
|
36 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,
|
c@120
|
37 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,
|
c@120
|
38 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,
|
c@120
|
39 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,
|
c@120
|
40 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,
|
c@120
|
41 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,
|
c@120
|
42 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,
|
c@120
|
43 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,
|
c@120
|
44 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,
|
c@120
|
45 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,
|
c@120
|
46 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,
|
c@120
|
47 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,
|
c@120
|
48 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,
|
c@120
|
49 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,
|
c@120
|
50 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,
|
c@120
|
51 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,
|
c@120
|
52 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,
|
c@120
|
53 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,
|
c@120
|
54 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,
|
c@120
|
55 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,
|
c@120
|
56 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,
|
c@120
|
57 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,
|
c@120
|
58 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,
|
c@120
|
59 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,
|
c@120
|
60 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,
|
c@120
|
61 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,
|
c@120
|
62 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,
|
c@120
|
63 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,
|
c@120
|
64 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,
|
c@120
|
65 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,
|
c@120
|
66 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,
|
c@120
|
67 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,
|
c@120
|
68 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,
|
c@120
|
69 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,
|
c@120
|
70 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,
|
c@120
|
71 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,
|
c@120
|
72 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,
|
c@120
|
73 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,
|
c@120
|
74 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,
|
c@120
|
75 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,
|
c@120
|
76 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,
|
c@120
|
77 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,
|
c@120
|
78 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,
|
c@120
|
79 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,
|
c@120
|
80 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,
|
c@120
|
81 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,
|
c@120
|
82 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,
|
c@120
|
83 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,
|
c@120
|
84 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,
|
c@120
|
85 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,
|
c@120
|
86 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,
|
c@120
|
87 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,
|
c@120
|
88 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,
|
c@120
|
89 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,
|
c@120
|
90 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,
|
c@120
|
91 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,
|
c@120
|
92 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,
|
c@120
|
93 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,
|
c@120
|
94 15.142512,15.340191,15.537333,15.733840,15.929615,16.124564
|
c@120
|
95 };
|
c@120
|
96 void Transcribe(int Len,int inputLen,double *SoundIn,double *out,double *outArray2,double *outArray3,double SampleRate);
|
c@120
|
97
|
c@120
|
98 Transcription::Transcription(float inputSampleRate) :
|
c@120
|
99 Plugin(inputSampleRate),
|
c@120
|
100 m_stepSize(0)
|
c@120
|
101 {
|
c@120
|
102 m_SoundIn=0;
|
c@120
|
103 m_SampleN=0;
|
c@120
|
104 m_AllocN = 0;
|
c@120
|
105 m_Excess = false;
|
c@120
|
106 }
|
c@120
|
107
|
c@120
|
108 Transcription::~Transcription()
|
c@120
|
109 {
|
c@120
|
110 free(m_SoundIn);
|
c@120
|
111 }
|
c@120
|
112
|
c@120
|
113 string
|
c@120
|
114 Transcription::getIdentifier() const
|
c@120
|
115 {
|
c@120
|
116 return "qm-transcription";
|
c@120
|
117 }
|
c@120
|
118
|
c@120
|
119 string
|
c@120
|
120 Transcription::getName() const
|
c@120
|
121 {
|
c@120
|
122 return "Polyphonic Transcription";
|
c@120
|
123 }
|
c@120
|
124
|
c@120
|
125 string
|
c@120
|
126 Transcription::getDescription() const
|
c@120
|
127 {
|
c@120
|
128 return "Transcribe the input audio to estimated notes";
|
c@120
|
129 }
|
c@120
|
130
|
c@120
|
131 string
|
c@120
|
132 Transcription::getMaker() const
|
c@120
|
133 {
|
c@120
|
134 return "Queen Mary, University of London";
|
c@120
|
135 }
|
c@120
|
136
|
c@120
|
137 int
|
c@120
|
138 Transcription::getPluginVersion() const
|
c@120
|
139 {
|
c@120
|
140 return 1;
|
c@120
|
141 }
|
c@120
|
142
|
c@120
|
143 string
|
c@120
|
144 Transcription::getCopyright() const
|
c@120
|
145 {
|
c@120
|
146 return "Plugin by Dr. Ruohua Zhou. Copyright (c) 2008-2009 QMUL - All Rights Reserved";
|
c@120
|
147 }
|
c@120
|
148
|
c@120
|
149 size_t
|
c@120
|
150 Transcription::getPreferredStepSize() const
|
c@120
|
151 {
|
c@120
|
152 return 441;
|
c@120
|
153 }
|
c@120
|
154
|
c@120
|
155 size_t
|
c@120
|
156 Transcription::getPreferredBlockSize() const
|
c@120
|
157 {
|
c@120
|
158 return 441;
|
c@120
|
159 }
|
c@120
|
160
|
c@120
|
161 bool
|
c@120
|
162 Transcription::initialise(size_t channels, size_t stepSize, size_t blockSize)
|
c@120
|
163 {
|
c@120
|
164 if (channels < getMinChannelCount() ||
|
c@120
|
165 channels > getMaxChannelCount()) return false;
|
c@120
|
166
|
c@120
|
167 if (m_inputSampleRate < 4410 || m_inputSampleRate > 441000) return false;
|
c@120
|
168
|
c@120
|
169 m_stepSize = std::min(stepSize, blockSize);
|
c@120
|
170 m_blockSize=blockSize;
|
c@120
|
171
|
c@120
|
172 m_SampleN = 0;
|
c@120
|
173
|
c@120
|
174 return true;
|
c@120
|
175 }
|
c@120
|
176
|
c@120
|
177 void
|
c@120
|
178 Transcription::reset()
|
c@120
|
179 {
|
c@120
|
180 free(m_SoundIn);
|
c@120
|
181 m_SoundIn = 0;
|
c@120
|
182 m_SampleN = 0;
|
c@120
|
183 m_AllocN = 0;
|
c@120
|
184 m_Excess = false;
|
c@120
|
185 m_Base = Vamp::RealTime();
|
c@120
|
186 }
|
c@120
|
187
|
c@120
|
188 Transcription::OutputList
|
c@120
|
189 Transcription::getOutputDescriptors() const
|
c@120
|
190 {
|
c@120
|
191 OutputList list;
|
c@120
|
192
|
c@120
|
193 OutputDescriptor zc;
|
c@120
|
194 zc.identifier = "transcription";
|
c@120
|
195 zc.name = "Transcription";
|
c@120
|
196 zc.description = "Estimated note pitch (MIDI note number from 0 to 127)";
|
c@120
|
197 zc.unit = "MIDI units";
|
c@120
|
198 zc.hasFixedBinCount = true;
|
c@120
|
199 zc.binCount = 1;
|
c@120
|
200 zc.hasKnownExtents = true;
|
c@120
|
201 zc.minValue = 0;
|
c@120
|
202 zc.maxValue = 127;
|
c@120
|
203 zc.isQuantized = true;
|
c@120
|
204 zc.quantizeStep = 1.0;
|
c@120
|
205 zc.hasDuration = true;
|
c@120
|
206 zc.sampleType = OutputDescriptor::VariableSampleRate;
|
c@120
|
207
|
c@120
|
208 /* no -- this is the result of a confusion between bin indices and values
|
c@120
|
209 {
|
c@120
|
210
|
c@120
|
211 zc.binNames.push_back("A0");// MIDI Note 21
|
c@120
|
212 zc.binNames.push_back("A0#");
|
c@120
|
213 zc.binNames.push_back("B0");
|
c@120
|
214 zc.binNames.push_back("C1");
|
c@120
|
215 zc.binNames.push_back("C1#");
|
c@120
|
216 zc.binNames.push_back("D1");
|
c@120
|
217 zc.binNames.push_back("D1#");
|
c@120
|
218 zc.binNames.push_back("E1");
|
c@120
|
219 zc.binNames.push_back("F1");
|
c@120
|
220 zc.binNames.push_back("F1#");
|
c@120
|
221 zc.binNames.push_back("G1");
|
c@120
|
222 zc.binNames.push_back("G1#");
|
c@120
|
223
|
c@120
|
224 zc.binNames.push_back("A1");// MIDI Note 33
|
c@120
|
225 zc.binNames.push_back("A1#");
|
c@120
|
226 zc.binNames.push_back("B1");
|
c@120
|
227 zc.binNames.push_back("C2");
|
c@120
|
228 zc.binNames.push_back("C2#");
|
c@120
|
229 zc.binNames.push_back("D2");
|
c@120
|
230 zc.binNames.push_back("D2#");
|
c@120
|
231 zc.binNames.push_back("E2");
|
c@120
|
232 zc.binNames.push_back("F2");
|
c@120
|
233 zc.binNames.push_back("F2#");
|
c@120
|
234 zc.binNames.push_back("G2");
|
c@120
|
235 zc.binNames.push_back("G2#");
|
c@120
|
236
|
c@120
|
237 zc.binNames.push_back("A2");// MIDI Note 45
|
c@120
|
238 zc.binNames.push_back("A2#");
|
c@120
|
239 zc.binNames.push_back("B3");
|
c@120
|
240 zc.binNames.push_back("C3");
|
c@120
|
241 zc.binNames.push_back("C3#");
|
c@120
|
242 zc.binNames.push_back("D3");
|
c@120
|
243 zc.binNames.push_back("D3#");
|
c@120
|
244 zc.binNames.push_back("E3");
|
c@120
|
245 zc.binNames.push_back("F3");
|
c@120
|
246 zc.binNames.push_back("F3#");
|
c@120
|
247 zc.binNames.push_back("G3");
|
c@120
|
248 zc.binNames.push_back("G3#");
|
c@120
|
249
|
c@120
|
250 zc.binNames.push_back("A3");// MIDI Note 57
|
c@120
|
251 zc.binNames.push_back("A3#");
|
c@120
|
252 zc.binNames.push_back("B0");
|
c@120
|
253 zc.binNames.push_back("C4");
|
c@120
|
254 zc.binNames.push_back("C4#");
|
c@120
|
255 zc.binNames.push_back("D4");
|
c@120
|
256 zc.binNames.push_back("D4#");
|
c@120
|
257 zc.binNames.push_back("E4");
|
c@120
|
258 zc.binNames.push_back("F4");
|
c@120
|
259 zc.binNames.push_back("F4#");
|
c@120
|
260 zc.binNames.push_back("G4");
|
c@120
|
261 zc.binNames.push_back("G4#");
|
c@120
|
262
|
c@120
|
263 zc.binNames.push_back("A4");// MIDI Note 69
|
c@120
|
264 zc.binNames.push_back("A4#");
|
c@120
|
265 zc.binNames.push_back("B0");
|
c@120
|
266 zc.binNames.push_back("C5");
|
c@120
|
267 zc.binNames.push_back("C5#");
|
c@120
|
268 zc.binNames.push_back("D5");
|
c@120
|
269 zc.binNames.push_back("D5#");
|
c@120
|
270 zc.binNames.push_back("E5");
|
c@120
|
271 zc.binNames.push_back("F5");
|
c@120
|
272 zc.binNames.push_back("F5#");
|
c@120
|
273 zc.binNames.push_back("G5");
|
c@120
|
274 zc.binNames.push_back("G5#");
|
c@120
|
275
|
c@120
|
276 zc.binNames.push_back("A5");// MIDI Note 85
|
c@120
|
277 zc.binNames.push_back("A5#");
|
c@120
|
278 zc.binNames.push_back("B0");
|
c@120
|
279 zc.binNames.push_back("C6");
|
c@120
|
280 zc.binNames.push_back("C6#");
|
c@120
|
281 zc.binNames.push_back("D6");
|
c@120
|
282 zc.binNames.push_back("D6#");
|
c@120
|
283 zc.binNames.push_back("E6");
|
c@120
|
284 zc.binNames.push_back("F6");
|
c@120
|
285 zc.binNames.push_back("F6#");
|
c@120
|
286 zc.binNames.push_back("G6");
|
c@120
|
287 zc.binNames.push_back("G6#");
|
c@120
|
288
|
c@120
|
289 zc.binNames.push_back("A6");// MIDI Note 93
|
c@120
|
290 zc.binNames.push_back("A6#");
|
c@120
|
291 zc.binNames.push_back("B0");
|
c@120
|
292 zc.binNames.push_back("C7");
|
c@120
|
293 zc.binNames.push_back("C7#");
|
c@120
|
294 zc.binNames.push_back("D7");
|
c@120
|
295 zc.binNames.push_back("D7#");
|
c@120
|
296 zc.binNames.push_back("E7");
|
c@120
|
297 zc.binNames.push_back("F7");
|
c@120
|
298 zc.binNames.push_back("F7#");
|
c@120
|
299 zc.binNames.push_back("G7");
|
c@120
|
300 zc.binNames.push_back("G7#");
|
c@120
|
301
|
c@120
|
302 zc.binNames.push_back("A7");// MIDI Note 105
|
c@120
|
303 zc.binNames.push_back("A7#");
|
c@120
|
304 zc.binNames.push_back("B0");
|
c@120
|
305 zc.binNames.push_back("C8");
|
c@120
|
306 }
|
c@120
|
307 */
|
c@120
|
308
|
c@120
|
309 list.push_back(zc);
|
c@120
|
310
|
c@120
|
311 /* zc.identifier = "Transcriptions";
|
c@120
|
312 zc.name = "Polyphonic Transcription";
|
c@120
|
313 zc.description = "Polyphonic Music Transcription";
|
c@120
|
314 zc.unit = "";
|
c@120
|
315 zc.hasFixedBinCount = true;
|
c@120
|
316 zc.binCount = 0;
|
c@120
|
317 zc.sampleType = OutputDescriptor::VariableSampleRate;
|
c@120
|
318 zc.sampleRate = m_inputSampleRate;
|
c@120
|
319 list.push_back(zc);*/
|
c@120
|
320
|
c@120
|
321 return list;
|
c@120
|
322 }
|
c@120
|
323
|
c@120
|
324 Transcription::FeatureSet
|
c@120
|
325 Transcription::process(const float *const *inputBuffers,
|
c@120
|
326 Vamp::RealTime timestamp)
|
c@120
|
327 {
|
c@120
|
328 if (m_stepSize == 0) {
|
c@120
|
329 cerr << "ERROR: Transcription::process: "
|
c@120
|
330 << "Transcription has not been initialised"
|
c@120
|
331 << endl;
|
c@120
|
332 return FeatureSet();
|
c@120
|
333 }
|
c@120
|
334
|
c@120
|
335 if (m_SampleN == 0) {
|
c@120
|
336 m_Base = timestamp;
|
c@120
|
337 }
|
c@120
|
338
|
c@120
|
339 if (m_Excess) return FeatureSet();
|
c@120
|
340
|
c@178
|
341 for (int i = 0; i < m_blockSize;i++) {
|
c@120
|
342
|
c@120
|
343 if (m_SampleN >= m_AllocN) {
|
c@178
|
344 int newsize = m_AllocN * 2;
|
c@120
|
345 if (newsize < 10000) newsize = 10000;
|
c@120
|
346 double *newbuf = (double *)realloc(m_SoundIn, newsize * sizeof(double));
|
c@120
|
347 if (!newbuf) {
|
c@120
|
348 m_Excess = true;
|
c@120
|
349 break;
|
c@120
|
350 }
|
c@120
|
351 m_SoundIn = newbuf;
|
c@120
|
352 m_AllocN = newsize;
|
c@120
|
353 }
|
c@120
|
354
|
c@120
|
355 m_SoundIn[m_SampleN]=inputBuffers[0][i];
|
c@120
|
356 m_SampleN=m_SampleN+1;
|
c@120
|
357 }
|
c@120
|
358
|
c@120
|
359 return FeatureSet();
|
c@120
|
360 }
|
c@120
|
361
|
c@120
|
362 Transcription::FeatureSet
|
c@120
|
363 Transcription::getRemainingFeatures()
|
c@120
|
364 {
|
c@120
|
365 FeatureSet returnFeatures;
|
c@120
|
366
|
c@120
|
367 double * OutArray;
|
c@120
|
368 double *OutArray2;
|
c@120
|
369 double *hello1;
|
c@120
|
370 double *hello2;
|
c@120
|
371 int Msec;
|
c@178
|
372 int i;
|
c@178
|
373 int j;
|
c@178
|
374 int n;
|
c@120
|
375
|
c@120
|
376 Msec=(int)(100*m_SampleN/m_inputSampleRate);
|
c@120
|
377
|
c@120
|
378 if (Msec < 100) return returnFeatures;
|
c@120
|
379
|
c@120
|
380 OutArray=(double *)malloc(3*3000*sizeof(double));
|
c@120
|
381 OutArray2=(double *)malloc(88*Msec*sizeof(double));
|
c@120
|
382 hello1=(double *)malloc(112*Msec*sizeof(double));
|
c@120
|
383 hello2=(double *)malloc(112*Msec*sizeof(double));
|
c@120
|
384
|
c@120
|
385 for (j = 0; j <Msec; j++) {
|
c@120
|
386
|
c@120
|
387 for(n=0;n<88;n++)
|
c@120
|
388 {
|
c@120
|
389
|
c@120
|
390 OutArray2[j*88+n]=0;
|
c@120
|
391 }
|
c@120
|
392
|
c@120
|
393 }
|
c@120
|
394
|
c@120
|
395
|
c@120
|
396 Transcribe(Msec,m_SampleN,m_SoundIn,hello1,hello2,OutArray,m_inputSampleRate);
|
c@120
|
397 int start;
|
c@120
|
398 int endd;
|
c@120
|
399
|
c@120
|
400
|
c@120
|
401 /* for (i = 0; i < 3000; i++) {
|
c@120
|
402
|
c@120
|
403 if((OutArray[3*i]>0)&&(OutArray[3*i]<88))
|
c@120
|
404 {
|
c@120
|
405 start=OutArray[3*i+1];endd=OutArray[3*i+2];
|
c@120
|
406 for(j=start;j<(start+0.05);j=j+0.01)
|
c@120
|
407 {
|
c@120
|
408
|
c@120
|
409 Feature feature;
|
c@120
|
410 Vamp::RealTime ts;
|
c@120
|
411
|
c@120
|
412 feature.hasTimestamp = true;
|
c@120
|
413
|
c@120
|
414 feature.timestamp =ts.fromSeconds(j);
|
c@120
|
415 feature.values.push_back(OutArray[3*i]+21);
|
c@120
|
416 returnFeatures[0].push_back(feature);
|
c@120
|
417
|
c@120
|
418 }
|
c@120
|
419
|
c@120
|
420
|
c@120
|
421
|
c@120
|
422 }
|
c@120
|
423 else
|
c@120
|
424 {
|
c@120
|
425
|
c@120
|
426 break;
|
c@120
|
427 }
|
c@120
|
428
|
c@120
|
429
|
c@120
|
430 }
|
c@120
|
431
|
c@120
|
432 */
|
c@120
|
433
|
c@120
|
434
|
c@120
|
435 for (i = 0; i < 3000; i++) {
|
c@120
|
436
|
c@120
|
437 if((OutArray[3*i]>0)&&(OutArray[3*i]<88))
|
c@120
|
438 {
|
c@120
|
439 start=100*OutArray[3*i+1];
|
c@120
|
440 endd=100*OutArray[3*i+2]-5;
|
c@120
|
441 for(j=start;j<endd;j++)
|
c@120
|
442 {
|
c@120
|
443 n=OutArray[3*i];
|
c@120
|
444 OutArray2[j*88+n]=OutArray[3*i];
|
c@120
|
445 }
|
c@120
|
446
|
c@120
|
447 }
|
c@120
|
448 else
|
c@120
|
449 {
|
c@120
|
450
|
c@120
|
451 break;
|
c@120
|
452 }
|
c@120
|
453
|
c@120
|
454
|
c@120
|
455 }
|
c@120
|
456
|
c@120
|
457 double starts[88];
|
c@120
|
458 for (n = 0; n < 88; ++n) starts[n] = -1.0;
|
c@120
|
459
|
c@120
|
460 for (j = 0; j <Msec; j++) {
|
c@120
|
461
|
c@120
|
462 for(n=0;n<88;n++)
|
c@120
|
463 {
|
c@120
|
464 if(OutArray2[j*88+n]>0)
|
c@120
|
465 {
|
c@120
|
466
|
c@120
|
467 if (starts[n] < 0.)
|
c@120
|
468 {
|
c@120
|
469 starts[n] = j * 0.01;
|
c@120
|
470 }
|
c@120
|
471 }
|
c@120
|
472 else
|
c@120
|
473 {
|
c@120
|
474 if (starts[n] > 0.)
|
c@120
|
475 {
|
c@120
|
476 Feature feature;
|
c@120
|
477 feature.hasTimestamp = true;
|
c@120
|
478 feature.timestamp = m_Base + Vamp::RealTime::fromSeconds(starts[n]);
|
c@120
|
479 feature.hasDuration = true;
|
c@120
|
480 feature.duration = Vamp::RealTime::fromSeconds(j * 0.01 - starts[n]);
|
c@120
|
481 feature.values.push_back(n+20);
|
c@120
|
482 returnFeatures[0].push_back(feature);
|
c@120
|
483
|
c@120
|
484 starts[n] = -1.0;
|
c@120
|
485 }
|
c@120
|
486 }
|
c@120
|
487 }
|
c@120
|
488 }
|
c@120
|
489
|
c@120
|
490
|
c@120
|
491 for(n=0;n<88;n++)
|
c@120
|
492 {
|
c@120
|
493 if (starts[n] > 0.)
|
c@120
|
494 {
|
c@120
|
495 Feature feature;
|
c@120
|
496 feature.hasTimestamp = true;
|
c@120
|
497 feature.timestamp = m_Base + Vamp::RealTime::fromSeconds(starts[n]);
|
c@120
|
498 feature.hasDuration = true;
|
c@120
|
499 feature.duration = Vamp::RealTime::fromSeconds(j * 0.01 - starts[n]);
|
c@120
|
500 feature.values.push_back(n+20);
|
c@120
|
501 returnFeatures[0].push_back(feature);
|
c@120
|
502
|
c@120
|
503 starts[n] = -1.0;
|
c@120
|
504 }
|
c@120
|
505 }
|
c@120
|
506
|
c@120
|
507 free(OutArray2);
|
c@120
|
508 free(OutArray);
|
c@120
|
509
|
c@120
|
510 free(hello1);
|
c@120
|
511 free(hello2);
|
c@120
|
512
|
c@120
|
513 return returnFeatures;
|
c@120
|
514
|
c@120
|
515 }
|
c@120
|
516
|
c@120
|
517
|
c@120
|
518
|
c@120
|
519
|
c@120
|
520
|
c@120
|
521 void sofacomplexMex(double *y, double *z, int ncols,double StartNote,double NoteInterval1,double NoteNum,double C,double D,double SR)
|
c@120
|
522 {
|
c@178
|
523 int mseconds,i,el,count,count2;
|
c@178
|
524 double Snote,NoteInterval,NoteN;
|
c@120
|
525 double *signs;
|
c@178
|
526 double *rwork;
|
c@120
|
527 double freq,R,gain,gainI,gainII,coefI,coefM;
|
c@120
|
528 double output,input,outputI,outputM;
|
c@120
|
529 double *x;
|
c@120
|
530 double *sum,*sum2;
|
c@120
|
531 double power;
|
c@120
|
532
|
c@120
|
533 //SR=44100;
|
c@120
|
534 Snote=StartNote;
|
c@120
|
535 NoteInterval=NoteInterval1;
|
c@120
|
536 NoteN=NoteNum;
|
c@120
|
537
|
c@120
|
538 signs=(double*)malloc((int)NoteN*5*sizeof(double));
|
c@120
|
539
|
c@120
|
540 for (i = 0; i <NoteN; i++) {
|
c@120
|
541
|
c@120
|
542 freq=exp((log(2.0))*(Snote+i*NoteInterval-69)/12)*440;
|
c@120
|
543 R=exp(-(D+C*freq*2*3.1415926)/(SR*3.1415926));
|
c@120
|
544 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);
|
c@120
|
545 gainI=-2*R*cos(freq*2*3.1415926/SR);
|
c@120
|
546 gainII =R*R ;
|
c@120
|
547 coefI=cos(freq*2*3.1415926/SR);
|
c@120
|
548 coefM=sin(freq*2*3.1415926/SR);
|
c@120
|
549
|
c@120
|
550 signs[i*5+0]=gain*gain;
|
c@120
|
551 signs[i*5+1]=gainI;
|
c@120
|
552 signs[i*5+2]=gainII;
|
c@120
|
553 signs[i*5+3]=coefI;
|
c@120
|
554 signs[i*5+4]=coefM;
|
c@120
|
555
|
c@120
|
556 }
|
c@120
|
557
|
c@120
|
558 x=(double*)malloc((int)NoteN*2*sizeof(double));
|
c@120
|
559 rwork=(double*)malloc((int)NoteN*sizeof(double));
|
c@120
|
560 sum=(double*)malloc((int)NoteN*sizeof(double));
|
c@120
|
561 sum2=(double*)malloc((int)NoteN*sizeof(double));
|
c@120
|
562 mseconds=(int)(100*ncols/SR);
|
c@120
|
563 power=0;
|
c@120
|
564 for (i=0;i<mseconds*(int)(SR/100);i++)
|
c@120
|
565 {
|
c@120
|
566 power=power+y[i]*y[i];
|
c@120
|
567 }
|
c@120
|
568 power=sqrt(power);
|
c@120
|
569 for(i=0;i<NoteN*2;i++)
|
c@120
|
570 x[i]=0;
|
c@120
|
571 for (i=0;i<NoteN;i++)
|
c@120
|
572 {
|
c@120
|
573 sum[i]=0;
|
c@120
|
574 sum2[i]=0;
|
c@120
|
575 };
|
c@120
|
576 count=0;
|
c@120
|
577 count2=0;
|
c@120
|
578 for (i=0;i<(mseconds*(int)(SR/100));i++)
|
c@120
|
579 {
|
c@120
|
580 count=count+1;
|
c@120
|
581 input=y[i];
|
c@120
|
582 for(el=0;el<NoteN;el++)
|
c@120
|
583 {
|
c@120
|
584 output=(input-signs[5*el+1]*x[2*el+0]-signs[5*el+2]*x[2*el+1]);
|
c@120
|
585 outputI=output-signs[5*el+3]*x[2*el+0];
|
c@120
|
586 outputM=signs[5*el+4]*x[2*el+0];
|
c@120
|
587 sum[el]=sum[el]+signs[5*el+0]*(outputI*outputI+ outputM*outputM);
|
c@120
|
588 rwork[el]=output;
|
c@120
|
589 x[el+el+1]=x[el+el+0];
|
c@120
|
590 x[el+el+0]=rwork[el];
|
c@120
|
591
|
c@120
|
592 }
|
c@120
|
593 if(count==(int)(SR/100))
|
c@120
|
594 {
|
c@120
|
595 for(el=0;el<NoteN;el++)
|
c@120
|
596 {
|
c@120
|
597 *(z+count2*(int)NoteN+el)=1000000*(sum[el]+sum2[el])/(2*(int)(SR/100))+0.00001;
|
c@120
|
598 sum2[el]=sum[el];
|
c@120
|
599 sum[el]=0;
|
c@120
|
600 }
|
c@120
|
601 count2=count2+1;
|
c@120
|
602 count=0;
|
c@120
|
603 }
|
c@120
|
604
|
c@120
|
605 }
|
c@120
|
606 for (i=0;i<NoteN;i++)
|
c@120
|
607 {
|
c@120
|
608 sum[i]=0;
|
c@120
|
609 sum2[i]=0;
|
c@120
|
610 };
|
c@120
|
611 for (el=0;el<NoteN;el++)
|
c@120
|
612 {
|
c@120
|
613 for (i=0;i<mseconds;i++)
|
c@120
|
614 {
|
c@120
|
615 sum[el]=sum[el]+*(z+i*(int)NoteN+el);
|
c@120
|
616 }
|
c@120
|
617
|
c@120
|
618 }
|
c@120
|
619
|
c@120
|
620 free(x);
|
c@120
|
621 free(rwork);
|
c@120
|
622 free(sum);
|
c@120
|
623 free(sum2);
|
c@120
|
624 free(signs);
|
c@120
|
625
|
c@120
|
626 }
|
c@120
|
627
|
c@120
|
628 void FindMaxN( double *InputArray, int InputLen,int MaxOrder)
|
c@120
|
629 {
|
c@120
|
630 int i,j,MaxIndex = 0;
|
c@120
|
631 double MaxValue;
|
c@120
|
632 double *In2;
|
c@120
|
633
|
c@120
|
634 In2=(double*)malloc(InputLen*sizeof(double));
|
c@120
|
635 for (i=0;i<InputLen;i++)
|
c@120
|
636 {
|
c@120
|
637 In2[i]=InputArray[i];
|
c@120
|
638 InputArray[i]=0;
|
c@120
|
639 }
|
c@120
|
640 for (i=0;i<MaxOrder;i++)
|
c@120
|
641 {
|
c@120
|
642 MaxValue=0;
|
c@120
|
643 for (j=0;j<InputLen;j++)
|
c@120
|
644 {
|
c@120
|
645 if(In2[j]>MaxValue)
|
c@120
|
646 {
|
c@120
|
647 MaxValue=In2[j];
|
c@120
|
648 MaxIndex=j;
|
c@120
|
649 }
|
c@120
|
650 }
|
c@120
|
651 InputArray[MaxIndex]=In2[MaxIndex];
|
c@120
|
652 In2[MaxIndex]=0;
|
c@120
|
653 }
|
c@120
|
654
|
c@120
|
655 free(In2);
|
c@120
|
656 }
|
c@120
|
657
|
c@120
|
658 double SumF(double *InputArray,int Start, int End)
|
c@120
|
659 {
|
c@120
|
660 double Value;
|
c@120
|
661 int i;
|
c@120
|
662 Value=0;
|
c@120
|
663 for (i=Start;i<(End+1);i++)
|
c@120
|
664 {
|
c@120
|
665 Value=Value+InputArray[i];
|
c@120
|
666 }
|
c@120
|
667
|
c@120
|
668 return Value;
|
c@120
|
669
|
c@120
|
670 }
|
c@120
|
671
|
c@120
|
672 int round10(int x)
|
c@120
|
673 {
|
c@120
|
674 int I,I2;
|
c@120
|
675 I=((int)(x/10));
|
c@120
|
676 I2=x-I*10;
|
c@120
|
677
|
c@120
|
678 if(I2>5)
|
c@120
|
679 return (I+1);
|
c@120
|
680 else
|
c@120
|
681 return I;
|
c@120
|
682
|
c@120
|
683 }
|
c@120
|
684
|
c@120
|
685
|
c@120
|
686 void ConToPitch1250(double *In, int InLen)
|
c@120
|
687 {
|
c@120
|
688 int i,j,k, nn,col;
|
c@120
|
689 double *Out;
|
c@120
|
690 const int A[12]={0, 120, 190, 240, 279, 310, 337, 360, 380, 399, 415, 430};
|
c@120
|
691 Out=(double*)malloc(InLen*sizeof(double));
|
c@120
|
692
|
c@120
|
693
|
c@120
|
694 col=InLen;
|
c@120
|
695
|
c@120
|
696 for (i=0;i<col;i++)
|
c@120
|
697 {
|
c@120
|
698 Out[i]=0;
|
c@120
|
699 }
|
c@120
|
700
|
c@120
|
701 for (i=0;i<col;i++)
|
c@120
|
702 {
|
c@120
|
703 k=0;
|
c@120
|
704 nn=5;
|
c@120
|
705 for (j=0;j<nn;j++)
|
c@120
|
706 {
|
c@120
|
707 if((i+A[j])<col)
|
c@120
|
708 {
|
c@120
|
709 k=k+1;
|
c@120
|
710 Out[i]=Out[i]+In[i+A[j]];
|
c@120
|
711 }
|
c@120
|
712
|
c@120
|
713 if((i+A[j])>(col-1))
|
c@120
|
714 {
|
c@120
|
715 k=k+1;
|
c@120
|
716 Out[i]=Out[i]+In[col-1];
|
c@120
|
717 }
|
c@120
|
718 }
|
c@120
|
719 if(k>0)
|
c@120
|
720 {
|
c@120
|
721 Out[i]=Out[i]/k;
|
c@120
|
722 }
|
c@120
|
723 }
|
c@120
|
724 for (i=0;i<col;i++)
|
c@120
|
725 {
|
c@120
|
726 In[i]=Out[i];
|
c@120
|
727 }
|
c@120
|
728
|
c@120
|
729
|
c@120
|
730 free(Out);
|
c@120
|
731 }
|
c@120
|
732
|
c@120
|
733 void Norm1(double *In, int InLen)
|
c@120
|
734 {
|
c@120
|
735 double MaxValue;
|
c@120
|
736 int i;
|
c@120
|
737 double *Out;
|
c@120
|
738 Out=(double*)malloc(InLen*sizeof(double));
|
c@120
|
739
|
c@120
|
740 MaxValue=In[0];
|
c@120
|
741 for (i=1;i<InLen;i++)
|
c@120
|
742 {
|
c@120
|
743 if(In[i]>MaxValue)
|
c@120
|
744 MaxValue=In[i];
|
c@120
|
745 }
|
c@120
|
746
|
c@120
|
747 for (i=0;i<InLen;i++)
|
c@120
|
748 {
|
c@120
|
749 Out[i]=In[i]-MaxValue;
|
c@120
|
750 }
|
c@120
|
751
|
c@120
|
752 for (i=0;i<InLen;i++)
|
c@120
|
753 {
|
c@120
|
754 In[i]=Out[i];
|
c@120
|
755 }
|
c@120
|
756
|
c@120
|
757 free(Out);
|
c@120
|
758 }
|
c@120
|
759
|
c@120
|
760 void Smooth(double *In, int InLen,int smoothLen)
|
c@120
|
761 {
|
c@120
|
762 double sum;
|
c@120
|
763 int i,j,nn,n,count;
|
c@120
|
764 double *Out;
|
c@120
|
765 Out=(double*)malloc(InLen*sizeof(double));
|
c@120
|
766 nn=InLen;
|
c@120
|
767 n=(smoothLen-1)/2;
|
c@120
|
768 for (i=0;i<nn;i++)
|
c@120
|
769 {
|
c@120
|
770 sum=0;
|
c@120
|
771 count=0;
|
c@120
|
772 for (j=0;j<(n+1);j++)
|
c@120
|
773 {
|
c@120
|
774 if ((i-j)>-1)
|
c@120
|
775 {
|
c@120
|
776 sum=sum+In[i-j];
|
c@120
|
777 count=count+1;
|
c@120
|
778 }
|
c@120
|
779 }
|
c@120
|
780
|
c@120
|
781 for (j=1;j<(n+1);j++)
|
c@120
|
782 {
|
c@120
|
783 if ((i+j)<nn)
|
c@120
|
784 {
|
c@120
|
785 sum=sum+In[i+j];
|
c@120
|
786 count=count+1;
|
c@120
|
787 }
|
c@120
|
788 }
|
c@120
|
789 Out[i]=sum/count;
|
c@120
|
790 }
|
c@120
|
791 for (i=0;i<InLen;i++)
|
c@120
|
792 In[i]=Out[i];
|
c@120
|
793
|
c@120
|
794 free(Out);
|
c@120
|
795 }
|
c@120
|
796
|
c@120
|
797
|
c@178
|
798 void FindPeaks(double *In, int InLen,double *Out1,double *Out2, int /* db */, int db2, int db3)
|
c@120
|
799 {
|
c@120
|
800 int i,lastout;
|
c@120
|
801 for (i=0;i<InLen;i++)
|
c@120
|
802 {
|
c@120
|
803 Out1[i]=0;
|
c@120
|
804 Out2[1]=0;
|
c@120
|
805 }
|
c@120
|
806
|
c@120
|
807 for (i=20;i<(InLen-20-1);i++)
|
c@120
|
808 {
|
c@120
|
809 if( /**/ ((In[i]>(db2+In[i-6]))||(In[i]>(db2+In[i+6]))
|
c@120
|
810 ||(In[i]>(db3+In[i+20]))||(In[i]>(db3+In[i-20])))
|
c@120
|
811 /*&&(In[i]>db)*/&&(In[i]>In[i+3])&&(In[i]>In[i-3])
|
c@120
|
812 &&(In[i]>In[i+2])&&(In[i]>In[i-2])
|
c@120
|
813 &&(In[i]>In[i+1])&&(In[i]>In[i-1]))
|
c@120
|
814 {
|
c@120
|
815 Out1[i]=In[i];
|
c@120
|
816 Out2[i]=1;
|
c@120
|
817 }
|
c@120
|
818
|
c@120
|
819 }
|
c@120
|
820
|
c@120
|
821 lastout=1;
|
c@120
|
822 for(i=0;i<InLen;i++)
|
c@120
|
823 {
|
c@120
|
824
|
c@120
|
825 if(Out2[i]==1)
|
c@120
|
826 {
|
c@120
|
827 if((i-lastout)<5)
|
c@120
|
828 {
|
c@120
|
829 if(Out1[i]>Out1[lastout])
|
c@120
|
830 {
|
c@120
|
831 Out2[lastout]=0;
|
c@120
|
832 Out1[lastout]=0;
|
c@120
|
833 lastout=i;
|
c@120
|
834 }
|
c@120
|
835 else
|
c@120
|
836 {
|
c@120
|
837 Out2[i]=0;
|
c@120
|
838 Out1[i]=0;
|
c@120
|
839 }
|
c@120
|
840
|
c@120
|
841 }
|
c@120
|
842 else
|
c@120
|
843 {
|
c@120
|
844 lastout=i;
|
c@120
|
845 }
|
c@120
|
846 }
|
c@120
|
847
|
c@120
|
848 }
|
c@120
|
849
|
c@120
|
850 }
|
c@120
|
851
|
c@120
|
852
|
c@120
|
853 void ConFrom1050To960(double *In, double *out, int InputLen)
|
c@120
|
854 {
|
c@120
|
855 int i,j;
|
c@120
|
856
|
c@120
|
857 for(i=0;i<960;i++)
|
c@120
|
858 {
|
c@120
|
859 for (j=0;j<InputLen;j++)
|
c@120
|
860 {
|
c@120
|
861 out[i+j*960]=In[i+j*1050];
|
c@120
|
862
|
c@120
|
863 }
|
c@120
|
864 }
|
c@120
|
865
|
c@120
|
866
|
c@120
|
867 }
|
c@120
|
868
|
c@120
|
869 void Move( double *InputArray, int InputLen,int m)
|
c@120
|
870 {
|
c@120
|
871 int i;
|
c@120
|
872 double *OutArray;
|
c@120
|
873
|
c@120
|
874 OutArray=(double *)malloc(InputLen*sizeof(double));
|
c@120
|
875 for (i=0;i<InputLen;i++)
|
c@120
|
876 OutArray[i]=0;
|
c@120
|
877
|
c@120
|
878 for (i=0;i<InputLen;i++)
|
c@120
|
879 { if(((i+m)>-1)&&((i+m)<InputLen))
|
c@120
|
880 OutArray[i+m]=InputArray[i];
|
c@120
|
881 }
|
c@120
|
882
|
c@120
|
883 for (i=0;i<InputLen;i++)
|
c@120
|
884 {
|
c@120
|
885 InputArray[i]=OutArray[i];
|
c@120
|
886 }
|
c@120
|
887
|
c@120
|
888 free(OutArray);
|
c@120
|
889 }
|
c@120
|
890
|
c@120
|
891
|
c@120
|
892 double SumArray( double *InputArray, int InputHLen, int InputVLen)
|
c@120
|
893 {
|
c@120
|
894 int i;
|
c@120
|
895 int j;
|
c@120
|
896 double sum;
|
c@120
|
897 int count;
|
c@120
|
898 count=0;
|
c@120
|
899 sum=0;
|
c@120
|
900 for (j=0;j<InputHLen;j++)
|
c@120
|
901 {
|
c@120
|
902 for (i=0;i<InputVLen;i++)
|
c@120
|
903 {
|
c@120
|
904 count=count+1;
|
c@120
|
905 sum=sum+InputArray[i+j*InputVLen];
|
c@120
|
906
|
c@120
|
907 }
|
c@120
|
908 }
|
c@120
|
909 return sum;
|
c@120
|
910 }
|
c@120
|
911
|
c@120
|
912 double Sum( double *InputArray, int InputHLen)
|
c@120
|
913 {
|
c@120
|
914 int i;
|
c@120
|
915 double sum;
|
c@120
|
916 int count;
|
c@120
|
917 count=0;
|
c@120
|
918 sum=0;
|
c@120
|
919 for (i=0;i<InputHLen;i++)
|
c@120
|
920 {
|
c@120
|
921 count=count+1;
|
c@120
|
922 sum=sum+InputArray[i];
|
c@120
|
923
|
c@120
|
924 }
|
c@120
|
925 return sum;
|
c@120
|
926 }
|
c@120
|
927
|
c@120
|
928 void MeanV2( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
|
c@120
|
929 {
|
c@120
|
930 int i;
|
c@120
|
931 int j;
|
c@120
|
932 double sum;
|
c@120
|
933 for (i=0;i<InputVLen;i++)
|
c@120
|
934 {
|
c@120
|
935 sum=0;
|
c@120
|
936 for (j=0;j<InputHLen;j++)
|
c@120
|
937 {
|
c@120
|
938
|
c@120
|
939 sum=sum+InputArray[i+j*InputVLen];
|
c@120
|
940
|
c@120
|
941 }
|
c@120
|
942 OutArray[i]=sum/InputHLen;
|
c@120
|
943 }
|
c@120
|
944
|
c@120
|
945 }
|
c@120
|
946
|
c@120
|
947 void SumV( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
|
c@120
|
948 {
|
c@120
|
949 int i;
|
c@120
|
950 int j;
|
c@120
|
951 double sum;
|
c@120
|
952
|
c@120
|
953 for (j=0;j<InputHLen;j++)
|
c@120
|
954 {
|
c@120
|
955 sum=0;
|
c@120
|
956 for (i=0;i<InputVLen;i++)
|
c@120
|
957 {
|
c@120
|
958
|
c@120
|
959 sum=sum+InputArray[i+j*InputVLen];
|
c@120
|
960
|
c@120
|
961 }
|
c@120
|
962 OutArray[j]=sum;
|
c@120
|
963 }
|
c@120
|
964
|
c@120
|
965 }
|
c@120
|
966
|
c@120
|
967
|
c@120
|
968
|
c@120
|
969 void SumV2( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
|
c@120
|
970 {
|
c@120
|
971 int i;
|
c@120
|
972 int j;
|
c@120
|
973 double sum;
|
c@120
|
974 for (i=0;i<InputVLen;i++)
|
c@120
|
975 {
|
c@120
|
976 sum=0;
|
c@120
|
977 for (j=0;j<InputHLen;j++)
|
c@120
|
978 {
|
c@120
|
979
|
c@120
|
980 sum=sum+InputArray[i+j*InputVLen];
|
c@120
|
981
|
c@120
|
982 }
|
c@120
|
983 OutArray[i]=sum;
|
c@120
|
984 }
|
c@120
|
985
|
c@120
|
986 }
|
c@120
|
987
|
c@120
|
988 void MaxV( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
|
c@120
|
989 {
|
c@120
|
990 int i;
|
c@120
|
991 int j;
|
c@120
|
992 double MaxVal;
|
c@120
|
993
|
c@120
|
994 for (j=0;j<InputHLen;j++)
|
c@120
|
995 {
|
c@120
|
996 MaxVal=InputArray[j*InputVLen];
|
c@120
|
997 for (i=0;i<InputVLen;i++)
|
c@120
|
998 {
|
c@120
|
999 if(InputArray[i+j*InputVLen]>MaxVal)
|
c@120
|
1000 {
|
c@120
|
1001 MaxVal=InputArray[i+j*InputVLen];
|
c@120
|
1002 }
|
c@120
|
1003
|
c@120
|
1004 }
|
c@120
|
1005 OutArray[j]=MaxVal;
|
c@120
|
1006 }
|
c@120
|
1007
|
c@120
|
1008 }
|
c@120
|
1009
|
c@120
|
1010 void MaxV2( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
|
c@120
|
1011 {
|
c@120
|
1012 int i;
|
c@120
|
1013 int j;
|
c@120
|
1014 double MaxVal;
|
c@120
|
1015 for (i=0;i<InputVLen;i++)
|
c@120
|
1016 {
|
c@120
|
1017 MaxVal=InputArray[i];
|
c@120
|
1018 for (j=0;j<InputHLen;j++)
|
c@120
|
1019 {
|
c@120
|
1020 if(InputArray[i+j*InputVLen]>MaxVal)
|
c@120
|
1021 {
|
c@120
|
1022 MaxVal=InputArray[i+j*InputVLen];
|
c@120
|
1023 }
|
c@120
|
1024
|
c@120
|
1025 }
|
c@120
|
1026 OutArray[i]=MaxVal;
|
c@120
|
1027 }
|
c@120
|
1028
|
c@120
|
1029 }
|
c@120
|
1030
|
c@120
|
1031
|
c@120
|
1032
|
c@120
|
1033 void MinArray( double *InputArray, int InputHLen, int InputVLen, double MinValue)
|
c@120
|
1034 {
|
c@120
|
1035 int i;
|
c@120
|
1036 int j;
|
c@120
|
1037
|
c@120
|
1038 for (i=0;i<InputVLen;i++)
|
c@120
|
1039 {
|
c@120
|
1040 for (j=0;j<InputHLen;j++)
|
c@120
|
1041 {
|
c@120
|
1042 if(InputArray[i+j*InputVLen]<MinValue)
|
c@120
|
1043 InputArray[i+j*InputVLen]=MinValue;
|
c@120
|
1044
|
c@120
|
1045 }
|
c@120
|
1046
|
c@120
|
1047 }
|
c@120
|
1048
|
c@120
|
1049 }
|
c@120
|
1050
|
c@120
|
1051
|
c@120
|
1052 void MaxArray( double *InputArray, int InputHLen, int InputVLen, double MaxValue)
|
c@120
|
1053 {
|
c@120
|
1054 int i;
|
c@120
|
1055 int j;
|
c@120
|
1056
|
c@120
|
1057 for (i=0;i<InputVLen;i++)
|
c@120
|
1058 {
|
c@120
|
1059 for (j=0;j<InputHLen;j++)
|
c@120
|
1060 {
|
c@120
|
1061 if(InputArray[i+j*InputVLen]>MaxValue)
|
c@120
|
1062 InputArray[i+j*InputVLen]=MaxValue;
|
c@120
|
1063
|
c@120
|
1064 }
|
c@120
|
1065
|
c@120
|
1066 }
|
c@120
|
1067
|
c@120
|
1068 }
|
c@120
|
1069
|
c@120
|
1070 double GetMaxValue( double *InputArray, int InputHLen, int InputVLen)
|
c@120
|
1071 {
|
c@120
|
1072 int i;
|
c@120
|
1073 int j;
|
c@120
|
1074
|
c@120
|
1075 double MaxValue;
|
c@120
|
1076 MaxValue=InputArray[0];
|
c@120
|
1077 for (i=0;i<InputVLen;i++)
|
c@120
|
1078 {
|
c@120
|
1079 for (j=0;j<InputHLen;j++)
|
c@120
|
1080 {
|
c@120
|
1081 if(InputArray[i*InputHLen+j]>MaxValue)
|
c@120
|
1082 MaxValue=InputArray[i*InputHLen+j];
|
c@120
|
1083
|
c@120
|
1084 }
|
c@120
|
1085
|
c@120
|
1086 }
|
c@120
|
1087
|
c@120
|
1088 return MaxValue;
|
c@120
|
1089 }
|
c@120
|
1090
|
c@120
|
1091 void RemoveNoise( double *InputArray, int InputHLen, int InputVLen)
|
c@120
|
1092 {
|
c@120
|
1093 int i;
|
c@120
|
1094 int j;
|
c@120
|
1095
|
c@120
|
1096 for (i=0;i<InputVLen;i++)
|
c@120
|
1097 {
|
c@120
|
1098 for (j=0;j<InputHLen;j++)
|
c@120
|
1099 {
|
c@120
|
1100
|
c@120
|
1101 InputArray[i+j*InputVLen]=InputArray[i+j*InputVLen]-EualCurve960[i];
|
c@120
|
1102
|
c@120
|
1103 }
|
c@120
|
1104
|
c@120
|
1105 }
|
c@120
|
1106
|
c@120
|
1107 }
|
c@120
|
1108 double MeanArray( double *InputArray, int InputHLen, int InputVLen)
|
c@120
|
1109 {
|
c@120
|
1110 int i;
|
c@120
|
1111 int j;
|
c@120
|
1112 double sum;
|
c@120
|
1113 int count;
|
c@120
|
1114 count=0;
|
c@120
|
1115 sum=0;
|
c@120
|
1116 for (j=0;j<InputHLen;j++)
|
c@120
|
1117 {
|
c@120
|
1118 for (i=0;i<InputVLen;i++)
|
c@120
|
1119 {
|
c@120
|
1120 count=count+1;
|
c@120
|
1121 sum=sum+InputArray[i+j*InputVLen];
|
c@120
|
1122
|
c@120
|
1123 }
|
c@120
|
1124 }
|
c@120
|
1125 return sum/count;
|
c@120
|
1126 }
|
c@120
|
1127 void Mydiff( double *InputArray, int InputHLen, int InputVLen,int n)
|
c@120
|
1128 {
|
c@120
|
1129 int i;
|
c@120
|
1130 int j;
|
c@120
|
1131 double * OutArray;
|
c@120
|
1132
|
c@120
|
1133 OutArray=(double*)malloc(InputHLen*InputVLen*sizeof(double));
|
c@120
|
1134
|
c@120
|
1135 for (i=0;i<InputVLen;i++)
|
c@120
|
1136 {
|
c@120
|
1137 for (j=n;j<InputHLen;j++)
|
c@120
|
1138 {
|
c@120
|
1139 OutArray[i+j*InputVLen]=InputArray[i+j*InputVLen]-InputArray[i+(j-n)*InputVLen];
|
c@120
|
1140
|
c@120
|
1141 }
|
c@120
|
1142 }
|
c@120
|
1143
|
c@120
|
1144 for (i=0;i<InputVLen;i++)
|
c@120
|
1145 {
|
c@120
|
1146 for (j=n;j<InputHLen;j++)
|
c@120
|
1147 {
|
c@120
|
1148 InputArray[i+j*InputVLen]=OutArray[i+j*InputVLen];
|
c@120
|
1149
|
c@120
|
1150 }
|
c@120
|
1151 }
|
c@120
|
1152
|
c@120
|
1153 for (i=0;i<InputVLen;i++)
|
c@120
|
1154 {
|
c@120
|
1155 for (j=0;j<n;j++)
|
c@120
|
1156 {
|
c@120
|
1157 InputArray[i+j*InputVLen]=0;
|
c@120
|
1158
|
c@120
|
1159 }
|
c@120
|
1160 }
|
c@120
|
1161
|
c@120
|
1162 free(OutArray);
|
c@120
|
1163 }
|
c@120
|
1164
|
c@120
|
1165 void PeakDetect(double *In, int InLen)
|
c@120
|
1166 {
|
c@178
|
1167 int i;
|
c@120
|
1168 double *Out1;
|
c@120
|
1169
|
c@120
|
1170 Out1=(double*)malloc(InLen*sizeof(double));
|
c@120
|
1171 for (i=0;i<InLen;i++)
|
c@120
|
1172 {
|
c@120
|
1173 Out1[i]=0;
|
c@120
|
1174 }
|
c@120
|
1175
|
c@120
|
1176
|
c@120
|
1177
|
c@120
|
1178 for (i=2;i<(InLen-3);i++)
|
c@120
|
1179 {
|
c@120
|
1180 if( (In[i]>In[i+2])&&(In[i]>In[i-2])
|
c@120
|
1181 &&(In[i]>In[i+1])&&(In[i]>In[i-1]))
|
c@120
|
1182 {
|
c@120
|
1183 Out1[i]=In[i];
|
c@120
|
1184 }
|
c@120
|
1185
|
c@120
|
1186 }
|
c@120
|
1187
|
c@120
|
1188 for(i=0;i<InLen;i++)
|
c@120
|
1189 {
|
c@120
|
1190
|
c@120
|
1191 In[i]=Out1[i];
|
c@120
|
1192 }
|
c@120
|
1193
|
c@120
|
1194 free(Out1);
|
c@120
|
1195 }
|
c@120
|
1196 void MeanV( double *InputArray, int InputHLen, int InputVLen, double *OutArray)
|
c@120
|
1197 {
|
c@120
|
1198 int i;
|
c@120
|
1199 int j;
|
c@120
|
1200 double sum;
|
c@120
|
1201
|
c@120
|
1202 for (j=0;j<InputHLen;j++)
|
c@120
|
1203 {
|
c@120
|
1204 sum=0;
|
c@120
|
1205 for (i=0;i<InputVLen;i++)
|
c@120
|
1206 {
|
c@120
|
1207
|
c@120
|
1208 sum=sum+InputArray[i+j*InputVLen];
|
c@120
|
1209
|
c@120
|
1210 }
|
c@120
|
1211 OutArray[j]=sum/InputVLen;
|
c@120
|
1212 }
|
c@120
|
1213
|
c@120
|
1214 }
|
c@120
|
1215 void Edetect(double *InputArray, int InputHLen, int InputVLen, double MinT, double db1,double *OutOne)
|
c@120
|
1216 {
|
c@120
|
1217 int i;
|
c@120
|
1218 int j;
|
c@120
|
1219 double MaxValue;
|
c@120
|
1220
|
c@120
|
1221 // printf(" Starting Energy Onset Detection.. %f\n",db1);
|
c@120
|
1222 RemoveNoise(InputArray, InputHLen, InputVLen);
|
c@120
|
1223
|
c@120
|
1224
|
c@120
|
1225 MaxValue=GetMaxValue(InputArray,InputHLen,InputVLen);
|
c@120
|
1226
|
c@120
|
1227 for (i=0;i<InputVLen;i++)
|
c@120
|
1228 {
|
c@120
|
1229 for (j=0;j<InputHLen;j++)
|
c@120
|
1230 {
|
c@120
|
1231 InputArray[i*InputHLen+j]=InputArray[i*InputHLen+j]-MaxValue;
|
c@120
|
1232
|
c@120
|
1233 }
|
c@120
|
1234
|
c@120
|
1235 }
|
c@120
|
1236
|
c@120
|
1237 MinArray(InputArray, InputHLen, InputVLen, -100);
|
c@120
|
1238 Mydiff(InputArray, InputHLen, InputVLen,3);
|
c@120
|
1239 MinArray(InputArray, InputHLen, InputVLen, MinT);
|
c@120
|
1240
|
c@120
|
1241 for (i=0;i<InputVLen;i++)
|
c@120
|
1242 {
|
c@120
|
1243 for (j=0;j<InputHLen;j++)
|
c@120
|
1244 {
|
c@120
|
1245 InputArray[i*InputHLen+j]=InputArray[i*InputHLen+j]-MinT;
|
c@120
|
1246
|
c@120
|
1247 }
|
c@120
|
1248
|
c@120
|
1249 }
|
c@120
|
1250
|
c@120
|
1251 MeanV(InputArray,InputHLen,InputVLen,OutOne);
|
c@120
|
1252 Smooth(OutOne, InputHLen,3);
|
c@120
|
1253 Smooth(OutOne, InputHLen,3);
|
c@120
|
1254 Move(OutOne,InputHLen,-2);
|
c@120
|
1255 PeakDetect(OutOne,InputHLen);
|
c@120
|
1256 MinArray(OutOne, InputHLen,1, db1);
|
c@120
|
1257
|
c@120
|
1258 for (j=0;j<InputHLen;j++)
|
c@120
|
1259 {
|
c@120
|
1260 OutOne[j]=OutOne[j]-db1;
|
c@120
|
1261
|
c@120
|
1262 }
|
c@120
|
1263 }
|
c@120
|
1264
|
c@120
|
1265
|
c@120
|
1266
|
c@120
|
1267 void OnsetDetection2(double *In,int InputLen,double *OutOne,double a,double b)
|
c@120
|
1268 {
|
c@120
|
1269 int mseconds;
|
c@120
|
1270 double *Input;
|
c@120
|
1271
|
c@120
|
1272
|
c@120
|
1273 mseconds=InputLen;
|
c@120
|
1274
|
c@120
|
1275 Input=(double *)malloc(mseconds*960*sizeof(double));
|
c@120
|
1276
|
c@120
|
1277 ConFrom1050To960(In,Input,InputLen);
|
c@120
|
1278
|
c@120
|
1279
|
c@120
|
1280
|
c@120
|
1281
|
c@120
|
1282 if(a>0)
|
c@120
|
1283 {
|
c@120
|
1284 Edetect(Input,mseconds,960, a,b,OutOne);
|
c@120
|
1285 }
|
c@120
|
1286
|
c@120
|
1287
|
c@120
|
1288 free(Input);
|
c@120
|
1289
|
c@120
|
1290 }
|
c@120
|
1291
|
c@178
|
1292 void PitchEstimation(double *In, int /* InLen */, double *OutArray,double *OutArray2)
|
c@120
|
1293 {
|
c@120
|
1294 double *xx,*x,*y,*y1,*PeakPitch1, *PeakPitch2,*PeakInput1, *PeakInput2;
|
c@120
|
1295 double *out,*outValue;
|
c@120
|
1296 double *output,*output1;
|
c@120
|
1297 int *outc;
|
c@120
|
1298 double temp;
|
c@178
|
1299 int i,sumI;
|
c@120
|
1300 int Len;
|
c@120
|
1301
|
c@120
|
1302 Len=1050;
|
c@120
|
1303 xx=(double*)malloc(Len*sizeof(double));
|
c@120
|
1304 x=(double*)malloc(Len*sizeof(double));
|
c@120
|
1305 y=(double*)malloc(Len*sizeof(double));
|
c@120
|
1306 y1=(double*)malloc(Len*sizeof(double));
|
c@120
|
1307 PeakPitch1=(double*)malloc(Len*sizeof(double));
|
c@120
|
1308 PeakPitch2=(double*)malloc(Len*sizeof(double));
|
c@120
|
1309 PeakInput1=(double*)malloc(Len*sizeof(double));
|
c@120
|
1310 PeakInput2=(double*)malloc(Len*sizeof(double));
|
c@120
|
1311 out=(double*)malloc(Len*sizeof(double));
|
c@120
|
1312 outValue=(double*)malloc(Len*sizeof(double));
|
c@120
|
1313 output=(double*)malloc(112*sizeof(double));
|
c@120
|
1314 output1=(double*)malloc(112*sizeof(double));
|
c@120
|
1315 outc=(int*)malloc(112*sizeof(int));
|
c@120
|
1316 // yI=(double*)malloc(12*sizeof(double));
|
c@120
|
1317
|
c@120
|
1318
|
c@120
|
1319 for (i=0;i<Len;i++)
|
c@120
|
1320 {
|
c@120
|
1321 x[i]=In[i];
|
c@120
|
1322 }
|
c@120
|
1323
|
c@120
|
1324 for (i=0;i<Len;i++)
|
c@120
|
1325 {
|
c@120
|
1326 y1[i]=x[i];
|
c@120
|
1327 }
|
c@120
|
1328
|
c@120
|
1329 ConToPitch1250(y1,Len);
|
c@120
|
1330
|
c@120
|
1331 for (i=0;i<Len;i++)
|
c@120
|
1332 {
|
c@120
|
1333 y[i]=y1[i];
|
c@120
|
1334 }
|
c@120
|
1335
|
c@120
|
1336 Smooth(y,Len,30);
|
c@120
|
1337
|
c@120
|
1338 for (i=0;i<Len;i++)
|
c@120
|
1339 {
|
c@120
|
1340 y1[i]=y1[i]-y[i];
|
c@120
|
1341 }
|
c@120
|
1342
|
c@120
|
1343 for (i=0;i<Len;i++)
|
c@120
|
1344 {
|
c@120
|
1345 y1[i]=y1[i]+20;
|
c@120
|
1346 }
|
c@120
|
1347
|
c@120
|
1348 temp=0;
|
c@120
|
1349 for (i=0;i<Len;i++)
|
c@120
|
1350 {
|
c@120
|
1351 temp=temp+x[i];
|
c@120
|
1352 }
|
c@120
|
1353 temp=temp/Len;
|
c@120
|
1354 for (i=0;i<Len;i++)
|
c@120
|
1355 {
|
c@120
|
1356 y[i]=x[i]-temp;
|
c@120
|
1357 }
|
c@120
|
1358
|
c@120
|
1359
|
c@120
|
1360 for (i=0;i<Len;i++)
|
c@120
|
1361 {
|
c@120
|
1362 PeakPitch2[i]=0;
|
c@120
|
1363 PeakPitch1[i]=0;
|
c@120
|
1364 PeakInput1[i]=0;
|
c@120
|
1365 PeakInput2[i]=0;
|
c@120
|
1366 }
|
c@120
|
1367 FindPeaks(y1, Len,PeakPitch1,PeakPitch2, 0, -1000, -1000);
|
c@120
|
1368 FindPeaks(y, Len,PeakInput1,PeakInput2, 0, 6, 15);
|
c@120
|
1369
|
c@120
|
1370
|
c@120
|
1371
|
c@120
|
1372 sumI=0;
|
c@120
|
1373 for (i=0;i<Len;i++)
|
c@120
|
1374 {
|
c@120
|
1375 sumI=sumI+PeakPitch2[i];
|
c@120
|
1376 }
|
c@120
|
1377
|
c@120
|
1378
|
c@120
|
1379 if (sumI>12)
|
c@120
|
1380 {
|
c@120
|
1381 FindMaxN(PeakPitch1,Len,12);
|
c@120
|
1382
|
c@120
|
1383 for (i=0;i<Len;i++)
|
c@120
|
1384 {
|
c@120
|
1385 if(PeakPitch1[i]==0)
|
c@120
|
1386 {
|
c@120
|
1387 PeakPitch2[i]=0;
|
c@120
|
1388 }
|
c@120
|
1389 }
|
c@120
|
1390
|
c@120
|
1391 }
|
c@120
|
1392
|
c@120
|
1393 for (i=0;i<Len;i++)
|
c@120
|
1394 {
|
c@120
|
1395 out[i]=0;
|
c@120
|
1396 outValue[i]=0;
|
c@120
|
1397 }
|
c@120
|
1398
|
c@120
|
1399 for (i=0;i<(Len-300);i++)
|
c@120
|
1400 {
|
c@120
|
1401 if(PeakPitch2[i]==1)
|
c@120
|
1402
|
c@120
|
1403 {
|
c@120
|
1404 if (
|
c@120
|
1405 ((SumF(PeakInput2,i-4,i+4)>0)&&(SumF(PeakInput2,i+120-4,i+120+4)>0))
|
c@120
|
1406 ||((SumF(PeakInput2,i-4,i+4)>0)&&(SumF(PeakInput2,i+190-4,i+190+4)>0))
|
c@120
|
1407 ||((SumF(PeakInput2,i+190-4,i+190+4)>0)&&(SumF(PeakInput2,i+120-4,i+120+4)>0))
|
c@120
|
1408 )
|
c@120
|
1409 {
|
c@120
|
1410 out[i]=1;
|
c@120
|
1411 outValue[i]=y1[i];
|
c@120
|
1412
|
c@120
|
1413 }
|
c@120
|
1414 }
|
c@120
|
1415 }
|
c@120
|
1416
|
c@120
|
1417 for (i=0;i<112;i++)
|
c@120
|
1418 {
|
c@120
|
1419 output[i]=0;
|
c@120
|
1420 outc[i]=0;
|
c@120
|
1421 }
|
c@120
|
1422
|
c@120
|
1423
|
c@120
|
1424
|
c@120
|
1425 for (i=0;i<Len;i++)
|
c@120
|
1426 {
|
c@120
|
1427 if(out[i]==1)
|
c@120
|
1428 {
|
c@120
|
1429 output[20+round10(i+1)-1]=1;
|
c@120
|
1430 outc[20+round10(i+1)-1]=i;
|
c@120
|
1431 }
|
c@120
|
1432 }
|
c@120
|
1433
|
c@120
|
1434
|
c@120
|
1435 for (i=0;i<112;i++)
|
c@120
|
1436 {
|
c@120
|
1437 output1[i]=output[i];
|
c@120
|
1438 }
|
c@120
|
1439
|
c@120
|
1440
|
c@120
|
1441
|
c@120
|
1442 for (i=20;i<(112-28);i++)
|
c@120
|
1443 {
|
c@120
|
1444 if((output[i]>0)&&(SumF(PeakInput2,outc[i]-5,outc[i]+5)==0))
|
c@120
|
1445 {
|
c@120
|
1446 output1[i]=0;
|
c@120
|
1447 }
|
c@120
|
1448 }
|
c@120
|
1449
|
c@120
|
1450
|
c@120
|
1451 for (i=0;i<112;i++)
|
c@120
|
1452 {
|
c@120
|
1453 OutArray[i]=0;
|
c@120
|
1454 OutArray2[i]=0;
|
c@120
|
1455
|
c@120
|
1456 }
|
c@120
|
1457
|
c@120
|
1458 for(i=20;i<105;i++)
|
c@120
|
1459 {
|
c@120
|
1460 if(output1[i]==1)
|
c@120
|
1461 {
|
c@120
|
1462 OutArray[i]=outc[i]+200+2;
|
c@120
|
1463 OutArray2[i]=y[outc[i]];
|
c@120
|
1464 }
|
c@120
|
1465 }
|
c@120
|
1466
|
c@120
|
1467 free(xx); // xx=(double*)malloc(Len*sizeof(double));
|
c@120
|
1468 free(x); // x=(double*)malloc(Len*sizeof(double));
|
c@120
|
1469 free(y); // y=(double*)malloc(Len*sizeof(double));
|
c@120
|
1470 free(y1); // y1=(double*)malloc(Len*sizeof(double));
|
c@120
|
1471 free(PeakPitch1); //=(double*)malloc(Len*sizeof(double));
|
c@120
|
1472 free(PeakPitch2); //=(double*)malloc(Len*sizeof(double));
|
c@120
|
1473 free(PeakInput1); //=(double*)malloc(Len*sizeof(double));
|
c@120
|
1474 free(PeakInput2); //=(double*)malloc(Len*sizeof(double));
|
c@120
|
1475 free(out); //=(double*)malloc(Len*sizeof(double));
|
c@120
|
1476 free(outValue); //=(double*)malloc(Len*sizeof(double));
|
c@120
|
1477 free(output); //=(double*)malloc(112*sizeof(double));
|
c@120
|
1478 free(output1); //=(double*)malloc(112*sizeof(double));
|
c@120
|
1479 free(outc); //=(double*)malloc(112*sizeof(int));
|
c@120
|
1480 //free(yI); //=(double*)malloc(12*sizeof(int));
|
c@120
|
1481 // printf(" end free \n");
|
c@120
|
1482 }
|
c@120
|
1483
|
c@120
|
1484 void DoMultiPitch(double *In, int RLen,int CLen, double *Out1, double *Out2)
|
c@120
|
1485 {
|
c@120
|
1486
|
c@120
|
1487 int i, j;
|
c@120
|
1488 double *sum1,*mean1;
|
c@120
|
1489 double MaxV;
|
c@120
|
1490 double *OutArray1, *OutArray2,*tempArray;
|
c@120
|
1491
|
c@120
|
1492 OutArray1=(double *)malloc(112*sizeof(double));
|
c@120
|
1493 OutArray2=(double *)malloc(112*sizeof(double));
|
c@120
|
1494 tempArray=(double *)malloc(RLen*sizeof(double));
|
c@120
|
1495
|
c@120
|
1496 sum1=(double*)malloc(CLen*sizeof(double));
|
c@120
|
1497 mean1=(double*)malloc(CLen*sizeof(double));
|
c@120
|
1498
|
c@120
|
1499 for (j=0;j<CLen;j++)
|
c@120
|
1500 {
|
c@120
|
1501 sum1[j]=0;
|
c@120
|
1502 for (i=0;i<RLen;i++)
|
c@120
|
1503 {
|
c@120
|
1504 sum1[j]=sum1[j]+In[j*RLen+i];
|
c@120
|
1505 }
|
c@120
|
1506
|
c@120
|
1507 mean1[j]=sum1[j]/CLen;
|
c@120
|
1508 }
|
c@120
|
1509 MaxV=mean1[0];
|
c@120
|
1510 for (j=0;j<CLen;j++)
|
c@120
|
1511 {
|
c@120
|
1512 if(mean1[j]>MaxV)
|
c@120
|
1513 {
|
c@120
|
1514 MaxV=mean1[j];
|
c@120
|
1515 }
|
c@120
|
1516 }
|
c@120
|
1517
|
c@120
|
1518 for (j=0;j<CLen;j++)
|
c@120
|
1519 {
|
c@120
|
1520 mean1[j]=mean1[j]-MaxV;
|
c@120
|
1521 }
|
c@120
|
1522
|
c@120
|
1523
|
c@120
|
1524 for (j=0;j<CLen;j++)
|
c@120
|
1525 {
|
c@120
|
1526
|
c@120
|
1527 for (i=0;i<112;i++)
|
c@120
|
1528 {
|
c@120
|
1529
|
c@120
|
1530 OutArray1[i]=0;
|
c@120
|
1531 OutArray2[i]=0;;
|
c@120
|
1532
|
c@120
|
1533 }
|
c@120
|
1534 MaxV=In[j*RLen];
|
c@120
|
1535 for(i=0;i<RLen;i++)
|
c@120
|
1536 {
|
c@120
|
1537 tempArray[i]=In[j*RLen+i];
|
c@120
|
1538 if(tempArray[i]>MaxV)
|
c@120
|
1539 MaxV=tempArray[i];
|
c@120
|
1540 }
|
c@120
|
1541
|
c@120
|
1542 if(mean1[j]>-55)
|
c@120
|
1543 {
|
c@120
|
1544
|
c@120
|
1545 PitchEstimation(tempArray,RLen,OutArray1,OutArray2);
|
c@120
|
1546
|
c@120
|
1547 for(i=0;i<112;i++)
|
c@120
|
1548 {
|
c@120
|
1549 if(OutArray1[i]>0)
|
c@120
|
1550 {
|
c@120
|
1551 if((MaxV-tempArray[(int)OutArray1[i]-201-1])>40)
|
c@120
|
1552 {
|
c@120
|
1553 OutArray1[i]=0;
|
c@120
|
1554 OutArray2[i]=0;
|
c@120
|
1555 }
|
c@120
|
1556
|
c@120
|
1557 }
|
c@120
|
1558 }
|
c@120
|
1559
|
c@120
|
1560 }
|
c@120
|
1561
|
c@120
|
1562 for (i=0;i<112;i++)
|
c@120
|
1563 {
|
c@120
|
1564
|
c@120
|
1565 Out1[j*112+i]=OutArray1[i];
|
c@120
|
1566 Out2[j*112+i]=OutArray2[i];
|
c@120
|
1567
|
c@120
|
1568 }
|
c@120
|
1569
|
c@120
|
1570 }
|
c@120
|
1571
|
c@120
|
1572 free(OutArray1);
|
c@120
|
1573 free(OutArray2);
|
c@120
|
1574 free(tempArray);
|
c@120
|
1575 free(sum1);
|
c@120
|
1576 free(mean1);
|
c@120
|
1577 }
|
c@120
|
1578
|
c@120
|
1579
|
c@120
|
1580 int OnsetToArray(double *In, int Len, double *OutStart,double *OutEnd)
|
c@120
|
1581 {
|
c@120
|
1582 int count,i;
|
c@120
|
1583
|
c@120
|
1584 count=0;
|
c@120
|
1585
|
c@120
|
1586 for (i=0;i<Len;i++)
|
c@120
|
1587 {
|
c@120
|
1588 if(In[i]>0)
|
c@120
|
1589 {
|
c@120
|
1590 OutStart[count]=i+1;
|
c@120
|
1591 if(count>0)
|
c@120
|
1592 {
|
c@120
|
1593 OutEnd[count-1]=i+1;
|
c@120
|
1594 }
|
c@120
|
1595 count=count+1;
|
c@120
|
1596 }
|
c@120
|
1597 }
|
c@120
|
1598 if (count>0)
|
c@120
|
1599 {
|
c@120
|
1600 OutEnd[count-1]=Len;
|
c@120
|
1601 }
|
c@120
|
1602 return count;
|
c@120
|
1603
|
c@120
|
1604 }
|
c@120
|
1605 void dbfunction( double *InputArray, int InputHLen, int InputVLen,double *OutArray)
|
c@120
|
1606 {
|
c@120
|
1607 int i;
|
c@120
|
1608 int j;
|
c@120
|
1609
|
c@120
|
1610 for (i=0;i<InputVLen;i++)
|
c@120
|
1611 {
|
c@120
|
1612 for (j=0;j<InputHLen;j++)
|
c@120
|
1613 {
|
c@120
|
1614 OutArray[i*InputHLen+j]=20*log10(InputArray[i*InputHLen+j]);
|
c@120
|
1615
|
c@120
|
1616 }
|
c@120
|
1617
|
c@120
|
1618 }
|
c@120
|
1619 }
|
c@120
|
1620
|
c@120
|
1621 void Transcribe(int Len,int inputLen,double *SoundIn,double *out,double *outArray2,double *outArray3,double SampleRate)
|
c@120
|
1622 {
|
c@120
|
1623 int OnsetN;
|
c@120
|
1624 int i,j,k;
|
c@120
|
1625 int count;
|
c@120
|
1626 int index;
|
c@120
|
1627 double *OutStart,*OutEnd;
|
c@120
|
1628 int start,endd,startb=1,start2,endd2;
|
c@120
|
1629 double *A1,*A2,*A3,*A4,*A5,*A6,*D,*D2;
|
c@120
|
1630 double *A6A;
|
c@120
|
1631 double *out2, *PitchOut1,*PitchOut2,*PitchOut3;
|
c@120
|
1632 double sum,maxV,maxVal;
|
c@120
|
1633 double *tempArray;
|
c@120
|
1634 double temp;
|
c@120
|
1635 double p;
|
c@120
|
1636 double M1,M2;
|
c@120
|
1637 double *In;
|
c@120
|
1638 int Len2;
|
c@120
|
1639 double *dbs,*ss,*dbs1,*jj;
|
c@120
|
1640 int TempInt;
|
c@120
|
1641
|
c@120
|
1642
|
c@120
|
1643 A1=(double *)malloc(112*sizeof(double));
|
c@120
|
1644 A2=(double *)malloc(112*sizeof(double));
|
c@120
|
1645 A3=(double *)malloc(112*sizeof(double));
|
c@120
|
1646 A4=(double *)malloc(112*sizeof(double));
|
c@120
|
1647 A5=(double *)malloc(112*sizeof(double));
|
c@120
|
1648 A6=(double *)malloc(112*sizeof(double));
|
c@120
|
1649 D=(double *)malloc(112*sizeof(double));
|
c@120
|
1650 D2=(double *)malloc(112*sizeof(double));
|
c@120
|
1651 PitchOut1=(double *)malloc(112*Len*sizeof(double));
|
c@120
|
1652 PitchOut2=(double *)malloc(112*Len*sizeof(double));
|
c@120
|
1653 PitchOut3=(double *)malloc(112*Len*sizeof(double));
|
c@120
|
1654 OutStart=(double *)malloc(Len*sizeof(double));
|
c@120
|
1655 OutEnd=(double *)malloc(Len*sizeof(double));
|
c@120
|
1656 tempArray=(double *)malloc(sizeof(double)*Len);
|
c@120
|
1657 In=(double *)malloc(sizeof(double)*Len);
|
c@120
|
1658 dbs=(double *)malloc(1050*sizeof(double)*Len);
|
c@120
|
1659 dbs1=(double *)malloc(210*sizeof(double)*Len);
|
c@120
|
1660 ss=(double *)malloc(210*sizeof(double)*Len);
|
c@120
|
1661 jj=(double *)malloc(1050*sizeof(double));
|
c@120
|
1662
|
c@120
|
1663
|
c@120
|
1664
|
c@120
|
1665
|
c@120
|
1666 for(k=0;k<1050;k++)
|
c@120
|
1667 {
|
c@120
|
1668
|
c@120
|
1669 jj[k]=k/5.0;
|
c@120
|
1670
|
c@120
|
1671 }
|
c@120
|
1672
|
c@120
|
1673 sofacomplexMex(SoundIn,ss,inputLen,20,0.5,210,0.03,20,SampleRate);
|
c@120
|
1674 dbfunction(ss, Len, 210,dbs1);
|
c@120
|
1675
|
c@120
|
1676 for(i=0;i<Len;i++)
|
c@120
|
1677 {
|
c@120
|
1678 for(k=0;k<1045;k++)
|
c@120
|
1679 {
|
c@120
|
1680 TempInt=(int)jj[k];
|
c@120
|
1681 dbs[k+i*1050]=(jj[k]-TempInt)*dbs1[TempInt+1+i*210]+(TempInt+1-jj[k])*dbs1[TempInt+i*210];
|
c@120
|
1682
|
c@120
|
1683 }
|
c@120
|
1684
|
c@120
|
1685 for (k=1045;k<1050;k++)
|
c@120
|
1686 {
|
c@120
|
1687 dbs[k+i*1050]=dbs[1044+i*1050];
|
c@120
|
1688 }
|
c@120
|
1689
|
c@120
|
1690 }
|
c@120
|
1691
|
c@120
|
1692 OnsetDetection2(dbs,Len,In,3,1.2);
|
c@120
|
1693 for (i=0;i<Len;i++)
|
c@120
|
1694 {
|
c@120
|
1695 outArray2[i]=In[i];
|
c@120
|
1696
|
c@120
|
1697 }
|
c@120
|
1698
|
c@120
|
1699 OnsetN=0;
|
c@120
|
1700 count=0;
|
c@120
|
1701 for (i=0;i<Len;i++)
|
c@120
|
1702 {
|
c@120
|
1703 if(In[i]>0)
|
c@120
|
1704 {
|
c@120
|
1705 OnsetN=OnsetN+1;
|
c@120
|
1706 count=count+1;
|
c@120
|
1707 }
|
c@120
|
1708 }
|
c@120
|
1709 Len2=count;
|
c@120
|
1710 out2=(double *)malloc(112*Len2*sizeof(double));
|
c@120
|
1711 A6A=(double *)malloc(112*Len2*sizeof(double));
|
c@120
|
1712 OnsetToArray(In,Len,OutStart,OutEnd);
|
c@120
|
1713 DoMultiPitch(dbs,1050,Len, PitchOut1, PitchOut2);
|
c@120
|
1714
|
c@120
|
1715
|
c@120
|
1716 for (i=0;i<Len;i++)
|
c@120
|
1717 {
|
c@120
|
1718 for (j=0;j<112;j++)
|
c@120
|
1719 {
|
c@120
|
1720 PitchOut3[i*112+j]=PitchOut1[i*112+j];
|
c@120
|
1721 if(PitchOut3[i*112+j]>1)
|
c@120
|
1722 PitchOut3[i*112+j]=1;
|
c@120
|
1723 }
|
c@120
|
1724
|
c@120
|
1725 }
|
c@120
|
1726
|
c@120
|
1727
|
c@120
|
1728 for (i=0;i<OnsetN;i++)
|
c@120
|
1729 {
|
c@120
|
1730 for(j=0;j<112;j++)
|
c@120
|
1731 {
|
c@120
|
1732 A1[j]=0;A2[j]=0;A3[j]=0;A4[j]=0;A5[j]=0;A6[j]=0;
|
c@120
|
1733
|
c@120
|
1734 }
|
c@120
|
1735 maxV=0;
|
c@120
|
1736 start=(int)OutStart[i];
|
c@120
|
1737 endd=(int)OutEnd[i];
|
c@120
|
1738 if(i>0)
|
c@120
|
1739 {
|
c@120
|
1740 startb=(int)OutStart[i-1];
|
c@120
|
1741 }
|
c@120
|
1742
|
c@120
|
1743 for (j=0;j<112;j++)
|
c@120
|
1744 {
|
c@120
|
1745 sum=0;
|
c@120
|
1746 count=0;
|
c@120
|
1747 for (k=(start-1);k<endd;k++)
|
c@120
|
1748 {
|
c@120
|
1749 sum=sum+PitchOut3[k*112+j];
|
c@120
|
1750 count=count+1;
|
c@120
|
1751 }
|
c@120
|
1752
|
c@120
|
1753 A1[j]=sum;
|
c@120
|
1754 A6[j]=sum/count;
|
c@120
|
1755 A6A[i*112+j]=sum/count;
|
c@120
|
1756
|
c@120
|
1757 }
|
c@120
|
1758
|
c@120
|
1759 for (j=0;j<112;j++)
|
c@120
|
1760 {
|
c@120
|
1761 maxVal=PitchOut2[start*112+j];
|
c@120
|
1762 for (k=(start-1);k<endd;k++)
|
c@120
|
1763 {
|
c@120
|
1764 if(PitchOut2[k*112+j]>maxVal)
|
c@120
|
1765 {
|
c@120
|
1766 maxVal=PitchOut2[k*112+j];
|
c@120
|
1767 }
|
c@120
|
1768
|
c@120
|
1769 }
|
c@120
|
1770
|
c@120
|
1771 A3[j]=maxVal;
|
c@120
|
1772
|
c@120
|
1773 }
|
c@120
|
1774
|
c@120
|
1775 for (j=0;j<112;j++)
|
c@120
|
1776 {
|
c@120
|
1777 sum=0;
|
c@120
|
1778 count=0;
|
c@120
|
1779 for (k=(start-1);k<endd;k++)
|
c@120
|
1780 {
|
c@120
|
1781 if(PitchOut2[k*112+j]>0)
|
c@120
|
1782 {
|
c@120
|
1783 sum=sum+PitchOut2[k*112+j];
|
c@120
|
1784 count=count+1;
|
c@120
|
1785 }
|
c@120
|
1786 }
|
c@120
|
1787 if(count>0)
|
c@120
|
1788 A4[j]=sum/count;
|
c@120
|
1789 else
|
c@120
|
1790 A4[j]=0;
|
c@120
|
1791 }
|
c@120
|
1792
|
c@120
|
1793
|
c@120
|
1794 for (j=0;j<112;j++)
|
c@120
|
1795 {
|
c@120
|
1796 sum=0;
|
c@120
|
1797 count=0;
|
c@120
|
1798 for (k=(start-1);k<endd;k++)
|
c@120
|
1799 {
|
c@120
|
1800 if(PitchOut1[k*112+j]>0)
|
c@120
|
1801 {
|
c@120
|
1802 sum=sum+PitchOut1[k*112+j];
|
c@120
|
1803 count=count+1;
|
c@120
|
1804 }
|
c@120
|
1805 }
|
c@120
|
1806 if(count>0)
|
c@120
|
1807 A5[j]=sum/count;
|
c@120
|
1808 else
|
c@120
|
1809 A5[j]=0;
|
c@120
|
1810 }
|
c@120
|
1811
|
c@120
|
1812 maxV=A3[0];
|
c@120
|
1813 for (j=0;j<112;j++)
|
c@120
|
1814 {
|
c@120
|
1815 if(A3[j]>maxV)
|
c@120
|
1816 maxV=A3[j];
|
c@120
|
1817 }
|
c@120
|
1818
|
c@120
|
1819 for (j=0;j<112;j++)
|
c@120
|
1820 {
|
c@120
|
1821
|
c@120
|
1822 if(A1[j]>0)
|
c@120
|
1823 {
|
c@120
|
1824 D[j]=A1[j];D2[j]=A1[j];
|
c@120
|
1825 }
|
c@120
|
1826
|
c@120
|
1827 else
|
c@120
|
1828 {
|
c@120
|
1829 D[j]=A1[j];D2[j]=A1[j];
|
c@120
|
1830 }
|
c@120
|
1831 }
|
c@120
|
1832
|
c@120
|
1833 for (j=0;j<112;j++)
|
c@120
|
1834 {
|
c@120
|
1835 if(A1[j]<8)
|
c@120
|
1836 {
|
c@120
|
1837 D[j]=0;D2[j]=0;
|
c@120
|
1838 }
|
c@120
|
1839
|
c@120
|
1840 }
|
c@120
|
1841
|
c@120
|
1842 for(j=0;j<112;j++)
|
c@120
|
1843 {
|
c@120
|
1844
|
c@120
|
1845 if ((j>12)&&(D[j]>0)&&(D[j-12]>0))
|
c@120
|
1846 {
|
c@120
|
1847 D[j]=0; D2[j]=0;
|
c@120
|
1848 if((A3[j]>45)&&(A3[j]>(A3[j-12]+3)))
|
c@120
|
1849 {
|
c@120
|
1850 D[j]=1;
|
c@120
|
1851 }
|
c@120
|
1852 }
|
c@120
|
1853
|
c@120
|
1854
|
c@120
|
1855 if ((j>19)&&(D[j]>0)&&(D[j-19]>0))
|
c@120
|
1856 {
|
c@120
|
1857
|
c@120
|
1858 D[j]=0; D2[j]=0;
|
c@120
|
1859 if((A3[j]>50))
|
c@120
|
1860 {
|
c@120
|
1861 D[j]=1;
|
c@120
|
1862 }
|
c@120
|
1863 }
|
c@120
|
1864
|
c@120
|
1865 if ((j>24)&&(D[j]>0)&&(D[j-24]>0))
|
c@120
|
1866 {
|
c@120
|
1867
|
c@120
|
1868 D[j]=0; D2[j]=0;
|
c@120
|
1869 if((A3[j]>50))
|
c@120
|
1870 {
|
c@120
|
1871 D[j]=1;
|
c@120
|
1872 }
|
c@120
|
1873 }
|
c@120
|
1874
|
c@120
|
1875 if ((j>28)&&(D[j]>0)&&(D[j-28]>0))
|
c@120
|
1876 {
|
c@120
|
1877
|
c@120
|
1878 D[j]=0; D2[j]=0;
|
c@120
|
1879 if((A3[j]>50))
|
c@120
|
1880 {
|
c@120
|
1881 D[j]=1;
|
c@120
|
1882 }
|
c@120
|
1883 }
|
c@120
|
1884
|
c@183
|
1885 if ((j>34)&&(fabs(A5[j]-337.0-A5[j-34])<3.0)&&(D[j]>0)&&(D[j-34]>0))
|
c@120
|
1886 {
|
c@120
|
1887
|
c@120
|
1888 D[j]=0; D2[j]=0;
|
c@120
|
1889 if((A4[j]>25)&&(A3[j]>40)&&(A3[j]>(A3[j-34]-3))&&((A1[j]>8)||(A6[j]>0.8)))
|
c@120
|
1890 {
|
c@120
|
1891 D[j]=1;
|
c@120
|
1892 }
|
c@120
|
1893 }
|
c@120
|
1894
|
c@120
|
1895 if((j>48)&&(j<59)&&(A3[j]<20))
|
c@120
|
1896 {
|
c@120
|
1897 D[j]=0;
|
c@120
|
1898 }
|
c@120
|
1899
|
c@120
|
1900 if((j>58)&&(j<69)&&(A3[j]<28))
|
c@120
|
1901 {
|
c@120
|
1902 D[j]=0;
|
c@120
|
1903 }
|
c@120
|
1904
|
c@120
|
1905
|
c@120
|
1906 if((j>68)&&(j<79)&&(A3[j]<40))
|
c@120
|
1907 {
|
c@120
|
1908 D[j]=0;
|
c@120
|
1909 }
|
c@120
|
1910
|
c@120
|
1911 if((j>78)&&(A3[j]<50))
|
c@120
|
1912 {
|
c@120
|
1913 D[j]=0;
|
c@120
|
1914 }
|
c@120
|
1915
|
c@120
|
1916 if((j>85)&&(A3[j]<55))
|
c@120
|
1917 {
|
c@120
|
1918 D[j]=0;
|
c@120
|
1919 }
|
c@120
|
1920
|
c@120
|
1921 if((D2[j]>0)&&(A1[j]>15))
|
c@120
|
1922 {
|
c@120
|
1923 D[j]=1;
|
c@120
|
1924 }
|
c@120
|
1925 if(i>1)
|
c@120
|
1926 {
|
c@120
|
1927
|
c@120
|
1928 for (k=(startb-1);k<start;k++)
|
c@120
|
1929 {
|
c@120
|
1930 tempArray[k-startb+1]=PitchOut3[j+k*112];
|
c@120
|
1931
|
c@120
|
1932 }
|
c@120
|
1933 temp=Sum(tempArray,start-startb+1);
|
c@120
|
1934 if(((maxV-A3[j])>20)&&(temp>3))
|
c@120
|
1935 {
|
c@120
|
1936 D[j]=0;
|
c@120
|
1937 }
|
c@120
|
1938
|
c@120
|
1939 }
|
c@120
|
1940
|
c@120
|
1941 }
|
c@120
|
1942
|
c@120
|
1943 for(j=0;j<112;j++)
|
c@120
|
1944 {
|
c@120
|
1945 out[j+i*112]=D[j];
|
c@120
|
1946 out2[j+i*112]=D[j];
|
c@120
|
1947 }
|
c@120
|
1948 }
|
c@120
|
1949
|
c@120
|
1950 for (i=1;i<OnsetN;i++)
|
c@120
|
1951 {
|
c@120
|
1952 start2=(int)OutStart[i];
|
c@120
|
1953 endd2=(int)OutEnd[i];
|
c@120
|
1954
|
c@120
|
1955 for (j=0;j<112;j++)
|
c@120
|
1956 {
|
c@120
|
1957 sum=0;
|
c@120
|
1958 count=0;
|
c@120
|
1959 for (k=(start2-1);k<endd2;k++)
|
c@120
|
1960 {
|
c@120
|
1961 sum=sum+PitchOut3[k*112+j];
|
c@120
|
1962 count=count+1;
|
c@120
|
1963 }
|
c@120
|
1964
|
c@120
|
1965 A1[j]=sum;
|
c@120
|
1966 }
|
c@120
|
1967
|
c@120
|
1968 for (j=0;j<112;j++)
|
c@120
|
1969 {
|
c@120
|
1970 if((out2[(i-1)*112+j]>0)&&(out[j+i*112]>0))
|
c@120
|
1971 {
|
c@120
|
1972 out[j+i*112]=0;
|
c@120
|
1973 sum=0;
|
c@120
|
1974 for(k=(start2-1);k<endd2;k++)
|
c@120
|
1975 {
|
c@120
|
1976 sum=sum+PitchOut1[j+k*112];
|
c@120
|
1977
|
c@120
|
1978 }
|
c@120
|
1979 p=sum/A1[j];
|
c@120
|
1980
|
c@120
|
1981 index=(int)(p+0.5)-200;
|
c@120
|
1982
|
c@120
|
1983 if((index>0)&&(i<(OnsetN-1))&&(start2>5))
|
c@120
|
1984 {
|
c@120
|
1985
|
c@120
|
1986 M1=dbs[index+(start2-1)*1050];
|
c@120
|
1987 for (k=(start2-1);k<(start2+10);k++)
|
c@120
|
1988 {
|
c@120
|
1989 if(dbs[index+k*1050]>M1)
|
c@120
|
1990 M1=dbs[index+k*1050];
|
c@120
|
1991
|
c@120
|
1992 }
|
c@120
|
1993
|
c@120
|
1994 M2=dbs[index+(start2-5-1)*1050];
|
c@120
|
1995 for (k=(start2-5-1);k<start2;k++)
|
c@120
|
1996 {
|
c@120
|
1997 if(dbs[index+k*1050]<M2)
|
c@120
|
1998 M2=dbs[index+k*1050];
|
c@120
|
1999
|
c@120
|
2000 }
|
c@120
|
2001
|
c@120
|
2002 if((M1-M2)>10)
|
c@120
|
2003 {
|
c@120
|
2004 out[j+i*112]=1;
|
c@120
|
2005 }
|
c@120
|
2006 }
|
c@120
|
2007 }
|
c@120
|
2008 }
|
c@120
|
2009 }
|
c@120
|
2010
|
c@120
|
2011 count=0;
|
c@120
|
2012 for (i=0;i<OnsetN;i++)
|
c@120
|
2013 {
|
c@120
|
2014
|
c@120
|
2015 start=(int)OutStart[i];
|
c@120
|
2016 endd=(int)OutEnd[i];
|
c@120
|
2017
|
c@120
|
2018 for(j=0;j<112;j++)
|
c@120
|
2019 {
|
c@120
|
2020 if(out[j+i*112]>0)
|
c@120
|
2021 {
|
c@120
|
2022 outArray3[count*3+0]=j+1-21;//exp((log(2.0))*(j+1-69)/12)*440;
|
c@120
|
2023 outArray3[count*3+1]=start*0.01;
|
c@120
|
2024
|
c@120
|
2025 if(i==(OnsetN-1))
|
c@120
|
2026 {
|
c@120
|
2027 outArray3[count*3+2]=0.01*OutEnd[i];
|
c@120
|
2028 }
|
c@120
|
2029 else
|
c@120
|
2030 {
|
c@120
|
2031
|
c@120
|
2032 for(k=(i+1);k<OnsetN;k++)
|
c@120
|
2033 {
|
c@120
|
2034
|
c@120
|
2035 if(k==(OnsetN-1))
|
c@120
|
2036 {
|
c@120
|
2037 outArray3[count*3+2]=0.01*OutEnd[k];
|
c@120
|
2038 }
|
c@120
|
2039
|
c@120
|
2040 if(out[j+k*112]>0)
|
c@120
|
2041 {
|
c@120
|
2042 outArray3[count*3+2]=0.01*OutStart[k];
|
c@120
|
2043 break;
|
c@120
|
2044 }
|
c@120
|
2045
|
c@120
|
2046 if(A6A[k*112+j]<0.5)
|
c@120
|
2047 {
|
c@120
|
2048 outArray3[count*3+2]=0.01*OutStart[k];
|
c@120
|
2049 break;
|
c@120
|
2050
|
c@120
|
2051 }
|
c@120
|
2052
|
c@120
|
2053 }
|
c@120
|
2054
|
c@120
|
2055 }
|
c@120
|
2056
|
c@120
|
2057 count=count+1;
|
c@120
|
2058 }
|
c@120
|
2059
|
c@120
|
2060 }
|
c@120
|
2061
|
c@120
|
2062 }
|
c@120
|
2063 outArray3[count*3+0]=0;
|
c@120
|
2064 outArray3[count*3+1]=0;
|
c@120
|
2065 outArray3[count*3+2]=0;
|
c@120
|
2066
|
c@120
|
2067 free(tempArray);
|
c@120
|
2068 free(OutStart);
|
c@120
|
2069 free(OutEnd);
|
c@120
|
2070 free(A1);
|
c@120
|
2071 free(A2);
|
c@120
|
2072 free(A3);
|
c@120
|
2073 free(A4);
|
c@120
|
2074 free(A5);
|
c@120
|
2075 free(A6);
|
c@120
|
2076 free(A6A);
|
c@120
|
2077 free(D);
|
c@120
|
2078 free(D2);
|
c@120
|
2079 free(out2);
|
c@120
|
2080 free(PitchOut1);
|
c@120
|
2081 free(PitchOut2);
|
c@120
|
2082 free(PitchOut3);
|
c@120
|
2083 free(In);
|
c@120
|
2084 free(dbs);
|
c@120
|
2085 free(dbs1);
|
c@120
|
2086 free(ss);
|
c@120
|
2087 free(jj);
|
c@120
|
2088 }
|
c@120
|
2089
|