andrew@0: /* andrew@0: * ofxSoundFileLoader.cpp andrew@0: * audioFileLoaderSVN1 andrew@0: * andrew@0: * Created by Andrew on 04/09/2011. andrew@0: * Copyright 2011 QMUL. All rights reserved. andrew@0: * andrew@0: */ andrew@0: andrew@0: #include "ofxSoundFileLoader.h" andrew@0: andrew@0: //NB zooming relies on screenToDraw - this needs to be 1 andrew@0: andrew@0: ofxSoundFileLoader::ofxSoundFileLoader(){ andrew@0: sfinfo.format = 0; andrew@0: // onsetDetect = new ofxAubioOnsetDetection(); andrew@0: //onsetDetect->reset(); andrew@0: andrew@0: soundFileName = ""; andrew@0: screenToDraw = 1; andrew@0: } andrew@0: andrew@0: ofxSoundFileLoader::~ofxSoundFileLoader(){ andrew@0: // delete onsetDetect ; andrew@0: // printf("file loader delete onset detect\n"); andrew@0: andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::updateToAudioPosition(const float& audioPosition){ andrew@0: andrew@0: audioHolder.playPosition = audioPosition * audioHolder.audioVector.size(); andrew@0: onsetDetect.playPosition = audioPosition; andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::updateToMillisPosition(const double& millis){ andrew@0: andrew@0: // audioHolder.playPosition = audioPosition * audioHolder.audioVector.size(); andrew@0: onsetDetect.playPosition = millis * 44.1 / (double)totalNumberOfSamples; andrew@0: andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::drawFile(){ andrew@0: if (screenToDraw == 0){ andrew@0: audioHolder.drawAudioVectorSamples(audioHolder.playPosition - audioHolder.audioScaleSamples*0.5, andrew@0: audioHolder.playPosition + audioHolder.audioScaleSamples*0.5); andrew@0: }else{ andrew@0: onsetDetect.drawOnsetDetectionScrolling(); andrew@0: } andrew@0: andrew@0: } andrew@0: andrew@0: #pragma mark -loadAudio andrew@0: void ofxSoundFileLoader::loadNewAudio(std::string filename){ andrew@0: loadLibSndFile(filename.c_str()); andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::loadLibSndFile(const char *infilename){ andrew@0: andrew@0: // if (!sf_close(infile)){ andrew@0: // printf("closed sndfile okay \n"); andrew@0: // } andrew@0: andrew@0: // Open Input File with lib snd file andrew@0: if (! (infile = sf_open (infilename, SFM_READ, &sfinfo))) andrew@0: { // Open failed andrew@0: printf ("SF OPEN routine Not able to open input file %s.\n", infilename) ; andrew@0: // Print the error message from libsndfile. andrew@0: puts (sf_strerror (NULL)) ; andrew@0: andrew@0: } else{ andrew@0: printf("SF OPEN : file %s okay, ", infilename); andrew@0: printf("number of channels is %i\n", sfinfo.channels); andrew@0: soundFileName = infilename; andrew@0: //sndfileInfoString = "Opened okay "; andrew@0: andrew@0: }; andrew@0: andrew@0: readAudio(); andrew@0: onsetDetect.printOnsetList(); andrew@0: printf("max val of onset det is %f\n", onsetDetect.onsetDetector.maximumDetectionValue); andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::readAudio(){ andrew@0: andrew@0: onsetDetect.reset(); andrew@0: //could add this in - check the stored github andrew@0: andrew@0: // HERE IS THE CLASSIC LOADING FILE CODE andrew@0: //DEALS WITH MORE THAN MONO andrew@0: int channels = sfinfo.channels; andrew@0: int blocksize = FRAMESIZE; andrew@0: andrew@0: float buf [channels * blocksize] ; andrew@0: int k, m, readcount ; andrew@0: andrew@0: DoubleVector d; andrew@0: while ((readcount = sf_readf_float (infile, buf, blocksize)) > 0){ andrew@0: for (k = 0 ; k < readcount ; k++){ andrew@0: //readcount is a chunk - eg 512 samples - of audio that is processed andrew@0: d.clear(); andrew@0: for (m = 0 ; m < channels ; m++){ andrew@0: d.push_back(buf [k * channels + m]); andrew@0: // fprintf (outfile, " % 12.10f", buf [k * channels + m]) ; andrew@0: // fprintf (outfile, "\n") ; andrew@0: if (m == 0){ andrew@0: //makes the vector hold the mono file - the left channel andrew@0: audioHolder.audioVector.push_back(buf[k * channels + 0]); andrew@0: frame[k] = buf[k*channels + 0]; andrew@0: } andrew@0: andrew@0: } andrew@0: audioHolder.audioMatrix.push_back(d); andrew@0: //storing the full soundfile in multiple channels in the audioMatrix andrew@0: } andrew@0: //printf("processing at readcount %i\n", readcount); andrew@0: //could call this here andrew@0: onsetDetect.processFrame(&frame[0], blocksize); andrew@0: andrew@0: andrew@0: }//end readcount andrew@0: andrew@0: //printf("audio vector size is %i\n", (int) audioHolder.audioVector.size()); andrew@0: audioHolder.length = (int) audioHolder.audioVector.size(); andrew@0: totalNumberOfSamples = audioHolder.length; andrew@0: andrew@0: printf("Total number of samples %i onset frames %i\n", totalNumberOfSamples, onsetDetect.frameCountIndex); andrew@0: andrew@0: freeMemory(); andrew@0: } andrew@0: andrew@0: andrew@0: void ofxSoundFileLoader::freeMemory(){ andrew@0: printf("FREE MEMORY in file loader\n"); andrew@0: audioHolder.audioMatrix.clear(); andrew@0: audioHolder.audioVector.clear(); andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::zoomOut(){ andrew@0: if (screenToDraw == 0){ andrew@0: audioHolder.audioScaleSamples *= 2.; andrew@0: } andrew@0: if (screenToDraw == 1){ andrew@0: onsetDetect.amplitudeNumber *= 2; andrew@0: } andrew@0: } andrew@0: andrew@0: void ofxSoundFileLoader::zoomIn(){ andrew@0: if (screenToDraw == 0){ andrew@0: audioHolder.audioScaleSamples /= 2.; andrew@0: } andrew@0: if (screenToDraw == 1 && onsetDetect.amplitudeNumber > 2){ andrew@0: onsetDetect.amplitudeNumber /= 2; andrew@0: } andrew@0: } andrew@0: