annotate src/EM.h @ 188:462b165c8c0f noteagent

Emit "MIDI-compatible" frequencies only, unless in fine tuning mode
author Chris Cannam
date Thu, 29 May 2014 09:21:15 +0100
parents 59e3cca75b8d
children 5bde003a43a9
rev   line source
Chris@34 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@34 2
Chris@34 3 /*
Chris@34 4 Silvet
Chris@34 5
Chris@34 6 A Vamp plugin for note transcription.
Chris@34 7 Centre for Digital Music, Queen Mary University of London.
Chris@34 8
Chris@34 9 This program is free software; you can redistribute it and/or
Chris@34 10 modify it under the terms of the GNU General Public License as
Chris@34 11 published by the Free Software Foundation; either version 2 of the
Chris@34 12 License, or (at your option) any later version. See the file
Chris@34 13 COPYING included with this distribution for more information.
Chris@34 14 */
Chris@34 15
Chris@34 16 #ifndef SILVET_EM_H
Chris@34 17 #define SILVET_EM_H
Chris@34 18
Chris@34 19 #include <vector>
Chris@34 20
Chris@161 21 class InstrumentPack;
Chris@161 22
Chris@34 23 class EM
Chris@34 24 {
Chris@34 25 public:
Chris@161 26 EM(const InstrumentPack *pack, bool useShifts); // pack must outlive me
Chris@34 27 ~EM();
Chris@34 28
Chris@183 29 void setPitchSparsity(float sparsity) { m_pitchSparsity = sparsity; }
Chris@183 30
Chris@125 31 int getBinCount() const { return m_binCount; }
Chris@125 32 int getNoteCount() const { return m_noteCount; }
Chris@91 33 int getSourceCount() const { return m_sourceCount; }
Chris@166 34 int getShiftCount() const { return m_shiftCount; }
Chris@34 35
Chris@125 36 /**
Chris@125 37 * Carry out one iteration using the given column as input. The
Chris@125 38 * column must have getBinCount() values.
Chris@125 39 */
Chris@92 40 void iterate(const double *column);
Chris@91 41
Chris@125 42 /**
Chris@125 43 * Return the estimated distribution after the current iteration.
Chris@125 44 * Like the input, this will have getBinCount() values.
Chris@125 45 */
Chris@151 46 const float *getEstimate() const {
Chris@38 47 return m_estimate;
Chris@38 48 }
Chris@125 49
Chris@125 50 /**
Chris@125 51 * Return the pitch distribution for the current estimate. The
Chris@125 52 * returned array has getNoteCount() values.
Chris@125 53 */
Chris@151 54 const float *getPitchDistribution() const {
Chris@38 55 return m_pitches;
Chris@38 56 }
Chris@125 57
Chris@125 58 /**
Chris@125 59 * Return the source distribution for the current estimate. The
Chris@125 60 * returned pointer refers to getSourceCount() arrays of
Chris@125 61 * getNoteCount() values.
Chris@125 62 */
Chris@151 63 const float *const *getSources() const {
Chris@38 64 return m_sources;
Chris@38 65 }
Chris@166 66
Chris@166 67 /**
Chris@166 68 * Return the shift distribution for the current estimate. The
Chris@166 69 * returned pointer refers to getShiftCount() arrays of
Chris@166 70 * getNoteCount() values.
Chris@166 71 */
Chris@166 72 const float *const *getShifts() const {
Chris@166 73 return m_shifts;
Chris@166 74 }
Chris@38 75
Chris@34 76 private:
Chris@161 77 const InstrumentPack *m_pack;
Chris@161 78
Chris@151 79 float *m_pitches;
Chris@151 80 float **m_shifts;
Chris@151 81 float **m_sources;
Chris@55 82
Chris@151 83 float *m_updatePitches;
Chris@151 84 float **m_updateShifts;
Chris@151 85 float **m_updateSources;
Chris@34 86
Chris@151 87 float *m_estimate;
Chris@151 88 float *m_q;
Chris@55 89
Chris@83 90 const int m_noteCount;
Chris@83 91 const int m_shiftCount; // 1 + 2 * max template shift
Chris@83 92 const int m_binCount;
Chris@91 93 const int m_sourceCount;
Chris@55 94
Chris@183 95 float m_pitchSparsity;
Chris@183 96 float m_shiftSparsity;
Chris@183 97 float m_sourceSparsity;
Chris@36 98
Chris@83 99 const int m_lowestPitch;
Chris@83 100 const int m_highestPitch;
Chris@35 101
Chris@151 102 void normaliseColumn(float *column, int size);
Chris@151 103 void normaliseGrid(float **grid, int size1, int size2);
Chris@35 104
Chris@151 105 void expectation(const float *column); // size is m_binCount
Chris@151 106 void maximisation(const float *column); // size is m_binCount
Chris@36 107
Chris@151 108 const float *templateFor(int instrument, int note, int shift);
Chris@45 109 void rangeFor(int instrument, int &minPitch, int &maxPitch);
Chris@45 110 bool inRange(int instrument, int pitch);
Chris@34 111 };
Chris@34 112
Chris@34 113 #endif