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@34: class EM Chris@34: { Chris@34: public: Chris@110: EM(bool useShifts); Chris@34: ~EM(); Chris@34: 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@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@125: const double *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@125: const double *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@125: const double *const *getSources() const { Chris@38: return m_sources; Chris@38: } Chris@38: Chris@34: private: Chris@91: double *m_pitches; Chris@91: double **m_shifts; Chris@91: double **m_sources; Chris@55: Chris@100: double *m_updatePitches; Chris@100: double **m_updateShifts; Chris@100: double **m_updateSources; Chris@34: Chris@91: double *m_estimate; Chris@91: double *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@83: const double m_pitchSparsity; Chris@83: const double m_sourceSparsity; Chris@36: Chris@83: const int m_lowestPitch; Chris@83: const int m_highestPitch; Chris@35: Chris@91: void normaliseColumn(double *column, int size); Chris@92: void normaliseGrid(double **grid, int size1, int size2); Chris@35: Chris@92: void expectation(const double *column); // size is m_binCount Chris@92: void maximisation(const double *column); // size is m_binCount Chris@36: Chris@88: const double *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