annotate data/model/test/MockWaveModel.cpp @ 1196:c7b9c902642f spectrogram-minor-refactor

Fix threshold in spectrogram -- it wasn't working in the last release. There is a new protocol for this. Formerly the threshold parameter had a range from -50dB to 0 with the default at -50, and -50 treated internally as "no threshold". However, there was a hardcoded, hidden internal threshold for spectrogram colour mapping at -80dB with anything below this being rounded to zero. Now the threshold parameter has range -81 to -1 with the default at -80, -81 is treated internally as "no threshold", and there is no hidden internal threshold. So the default behaviour is the same as before, an effective -80dB threshold, but it is now possible to change this in both directions. Sessions reloaded from prior versions may look slightly different because, if the session says there should be no threshold, there will now actually be no threshold instead of having the hidden internal one. Still need to do something in the UI to make it apparent that the -81dB setting removes the threshold entirely. This is at least no worse than the previous, also obscured, magic -50dB setting.
author Chris Cannam
date Mon, 01 Aug 2016 16:21:01 +0100
parents 1309b66eff53
children 54af1e21705c
rev   line source
Chris@1086 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1086 2
Chris@1086 3 /*
Chris@1086 4 Sonic Visualiser
Chris@1086 5 An audio file viewer and annotation editor.
Chris@1086 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1086 7 This file copyright 2006 Chris Cannam.
Chris@1086 8
Chris@1086 9 This program is free software; you can redistribute it and/or
Chris@1086 10 modify it under the terms of the GNU General Public License as
Chris@1086 11 published by the Free Software Foundation; either version 2 of the
Chris@1086 12 License, or (at your option) any later version. See the file
Chris@1086 13 COPYING included with this distribution for more information.
Chris@1086 14 */
Chris@1086 15
Chris@1086 16 #include "MockWaveModel.h"
Chris@1086 17
Chris@1137 18 #include <cmath>
Chris@1137 19
Chris@1086 20 using namespace std;
Chris@1086 21
Chris@1088 22 MockWaveModel::MockWaveModel(vector<Sort> sorts, int length, int pad)
Chris@1086 23 {
Chris@1086 24 for (auto sort: sorts) {
Chris@1088 25 m_data.push_back(generate(sort, length, pad));
Chris@1086 26 }
Chris@1086 27 }
Chris@1086 28
Chris@1096 29 vector<float>
Chris@1096 30 MockWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const
Chris@1086 31 {
Chris@1086 32 sv_frame_t i = 0;
Chris@1086 33
Chris@1091 34 // cerr << "MockWaveModel::getData(" << channel << "," << start << "," << count << "): ";
Chris@1086 35
Chris@1096 36 vector<float> data;
Chris@1096 37
Chris@1086 38 while (i < count) {
Chris@1086 39 sv_frame_t idx = start + i;
Chris@1086 40 if (!in_range_for(m_data[channel], idx)) break;
Chris@1096 41 data.push_back(m_data[channel][idx]);
Chris@1096 42 // cerr << data[i] << " ";
Chris@1086 43 ++i;
Chris@1086 44 }
Chris@1086 45
Chris@1091 46 // cerr << endl;
Chris@1086 47
Chris@1096 48 return data;
Chris@1086 49 }
Chris@1086 50
Chris@1096 51 vector<vector<float>>
Chris@1086 52 MockWaveModel::getMultiChannelData(int fromchannel, int tochannel,
Chris@1096 53 sv_frame_t start, sv_frame_t count) const
Chris@1086 54 {
Chris@1096 55 vector<vector<float>> data(tochannel - fromchannel + 1);
Chris@1096 56
Chris@1086 57 for (int c = fromchannel; c <= tochannel; ++c) {
Chris@1096 58 data.push_back(getData(c, start, count));
Chris@1086 59 }
Chris@1086 60
Chris@1096 61 return data;
Chris@1086 62 }
Chris@1086 63
Chris@1086 64 vector<float>
Chris@1088 65 MockWaveModel::generate(Sort sort, int length, int pad) const
Chris@1086 66 {
Chris@1086 67 vector<float> data;
Chris@1086 68
Chris@1088 69 for (int i = 0; i < pad; ++i) {
Chris@1088 70 data.push_back(0.f);
Chris@1088 71 }
Chris@1088 72
Chris@1086 73 for (int i = 0; i < length; ++i) {
Chris@1086 74
Chris@1087 75 double v = 0.0;
Chris@1086 76
Chris@1086 77 switch (sort) {
Chris@1087 78 case DC: v = 1.0; break;
Chris@1087 79 case Sine: v = sin((2.0 * M_PI / 8.0) * i); break;
Chris@1087 80 case Cosine: v = cos((2.0 * M_PI / 8.0) * i); break;
Chris@1086 81 case Nyquist: v = (i % 2) * 2 - 1; break;
Chris@1087 82 case Dirac: v = (i == 0) ? 1.0 : 0.0; break;
Chris@1086 83 }
Chris@1086 84
Chris@1087 85 data.push_back(float(v));
Chris@1086 86 }
Chris@1086 87
Chris@1088 88 for (int i = 0; i < pad; ++i) {
Chris@1088 89 data.push_back(0.f);
Chris@1088 90 }
Chris@1088 91
Chris@1086 92 return data;
Chris@1086 93 }
Chris@1086 94