comparison src/Analyser.cpp @ 83:4db051a704b2 tonioni_multi_transform

Make use of multi-transform support
author Chris Cannam
date Mon, 02 Dec 2013 15:06:47 +0000
parents 92e8231466a8
children 8ed567d30e34
comparison
equal deleted inserted replaced
82:92e8231466a8 83:4db051a704b2
27 #include "layer/NoteLayer.h" 27 #include "layer/NoteLayer.h"
28 #include "layer/FlexiNoteLayer.h" 28 #include "layer/FlexiNoteLayer.h"
29 #include "layer/ColourDatabase.h" 29 #include "layer/ColourDatabase.h"
30 #include "layer/LayerFactory.h" 30 #include "layer/LayerFactory.h"
31 31
32 #include <QSettings>
33
32 Analyser::Analyser() : 34 Analyser::Analyser() :
33 m_document(0), 35 m_document(0),
34 m_fileModel(0), 36 m_fileModel(0),
35 m_pane(0), 37 m_pane(0),
36 m_flexiNoteLayer(0) 38 m_flexiNoteLayer(0)
37 { 39 {
40 QSettings settings;
41 settings.beginGroup("LayerDefaults");
42 settings.setValue
43 ("timevalues",
44 QString("<layer verticalScale=\"%1\" plotStyle=\"%2\" "
45 "scaleMinimum=\"%3\" scaleMaximum=\"%4\"/>")
46 .arg(int(TimeValueLayer::LogScale))
47 .arg(int(TimeValueLayer::PlotDiscreteCurves))
48 .arg(27.5f).arg(880.f)); // temporary values: better get the real extents of the data from the model
49 settings.setValue
50 ("flexinotes",
51 QString("<layer verticalScale=\"%1\"/>")
52 .arg(int(FlexiNoteLayer::AutoAlignScale)));
53 settings.endGroup();
38 } 54 }
39 55
40 Analyser::~Analyser() 56 Analyser::~Analyser()
41 { 57 {
42 } 58 }
47 { 63 {
48 m_document = doc; 64 m_document = doc;
49 m_fileModel = model; 65 m_fileModel = model;
50 m_pane = pane; 66 m_pane = pane;
51 67
52 TransformId f0 = "vamp:pyin:pyin:smoothedpitchtrack"; 68 QString base = "vamp:pyin:pyin:";
53 TransformId notes = "vamp:pyin:pyin:notes"; 69 QString f0out = "smoothedpitchtrack";
54 70 QString noteout = "notes";
55 // TransformId f0 = "vamp:yintony:yintony:notepitchtrack";
56 // TransformId notes = "vamp:yintony:yintony:notes";
57
58 // TransformId f0 = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0";
59 // TransformId notes = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:notes";
60 71
61 // We don't want a waveform in the main pane. We must have a 72 // We don't want a waveform in the main pane. We must have a
62 // main-model layer of some sort, but the layers created by 73 // main-model layer of some sort, but the layers created by
63 // transforms are derived layers, so we'll create a time ruler for 74 // transforms are derived layers, so we'll create a time ruler for
64 // the main-model layer. It could subsequently be hidden if we 75 // the main-model layer. It could subsequently be hidden if we
65 // didn't want it 76 // didn't want it
66 77
67 m_document->addLayerToView 78 m_document->addLayerToView
68 (m_pane, m_document->createMainModelLayer(LayerFactory::TimeRuler)); 79 (m_pane, m_document->createMainModelLayer(LayerFactory::TimeRuler));
69 80
70 Layer *layer = 0; 81 Transforms transforms;
71 82
72 layer = addLayerFor(f0); 83 TransformFactory *tf = TransformFactory::getInstance();
73 84 if (!tf->haveTransform(base + f0out) || !tf->haveTransform(base + noteout)) {
74 if (layer) { 85 std::cerr << "ERROR: Analyser::newFileLoaded: Transform unknown" << std::endl;
75 TimeValueLayer *tvl = qobject_cast<TimeValueLayer *>(layer); 86 return;
76 if (tvl) {
77 tvl->setPlotStyle(TimeValueLayer::PlotDiscreteCurves);
78 // tvl->setPlotStyle(TimeValueLayer::PlotPoints);
79 tvl->setBaseColour(ColourDatabase::getInstance()->
80 getColourIndex(QString("Black")));
81 tvl->setVerticalScale(TimeValueLayer::LogScale);
82 tvl->setDisplayExtents(27.5f,880.f); // temporary values: better get the real extents of the data form the model
83 }
84 } 87 }
85 88
86 layer = addLayerForNotes(notes); 89 Transform t = tf->getDefaultTransformFor
90 (base + f0out, m_fileModel->getSampleRate());
91 t.setStepSize(256);
92 t.setBlockSize(2048);
87 93
88 if (layer) { 94 transforms.push_back(t);
89 FlexiNoteLayer *nl = qobject_cast<FlexiNoteLayer *>(layer); 95
90 if (nl) { 96 t.setOutput(noteout);
91 m_flexiNoteLayer = nl; 97
92 nl->setBaseColour(ColourDatabase::getInstance()-> 98 transforms.push_back(t);
93 getColourIndex(QString("Bright Blue"))); 99
94 nl->setVerticalScale(FlexiNoteLayer::AutoAlignScale); 100 std::vector<Layer *> layers =
95 // nl->setDisplayExtents(80.f,600.f); // temporary values: better get the real extents of the data form the model 101 m_document->createDerivedLayers(transforms, m_fileModel);
96 } 102
103 if (!layers.empty()) {
104
105 ColourDatabase *cdb = ColourDatabase::getInstance();
106
107 for (int i = 0; i < (int)layers.size(); ++i) {
108
109 SingleColourLayer *scl = dynamic_cast<SingleColourLayer *>
110 (layers[i]);
111
112 if (scl) {
113 if (i == 0) {
114 scl->setBaseColour(cdb->getColourIndex(tr("Black")));
115 } else {
116 scl->setBaseColour(cdb->getColourIndex(tr("Bright Blue")));
117 }
118 }
119
120 m_document->addLayerToView(m_pane, layers[i]);
121 }
122
123 m_flexiNoteLayer = dynamic_cast<FlexiNoteLayer *>
124 (layers[layers.size()-1]);
125 paneStack->setCurrentLayer(m_pane, m_flexiNoteLayer);
97 } 126 }
98
99 paneStack->setCurrentLayer(m_pane, layer);
100 }
101
102 Layer *
103 Analyser::addLayerFor(TransformId id)
104 {
105 TransformFactory *tf = TransformFactory::getInstance();
106
107 if (!tf->haveTransform(id)) {
108 std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl;
109 return 0;
110 }
111
112 Transform transform = tf->getDefaultTransformFor
113 (id, m_fileModel->getSampleRate());
114
115 transform.setStepSize(256);
116 transform.setBlockSize(2048);
117
118 ModelTransformer::Input input(m_fileModel, -1);
119
120 Layer *layer;
121 layer = m_document->createDerivedLayer(transform, m_fileModel);
122
123 if (layer) {
124 m_document->addLayerToView(m_pane, layer);
125 } else {
126 std::cerr << "ERROR: Analyser::addLayerFor: Cound not create layer. " << std::endl;
127 }
128
129 return layer;
130 }
131
132 Layer *
133 Analyser::addLayerForNotes(TransformId id)
134 {
135 TransformFactory *tf = TransformFactory::getInstance();
136
137 if (!tf->haveTransform(id)) {
138 std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl;
139 return 0;
140 }
141
142 Transform transform = tf->getDefaultTransformFor
143 (id, m_fileModel->getSampleRate());
144
145 transform.setStepSize(256);
146 transform.setBlockSize(2048);
147
148 ModelTransformer::Input input(m_fileModel, -1);
149
150 Layer *layer;
151 layer = m_document->createDerivedLayer(transform, m_fileModel);
152
153 if (layer) {
154 m_document->addLayerToView(m_pane, layer);
155 } else {
156 std::cerr << "ERROR: Analyser::addLayerForNotes: Cound not create layer type(" << preferredLayer << ")" << std::endl;
157 }
158
159 return layer;
160 } 127 }
161 128
162 void 129 void
163 Analyser::setIntelligentActions(bool on) 130 Analyser::setIntelligentActions(bool on)
164 { 131 {