Chris@6: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@6: Chris@6: /* Chris@6: Tony Chris@6: An intonation analysis and annotation tool Chris@6: Centre for Digital Music, Queen Mary, University of London. Chris@6: This file copyright 2006-2012 Chris Cannam and QMUL. Chris@6: Chris@6: This program is free software; you can redistribute it and/or Chris@6: modify it under the terms of the GNU General Public License as Chris@6: published by the Free Software Foundation; either version 2 of the Chris@6: License, or (at your option) any later version. See the file Chris@6: COPYING included with this distribution for more information. Chris@6: */ Chris@6: Chris@6: #include "Analyser.h" Chris@6: Chris@6: #include "transform/TransformFactory.h" Chris@6: #include "transform/ModelTransformer.h" Chris@6: #include "framework/Document.h" Chris@6: #include "data/model/WaveFileModel.h" Chris@6: #include "view/Pane.h" Chris@6: #include "view/PaneStack.h" Chris@6: #include "layer/Layer.h" Chris@6: #include "layer/TimeValueLayer.h" matthiasm@11: #include "layer/FlexiNoteLayer.h" Chris@6: #include "layer/ColourDatabase.h" Chris@6: Chris@6: Analyser::Analyser() : Chris@6: m_document(0), Chris@6: m_fileModel(0), Chris@6: m_pane(0) Chris@6: { Chris@6: } Chris@6: Chris@6: Analyser::~Analyser() Chris@6: { Chris@6: } Chris@6: Chris@6: void Chris@6: Analyser::newFileLoaded(Document *doc, WaveFileModel *model, Chris@6: PaneStack *paneStack, Pane *pane) Chris@6: { Chris@6: m_document = doc; Chris@6: m_fileModel = model; Chris@6: m_pane = pane; Chris@6: Chris@6: TransformId f0 = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0"; Chris@6: TransformId notes = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:notes"; Chris@6: Chris@6: // We don't want a waveform in the main pane. We must have a Chris@6: // main-model layer of some sort, but the layers created by Chris@6: // transforms are derived layers, so we'll create a time ruler for Chris@6: // the main-model layer. It could subsequently be hidden if we Chris@6: // didn't want it Chris@6: Chris@6: m_document->addLayerToView Chris@6: (m_pane, m_document->createMainModelLayer(LayerFactory::TimeRuler)); Chris@6: Chris@6: Layer *layer = 0; Chris@6: Chris@6: layer = addLayerFor(f0); Chris@6: Chris@6: if (layer) { Chris@6: TimeValueLayer *tvl = qobject_cast(layer); Chris@6: if (tvl) { Chris@6: tvl->setPlotStyle(TimeValueLayer::PlotDiscreteCurves); Chris@6: tvl->setBaseColour(ColourDatabase::getInstance()-> Chris@6: getColourIndex(QString("Black"))); Chris@6: } Chris@6: } Chris@6: Chris@6: layer = addLayerFor(notes); Chris@6: Chris@6: if (layer) { matthiasm@11: FlexiNoteLayer *nl = qobject_cast(layer); Chris@6: if (nl) { Chris@6: nl->setBaseColour(ColourDatabase::getInstance()-> Chris@6: getColourIndex(QString("Bright Blue"))); Chris@6: } Chris@6: } Chris@6: Chris@6: paneStack->setCurrentLayer(m_pane, layer); Chris@6: } Chris@6: Chris@6: Layer * Chris@6: Analyser::addLayerFor(TransformId id) Chris@6: { Chris@6: TransformFactory *tf = TransformFactory::getInstance(); Chris@6: Chris@6: if (!tf->haveTransform(id)) { Chris@6: std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl; Chris@6: return 0; Chris@6: } Chris@6: Chris@6: Transform transform = tf->getDefaultTransformFor Chris@6: (id, m_fileModel->getSampleRate()); Chris@6: matthiasm@11: transform.setStepSize(512); Chris@6: transform.setBlockSize(2048); Chris@6: Chris@6: ModelTransformer::Input input(m_fileModel, -1); Chris@6: Chris@6: Layer *layer; Chris@6: layer = m_document->createDerivedLayer(transform, m_fileModel); Chris@6: if (layer) { Chris@6: m_document->addLayerToView(m_pane, layer); Chris@6: } Chris@6: Chris@6: return layer; Chris@6: } Chris@6: