void SoundScapingApp::drawWaveForm() { //if the buffer is null, for example if this gets called before any PCM data has been buffered //don't do anything if( ! mPcmBuffer ) { return; } uint32_t bufferLength = mPcmBuffer->getSampleCount(); audio::Buffer32fRef leftBuffer = mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ); audio::Buffer32fRef rightBuffer = mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_RIGHT ); int displaySize = getWindowWidth(); float scale = displaySize / (float)bufferLength; PolyLine<Vec2f> leftBufferLine; PolyLine<Vec2f> rightBufferLine; for( int i = 0; i < bufferLength; i++ ) { float x = ( i * scale ); //get the PCM value from the left channel buffer float y = ( ( leftBuffer->mData[i] - 1 ) * - 100 ); leftBufferLine.push_back( Vec2f( x , y) ); y = ( ( rightBuffer->mData[i] - 1 ) * - 100 ); rightBufferLine.push_back( Vec2f( x , y) ); } gl::color( Color( 0.0f, 0.5f, 1.0f ) ); gl::draw( leftBufferLine ); gl::draw( rightBufferLine ); }
void svvimApp::getAlpha () { // Sound buffer for FFT mPcmBuffer = mInput.getPcmBuffer(); // if (mPcmBuffer) { mFftDataRef = audio::calculateFft(mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ), 512); } uint16_t bandCount = 64; if( ! mPcmBuffer ) return; //use the most recent Pcm data to calculate t`he Fft std::shared_ptr <float> fftRef = audio::calculateFft( mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ), bandCount ); if( ! fftRef ) { return; } float * fftBuffer = fftRef.get(); //mAlpha = max(2, mAlpha); //draw the bands for( int i = 0; i < ( bandCount/32 ); i++ ) { mAlpha += fftBuffer[i] / bandCount / 4; } mAlpha /= 6.5; }
// Runs update logic void KissFileSampleApp::update() { // 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->getInterleavedData()->mSampleCount; if (mSampleCount > 0) { // Initialize analyzer, if needed if (!mFftInit) { mFftInit = true; mFft.setDataSize(mSampleCount); } // Analyze data if (mBuffer->getInterleavedData()->mData != 0) mFft.setData(mBuffer->getInterleavedData()->mData); } } } }
//************************************************************************* 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()); } } } } }
void shader02vertexApp::update() { //--audio input mPcmBuffer= mInput.getPcmBuffer(); if(mPcmBuffer) { mBufferSize= mPcmBuffer->getSampleCount(); //std::cout<<"mBufferSize: "<<mBufferSize<<std::endl; mBufferLeft= mPcmBuffer->getChannelData(audio::CHANNEL_FRONT_LEFT); mFftLeft= audio::calculateFft(mPcmBuffer->getChannelData(audio::CHANNEL_FRONT_LEFT), mBufferSize/2); mAmplitude= 0.0f; for(uint32_t i= 0; i<mBufferSize; i++) { mAmplitude += abs(mBufferLeft->mData[i]); } mAmplitude /= float(mBufferSize); //average amplitude Surface32f mSurfaceSnd(mBufferSize, 1, true); Surface32f::Iter sndIter(mSurfaceSnd.getIter()); uint32_t i= 0; while(sndIter.line()) { while(sndIter.pixel()) { sndIter.r()= mBufferLeft->mData[i]; i++; } } mTextureSnd= gl::Texture(mSurfaceSnd); Surface32f mSurfaceFft(mBufferSize/2, 1, true); Surface32f::Iter fftIter(mSurfaceFft.getIter()); uint32_t j= 0; float *fftBuffer= mFftLeft.get(); while(fftIter.line()) { while(fftIter.pixel()) { fftIter.r()= fftBuffer[j]; j++; } } mTextureFft= gl::Texture(mSurfaceFft); } //--shaders if((fs::last_write_time(mPathFrag)>mTimeFrag) || (fs::last_write_time(mPathVert)>mTimeVert)) { loadShader(); //hot-loading shader } }
void TouchAudioTestApp::drawWaveForm() { if( ! mPcmBuffer ) { return; } uint32_t bufferSamples = mPcmBuffer->getSampleCount(); audio::Buffer32fRef leftBuffer = mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ); //audio::Buffer32fRef rightBuffer = mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_RIGHT ); float center = getWindowWidth() / 2; float displaySize = getWindowHeight(); uint32_t endIdx = bufferSamples; //only draw the last 1024 samples or less int32_t startIdx = ( endIdx - 1024 ); startIdx = math<int32_t>::clamp( startIdx, 0, endIdx ); float scale = displaySize / (float)( endIdx - startIdx ); //float scale = displaySize / (float)( endIdx ); PolyLine<vec2> line; gl::color( Color( 1.0f, 0.5f, 0.25f ) ); for( uint32_t i = startIdx, c = 0; i < endIdx; i++, c++ ) { float y = ( ( leftBuffer->mData[i] - 1 ) * - center ); line.push_back( vec2( y, ( c * scale ) ) ); } gl::draw( line ); /*glColor3f( 1.0f, 0.96f, 0.0f ); glBegin( GL_LINE_STRIP ); for( int i = 0; i < endIdx; i++ ) { float y = ( ( rightBuffer->mData[i] - 1 ) * - 100 ); glVertex2f( ( i * scale ) , y ); } glEnd();*/ }
void RoboticaProjectApp::update() { //get the latest pcm buffer from the track mPcmBuffer = mTrack->getPcmBuffer(); if( mPcmBuffer ){ // mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ) fftRef = audio::calculateFft( mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ), bandCount ); if(mAddParticle){ particleC->addParticle(mAddPos); mAddParticle = false; } particleC->update(fftRef, bandCount, getElapsedSeconds()); } }
void redEyeApp::update() { //--osc input while(mListener.hasWaitingMessages()) { osc::Message msg; mListener.getNextMessage(&msg); mOsc= msg.getAddress(); for(uint32_t i= 0; i<msg.getNumArgs(); i++) { mOsc= mOsc+" "+msg.getArgAsString(i, true); } if(msg.getAddress()=="/numSamples") { mNumSamples= math<int32_t>::clamp(msg.getArgAsInt32(0, true), 1, 2048); } else if(msg.getAddress()=="/downSample") { mDownSample= math<int32_t>::clamp(msg.getArgAsInt32(0, true), 0, 2047); } else if(msg.getAddress()=="/amplitude") { mAmplitude= msg.getArgAsFloat(0, true); } else if(msg.getAddress()=="/width") { mWidth= math<float>::clamp(msg.getArgAsFloat(0, true), 0, 1000); } else if(msg.getAddress()=="/colorBack") { ColorA col= ColorA(0, 0, 0, 1); for(uint32_t i= 0; i<min(msg.getNumArgs(), 4); i++) { col[i]= msg.getArgAsFloat(i, true); } mColorBack.set(col.r, col.g, col.b, col.a); } else if(msg.getAddress()=="/scale0") { Vec3f sca= Vec3f(1.0f, 1.0f, 1.0f); for(uint32_t i= 0; i<min(msg.getNumArgs(), 3); i++) { msg.getArgAsFloat(i, true); } mScale0.set(sca.x, sca.y, sca.z); } else if(msg.getAddress()=="/scale1") { Vec3f sca= Vec3f(1.0f, 1.0f, 1.0f); for(uint32_t i= 0; i<min(msg.getNumArgs(), 3); i++) { msg.getArgAsFloat(i, true); } mScale1.set(sca.x, sca.y, sca.z); } else if(msg.getAddress()=="/rotate0") { Vec3f rot= Vec3f::zero(); for(uint32_t i= 0; i<min(msg.getNumArgs(), 3); i++) { rot[i]= msg.getArgAsFloat(i, true); } mRotate0.set(rot.x, rot.y, rot.z); } else if(msg.getAddress()=="/rotate1") { Vec3f rot= Vec3f::zero(); for(uint32_t i= 0; i<min(msg.getNumArgs(), 3); i++) { rot[i]= msg.getArgAsFloat(i, true); } mRotate1.set(rot.x, rot.y, rot.z); } else if(msg.getAddress()=="/translate0") { Vec3f tra= Vec3f::zero(); for(uint32_t i= 0; i<min(msg.getNumArgs(), 3); i++) { tra[i]= msg.getArgAsFloat(i, true); } mTranslate0.set(tra.x, tra.y, tra.z); } else if(msg.getAddress()=="/translate1") { Vec3f tra= Vec3f::zero(); for(uint32_t i= 0; i<min(msg.getNumArgs(), 3); i++) { tra[i]= msg.getArgAsFloat(i, true); } mTranslate1.set(tra.x, tra.y, tra.z); } else if(msg.getAddress()=="/color0") { ColorA col= ColorA(0, 0, 0, 1); for(uint32_t i= 0; i<min(msg.getNumArgs(), 4); i++) { col[i]= msg.getArgAsFloat(i, true); } mColor0.set(col.r, col.g, col.b, col.a); } else if(msg.getAddress()=="/color1") { ColorA col= ColorA(0, 0, 0, 1); for(uint32_t i= 0; i<min(msg.getNumArgs(), 4); i++) { col[i]= msg.getArgAsFloat(i, true); } mColor1.set(col.r, col.g, col.b, col.a); } } //--audio input mPcmBuffer= mInput.getPcmBuffer(); if(mPcmBuffer) { mBufferSize= mPcmBuffer->getSampleCount(); //std::cout<<"mBufferSize: "<<mBufferSize<<std::endl; mBufferLeft= mPcmBuffer->getChannelData(audio::CHANNEL_FRONT_LEFT); //mBufferRight= mPcmBuffer->getChannelData(audio::CHANNEL_FRONT_RIGHT); mFftLeft= audio::calculateFft(mPcmBuffer->getChannelData(audio::CHANNEL_FRONT_LEFT), mBufferSize/2); //mFftRight= audio::calculateFft(mPcmBuffer->getChannelData(audio::CHANNEL_FRONT_LEFT), mBufferSize/2); mAmplitude= 0.0f; for(uint32_t i= 0; i<mBufferSize; i++) { mAmplitude += abs(mBufferLeft->mData[i]); } mAmplitude /= float(mBufferSize); //average amplitude Surface32f mSurfaceSnd(mBufferSize, 1, true); Surface32f::Iter sndIter(mSurfaceSnd.getIter()); uint32_t i= 0; while(sndIter.line()) { while(sndIter.pixel()) { sndIter.r()= mBufferLeft->mData[i]; i++; } } mTextureSnd= gl::Texture(mSurfaceSnd); Surface32f mSurfaceFft(mBufferSize/2, 1, true); Surface32f::Iter fftIter(mSurfaceFft.getIter()); uint32_t j= 0; float *fftBuffer= mFftLeft.get(); while(fftIter.line()) { while(fftIter.pixel()) { fftIter.r()= fftBuffer[j]; j++; } } mTextureFft= gl::Texture(mSurfaceFft); } //--shaders if(mShader!=NULL) { if((fs::last_write_time(mPathFrag)>mTimeFrag) || (fs::last_write_time(mPathVert)>mTimeVert)) { loadShader(); //hot-loading shader } } mFps= getAverageFps(); }
void SoundScapingApp::drawFft() { float ht = 200.0f; if( ! mPcmBuffer ) return; //use the most recent Pcm data to calculate the Fft std::shared_ptr<float> fftRef = audio::calculateFft( mPcmBuffer->getChannelData( audio::CHANNEL_FRONT_LEFT ), bandCount * 2); if( ! fftRef ) { std::cout << "Pb with fft" << std::endl; return; } float * fftBuffer = fftRef.get(); float maxBand = *max_element(cumlFFT.begin() ,cumlFFT.end() ); float width = 6.0; //draw the bands for( int i = 0; i < ( bandCount ); i++ ) { float barY = (fftBuffer[i] / bandCount) * ht; glBegin( GL_QUADS ); glColor3f( 255.0f, 255.0f, 0.0f ); glVertex2f( i * width - 1, ht ); glVertex2f( i * width , ht ); glColor3f( 0.0f, 255.0f, 0.0f ); glVertex2f( i * width , ht - barY ); glVertex2f( i * width - 1, ht - barY ); glEnd(); barY = ( cumlFFT[i] += barY ) / maxBand ; barY *= ht; glPushMatrix(); glTranslatef( 0.0, 10.0, 0.0 ); glBegin( GL_QUADS ); glColor3f( 255.0f, 0.0f, 0.0f ); glVertex2f( i * width, ht ); glVertex2f( i * width + 1, ht ); glColor3f( 255.0f, 255.0f, 0.0f ); glVertex2f( i * width + 1,ht + barY ); glVertex2f( i * width, ht + barY ); glEnd(); glPopMatrix(); cumlFFT[i] *= 0.99; } glPushMatrix(); glTranslatef(600.0f, 0.0f, 0.0f); float scale = 300.0f / maxBand; glScalef(scale, scale, scale); SoundArc::draw_bands( &cumlFFT[0], bandCount /2 ); glPopMatrix(); glPushMatrix(); glTranslatef(800.0f, 200.0f, 0.0f); float scale2 = 600.0f / bandCount; glScalef(scale2, scale2, scale2); SoundArc::draw_bands( fftBuffer, bandCount /2 ); glPopMatrix(); }