annotate src/SoundFileLoader.cpp @ 2:fa2af670b5c5 tip

SoundFileLoader might have moved
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 06 Jan 2012 00:23:26 +0000
parents
children
rev   line source
andrew@2 1 /*
andrew@2 2 * SoundFileLoader.cpp
andrew@2 3 * audioFileLoaderSVN1
andrew@2 4 *
andrew@2 5 * Created by Andrew on 04/09/2011.
andrew@2 6 * Copyright 2011 QMUL. All rights reserved.
andrew@2 7 *
andrew@2 8 */
andrew@2 9
andrew@2 10 #include "SoundFileLoader.h"
andrew@2 11
andrew@2 12
andrew@2 13 SoundFileLoader::SoundFileLoader(){
andrew@2 14 sfinfo.format = 0;
andrew@2 15
andrew@2 16 chromaG = &chromoGramm;
andrew@2 17
andrew@2 18 }
andrew@2 19
andrew@2 20 void SoundFileLoader::loadLibSndFile(const char *infilename){
andrew@2 21
andrew@2 22 if (!sf_close(infile)){
andrew@2 23 printf("closed sndfile okay \n");
andrew@2 24 }
andrew@2 25
andrew@2 26 // Open Input File with lib snd file
andrew@2 27 if (! (infile = sf_open (infilename, SFM_READ, &sfinfo)))
andrew@2 28 { // Open failed
andrew@2 29 printf ("SF OPEN routine Not able to open input file %s.\n", infilename) ;
andrew@2 30 // Print the error message from libsndfile.
andrew@2 31 puts (sf_strerror (NULL)) ;
andrew@2 32
andrew@2 33 } else{
andrew@2 34 printf("SF OPEN : file %s okay, ", infilename);
andrew@2 35 printf("number of channels is %i\n", sfinfo.channels);
andrew@2 36 //sndfileInfoString = "Opened okay ";
andrew@2 37
andrew@2 38 };
andrew@2 39
andrew@2 40 processAudioToDoubleMatrix();
andrew@2 41
andrew@2 42 }
andrew@2 43
andrew@2 44
andrew@2 45
andrew@2 46
andrew@2 47 void SoundFileLoader::processAudioToDoubleMatrix(){
andrew@2 48
andrew@2 49
andrew@2 50
andrew@2 51 chromaAnalysis.chromaMatrix.clear();
andrew@2 52 chromaAnalysis.energyVector.clear();
andrew@2 53
andrew@2 54 audioHolder.audioVector.clear();
andrew@2 55 audioHolder.audioMatrix.clear();
andrew@2 56
andrew@2 57 //energyIndex = 0;
andrew@2 58
andrew@2 59 chromaG->initialise(FRAMESIZE,2048);//framesize 512 and hopsize 2048
andrew@2 60 chromaG->maximumChromaValue = 0;
andrew@2 61
andrew@2 62
andrew@2 63 // HERE IS THE CLASSIC LOADING FILE CODE
andrew@2 64 //DEALS WITH MORE THAN MONO
andrew@2 65 int channels = sfinfo.channels;
andrew@2 66 int blocksize = FRAMESIZE;
andrew@2 67
andrew@2 68 float buf [channels * blocksize] ;
andrew@2 69 int k, m, readcount ;
andrew@2 70
andrew@2 71 DoubleVector d;
andrew@2 72 while ((readcount = sf_readf_float (infile, buf, blocksize)) > 0){
andrew@2 73 for (k = 0 ; k < readcount ; k++){
andrew@2 74 d.clear();
andrew@2 75 for (m = 0 ; m < channels ; m++){
andrew@2 76 d.push_back(buf [k * channels + m]);
andrew@2 77 // fprintf (outfile, " % 12.10f", buf [k * channels + m]) ;
andrew@2 78 // fprintf (outfile, "\n") ;
andrew@2 79 if (m == 0){
andrew@2 80 //makes the vector hold the mono file
andrew@2 81 //this is the one we use for chromagram analysis etc
andrew@2 82 audioHolder.audioVector.push_back(buf[k * channels + 0]);
andrew@2 83 frame[k] = buf[k*channels + 0];
andrew@2 84 }
andrew@2 85
andrew@2 86 }
andrew@2 87 audioHolder.audioMatrix.push_back(d);
andrew@2 88 //storing the full soundfile in multiple channels in the audioMatrix
andrew@2 89 }
andrew@2 90
andrew@2 91
andrew@2 92 chromaG->processframe(frame);
andrew@2 93
andrew@2 94 if (chromaG->chromaready)
andrew@2 95 {
andrew@2 96 DoubleVector d;
andrew@2 97
andrew@2 98 for (int i = 0;i<12;i++){
andrew@2 99 //chromoGramVector[chromaIndex][i] = chromoGramm.rawChroma[i] / chromoGramm.maximumChromaValue;
andrew@2 100 d.push_back(chromaG->rawChroma[i]);// / chromaG->maximumChromaValue);
andrew@2 101
andrew@2 102 }
andrew@2 103
andrew@2 104 chromaAnalysis.chromaMatrix.push_back(d);
andrew@2 105
andrew@2 106 //There was a method to detect chord but deleted
andrew@2 107 // chord.C_Detect(chromoGramm.chroma,chromoGramm.chroma_low);
andrew@2 108 // rootChord[chromaIndex] = chord.root;
andrew@2 109
andrew@2 110
andrew@2 111 }//end if chromagRamm ready
andrew@2 112
andrew@2 113 // frameIndex++;
andrew@2 114
andrew@2 115 //get energy of the current frame and wait
andrew@2 116 double energyValue = getEnergyOfFrame();
andrew@2 117 chromaAnalysis.energyVector.push_back(energyValue);
andrew@2 118
andrew@2 119
andrew@2 120
andrew@2 121 }//end readcount
andrew@2 122
andrew@2 123
andrew@2 124
andrew@2 125 printf("Max chroma value is %f \n", chromaG->maximumChromaValue);
andrew@2 126
andrew@2 127
andrew@2 128
andrew@2 129 //normalise
andrew@2 130 int length = chromaAnalysis.chromaMatrix.size();
andrew@2 131 printf("length of chromagram is %d frames\n", length);
andrew@2 132 length = (chromaAnalysis.chromaMatrix[0]).size();
andrew@2 133 printf("height of dmatrix is %d\n", length);
andrew@2 134
andrew@2 135 for (int i = 0; i < chromaAnalysis.chromaMatrix.size();i++){
andrew@2 136 for (int j = 0; j < (chromaAnalysis.chromaMatrix[0]).size();j++){
andrew@2 137 chromaAnalysis.chromaMatrix[i][j] /= chromaG->maximumChromaValue;
andrew@2 138 }
andrew@2 139 }
andrew@2 140
andrew@2 141
andrew@2 142 printf("size of energy vector is %d \n", (int) chromaAnalysis.energyVector.size());
andrew@2 143
andrew@2 144 totalNumberOfFrames = (int) chromaAnalysis.energyVector.size();//frameIndex;//used to use this - but switch to energy vector's size instead
andrew@2 145
andrew@2 146 // printf("Total frames %i energy index %i and Chroma index %i \n", frameIndex, energyIndex, chromaIndex);
andrew@2 147
andrew@2 148 printf("audio vector size is %i\n", (int) audioHolder.audioVector.size());
andrew@2 149 audioHolder.length = (int) audioHolder.audioVector.size();
andrew@2 150 }
andrew@2 151
andrew@2 152
andrew@2 153
andrew@2 154 double SoundFileLoader::getEnergyOfFrame(){
andrew@2 155
andrew@2 156 float totalEnergyInFrame = 0;
andrew@2 157
andrew@2 158 for (int i = 0;i<FRAMESIZE;i++){
andrew@2 159
andrew@2 160 totalEnergyInFrame += (frame[i] * frame[i]);
andrew@2 161
andrew@2 162 }
andrew@2 163 totalEnergyInFrame = sqrt(totalEnergyInFrame);
andrew@2 164
andrew@2 165 return totalEnergyInFrame;
andrew@2 166 }
andrew@2 167