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@120: #include "layer/WaveformLayer.h" Chris@6: #include "layer/ColourDatabase.h" gyorgyf@16: #include "layer/LayerFactory.h" Chris@6: Chris@83: #include Chris@83: Chris@6: Analyser::Analyser() : Chris@6: m_document(0), Chris@6: m_fileModel(0), Chris@128: m_pane(0) Chris@6: { Chris@83: QSettings settings; Chris@83: settings.beginGroup("LayerDefaults"); Chris@83: settings.setValue Chris@83: ("timevalues", Chris@83: QString("") Chris@83: .arg(int(TimeValueLayer::LogScale)) Chris@83: .arg(int(TimeValueLayer::PlotDiscreteCurves)) Chris@83: .arg(27.5f).arg(880.f)); // temporary values: better get the real extents of the data from the model Chris@83: settings.setValue Chris@83: ("flexinotes", Chris@83: QString("") Chris@83: .arg(int(FlexiNoteLayer::AutoAlignScale))); Chris@83: settings.endGroup(); 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@83: QString base = "vamp:pyin:pyin:"; Chris@83: QString f0out = "smoothedpitchtrack"; Chris@83: QString noteout = "notes"; Chris@6: Chris@120: // We need at least one main-model layer (time ruler, waveform or Chris@120: // what have you). It could be hidden if we don't want to see it Chris@120: // but it must exist. Chris@6: Chris@131: // Our waveform layer is just a shadow, light grey and taking up Chris@120: // little space at the bottom Chris@120: Chris@120: WaveformLayer *waveform = qobject_cast Chris@120: (m_document->createMainModelLayer(LayerFactory::Waveform)); Chris@120: Chris@120: waveform->setMiddleLineHeight(0.9); Chris@120: waveform->setShowMeans(false); // too small & pale for this Chris@120: waveform->setBaseColour Chris@120: (ColourDatabase::getInstance()->getColourIndex(tr("Grey"))); Chris@130: PlayParameters *params = waveform->getPlayParameters(); Chris@130: if (params) params->setPlayPan(1); Chris@128: Chris@128: m_document->addLayerToView(m_pane, waveform); Chris@120: Chris@128: m_layers[Audio] = waveform; Chris@120: Chris@83: Transforms transforms; Chris@83: Chris@83: TransformFactory *tf = TransformFactory::getInstance(); Chris@83: if (!tf->haveTransform(base + f0out) || !tf->haveTransform(base + noteout)) { Chris@83: std::cerr << "ERROR: Analyser::newFileLoaded: Transform unknown" << std::endl; Chris@83: return; Chris@6: } Chris@6: Chris@83: Transform t = tf->getDefaultTransformFor Chris@83: (base + f0out, m_fileModel->getSampleRate()); Chris@83: t.setStepSize(256); Chris@83: t.setBlockSize(2048); Chris@6: Chris@83: transforms.push_back(t); Chris@83: Chris@83: t.setOutput(noteout); Chris@83: Chris@83: transforms.push_back(t); Chris@83: Chris@83: std::vector layers = Chris@83: m_document->createDerivedLayers(transforms, m_fileModel); Chris@83: Chris@83: if (!layers.empty()) { Chris@83: Chris@83: for (int i = 0; i < (int)layers.size(); ++i) { Chris@83: Chris@128: FlexiNoteLayer *f = qobject_cast(layers[i]); Chris@128: TimeValueLayer *t = qobject_cast(layers[i]); Chris@83: Chris@128: if (f) m_layers[Notes] = f; Chris@128: if (t) m_layers[PitchTrack] = t; Chris@83: Chris@83: m_document->addLayerToView(m_pane, layers[i]); Chris@83: } Chris@128: Chris@128: ColourDatabase *cdb = ColourDatabase::getInstance(); Chris@83: Chris@128: TimeValueLayer *pitchLayer = Chris@128: qobject_cast(m_layers[PitchTrack]); Chris@128: if (pitchLayer) { Chris@128: pitchLayer->setBaseColour(cdb->getColourIndex(tr("Black"))); Chris@128: paneStack->setCurrentLayer(m_pane, pitchLayer); Chris@130: PlayParameters *params = pitchLayer->getPlayParameters(); Chris@130: if (params) params->setPlayPan(-1); Chris@128: } Chris@128: Chris@128: FlexiNoteLayer *flexiNoteLayer = Chris@128: qobject_cast(m_layers[Notes]); Chris@128: if (flexiNoteLayer) { Chris@128: flexiNoteLayer->setBaseColour(cdb->getColourIndex(tr("Bright Blue"))); Chris@128: paneStack->setCurrentLayer(m_pane, flexiNoteLayer); Chris@130: PlayParameters *params = flexiNoteLayer->getPlayParameters(); Chris@130: if (params) params->setPlayPan(0); Chris@128: } Chris@6: } Chris@128: Chris@128: emit layersChanged(); Chris@6: } Chris@6: gyorgyf@45: void gyorgyf@45: Analyser::setIntelligentActions(bool on) gyorgyf@45: { gyorgyf@45: std::cerr << "toggle setIntelligentActions " << on << std::endl; Chris@128: Chris@128: FlexiNoteLayer *flexiNoteLayer = Chris@128: qobject_cast(m_layers[Notes]); Chris@128: if (flexiNoteLayer) { Chris@128: flexiNoteLayer->setIntelligentActions(on); Chris@70: } gyorgyf@45: } Chris@128: Chris@128: bool Chris@128: Analyser::isVisible(Component c) const Chris@128: { Chris@128: if (m_layers[c]) { Chris@128: return !m_layers[c]->isLayerDormant(m_pane); Chris@128: } else { Chris@128: return false; Chris@128: } Chris@128: } Chris@128: Chris@128: void Chris@128: Analyser::setVisible(Component c, bool v) Chris@128: { Chris@128: if (m_layers[c]) { Chris@128: m_layers[c]->setLayerDormant(m_pane, !v); Chris@128: m_pane->layerParametersChanged(); Chris@128: } Chris@128: } Chris@128: Chris@128: bool Chris@128: Analyser::isAudible(Component c) const Chris@128: { Chris@128: if (m_layers[c]) { Chris@128: Chris@128: PlayParameters *params = m_layers[c]->getPlayParameters(); Chris@128: if (!params) return false; Chris@128: Chris@128: return params->isPlayAudible(); Chris@128: } else { Chris@128: return false; Chris@128: } Chris@128: } Chris@128: Chris@128: void Chris@128: Analyser::setAudible(Component c, bool a) Chris@128: { Chris@128: if (m_layers[c]) { Chris@128: Chris@128: PlayParameters *params = m_layers[c]->getPlayParameters(); Chris@128: if (!params) return; Chris@128: Chris@128: params->setPlayAudible(a); Chris@128: } Chris@128: } Chris@128: