annotate src/Analyser.cpp @ 70:5310637392f6

Revert to using three separate tool modes (more like SV). This is less like the proposed design for Tony but better than the previous situation with two incomprehensible toggle buttons.
author Chris Cannam
date Tue, 26 Nov 2013 16:59:31 +0000
parents 3123e32ab5f1
children fc3b62262443
rev   line source
Chris@6 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@6 2
Chris@6 3 /*
Chris@6 4 Tony
Chris@6 5 An intonation analysis and annotation tool
Chris@6 6 Centre for Digital Music, Queen Mary, University of London.
Chris@6 7 This file copyright 2006-2012 Chris Cannam and QMUL.
Chris@6 8
Chris@6 9 This program is free software; you can redistribute it and/or
Chris@6 10 modify it under the terms of the GNU General Public License as
Chris@6 11 published by the Free Software Foundation; either version 2 of the
Chris@6 12 License, or (at your option) any later version. See the file
Chris@6 13 COPYING included with this distribution for more information.
Chris@6 14 */
Chris@6 15
Chris@6 16 #include "Analyser.h"
Chris@6 17
Chris@6 18 #include "transform/TransformFactory.h"
Chris@6 19 #include "transform/ModelTransformer.h"
gyorgyf@14 20 #include "transform/FeatureExtractionModelTransformer.h"
Chris@6 21 #include "framework/Document.h"
Chris@6 22 #include "data/model/WaveFileModel.h"
Chris@6 23 #include "view/Pane.h"
Chris@6 24 #include "view/PaneStack.h"
Chris@6 25 #include "layer/Layer.h"
Chris@6 26 #include "layer/TimeValueLayer.h"
matthiasm@13 27 #include "layer/NoteLayer.h"
matthiasm@11 28 #include "layer/FlexiNoteLayer.h"
Chris@6 29 #include "layer/ColourDatabase.h"
gyorgyf@16 30 #include "layer/LayerFactory.h"
Chris@6 31
Chris@6 32 Analyser::Analyser() :
Chris@6 33 m_document(0),
Chris@6 34 m_fileModel(0),
Chris@54 35 m_pane(0),
Chris@54 36 m_flexiNoteLayer(0)
Chris@6 37 {
Chris@6 38 }
Chris@6 39
Chris@6 40 Analyser::~Analyser()
Chris@6 41 {
Chris@6 42 }
Chris@6 43
Chris@6 44 void
Chris@6 45 Analyser::newFileLoaded(Document *doc, WaveFileModel *model,
Chris@6 46 PaneStack *paneStack, Pane *pane)
Chris@6 47 {
Chris@6 48 m_document = doc;
Chris@6 49 m_fileModel = model;
Chris@6 50 m_pane = pane;
Chris@6 51
matthiasm@47 52 TransformId f0 = "vamp:yintony:yintony:notepitchtrack";
matthiasm@47 53 TransformId notes = "vamp:yintony:yintony:notes";
gyorgyf@17 54
matthiasm@47 55 // TransformId f0 = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0";
matthiasm@47 56 // TransformId notes = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:notes";
Chris@6 57
Chris@6 58 // We don't want a waveform in the main pane. We must have a
Chris@6 59 // main-model layer of some sort, but the layers created by
Chris@6 60 // transforms are derived layers, so we'll create a time ruler for
Chris@6 61 // the main-model layer. It could subsequently be hidden if we
Chris@6 62 // didn't want it
Chris@6 63
Chris@6 64 m_document->addLayerToView
Chris@6 65 (m_pane, m_document->createMainModelLayer(LayerFactory::TimeRuler));
Chris@6 66
Chris@6 67 Layer *layer = 0;
Chris@6 68
Chris@6 69 layer = addLayerFor(f0);
Chris@6 70
Chris@6 71 if (layer) {
Chris@6 72 TimeValueLayer *tvl = qobject_cast<TimeValueLayer *>(layer);
Chris@6 73 if (tvl) {
matthiasm@44 74 tvl->setPlotStyle(TimeValueLayer::PlotDiscreteCurves);
matthiasm@44 75 // tvl->setPlotStyle(TimeValueLayer::PlotPoints);
Chris@6 76 tvl->setBaseColour(ColourDatabase::getInstance()->
matthiasm@36 77 getColourIndex(QString("Black")));
gyorgyf@21 78 tvl->setVerticalScale(TimeValueLayer::LogScale);
matthiasm@42 79 tvl->setDisplayExtents(27.5f,880.f); // temporary values: better get the real extents of the data form the model
Chris@6 80 }
Chris@6 81 }
Chris@6 82
gyorgyf@15 83 layer = addLayerForNotes(notes);
Chris@6 84
Chris@6 85 if (layer) {
gyorgyf@14 86 FlexiNoteLayer *nl = qobject_cast<FlexiNoteLayer *>(layer);
Chris@6 87 if (nl) {
gyorgyf@45 88 m_flexiNoteLayer = nl;
Chris@6 89 nl->setBaseColour(ColourDatabase::getInstance()->
Chris@6 90 getColourIndex(QString("Bright Blue")));
matthiasm@42 91 nl->setVerticalScale(FlexiNoteLayer::AutoAlignScale);
matthiasm@42 92 // nl->setDisplayExtents(80.f,600.f); // temporary values: better get the real extents of the data form the model
Chris@6 93 }
Chris@6 94 }
Chris@6 95
matthiasm@42 96
Chris@6 97 paneStack->setCurrentLayer(m_pane, layer);
Chris@6 98 }
Chris@6 99
Chris@6 100 Layer *
Chris@6 101 Analyser::addLayerFor(TransformId id)
Chris@6 102 {
Chris@6 103 TransformFactory *tf = TransformFactory::getInstance();
Chris@6 104
Chris@6 105 if (!tf->haveTransform(id)) {
Chris@6 106 std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl;
Chris@6 107 return 0;
Chris@6 108 }
Chris@6 109
Chris@6 110 Transform transform = tf->getDefaultTransformFor
Chris@6 111 (id, m_fileModel->getSampleRate());
Chris@6 112
matthiasm@29 113 transform.setStepSize(256);
Chris@6 114 transform.setBlockSize(2048);
Chris@6 115
Chris@6 116 ModelTransformer::Input input(m_fileModel, -1);
gyorgyf@15 117
gyorgyf@15 118 Layer *layer;
gyorgyf@15 119 layer = m_document->createDerivedLayer(transform, m_fileModel);
gyorgyf@15 120
gyorgyf@15 121 if (layer) {
gyorgyf@15 122 m_document->addLayerToView(m_pane, layer);
gyorgyf@15 123 } else {
gyorgyf@16 124 std::cerr << "ERROR: Analyser::addLayerFor: Cound not create layer. " << std::endl;
gyorgyf@15 125 }
gyorgyf@15 126
gyorgyf@15 127 return layer;
gyorgyf@15 128 }
gyorgyf@15 129
gyorgyf@15 130 Layer *
gyorgyf@15 131 Analyser::addLayerForNotes(TransformId id)
gyorgyf@15 132 {
gyorgyf@15 133 TransformFactory *tf = TransformFactory::getInstance();
gyorgyf@15 134
gyorgyf@15 135 if (!tf->haveTransform(id)) {
gyorgyf@15 136 std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl;
gyorgyf@15 137 return 0;
gyorgyf@15 138 }
gyorgyf@15 139
gyorgyf@15 140 Transform transform = tf->getDefaultTransformFor
gyorgyf@15 141 (id, m_fileModel->getSampleRate());
gyorgyf@15 142
matthiasm@29 143 transform.setStepSize(256);
gyorgyf@15 144 transform.setBlockSize(2048);
gyorgyf@15 145
gyorgyf@15 146 ModelTransformer::Input input(m_fileModel, -1);
gyorgyf@14 147
gyorgyf@14 148 FeatureExtractionModelTransformer::PreferredOutputModel preferredModel;
gyorgyf@14 149
gyorgyf@14 150 // preferredModel = FeatureExtractionModelTransformer::NoteOutputModel;
gyorgyf@14 151 preferredModel = FeatureExtractionModelTransformer::FlexiNoteOutputModel;
gyorgyf@14 152
gyorgyf@14 153 // preferredLayer = LayerFactory::Notes ;
gyorgyf@14 154 preferredLayer = LayerFactory::FlexiNotes ;
gyorgyf@16 155
gyorgyf@16 156 // std::cerr << "NOTE: Trying to create layer type(" << preferredLayer << ")" << std::endl;
Chris@6 157 Layer *layer;
gyorgyf@14 158 layer = m_document->createDerivedLayer(transform, m_fileModel, preferredLayer, preferredModel);
gyorgyf@14 159
Chris@6 160 if (layer) {
gyorgyf@14 161 m_document->addLayerToView(m_pane, layer);
gyorgyf@14 162 } else {
gyorgyf@16 163 std::cerr << "ERROR: Analyser::addLayerForNotes: Cound not create layer type(" << preferredLayer << ")" << std::endl;
gyorgyf@14 164 }
Chris@6 165
Chris@6 166 return layer;
Chris@6 167 }
Chris@6 168
gyorgyf@45 169 void
gyorgyf@45 170 Analyser::setIntelligentActions(bool on)
gyorgyf@45 171 {
gyorgyf@45 172 std::cerr << "toggle setIntelligentActions " << on << std::endl;
Chris@70 173 if (m_flexiNoteLayer) {
Chris@70 174 m_flexiNoteLayer->setIntelligentActions(on);
Chris@70 175 }
gyorgyf@45 176 }