annotate src/Analyser.h @ 191:800e65412473

Toward acting on a frequency range when outlined
author Chris Cannam
date Tue, 04 Mar 2014 16:45:54 +0000
parents ea15fa75ae6f
children 431a95c9d14d
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 #ifndef ANALYSER_H
Chris@6 17 #define ANALYSER_H
Chris@6 18
Chris@6 19 #include <QObject>
Chris@191 20 #include <QRect>
Chris@6 21
Chris@128 22 #include <map>
Chris@163 23 #include <vector>
Chris@163 24
Chris@163 25 #include "framework/Document.h"
Chris@164 26 #include "base/Selection.h"
Chris@6 27
Chris@6 28 class WaveFileModel;
Chris@6 29 class Pane;
Chris@6 30 class PaneStack;
Chris@6 31 class Layer;
Chris@128 32 class TimeValueLayer;
Chris@128 33 class Layer;
Chris@6 34
Chris@163 35 class Analyser : public QObject,
Chris@163 36 public Document::LayerCreationHandler
Chris@6 37 {
Chris@6 38 Q_OBJECT
Chris@6 39
Chris@6 40 public:
Chris@6 41 Analyser();
Chris@6 42 virtual ~Analyser();
Chris@6 43
Chris@140 44 // Process new main model, add derived layers; return "" on success or error string on failure
Chris@140 45 QString newFileLoaded(Document *newDocument, WaveFileModel *model,
Chris@140 46 PaneStack *paneStack, Pane *pane);
gyorgyf@45 47
gyorgyf@45 48 void setIntelligentActions(bool);
Chris@6 49
Chris@128 50 enum Component {
Chris@128 51 Audio,
Chris@128 52 PitchTrack,
Chris@128 53 Notes,
Chris@145 54 Spectrogram,
Chris@128 55 };
Chris@128 56
Chris@128 57 bool isVisible(Component c) const;
Chris@128 58 void setVisible(Component c, bool v);
Chris@144 59 void toggleVisible(Component c) { setVisible(c, !isVisible(c)); }
Chris@128 60
Chris@128 61 bool isAudible(Component c) const;
Chris@128 62 void setAudible(Component c, bool v);
Chris@144 63 void toggleAudible(Component c) { setAudible(c, !isAudible(c)); }
Chris@128 64
Chris@128 65 void cycleStatus(Component c) {
Chris@128 66 if (isVisible(c)) {
Chris@128 67 if (isAudible(c)) {
Chris@128 68 setVisible(c, false);
Chris@128 69 setAudible(c, false);
Chris@128 70 } else {
Chris@128 71 setAudible(c, true);
Chris@128 72 }
Chris@128 73 } else {
Chris@128 74 setVisible(c, true);
Chris@128 75 setAudible(c, false);
Chris@128 76 }
Chris@128 77 }
Chris@128 78
Chris@158 79 float getGain(Component c) const;
Chris@158 80 void setGain(Component c, float gain);
Chris@158 81
Chris@158 82 float getPan(Component c) const;
Chris@158 83 void setPan(Component c, float pan);
Chris@158 84
Chris@139 85 void getEnclosingSelectionScope(size_t f, size_t &f0, size_t &f1);
Chris@139 86
Chris@164 87 /**
Chris@165 88 * Analyse the selection and schedule asynchronous adds of
Chris@165 89 * candidate layers for the region it contains. Returns "" on
Chris@165 90 * success or a user-readable error string on failure.
Chris@164 91 */
Chris@164 92 QString reAnalyseSelection(Selection sel);
Chris@164 93
Chris@167 94 /**
Chris@184 95 * Return true if the analysed pitch candidates are currently
Chris@184 96 * visible (by default they are hidden after construction until
Chris@184 97 * the user requests them). Note that the shown/hidden state is
Chris@184 98 * independent of whether any pitch candidates actually exist --
Chris@184 99 * it's possible they might be shown but not have been created yet
Chris@184 100 * because creation (through reAnalyseSelection) is asynchronous.
Chris@184 101 */
Chris@184 102 bool arePitchCandidatesShown() const;
Chris@184 103
Chris@184 104 /**
Chris@184 105 * Show or hide the analysed pitch candidate layers. As in
Chris@184 106 * arePitchCandidatesShown, this is independent of whether the
Chris@184 107 * candidate layers actually exist. Call reAnalyseSelection to
Chris@184 108 * schedule creation of those layers.
Chris@184 109 */
Chris@184 110 void showPitchCandidates(bool shown);
Chris@184 111
Chris@184 112 /**
Chris@167 113 * If a re-analysis has been activated, switch the selected area
Chris@167 114 * of the main pitch track to a different candidate from the
Chris@167 115 * analysis results.
Chris@167 116 */
Chris@167 117 void switchPitchCandidate(Selection sel, bool up);
Chris@167 118
Chris@167 119 /**
Chris@184 120 * Delete the pitch estimates from the selected area of the main
Chris@168 121 * pitch track.
Chris@168 122 */
Chris@184 123 void deletePitches(Selection sel);
Chris@168 124
Chris@168 125 /**
Chris@168 126 * Move the main pitch track and any active analysis candidate
Chris@168 127 * tracks up or down an octave in the selected area.
Chris@168 128 */
Chris@168 129 void shiftOctave(Selection sel, bool up);
Chris@168 130
Chris@168 131 /**
Chris@167 132 * Remove any re-analysis layers.
Chris@167 133 */
Chris@167 134 void clearReAnalysis();
Chris@167 135
Chris@174 136 /**
Chris@174 137 * Import the pitch track from the given layer into our
Chris@174 138 * pitch-track layer.
Chris@174 139 */
Chris@174 140 void takePitchTrackFrom(Layer *layer);
Chris@174 141
Chris@174 142 Pane *getPane() {
Chris@174 143 return m_pane;
Chris@174 144 }
Chris@174 145
Chris@174 146 Layer *getLayer(Component type) {
Chris@174 147 return m_layers[type];
Chris@174 148 }
Chris@174 149
Chris@128 150 signals:
Chris@128 151 void layersChanged();
Chris@128 152
Chris@191 153 protected slots:
Chris@191 154 void regionOutlined(QRect);
Chris@191 155
Chris@6 156 protected:
Chris@6 157 Document *m_document;
Chris@6 158 WaveFileModel *m_fileModel;
Chris@133 159 PaneStack *m_paneStack;
Chris@6 160 Pane *m_pane;
Chris@165 161
Chris@128 162 mutable std::map<Component, Layer *> m_layers;
Chris@132 163
Chris@165 164 Selection m_reAnalysingSelection;
Chris@165 165 std::vector<Layer *> m_reAnalysisCandidates;
Chris@167 166 int m_currentCandidate;
Chris@184 167 bool m_candidatesVisible;
Chris@165 168
Chris@161 169 QString addVisualisations();
Chris@161 170 QString addWaveform();
Chris@161 171 QString addAnalyses();
Chris@161 172
Chris@163 173 // Document::LayerCreationHandler method
Chris@163 174 void layersCreated(std::vector<Layer *>, std::vector<Layer *>);
Chris@163 175
Chris@132 176 void saveState(Component c) const;
Chris@132 177 void loadState(Component c);
Chris@6 178 };
Chris@6 179
Chris@6 180 #endif