annotate src/Silvet.h @ 325:4cf4313d7e30 livemode

Always use q=0.8 and accept the hit on speed -- the templates are made for that configuration and it does work better. Also some adjustments to thresholding and peak picking for live mode in particular.
author Chris Cannam
date Mon, 18 May 2015 13:58:27 +0100
parents 213a51e197c8
children d25e4aee73d7
rev   line source
Chris@31 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@31 2
Chris@31 3 /*
Chris@31 4 Silvet
Chris@31 5
Chris@31 6 A Vamp plugin for note transcription.
Chris@31 7 Centre for Digital Music, Queen Mary University of London.
Chris@31 8
Chris@31 9 This program is free software; you can redistribute it and/or
Chris@31 10 modify it under the terms of the GNU General Public License as
Chris@31 11 published by the Free Software Foundation; either version 2 of the
Chris@31 12 License, or (at your option) any later version. See the file
Chris@31 13 COPYING included with this distribution for more information.
Chris@31 14 */
Chris@31 15
Chris@31 16 #ifndef SILVET_H
Chris@31 17 #define SILVET_H
Chris@31 18
Chris@31 19 #include <vamp-sdk/Plugin.h>
Chris@31 20
Chris@32 21 #include <vector>
Chris@32 22 #include <string>
Chris@41 23 #include <set>
Chris@32 24
Chris@152 25 #include "MedianFilter.h"
Chris@161 26 #include "Instruments.h"
Chris@32 27
Chris@31 28 using std::string;
Chris@32 29 using std::vector;
Chris@41 30 using std::set;
Chris@55 31 using std::map;
Chris@31 32
Chris@31 33 class Resampler;
Chris@145 34 class CQSpectrogram;
Chris@246 35 class FlattenDynamics;
Chris@31 36
Chris@31 37 class Silvet : public Vamp::Plugin
Chris@31 38 {
Chris@31 39 public:
Chris@31 40 Silvet(float inputSampleRate);
Chris@31 41 virtual ~Silvet();
Chris@31 42
Chris@31 43 string getIdentifier() const;
Chris@31 44 string getName() const;
Chris@31 45 string getDescription() const;
Chris@31 46 string getMaker() const;
Chris@31 47 int getPluginVersion() const;
Chris@31 48 string getCopyright() const;
Chris@31 49
Chris@31 50 InputDomain getInputDomain() const;
Chris@31 51 size_t getPreferredBlockSize() const;
Chris@31 52 size_t getPreferredStepSize() const;
Chris@31 53 size_t getMinChannelCount() const;
Chris@31 54 size_t getMaxChannelCount() const;
Chris@31 55
Chris@31 56 ParameterList getParameterDescriptors() const;
Chris@31 57 float getParameter(string identifier) const;
Chris@31 58 void setParameter(string identifier, float value);
Chris@31 59
Chris@31 60 ProgramList getPrograms() const;
Chris@31 61 string getCurrentProgram() const;
Chris@31 62 void selectProgram(string name);
Chris@31 63
Chris@31 64 OutputList getOutputDescriptors() const;
Chris@31 65
Chris@31 66 bool initialise(size_t channels, size_t stepSize, size_t blockSize);
Chris@31 67 void reset();
Chris@31 68
Chris@31 69 FeatureSet process(const float *const *inputBuffers,
Chris@31 70 Vamp::RealTime timestamp);
Chris@31 71
Chris@31 72 FeatureSet getRemainingFeatures();
Chris@31 73
Chris@316 74 enum ProcessingMode { // ordered so draft==0 and hq==1 as in prior releases
Chris@316 75 DraftMode = 0,
Chris@316 76 HighQualityMode = 1,
Chris@316 77 LiveMode = 2,
Chris@316 78 };
Chris@316 79
Chris@31 80 protected:
Chris@161 81 const std::vector<InstrumentPack> m_instruments;
Chris@298 82 const std::vector<InstrumentPack> m_liveInstruments;
Chris@161 83
Chris@298 84 const InstrumentPack &getPack(int instrument) const {
Chris@298 85 if (m_mode == LiveMode) {
Chris@298 86 return m_liveInstruments[instrument];
Chris@298 87 } else {
Chris@298 88 return m_instruments[instrument];
Chris@298 89 }
Chris@298 90 }
Chris@298 91
Chris@31 92 Resampler *m_resampler;
Chris@246 93 FlattenDynamics *m_flattener;
Chris@145 94 CQSpectrogram *m_cq;
Chris@32 95
Chris@297 96 ProcessingMode m_mode;
Chris@297 97
Chris@166 98 bool m_fineTuning;
Chris@162 99 int m_instrument;
Chris@165 100 int m_colsPerSec;
Chris@110 101
Chris@32 102 typedef vector<vector<double> > Grid;
Chris@32 103
Chris@41 104 vector<MedianFilter<double> *> m_postFilter;
Chris@55 105 vector<map<int, double> > m_pianoRoll;
Chris@168 106 vector<map<int, int> > m_pianoRollShifts;
Chris@252 107 map<Vamp::RealTime, float> m_inputGains;
Chris@325 108 set<int> m_current;
Chris@41 109
Chris@32 110 Grid preProcess(const Grid &);
Chris@166 111
Chris@311 112 std::pair<vector<double>, vector<int> > applyEM(const InstrumentPack &pack,
Chris@311 113 const vector<double> &column,
Chris@311 114 bool wantShifts);
Chris@311 115
Chris@321 116 void postProcess(const vector<double> &pitches,
Chris@321 117 const vector<int> &bestShifts,
Chris@321 118 bool wantShifts); // -> piano roll column
Chris@166 119
Chris@319 120 std::pair<FeatureList, FeatureList> noteTrack(int shiftCount); // notes, onsets
Chris@166 121
Chris@169 122 void emitNote(int start, int end, int note, int shiftCount,
Chris@169 123 FeatureList &noteFeatures);
Chris@319 124
Chris@319 125 void emitOnset(int start, int note, int shiftCount,
Chris@319 126 FeatureList &noteFeatures);
Chris@309 127
Chris@309 128 Vamp::RealTime getColumnTimestamp(int column);
Chris@309 129
Chris@252 130 Feature makeNoteFeature(int start, int end, int note, int shift,
Chris@320 131 int shiftCount, double strength);
Chris@319 132 Feature makeOnsetFeature(int start, int note, int shift,
Chris@320 133 int shiftCount, double strength);
Chris@252 134
Chris@320 135 int getVelocityFor(double strength, int column);
Chris@320 136
Chris@252 137 float getInputGainAt(Vamp::RealTime t);
Chris@252 138
Chris@302 139 void insertTemplateFeatures(FeatureSet &);
Chris@302 140
Chris@302 141 void transcribe(const Grid &, FeatureSet &);
Chris@31 142
Chris@320 143 string getChromaName(int n) const;
Chris@320 144 string getNoteName(int n, int shift, int shiftCount) const;
Chris@320 145 float getNoteFrequency(int n, int shift, int shiftCount) const;
Chris@38 146
Chris@31 147 int m_blockSize;
Chris@32 148 int m_columnCount;
Chris@272 149 int m_resampledCount;
Chris@40 150 Vamp::RealTime m_startTime;
Chris@313 151 bool m_haveStartTime;
Chris@32 152
Chris@32 153 mutable int m_notesOutputNo;
Chris@319 154 mutable int m_onsetsOutputNo;
Chris@178 155 mutable int m_fcqOutputNo;
Chris@294 156 mutable int m_pitchOutputNo;
Chris@302 157 mutable int m_templateOutputNo;
Chris@309 158 mutable int m_chromaOutputNo;
Chris@31 159 };
Chris@31 160
Chris@31 161 #endif