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