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
|