andrew@2: /* andrew@2: * SoundFileLoader.cpp andrew@2: * audioFileLoaderSVN1 andrew@2: * andrew@2: * Created by Andrew on 04/09/2011. andrew@2: * Copyright 2011 QMUL. All rights reserved. andrew@2: * andrew@2: */ andrew@2: andrew@2: #include "SoundFileLoader.h" andrew@2: andrew@2: andrew@2: SoundFileLoader::SoundFileLoader(){ andrew@2: sfinfo.format = 0; andrew@2: andrew@2: chromaG = &chromoGramm; andrew@2: andrew@2: } andrew@2: andrew@2: void SoundFileLoader::loadLibSndFile(const char *infilename){ andrew@2: andrew@2: if (!sf_close(infile)){ andrew@2: printf("closed sndfile okay \n"); andrew@2: } andrew@2: andrew@2: // Open Input File with lib snd file andrew@2: if (! (infile = sf_open (infilename, SFM_READ, &sfinfo))) andrew@2: { // Open failed andrew@2: printf ("SF OPEN routine Not able to open input file %s.\n", infilename) ; andrew@2: // Print the error message from libsndfile. andrew@2: puts (sf_strerror (NULL)) ; andrew@2: andrew@2: } else{ andrew@2: printf("SF OPEN : file %s okay, ", infilename); andrew@2: printf("number of channels is %i\n", sfinfo.channels); andrew@2: //sndfileInfoString = "Opened okay "; andrew@2: andrew@2: }; andrew@2: andrew@2: processAudioToDoubleMatrix(); andrew@2: andrew@2: } andrew@2: andrew@2: andrew@2: andrew@2: andrew@2: void SoundFileLoader::processAudioToDoubleMatrix(){ andrew@2: andrew@2: andrew@2: andrew@2: chromaAnalysis.chromaMatrix.clear(); andrew@2: chromaAnalysis.energyVector.clear(); andrew@2: andrew@2: audioHolder.audioVector.clear(); andrew@2: audioHolder.audioMatrix.clear(); andrew@2: andrew@2: //energyIndex = 0; andrew@2: andrew@2: chromaG->initialise(FRAMESIZE,2048);//framesize 512 and hopsize 2048 andrew@2: chromaG->maximumChromaValue = 0; andrew@2: andrew@2: andrew@2: // HERE IS THE CLASSIC LOADING FILE CODE andrew@2: //DEALS WITH MORE THAN MONO andrew@2: int channels = sfinfo.channels; andrew@2: int blocksize = FRAMESIZE; andrew@2: andrew@2: float buf [channels * blocksize] ; andrew@2: int k, m, readcount ; andrew@2: andrew@2: DoubleVector d; andrew@2: while ((readcount = sf_readf_float (infile, buf, blocksize)) > 0){ andrew@2: for (k = 0 ; k < readcount ; k++){ andrew@2: d.clear(); andrew@2: for (m = 0 ; m < channels ; m++){ andrew@2: d.push_back(buf [k * channels + m]); andrew@2: // fprintf (outfile, " % 12.10f", buf [k * channels + m]) ; andrew@2: // fprintf (outfile, "\n") ; andrew@2: if (m == 0){ andrew@2: //makes the vector hold the mono file andrew@2: //this is the one we use for chromagram analysis etc andrew@2: audioHolder.audioVector.push_back(buf[k * channels + 0]); andrew@2: frame[k] = buf[k*channels + 0]; andrew@2: } andrew@2: andrew@2: } andrew@2: audioHolder.audioMatrix.push_back(d); andrew@2: //storing the full soundfile in multiple channels in the audioMatrix andrew@2: } andrew@2: andrew@2: andrew@2: chromaG->processframe(frame); andrew@2: andrew@2: if (chromaG->chromaready) andrew@2: { andrew@2: DoubleVector d; andrew@2: andrew@2: for (int i = 0;i<12;i++){ andrew@2: //chromoGramVector[chromaIndex][i] = chromoGramm.rawChroma[i] / chromoGramm.maximumChromaValue; andrew@2: d.push_back(chromaG->rawChroma[i]);// / chromaG->maximumChromaValue); andrew@2: andrew@2: } andrew@2: andrew@2: chromaAnalysis.chromaMatrix.push_back(d); andrew@2: andrew@2: //There was a method to detect chord but deleted andrew@2: // chord.C_Detect(chromoGramm.chroma,chromoGramm.chroma_low); andrew@2: // rootChord[chromaIndex] = chord.root; andrew@2: andrew@2: andrew@2: }//end if chromagRamm ready andrew@2: andrew@2: // frameIndex++; andrew@2: andrew@2: //get energy of the current frame and wait andrew@2: double energyValue = getEnergyOfFrame(); andrew@2: chromaAnalysis.energyVector.push_back(energyValue); andrew@2: andrew@2: andrew@2: andrew@2: }//end readcount andrew@2: andrew@2: andrew@2: andrew@2: printf("Max chroma value is %f \n", chromaG->maximumChromaValue); andrew@2: andrew@2: andrew@2: andrew@2: //normalise andrew@2: int length = chromaAnalysis.chromaMatrix.size(); andrew@2: printf("length of chromagram is %d frames\n", length); andrew@2: length = (chromaAnalysis.chromaMatrix[0]).size(); andrew@2: printf("height of dmatrix is %d\n", length); andrew@2: andrew@2: for (int i = 0; i < chromaAnalysis.chromaMatrix.size();i++){ andrew@2: for (int j = 0; j < (chromaAnalysis.chromaMatrix[0]).size();j++){ andrew@2: chromaAnalysis.chromaMatrix[i][j] /= chromaG->maximumChromaValue; andrew@2: } andrew@2: } andrew@2: andrew@2: andrew@2: printf("size of energy vector is %d \n", (int) chromaAnalysis.energyVector.size()); andrew@2: andrew@2: totalNumberOfFrames = (int) chromaAnalysis.energyVector.size();//frameIndex;//used to use this - but switch to energy vector's size instead andrew@2: andrew@2: // printf("Total frames %i energy index %i and Chroma index %i \n", frameIndex, energyIndex, chromaIndex); andrew@2: andrew@2: printf("audio vector size is %i\n", (int) audioHolder.audioVector.size()); andrew@2: audioHolder.length = (int) audioHolder.audioVector.size(); andrew@2: } andrew@2: andrew@2: andrew@2: andrew@2: double SoundFileLoader::getEnergyOfFrame(){ andrew@2: andrew@2: float totalEnergyInFrame = 0; andrew@2: andrew@2: for (int i = 0;i