10
void compute(int nframes, signed short int *indata);
11
float getFreq( void ) { return m_freq; }
13
void measure (int nframes, int overlap, float *indata);
14
float *fftSampleBuffer;
20
fftwf_complex *fftOut;
28
CRecord(char * captureDevice = "default");
31
float getFreq( void ) { return fft->getFreq(); }
32
char * getNoteStr( int id);
34
float getNoteFreq(int id);
37
snd_pcm_t *alsaHandle;
38
signed short int buf[4096];
4
#include <boost/thread/mutex.hpp>
16
Peak(double _freq = 0.0, double _db = -std::numeric_limits<double>::infinity()): m_freq(_freq), m_db(_db) {}
17
double db() const {return m_db;};
18
double freq() const {return m_freq;};
19
void db(double _db) {m_db = _db;};
20
void freq(double _freq) {m_freq = _freq;};
24
double m_freqSum; // Sum of the fundamental frequencies of all harmonics
25
unsigned int m_harmonics;
27
unsigned int m_hHighest;
29
unsigned int m_dbHighestH;
33
void combine(Peak& p, unsigned int h);
35
double db() const { return m_dbHighest; }
36
double freq() const { return m_freqSum / m_harmonics; }
37
bool operator==(double f) const;
38
Tone& operator+=(Tone const& t);
41
static inline bool operator==(Tone const& lhs, Tone const& rhs) { return lhs == rhs.freq(); }
42
static inline bool operator!=(Tone const& lhs, Tone const& rhs) { return !(lhs == rhs); }
43
static inline bool operator<=(Tone const& lhs, Tone const& rhs) { return lhs.freq() < rhs.freq() || lhs == rhs; }
44
static inline bool operator>=(Tone const& lhs, Tone const& rhs) { return lhs.freq() > rhs.freq() || lhs == rhs; }
45
static inline bool operator<(Tone const& lhs, Tone const& rhs) { return lhs.freq() < rhs.freq() && lhs != rhs; }
46
static inline bool operator>(Tone const& lhs, Tone const& rhs) { return lhs.freq() > rhs.freq() && lhs != rhs; }
49
static const unsigned FFT_P = 12;
50
static const std::size_t FFT_N = 1 << FFT_P;
52
Analyzer(std::size_t step = 1500);
53
void operator()(da::pcm_data& data, da::settings const& s);
54
/** Get the peak level in dB (negative value, 0.0 = clipping). **/
55
double getPeak() const { return m_peak; }
56
/** Get the primary (singing) frequency. **/
57
double getFreq() const { return m_freq; }
58
/** Get a list of all tones detected. **/
59
std::vector<Tone> getTones() const {
60
boost::mutex::scoped_lock l(m_mutex);
64
mutable boost::mutex m_mutex;
66
std::vector<float> m_fftLastPhase;
67
std::vector<float> m_window;
68
volatile double m_peak;
69
volatile double m_freq;
70
std::deque<float> m_buf; // Sample buffer
71
std::vector<Tone> m_tones; // Synchronized access only!
72
std::vector<Tone> m_oldTones;
76
static const std::size_t DEFAULT_RATE = 48000;
81
Capture(std::string const& device = "", std::size_t rate = DEFAULT_RATE):
82
m_rs(da::settings(device)
83
.set_callback(boost::ref(m_analyzer))
86
.set_debug(std::cerr)),
90
Analyzer const& analyzer() const { return m_analyzer; }