comparison src/Analyser.cpp @ 161:afaa4af03b22

Refactor, call to constant-Q plugin instead of spectrogram
author Chris Cannam
date Tue, 28 Jan 2014 16:01:06 +0000
parents 106fdf38c6c9
children cc9aa8f4fceb
comparison
equal deleted inserted replaced
160:106fdf38c6c9 161:afaa4af03b22
29 #include "layer/WaveformLayer.h" 29 #include "layer/WaveformLayer.h"
30 #include "layer/ColourDatabase.h" 30 #include "layer/ColourDatabase.h"
31 #include "layer/ColourMapper.h" 31 #include "layer/ColourMapper.h"
32 #include "layer/LayerFactory.h" 32 #include "layer/LayerFactory.h"
33 #include "layer/SpectrogramLayer.h" 33 #include "layer/SpectrogramLayer.h"
34 #include "layer/Colour3DPlotLayer.h"
34 35
35 #include <QSettings> 36 #include <QSettings>
36 37
37 Analyser::Analyser() : 38 Analyser::Analyser() :
38 m_document(0), 39 m_document(0),
67 m_document = doc; 68 m_document = doc;
68 m_fileModel = model; 69 m_fileModel = model;
69 m_paneStack = paneStack; 70 m_paneStack = paneStack;
70 m_pane = pane; 71 m_pane = pane;
71 72
72 QString plugname = "pYIN"; 73 // Note that we need at least one main-model layer (time ruler,
73 QString base = "vamp:pyin:pyin:"; 74 // waveform or what have you). It could be hidden if we don't want
74 QString f0out = "smoothedpitchtrack"; 75 // to see it but it must exist.
75 QString noteout = "notes"; 76
76 77 QString warning, error;
77 // We need at least one main-model layer (time ruler, waveform or 78
78 // what have you). It could be hidden if we don't want to see it 79 // This isn't fatal -- we can proceed without
79 // but it must exist. 80 // visualisations. Other failures are fatal though.
81 warning = addVisualisations();
82
83 error = addWaveform();
84 if (error != "") return error;
85
86 error = addAnalyses();
87 if (error != "") return error;
88
89 loadState(Audio);
90 loadState(PitchTrack);
91 loadState(Notes);
92 loadState(Spectrogram);
93
94 emit layersChanged();
95
96 return warning;
97 }
98
99 QString
100 Analyser::addVisualisations()
101 {
102 TransformFactory *tf = TransformFactory::getInstance();
103
104 QString name = "Constant-Q";
105 QString base = "vamp:cqvamp:cqvamp:";
106 QString out = "constantq";
80 107
81 // A spectrogram, off by default. Must go at the back because it's 108 // A spectrogram, off by default. Must go at the back because it's
82 // opaque 109 // opaque
83 110
111 QString notFound = tr("Transform \"%1\" not found, spectrogram will not be enabled.<br><br>Is the %2 Vamp plugin correctly installed?");
112 if (!tf->haveTransform(base + out)) {
113 return notFound.arg(base + out).arg(name);
114 }
115
116 Transform transform = tf->getDefaultTransformFor
117 (base + out, m_fileModel->getSampleRate());
118
119 Colour3DPlotLayer *spectrogram = qobject_cast<Colour3DPlotLayer *>
120 (m_document->createDerivedLayer(transform, m_fileModel));
121
122 if (!spectrogram) return tr("Transform \"%1\" did not run correctly (no layer or wrong layer type returned)").arg(base + out);
123
124 /*
84 SpectrogramLayer *spectrogram = qobject_cast<SpectrogramLayer *> 125 SpectrogramLayer *spectrogram = qobject_cast<SpectrogramLayer *>
85 (m_document->createMainModelLayer(LayerFactory::MelodicRangeSpectrogram)); 126 (m_document->createMainModelLayer(LayerFactory::MelodicRangeSpectrogram));
127 */
86 spectrogram->setColourMap((int)ColourMapper::BlackOnWhite); 128 spectrogram->setColourMap((int)ColourMapper::BlackOnWhite);
87 m_document->addLayerToView(m_pane, spectrogram); 129 m_document->addLayerToView(m_pane, spectrogram);
88 spectrogram->setLayerDormant(m_pane, true); 130 spectrogram->setLayerDormant(m_pane, true);
89 131
90 m_layers[Spectrogram] = spectrogram; 132 m_layers[Spectrogram] = spectrogram;
91 133
134 return "";
135 }
136
137 QString
138 Analyser::addWaveform()
139 {
92 // Our waveform layer is just a shadow, light grey and taking up 140 // Our waveform layer is just a shadow, light grey and taking up
93 // little space at the bottom 141 // little space at the bottom
94 142
95 WaveformLayer *waveform = qobject_cast<WaveformLayer *> 143 WaveformLayer *waveform = qobject_cast<WaveformLayer *>
96 (m_document->createMainModelLayer(LayerFactory::Waveform)); 144 (m_document->createMainModelLayer(LayerFactory::Waveform));
103 if (params) params->setPlayPan(-1); 151 if (params) params->setPlayPan(-1);
104 152
105 m_document->addLayerToView(m_pane, waveform); 153 m_document->addLayerToView(m_pane, waveform);
106 154
107 m_layers[Audio] = waveform; 155 m_layers[Audio] = waveform;
156 return "";
157 }
158
159 QString
160 Analyser::addAnalyses()
161 {
162 TransformFactory *tf = TransformFactory::getInstance();
163
164 QString plugname = "pYIN";
165 QString base = "vamp:pyin:pyin:";
166 QString f0out = "smoothedpitchtrack";
167 QString noteout = "notes";
108 168
109 Transforms transforms; 169 Transforms transforms;
110
111 TransformFactory *tf = TransformFactory::getInstance();
112 170
113 /*!!! we could have more than one pitch track... 171 /*!!! we could have more than one pitch track...
114 QString cx = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0"; 172 QString cx = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0";
115 if (tf->haveTransform(cx)) { 173 if (tf->haveTransform(cx)) {
116 Transform tx = tf->getDefaultTransformFor(cx); 174 Transform tx = tf->getDefaultTransformFor(cx);
173 flexiNoteLayer->setBaseColour(cdb->getColourIndex(tr("Bright Blue"))); 231 flexiNoteLayer->setBaseColour(cdb->getColourIndex(tr("Bright Blue")));
174 PlayParameters *params = flexiNoteLayer->getPlayParameters(); 232 PlayParameters *params = flexiNoteLayer->getPlayParameters();
175 if (params) params->setPlayPan(1); 233 if (params) params->setPlayPan(1);
176 } 234 }
177 } 235 }
178 236
179 loadState(Audio);
180 loadState(PitchTrack);
181 loadState(Notes);
182 loadState(Spectrogram);
183
184 emit layersChanged();
185
186 return ""; 237 return "";
187 } 238 }
188 239
189 void 240 void
190 Analyser::getEnclosingSelectionScope(size_t f, size_t &f0, size_t &f1) 241 Analyser::getEnclosingSelectionScope(size_t f, size_t &f0, size_t &f1)