//************************************************************************* void BeatDetectorApp::update() { if(write_frames) { if(curr_sample < p_sample->m_SampleCount) { // Initialize analyzer, if needed if (!mFftInit) { Init(samples_per_frame); } mFft.setData(p_sample->mp_Buffer + (curr_sample)); curr_sample += samples_per_frame; CSoundAnalyzer::Get().ProcessData(mFft.getAmplitude(), mFft.getData()); } else { shutdown(); } } else { // Check if track is playing and has a PCM buffer available if (mTrack->isPlaying() && mTrack->isPcmBuffering()) { // Get buffer mBuffer = mTrack->getPcmBuffer(); if (mBuffer && mBuffer->getInterleavedData()) { // Get sample count uint32_t mSampleCount = mBuffer->getChannelData(CHANNEL_FRONT_LEFT)->mSampleCount; if (mSampleCount > 0) { // Initialize analyzer, if needed if (!mFftInit) { Init(samples_per_frame); } // Analyze data if (mBuffer->getChannelData(CHANNEL_FRONT_LEFT)->mData != 0) mFft.setData(mBuffer->getChannelData(CHANNEL_FRONT_LEFT)->mData); CSoundAnalyzer::Get().ProcessData(mFft.getAmplitude(), mFft.getData()); } } } } }
// Draw void KissFileSampleApp::draw() { // Clear screen gl::clear(Color(0.0f, 0.0f, 0.0f)); // Check init flag if (mFftInit) { // Get data float * mFreqData = mFft.getAmplitude(); float * mTimeData = mFft.getData(); int32_t mDataSize = mFft.getBinSize(); // Get dimensions float mScale = ((float)getWindowWidth() - 20.0f) / (float)mDataSize; float mWindowHeight = (float)getWindowHeight(); // Use polylines to depict time and frequency domains PolyLine<Vec2f> mFreqLine; PolyLine<Vec2f> mTimeLine; // Iterate through data for (int32_t i = 0; i < mDataSize; i++) { // Do logarithmic plotting for frequency domain double mLogSize = log((double)mDataSize); float x = (float)(log((double)i) / mLogSize) * (double)mDataSize; float y = math<float>::clamp(mFreqData[i] * (x / mDataSize) * log((double)(mDataSize - i)), 0.0f, 2.0f); // Plot points on lines mFreqLine.push_back(Vec2f(x * mScale + 10.0f, -y * (mWindowHeight - 20.0f) * 1.25f + (mWindowHeight - 10.0f))); mTimeLine.push_back(Vec2f(i * mScale + 10.0f, mTimeData[i] * (mWindowHeight - 20.0f) * 0.3f + (mWindowHeight * 0.15f + 10.0f))); } // Draw signals gl::draw(mFreqLine); gl::draw(mTimeLine); } }