annotate src/Analyser.cpp @ 61:85ac2e8e3872 r0.1_win32_testbuild

Subrepo state
author Chris Cannam <chris.cannam@eecs.qmul.ac.uk>
date Wed, 17 Jul 2013 16:31:03 +0100
parents 0837a914e2d5
children 3123e32ab5f1
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@55 42 delete m_flexiNoteLayer;
Chris@6 43 }
Chris@6 44
Chris@6 45 void
Chris@6 46 Analyser::newFileLoaded(Document *doc, WaveFileModel *model,
Chris@6 47 PaneStack *paneStack, Pane *pane)
Chris@6 48 {
Chris@6 49 m_document = doc;
Chris@6 50 m_fileModel = model;
Chris@6 51 m_pane = pane;
Chris@6 52
matthiasm@47 53 TransformId f0 = "vamp:yintony:yintony:notepitchtrack";
matthiasm@47 54 TransformId notes = "vamp:yintony:yintony:notes";
gyorgyf@17 55
matthiasm@47 56 // TransformId f0 = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0";
matthiasm@47 57 // TransformId notes = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:notes";
Chris@6 58
Chris@6 59 // We don't want a waveform in the main pane. We must have a
Chris@6 60 // main-model layer of some sort, but the layers created by
Chris@6 61 // transforms are derived layers, so we'll create a time ruler for
Chris@6 62 // the main-model layer. It could subsequently be hidden if we
Chris@6 63 // didn't want it
Chris@6 64
Chris@6 65 m_document->addLayerToView
Chris@6 66 (m_pane, m_document->createMainModelLayer(LayerFactory::TimeRuler));
Chris@6 67
Chris@6 68 Layer *layer = 0;
Chris@6 69
Chris@6 70 layer = addLayerFor(f0);
Chris@6 71
Chris@6 72 if (layer) {
Chris@6 73 TimeValueLayer *tvl = qobject_cast<TimeValueLayer *>(layer);
Chris@6 74 if (tvl) {
matthiasm@44 75 tvl->setPlotStyle(TimeValueLayer::PlotDiscreteCurves);
matthiasm@44 76 // tvl->setPlotStyle(TimeValueLayer::PlotPoints);
Chris@6 77 tvl->setBaseColour(ColourDatabase::getInstance()->
matthiasm@36 78 getColourIndex(QString("Black")));
gyorgyf@21 79 tvl->setVerticalScale(TimeValueLayer::LogScale);
matthiasm@42 80 tvl->setDisplayExtents(27.5f,880.f); // temporary values: better get the real extents of the data form the model
Chris@6 81 }
Chris@6 82 }
Chris@6 83
gyorgyf@15 84 layer = addLayerForNotes(notes);
Chris@6 85
Chris@6 86 if (layer) {
gyorgyf@14 87 FlexiNoteLayer *nl = qobject_cast<FlexiNoteLayer *>(layer);
Chris@6 88 if (nl) {
gyorgyf@45 89 m_flexiNoteLayer = nl;
Chris@6 90 nl->setBaseColour(ColourDatabase::getInstance()->
Chris@6 91 getColourIndex(QString("Bright Blue")));
matthiasm@42 92 nl->setVerticalScale(FlexiNoteLayer::AutoAlignScale);
matthiasm@42 93 // nl->setDisplayExtents(80.f,600.f); // temporary values: better get the real extents of the data form the model
Chris@6 94 }
Chris@6 95 }
Chris@6 96
matthiasm@42 97
Chris@6 98 paneStack->setCurrentLayer(m_pane, layer);
Chris@6 99 }
Chris@6 100
Chris@6 101 Layer *
Chris@6 102 Analyser::addLayerFor(TransformId id)
Chris@6 103 {
Chris@6 104 TransformFactory *tf = TransformFactory::getInstance();
Chris@6 105
Chris@6 106 if (!tf->haveTransform(id)) {
Chris@6 107 std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl;
Chris@6 108 return 0;
Chris@6 109 }
Chris@6 110
Chris@6 111 Transform transform = tf->getDefaultTransformFor
Chris@6 112 (id, m_fileModel->getSampleRate());
Chris@6 113
matthiasm@29 114 transform.setStepSize(256);
Chris@6 115 transform.setBlockSize(2048);
Chris@6 116
Chris@6 117 ModelTransformer::Input input(m_fileModel, -1);
gyorgyf@15 118
gyorgyf@15 119 Layer *layer;
gyorgyf@15 120 layer = m_document->createDerivedLayer(transform, m_fileModel);
gyorgyf@15 121
gyorgyf@15 122 if (layer) {
gyorgyf@15 123 m_document->addLayerToView(m_pane, layer);
gyorgyf@15 124 } else {
gyorgyf@16 125 std::cerr << "ERROR: Analyser::addLayerFor: Cound not create layer. " << std::endl;
gyorgyf@15 126 }
gyorgyf@15 127
gyorgyf@15 128 return layer;
gyorgyf@15 129 }
gyorgyf@15 130
gyorgyf@15 131 Layer *
gyorgyf@15 132 Analyser::addLayerForNotes(TransformId id)
gyorgyf@15 133 {
gyorgyf@15 134 TransformFactory *tf = TransformFactory::getInstance();
gyorgyf@15 135
gyorgyf@15 136 if (!tf->haveTransform(id)) {
gyorgyf@15 137 std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl;
gyorgyf@15 138 return 0;
gyorgyf@15 139 }
gyorgyf@15 140
gyorgyf@15 141 Transform transform = tf->getDefaultTransformFor
gyorgyf@15 142 (id, m_fileModel->getSampleRate());
gyorgyf@15 143
matthiasm@29 144 transform.setStepSize(256);
gyorgyf@15 145 transform.setBlockSize(2048);
gyorgyf@15 146
gyorgyf@15 147 ModelTransformer::Input input(m_fileModel, -1);
gyorgyf@14 148
gyorgyf@14 149 FeatureExtractionModelTransformer::PreferredOutputModel preferredModel;
gyorgyf@14 150
gyorgyf@14 151 // preferredModel = FeatureExtractionModelTransformer::NoteOutputModel;
gyorgyf@14 152 preferredModel = FeatureExtractionModelTransformer::FlexiNoteOutputModel;
gyorgyf@14 153
gyorgyf@14 154 // preferredLayer = LayerFactory::Notes ;
gyorgyf@14 155 preferredLayer = LayerFactory::FlexiNotes ;
gyorgyf@16 156
gyorgyf@16 157 // std::cerr << "NOTE: Trying to create layer type(" << preferredLayer << ")" << std::endl;
Chris@6 158 Layer *layer;
gyorgyf@14 159 layer = m_document->createDerivedLayer(transform, m_fileModel, preferredLayer, preferredModel);
gyorgyf@14 160
Chris@6 161 if (layer) {
gyorgyf@14 162 m_document->addLayerToView(m_pane, layer);
gyorgyf@14 163 } else {
gyorgyf@16 164 std::cerr << "ERROR: Analyser::addLayerForNotes: Cound not create layer type(" << preferredLayer << ")" << std::endl;
gyorgyf@14 165 }
Chris@6 166
Chris@6 167 return layer;
Chris@6 168 }
Chris@6 169
gyorgyf@45 170 void
gyorgyf@45 171 Analyser::setIntelligentActions(bool on)
gyorgyf@45 172 {
gyorgyf@45 173 std::cerr << "toggle setIntelligentActions " << on << std::endl;
gyorgyf@45 174 m_flexiNoteLayer->setIntelligentActions(on);
gyorgyf@45 175 }