comparison layer/SliceLayer.cpp @ 944:78c152e4db95

Merge from branch tonioni
author Chris Cannam
date Mon, 20 Apr 2015 09:12:17 +0100
parents 12ab113ca2b1
children 94e4952a6774
comparison
equal deleted inserted replaced
896:78e041e45ff0 944:78c152e4db95
117 if (minbin >= mh) minbin = mh - 1; 117 if (minbin >= mh) minbin = mh - 1;
118 if (maxbin >= mh) maxbin = mh - 1; 118 if (maxbin >= mh) maxbin = mh - 1;
119 if (minbin < 0) minbin = 0; 119 if (minbin < 0) minbin = 0;
120 if (maxbin < 0) maxbin = 0; 120 if (maxbin < 0) maxbin = 0;
121 121
122 int sampleRate = m_sliceableModel->getSampleRate(); 122 sv_samplerate_t sampleRate = m_sliceableModel->getSampleRate();
123 123
124 int f0 = m_currentf0; 124 sv_frame_t f0 = m_currentf0;
125 int f1 = m_currentf1; 125 sv_frame_t f1 = m_currentf1;
126 126
127 RealTime rt0 = RealTime::frame2RealTime(f0, sampleRate); 127 RealTime rt0 = RealTime::frame2RealTime(f0, sampleRate);
128 RealTime rt1 = RealTime::frame2RealTime(f1, sampleRate); 128 RealTime rt1 = RealTime::frame2RealTime(f1, sampleRate);
129 129
130 range = f1 - f0 + 1; 130 range = int(f1 - f0 + 1);
131 131
132 QString rtrangestr = QString("%1 s").arg((rt1 - rt0).toText().c_str()); 132 QString rtrangestr = QString("%1 s").arg((rt1 - rt0).toText().c_str());
133 133
134 if (includeBinDescription) { 134 if (includeBinDescription) {
135 135
136 float minvalue = 0.f; 136 float minvalue = 0.0;
137 if (minbin < int(m_values.size())) minvalue = m_values[minbin]; 137 if (minbin < int(m_values.size())) minvalue = m_values[minbin];
138 138
139 float maxvalue = minvalue; 139 float maxvalue = minvalue;
140 if (maxbin < int(m_values.size())) maxvalue = m_values[maxbin]; 140 if (maxbin < int(m_values.size())) maxvalue = m_values[maxbin];
141 141
177 177
178 return description; 178 return description;
179 } 179 }
180 } 180 }
181 181
182 float 182 double
183 SliceLayer::getXForBin(int bin, int count, float w) const 183 SliceLayer::getXForBin(int bin, int count, double w) const
184 { 184 {
185 float x = 0; 185 double x = 0;
186 186
187 switch (m_binScale) { 187 switch (m_binScale) {
188 188
189 case LinearBins: 189 case LinearBins:
190 x = (float(w) * bin) / count; 190 x = (w * bin) / count;
191 break; 191 break;
192 192
193 case LogBins: 193 case LogBins:
194 x = (float(w) * log10f(bin + 1)) / log10f(count + 1); 194 x = (w * log10(bin + 1)) / log10(count + 1);
195 break; 195 break;
196 196
197 case InvertedLogBins: 197 case InvertedLogBins:
198 x = w - (float(w) * log10f(count - bin - 1)) / log10f(count); 198 x = w - (w * log10(count - bin - 1)) / log10(count);
199 break; 199 break;
200 } 200 }
201 201
202 return x; 202 return x;
203 } 203 }
204 204
205 int 205 int
206 SliceLayer::getBinForX(float x, int count, float w) const 206 SliceLayer::getBinForX(double x, int count, double w) const
207 { 207 {
208 int bin = 0; 208 int bin = 0;
209 209
210 switch (m_binScale) { 210 switch (m_binScale) {
211 211
212 case LinearBins: 212 case LinearBins:
213 bin = int((x * count) / w + 0.0001); 213 bin = int((x * count) / w + 0.0001);
214 break; 214 break;
215 215
216 case LogBins: 216 case LogBins:
217 bin = int(powf(10.f, (x * log10f(count + 1)) / w) - 1 + 0.0001); 217 bin = int(pow(10.0, (x * log10(count + 1)) / w) - 1 + 0.0001);
218 break; 218 break;
219 219
220 case InvertedLogBins: 220 case InvertedLogBins:
221 bin = count + 1 - int(powf(10.f, (log10f(count) * (w - x)) / float(w)) + 0.0001); 221 bin = count + 1 - int(pow(10.0, (log10(count) * (w - x)) / double(w)) + 0.0001);
222 break; 222 break;
223 } 223 }
224 224
225 return bin; 225 return bin;
226 } 226 }
227 227
228 float 228 double
229 SliceLayer::getYForValue(float value, const View *v, float &norm) const 229 SliceLayer::getYForValue(double value, const View *v, double &norm) const
230 { 230 {
231 norm = 0.f; 231 norm = 0.0;
232 232
233 if (m_yorigins.find(v) == m_yorigins.end()) return 0; 233 if (m_yorigins.find(v) == m_yorigins.end()) return 0;
234 234
235 value *= m_gain; 235 value *= m_gain;
236 236
237 int yorigin = m_yorigins[v]; 237 int yorigin = m_yorigins[v];
238 int h = m_heights[v]; 238 int h = m_heights[v];
239 float thresh = getThresholdDb(); 239 double thresh = getThresholdDb();
240 240
241 float y = 0.f; 241 double y = 0.0;
242 242
243 if (h <= 0) return y; 243 if (h <= 0) return y;
244 244
245 switch (m_energyScale) { 245 switch (m_energyScale) {
246 246
247 case dBScale: 247 case dBScale:
248 { 248 {
249 float db = thresh; 249 double db = thresh;
250 if (value > 0.f) db = 10.f * log10f(fabsf(value)); 250 if (value > 0.0) db = 10.0 * log10(fabs(value));
251 if (db < thresh) db = thresh; 251 if (db < thresh) db = thresh;
252 norm = (db - thresh) / -thresh; 252 norm = (db - thresh) / -thresh;
253 y = yorigin - (float(h) * norm); 253 y = yorigin - (double(h) * norm);
254 break; 254 break;
255 } 255 }
256 256
257 case MeterScale: 257 case MeterScale:
258 y = AudioLevel::multiplier_to_preview(value, h); 258 y = AudioLevel::multiplier_to_preview(value, h);
259 norm = float(y) / float(h); 259 norm = double(y) / double(h);
260 y = yorigin - y; 260 y = yorigin - y;
261 break; 261 break;
262 262
263 case AbsoluteScale: 263 case AbsoluteScale:
264 value = fabsf(value); 264 value = fabs(value);
265 // and fall through 265 // and fall through
266 266
267 case LinearScale: 267 case LinearScale:
268 default: 268 default:
269 norm = (value - m_threshold); 269 norm = (value - m_threshold);
270 if (norm < 0) norm = 0; 270 if (norm < 0) norm = 0;
271 y = yorigin - (float(h) * norm); 271 y = yorigin - (double(h) * norm);
272 break; 272 break;
273 } 273 }
274 274
275 return y; 275 return y;
276 } 276 }
277 277
278 float 278 double
279 SliceLayer::getValueForY(float y, const View *v) const 279 SliceLayer::getValueForY(double y, const View *v) const
280 { 280 {
281 float value = 0.f; 281 double value = 0.0;
282 282
283 if (m_yorigins.find(v) == m_yorigins.end()) return value; 283 if (m_yorigins.find(v) == m_yorigins.end()) return value;
284 284
285 int yorigin = m_yorigins[v]; 285 int yorigin = m_yorigins[v];
286 int h = m_heights[v]; 286 int h = m_heights[v];
287 float thresh = getThresholdDb(); 287 double thresh = getThresholdDb();
288 288
289 if (h <= 0) return value; 289 if (h <= 0) return value;
290 290
291 y = yorigin - y; 291 y = yorigin - y;
292 292
293 switch (m_energyScale) { 293 switch (m_energyScale) {
294 294
295 case dBScale: 295 case dBScale:
296 { 296 {
297 float db = ((y / h) * -thresh) + thresh; 297 double db = ((y / h) * -thresh) + thresh;
298 value = powf(10.f, db/10.f); 298 value = pow(10.0, db/10.0);
299 break; 299 break;
300 } 300 }
301 301
302 case MeterScale: 302 case MeterScale:
303 value = AudioLevel::preview_to_multiplier(lrintf(y), h); 303 value = AudioLevel::preview_to_multiplier(int(lrint(y)), h);
304 break; 304 break;
305 305
306 case LinearScale: 306 case LinearScale:
307 case AbsoluteScale: 307 case AbsoluteScale:
308 default: 308 default:
352 352
353 int divisor = 0; 353 int divisor = 0;
354 354
355 m_values.clear(); 355 m_values.clear();
356 for (int bin = 0; bin < mh; ++bin) { 356 for (int bin = 0; bin < mh; ++bin) {
357 m_values.push_back(0.f); 357 m_values.push_back(0.0);
358 } 358 }
359 359
360 int f0 = v->getCentreFrame(); 360 sv_frame_t f0 = v->getCentreFrame();
361 int f0x = v->getXForFrame(f0); 361 int f0x = v->getXForFrame(f0);
362 f0 = v->getFrameForX(f0x); 362 f0 = v->getFrameForX(f0x);
363 int f1 = v->getFrameForX(f0x + 1); 363 sv_frame_t f1 = v->getFrameForX(f0x + 1);
364 if (f1 > f0) --f1; 364 if (f1 > f0) --f1;
365 365
366 // cerr << "centre frame " << v->getCentreFrame() << ", x " << f0x << ", f0 " << f0 << ", f1 " << f1 << endl; 366 // cerr << "centre frame " << v->getCentreFrame() << ", x " << f0x << ", f0 " << f0 << ", f1 " << f1 << endl;
367 367
368 int res = m_sliceableModel->getResolution(); 368 int res = m_sliceableModel->getResolution();
369 int col0 = f0 / res; 369 int col0 = int(f0 / res);
370 int col1 = col0; 370 int col1 = col0;
371 if (m_samplingMode != NearestSample) col1 = f1 / res; 371 if (m_samplingMode != NearestSample) col1 = int(f1 / res);
372 f0 = col0 * res; 372 f0 = col0 * res;
373 f1 = (col1 + 1) * res - 1; 373 f1 = (col1 + 1) * res - 1;
374 374
375 // cerr << "resolution " << res << ", col0 " << col0 << ", col1 " << col1 << ", f0 " << f0 << ", f1 " << f1 << endl; 375 // cerr << "resolution " << res << ", col0 " << col0 << ", col1 " << col1 << ", f0 " << f0 << ", f1 " << f1 << endl;
376 376
377 m_currentf0 = f0; 377 m_currentf0 = f0;
378 m_currentf1 = f1; 378 m_currentf1 = f1;
379 379
380 BiasCurve curve; 380 BiasCurve curve;
381 getBiasCurve(curve); 381 getBiasCurve(curve);
382 int cs = curve.size(); 382 int cs = int(curve.size());
383 383
384 for (int col = col0; col <= col1; ++col) { 384 for (int col = col0; col <= col1; ++col) {
385 for (int bin = 0; bin < mh; ++bin) { 385 for (int bin = 0; bin < mh; ++bin) {
386 float value = m_sliceableModel->getValueAt(col, bin); 386 float value = m_sliceableModel->getValueAt(col, bin);
387 if (bin < cs) value *= curve[bin]; 387 if (bin < cs) value *= curve[bin];
392 } 392 }
393 } 393 }
394 ++divisor; 394 ++divisor;
395 } 395 }
396 396
397 float max = 0.f; 397 float max = 0.0;
398 for (int bin = 0; bin < mh; ++bin) { 398 for (int bin = 0; bin < mh; ++bin) {
399 if (m_samplingMode == SampleMean && divisor > 0) { 399 if (m_samplingMode == SampleMean && divisor > 0) {
400 m_values[bin] /= divisor; 400 m_values[bin] /= float(divisor);
401 } 401 }
402 if (m_values[bin] > max) max = m_values[bin]; 402 if (m_values[bin] > max) max = m_values[bin];
403 } 403 }
404 if (max != 0.f && m_normalize) { 404 if (max != 0.0 && m_normalize) {
405 for (int bin = 0; bin < mh; ++bin) { 405 for (int bin = 0; bin < mh; ++bin) {
406 m_values[bin] /= max; 406 m_values[bin] /= max;
407 } 407 }
408 } 408 }
409 409
410 float nx = xorigin; 410 double nx = xorigin;
411 411
412 ColourMapper mapper(m_colourMap, 0, 1); 412 ColourMapper mapper(m_colourMap, 0, 1);
413 413
414 for (int bin = 0; bin < mh; ++bin) { 414 for (int bin = 0; bin < mh; ++bin) {
415 415
416 float x = nx; 416 double x = nx;
417 nx = xorigin + getXForBin(bin + 1, mh, w); 417 nx = xorigin + getXForBin(bin + 1, mh, w);
418 418
419 float value = m_values[bin]; 419 double value = m_values[bin];
420 float norm = 0.f; 420 double norm = 0.0;
421 float y = getYForValue(value, v, norm); 421 double y = getYForValue(value, v, norm);
422 422
423 if (m_plotStyle == PlotLines) { 423 if (m_plotStyle == PlotLines) {
424 424
425 if (bin == 0) { 425 if (bin == 0) {
426 path.moveTo(x, y); 426 path.moveTo(x, y);
513 } 513 }
514 514
515 void 515 void
516 SliceLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const 516 SliceLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const
517 { 517 {
518 float thresh = m_threshold; 518 double thresh = m_threshold;
519 if (m_energyScale != LinearScale && m_energyScale != AbsoluteScale) { 519 if (m_energyScale != LinearScale && m_energyScale != AbsoluteScale) {
520 thresh = AudioLevel::dB_to_multiplier(getThresholdDb()); 520 thresh = AudioLevel::dB_to_multiplier(getThresholdDb());
521 } 521 }
522 522
523 // int h = (rect.height() * 3) / 4; 523 // int h = (rect.height() * 3) / 4;
536 PaintAssistant::Scale(m_energyScale), 536 PaintAssistant::Scale(m_energyScale),
537 mult, 537 mult,
538 const_cast<std::vector<int> *>(&m_scalePoints)); 538 const_cast<std::vector<int> *>(&m_scalePoints));
539 539
540 if (mult != 1 && mult != 0) { 540 if (mult != 1 && mult != 0) {
541 int log = lrintf(log10f(mult)); 541 int log = int(lrint(log10(mult)));
542 QString a = tr("x10"); 542 QString a = tr("x10");
543 QString b = QString("%1").arg(-log); 543 QString b = QString("%1").arg(-log);
544 paint.drawText(3, 8 + paint.fontMetrics().ascent(), a); 544 paint.drawText(3, 8 + paint.fontMetrics().ascent(), a);
545 paint.drawText(3 + paint.fontMetrics().width(a), 545 paint.drawText(3 + paint.fontMetrics().width(a),
546 3 + paint.fontMetrics().ascent(), b); 546 3 + paint.fontMetrics().ascent(), b);
625 *max = 50; 625 *max = 50;
626 *deflt = 0; 626 *deflt = 0;
627 627
628 cerr << "gain is " << m_gain << ", mode is " << m_samplingMode << endl; 628 cerr << "gain is " << m_gain << ", mode is " << m_samplingMode << endl;
629 629
630 val = lrint(log10(m_gain) * 20.0); 630 val = int(lrint(log10(m_gain) * 20.0));
631 if (val < *min) val = *min; 631 if (val < *min) val = *min;
632 if (val > *max) val = *max; 632 if (val > *max) val = *max;
633 633
634 } else if (name == "Threshold") { 634 } else if (name == "Threshold") {
635 635
636 *min = -80; 636 *min = -80;
637 *max = 0; 637 *max = 0;
638 638
639 *deflt = lrintf(AudioLevel::multiplier_to_dB(m_initialThreshold)); 639 *deflt = int(lrint(AudioLevel::multiplier_to_dB(m_initialThreshold)));
640 if (*deflt < *min) *deflt = *min; 640 if (*deflt < *min) *deflt = *min;
641 if (*deflt > *max) *deflt = *max; 641 if (*deflt > *max) *deflt = *max;
642 642
643 val = lrintf(AudioLevel::multiplier_to_dB(m_threshold)); 643 val = int(lrint(AudioLevel::multiplier_to_dB(m_threshold)));
644 if (val < *min) val = *min; 644 if (val < *min) val = *min;
645 if (val > *max) val = *max; 645 if (val > *max) val = *max;
646 646
647 } else if (name == "Normalize") { 647 } else if (name == "Normalize") {
648 648
755 755
756 void 756 void
757 SliceLayer::setProperty(const PropertyName &name, int value) 757 SliceLayer::setProperty(const PropertyName &name, int value)
758 { 758 {
759 if (name == "Gain") { 759 if (name == "Gain") {
760 setGain(pow(10, float(value)/20.0)); 760 setGain(powf(10, float(value)/20.0f));
761 } else if (name == "Threshold") { 761 } else if (name == "Threshold") {
762 if (value == -80) setThreshold(0.0); 762 if (value == -80) setThreshold(0.0f);
763 else setThreshold(AudioLevel::dB_to_multiplier(value)); 763 else setThreshold(float(AudioLevel::dB_to_multiplier(value)));
764 } else if (name == "Colour" && m_plotStyle == PlotFilledBlocks) { 764 } else if (name == "Colour" && m_plotStyle == PlotFilledBlocks) {
765 setFillColourMap(value); 765 setFillColourMap(value);
766 } else if (name == "Scale") { 766 } else if (name == "Scale") {
767 switch (value) { 767 switch (value) {
768 default: 768 default:
865 865
866 float 866 float
867 SliceLayer::getThresholdDb() const 867 SliceLayer::getThresholdDb() const
868 { 868 {
869 if (m_threshold == 0.0) return -80.f; 869 if (m_threshold == 0.0) return -80.f;
870 float db = AudioLevel::multiplier_to_dB(m_threshold); 870 float db = float(AudioLevel::multiplier_to_dB(m_threshold));
871 return db; 871 return db;
872 } 872 }
873 873
874 int 874 int
875 SliceLayer::getDefaultColourHint(bool darkbg, bool &impose) 875 SliceLayer::getDefaultColourHint(bool darkbg, bool &impose)
940 bool normalize = (attributes.value("normalize").trimmed() == "true"); 940 bool normalize = (attributes.value("normalize").trimmed() == "true");
941 setNormalize(normalize); 941 setNormalize(normalize);
942 } 942 }
943 943
944 bool 944 bool
945 SliceLayer::getValueExtents(float &, float &, bool &, QString &) const 945 SliceLayer::getValueExtents(double &, double &, bool &, QString &) const
946 { 946 {
947 return false; 947 return false;
948 } 948 }
949 949