Mercurial > hg > tony
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) |