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" gyorgyf@14: #include "transform/FeatureExtractionModelTransformer.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@13: #include "layer/NoteLayer.h" matthiasm@11: #include "layer/FlexiNoteLayer.h" Chris@6: #include "layer/ColourDatabase.h" gyorgyf@16: #include "layer/LayerFactory.h" Chris@6: Chris@6: Analyser::Analyser() : Chris@6: m_document(0), Chris@6: m_fileModel(0), Chris@54: m_pane(0), Chris@54: m_flexiNoteLayer(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: matthiasm@47: TransformId f0 = "vamp:yintony:yintony:notepitchtrack"; matthiasm@47: TransformId notes = "vamp:yintony:yintony:notes"; gyorgyf@17: matthiasm@47: // TransformId f0 = "vamp:cepstral-pitchtracker:cepstral-pitchtracker:f0"; matthiasm@47: // 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) { matthiasm@44: tvl->setPlotStyle(TimeValueLayer::PlotDiscreteCurves); matthiasm@44: // tvl->setPlotStyle(TimeValueLayer::PlotPoints); Chris@6: tvl->setBaseColour(ColourDatabase::getInstance()-> matthiasm@36: getColourIndex(QString("Black"))); gyorgyf@21: tvl->setVerticalScale(TimeValueLayer::LogScale); matthiasm@42: tvl->setDisplayExtents(27.5f,880.f); // temporary values: better get the real extents of the data form the model Chris@6: } Chris@6: } Chris@6: gyorgyf@15: layer = addLayerForNotes(notes); Chris@6: Chris@6: if (layer) { gyorgyf@14: FlexiNoteLayer *nl = qobject_cast(layer); Chris@6: if (nl) { gyorgyf@45: m_flexiNoteLayer = nl; Chris@6: nl->setBaseColour(ColourDatabase::getInstance()-> Chris@6: getColourIndex(QString("Bright Blue"))); matthiasm@42: nl->setVerticalScale(FlexiNoteLayer::AutoAlignScale); matthiasm@42: // nl->setDisplayExtents(80.f,600.f); // temporary values: better get the real extents of the data form the model Chris@6: } Chris@6: } Chris@6: matthiasm@42: 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@29: transform.setStepSize(256); Chris@6: transform.setBlockSize(2048); Chris@6: Chris@6: ModelTransformer::Input input(m_fileModel, -1); gyorgyf@15: gyorgyf@15: Layer *layer; gyorgyf@15: layer = m_document->createDerivedLayer(transform, m_fileModel); gyorgyf@15: gyorgyf@15: if (layer) { gyorgyf@15: m_document->addLayerToView(m_pane, layer); gyorgyf@15: } else { gyorgyf@16: std::cerr << "ERROR: Analyser::addLayerFor: Cound not create layer. " << std::endl; gyorgyf@15: } gyorgyf@15: gyorgyf@15: return layer; gyorgyf@15: } gyorgyf@15: gyorgyf@15: Layer * gyorgyf@15: Analyser::addLayerForNotes(TransformId id) gyorgyf@15: { gyorgyf@15: TransformFactory *tf = TransformFactory::getInstance(); gyorgyf@15: gyorgyf@15: if (!tf->haveTransform(id)) { gyorgyf@15: std::cerr << "ERROR: Analyser::addLayerFor(" << id << "): Transform unknown" << std::endl; gyorgyf@15: return 0; gyorgyf@15: } gyorgyf@15: gyorgyf@15: Transform transform = tf->getDefaultTransformFor gyorgyf@15: (id, m_fileModel->getSampleRate()); gyorgyf@15: matthiasm@29: transform.setStepSize(256); gyorgyf@15: transform.setBlockSize(2048); gyorgyf@15: gyorgyf@15: ModelTransformer::Input input(m_fileModel, -1); gyorgyf@14: gyorgyf@14: FeatureExtractionModelTransformer::PreferredOutputModel preferredModel; gyorgyf@14: gyorgyf@14: // preferredModel = FeatureExtractionModelTransformer::NoteOutputModel; gyorgyf@14: preferredModel = FeatureExtractionModelTransformer::FlexiNoteOutputModel; gyorgyf@14: gyorgyf@14: // preferredLayer = LayerFactory::Notes ; gyorgyf@14: preferredLayer = LayerFactory::FlexiNotes ; gyorgyf@16: gyorgyf@16: // std::cerr << "NOTE: Trying to create layer type(" << preferredLayer << ")" << std::endl; Chris@6: Layer *layer; gyorgyf@14: layer = m_document->createDerivedLayer(transform, m_fileModel, preferredLayer, preferredModel); gyorgyf@14: Chris@6: if (layer) { gyorgyf@14: m_document->addLayerToView(m_pane, layer); gyorgyf@14: } else { gyorgyf@16: std::cerr << "ERROR: Analyser::addLayerForNotes: Cound not create layer type(" << preferredLayer << ")" << std::endl; gyorgyf@14: } Chris@6: Chris@6: return layer; Chris@6: } Chris@6: gyorgyf@45: void gyorgyf@45: Analyser::setIntelligentActions(bool on) gyorgyf@45: { gyorgyf@45: std::cerr << "toggle setIntelligentActions " << on << std::endl; gyorgyf@45: m_flexiNoteLayer->setIntelligentActions(on); gyorgyf@45: }