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@34: EM(); Chris@34: ~EM(); Chris@34: Chris@91: int getBinCount() const { return m_binCount; } // size of input column Chris@91: int getNoteCount() const { return m_noteCount; } // size of pitch column Chris@91: int getSourceCount() const { return m_sourceCount; } Chris@34: Chris@92: void iterate(const double *column); Chris@91: Chris@91: const double *getEstimate() const { // bin count Chris@38: return m_estimate; Chris@38: } Chris@91: const double *getPitchDistribution() const { // note count Chris@38: return m_pitches; Chris@38: } Chris@92: const double *const *getSources() const { // source count * note count 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@34: Chris@91: double *m_estimate; Chris@91: double *m_q; Chris@34: 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@42: Chris@83: const double m_pitchSparsity; Chris@83: const double m_sourceSparsity; Chris@35: 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@91: 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