Chris@34: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@34: Chris@34: /* Chris@34: Silvet Chris@34: Chris@34: A Vamp plugin for note transcription. Chris@34: Centre for Digital Music, Queen Mary University of London. Chris@34: Chris@34: This program is free software; you can redistribute it and/or Chris@34: modify it under the terms of the GNU General Public License as Chris@34: published by the Free Software Foundation; either version 2 of the Chris@34: License, or (at your option) any later version. See the file Chris@34: COPYING included with this distribution for more information. Chris@34: */ Chris@34: Chris@34: #ifndef SILVET_EM_H Chris@34: #define SILVET_EM_H Chris@34: Chris@34: #include Chris@34: Chris@161: class InstrumentPack; Chris@161: Chris@34: class EM Chris@34: { Chris@34: public: Chris@161: EM(const InstrumentPack *pack, bool useShifts); // pack must outlive me Chris@34: ~EM(); Chris@34: Chris@183: void setPitchSparsity(float sparsity) { m_pitchSparsity = sparsity; } Chris@213: void setSourceSparsity(float sparsity) { m_sourceSparsity = sparsity; } Chris@183: Chris@125: int getBinCount() const { return m_binCount; } Chris@125: int getNoteCount() const { return m_noteCount; } Chris@91: int getSourceCount() const { return m_sourceCount; } Chris@166: int getShiftCount() const { return m_shiftCount; } Chris@34: Chris@125: /** Chris@125: * Carry out one iteration using the given column as input. The Chris@125: * column must have getBinCount() values. Chris@125: */ Chris@92: void iterate(const double *column); Chris@91: Chris@125: /** Chris@125: * Return the estimated distribution after the current iteration. Chris@125: * Like the input, this will have getBinCount() values. Chris@125: */ Chris@151: const float *getEstimate() const { Chris@38: return m_estimate; Chris@38: } Chris@125: Chris@125: /** Chris@125: * Return the pitch distribution for the current estimate. The Chris@125: * returned array has getNoteCount() values. Chris@125: */ Chris@151: const float *getPitchDistribution() const { Chris@38: return m_pitches; Chris@38: } Chris@125: Chris@125: /** Chris@125: * Return the source distribution for the current estimate. The Chris@125: * returned pointer refers to getSourceCount() arrays of Chris@125: * getNoteCount() values. Chris@125: */ Chris@151: const float *const *getSources() const { Chris@38: return m_sources; Chris@38: } Chris@166: Chris@166: /** Chris@166: * Return the shift distribution for the current estimate. The Chris@166: * returned pointer refers to getShiftCount() arrays of Chris@166: * getNoteCount() values. Chris@166: */ Chris@166: const float *const *getShifts() const { Chris@166: return m_shifts; Chris@166: } Chris@38: Chris@34: private: Chris@161: const InstrumentPack *m_pack; Chris@161: Chris@151: float *m_pitches; Chris@151: float **m_shifts; Chris@151: float **m_sources; Chris@55: Chris@151: float *m_updatePitches; Chris@151: float **m_updateShifts; Chris@151: float **m_updateSources; Chris@34: Chris@151: float *m_estimate; Chris@151: float *m_q; Chris@55: Chris@83: const int m_noteCount; Chris@83: const int m_shiftCount; // 1 + 2 * max template shift Chris@83: const int m_binCount; Chris@91: const int m_sourceCount; Chris@55: Chris@183: float m_pitchSparsity; Chris@183: float m_shiftSparsity; Chris@183: float m_sourceSparsity; Chris@36: Chris@151: void normaliseColumn(float *column, int size); Chris@151: void normaliseGrid(float **grid, int size1, int size2); Chris@35: Chris@151: void expectation(const float *column); // size is m_binCount Chris@354: void maximisation(); Chris@36: Chris@151: const float *templateFor(int instrument, int note, int shift); Chris@45: void rangeFor(int instrument, int &minPitch, int &maxPitch); Chris@45: bool inRange(int instrument, int pitch); Chris@34: }; Chris@34: Chris@34: #endif