andrew@0
|
1 #include "testApp.h"
|
andrew@0
|
2 #include "stdio.h"
|
andrew@0
|
3 #include "aubio.h"
|
andrew@0
|
4 #include <iostream>
|
andrew@0
|
5 #include <cstring>
|
andrew@0
|
6 #include <string>
|
andrew@0
|
7 #include <cstdlib>
|
andrew@0
|
8
|
andrew@0
|
9
|
andrew@0
|
10 const double samplingFrequency = 44100.0;
|
andrew@0
|
11
|
andrew@0
|
12 //--------------------------------------------------------------
|
andrew@0
|
13 void testApp::setup(){
|
andrew@0
|
14
|
andrew@0
|
15 ofBackground(255,255,255);
|
andrew@0
|
16
|
andrew@1
|
17
|
andrew@0
|
18 // 2 output channels,
|
andrew@0
|
19 // 0 input channels
|
andrew@0
|
20 // 22050 samples per second
|
andrew@0
|
21 // 256 samples per buffer
|
andrew@0
|
22 // 4 num buffers (latency)
|
andrew@0
|
23
|
andrew@0
|
24 //nb THIS CODE WOULD BE USEFUL IF WE EVER WANTED REAL-TIME INPUT - VIA ofSoundSteam
|
andrew@0
|
25
|
andrew@0
|
26
|
andrew@0
|
27 // ofSetDataPathRoot("../bin/data/");
|
andrew@0
|
28
|
andrew@0
|
29 //DONT NEED ANY OF THIS
|
andrew@0
|
30 sampleRate = 44100;
|
andrew@0
|
31 // phase = 0;
|
andrew@0
|
32 // phaseAdder = 0.0f;
|
andrew@0
|
33 // phaseAdderTarget = 0.0f;
|
andrew@0
|
34 volume = 0.1f;
|
andrew@0
|
35 bNoise = false;
|
andrew@0
|
36 lAudio = new float[256];
|
andrew@0
|
37 rAudio = new float[256];
|
andrew@0
|
38 ofSoundStreamSetup(2,0,this, sampleRate,256, 4);
|
andrew@0
|
39 //UNTIL HERE
|
andrew@0
|
40
|
andrew@0
|
41
|
andrew@0
|
42 ofSetFrameRate(60);
|
andrew@0
|
43
|
andrew@1
|
44 // fvec_t * my_fvec_t;
|
andrew@1
|
45 // aubio_onset_t* my_aubio_result;
|
andrew@1
|
46 // aubio_onsetdetection_t * my_onset_detection;
|
andrew@0
|
47
|
andrew@0
|
48 audioScale = 1000.0;
|
andrew@0
|
49
|
andrew@1
|
50
|
andrew@0
|
51
|
andrew@0
|
52 //int readcount = 0; // counts number of samples read from sound file
|
andrew@0
|
53
|
andrew@0
|
54 //string inputFilename = "sound/GetIntoTheGroove.wav";// input file name placed in bin
|
andrew@0
|
55
|
andrew@1
|
56
|
andrew@0
|
57
|
andrew@0
|
58 moveOn = true;
|
andrew@0
|
59
|
andrew@0
|
60 //loading audio files
|
andrew@0
|
61
|
andrew@0
|
62 const char *infilename = "../../../data/sound/bach4_short1.wav";
|
andrew@0
|
63 loadNewAudio(infilename);
|
andrew@0
|
64
|
andrew@0
|
65 audioPlaying = false;
|
andrew@0
|
66
|
andrew@0
|
67 drawSpectralDifferenceFunction = false;
|
andrew@0
|
68
|
andrew@0
|
69 screenToDraw = 1;
|
andrew@0
|
70
|
andrew@0
|
71
|
andrew@0
|
72 }
|
andrew@0
|
73
|
andrew@0
|
74
|
andrew@0
|
75 void testApp::initialiseVariables(){
|
andrew@0
|
76
|
andrew@1
|
77 // chromoGramm.initialise(FRAMESIZE,2048);//framesize 512 and hopsize 2048
|
andrew@0
|
78 }
|
andrew@0
|
79
|
andrew@0
|
80
|
andrew@0
|
81 //--------------------------------------------------------------
|
andrew@0
|
82 void testApp::update(){
|
andrew@0
|
83
|
andrew@1
|
84 audioPosition = loadedAudio.getPosition() * fileLoader.totalNumberOfFrames;//frameIndex;//the position in number of frames
|
andrew@1
|
85 fileLoader.chromaAnalysis.currentPlayingFrame = audioPosition;
|
andrew@1
|
86 audioPosition = (int) audioPosition % fileLoader.chromaAnalysis.scrollWidth ;
|
andrew@1
|
87 audioPosition /= fileLoader.chromaAnalysis.scrollWidth;
|
andrew@0
|
88
|
andrew@1
|
89 fileLoader.audioHolder.playPosition = loadedAudio.getPosition() * fileLoader.audioHolder.audioVector.size();
|
andrew@0
|
90 }
|
andrew@0
|
91
|
andrew@0
|
92 //--------------------------------------------------------------
|
andrew@0
|
93 void testApp::draw(){
|
andrew@0
|
94 switch (screenToDraw){
|
andrew@0
|
95 case 0:
|
andrew@0
|
96 if (drawSpectralDifferenceFunction)
|
andrew@1
|
97 fileLoader.chromaAnalysis.drawSpectralDifference();
|
andrew@0
|
98 else
|
andrew@1
|
99 drawDoubleMatrix(&fileLoader.chromaAnalysis.chromaMatrix);
|
andrew@0
|
100
|
andrew@1
|
101 fileLoader.chromaAnalysis.drawEnergyVectorFromPointer();
|
andrew@1
|
102
|
andrew@0
|
103 ofSetColor(0xFFFFFF);
|
andrew@0
|
104 ofLine(audioPosition*width, 0, audioPosition*width, height);
|
andrew@0
|
105 break;
|
andrew@0
|
106 case 1:
|
andrew@0
|
107 // audioHolder.drawAudioVectorMillis(1000, 1000+audioScale);
|
andrew@1
|
108 fileLoader.audioHolder.drawAudioVectorSamples(fileLoader.audioHolder.playPosition - fileLoader.audioHolder.audioScaleSamples*0.5, fileLoader.audioHolder.playPosition+fileLoader.audioHolder.audioScaleSamples*0.5);
|
andrew@0
|
109 ofSetColor(100,100,100);
|
andrew@0
|
110 ofLine(width/2, 0, width/2, height);
|
andrew@0
|
111 break;
|
andrew@0
|
112 }
|
andrew@0
|
113
|
andrew@0
|
114
|
andrew@0
|
115
|
andrew@0
|
116 //ofSetColor(255,0,0);
|
andrew@0
|
117 //drawEnergyVectorFromPointer(&audioVector);
|
andrew@0
|
118
|
andrew@0
|
119
|
andrew@0
|
120
|
andrew@0
|
121 ofDrawBitmapString(soundFileName,80,480);
|
andrew@0
|
122
|
andrew@0
|
123 }
|
andrew@0
|
124
|
andrew@0
|
125
|
andrew@0
|
126
|
andrew@0
|
127 void testApp::drawDoubleMatrix(DoubleMatrix* dMatrix){
|
andrew@0
|
128 //used to draw the chromagram matrix
|
andrew@0
|
129 int matrixSize = (*dMatrix).size();
|
andrew@0
|
130 if (matrixSize > 0){
|
andrew@0
|
131
|
andrew@0
|
132 float screenHeight = ofGetHeight() ;
|
andrew@0
|
133 float screenWidth = ofGetWidth();
|
andrew@0
|
134 float heightFactor = 8;
|
andrew@0
|
135 int i, j, startingFrame;
|
andrew@1
|
136 startingFrame = fileLoader.chromaAnalysis.currentPlayingFrame / fileLoader.chromaAnalysis.scrollWidth;//i.e. number of scroll widths in
|
andrew@1
|
137 startingFrame *= fileLoader.chromaAnalysis.scrollWidth;//starting frame in terms of energy frames
|
andrew@0
|
138 startingFrame /= CHROMA_CONVERSION_FACTOR; //in terms of chroma frames
|
andrew@0
|
139
|
andrew@1
|
140 float chromoLength = fileLoader.chromaAnalysis.scrollWidth/CHROMA_CONVERSION_FACTOR;
|
andrew@0
|
141 for (i = 0; i < chromoLength; i++){
|
andrew@0
|
142 j = i + startingFrame;
|
andrew@0
|
143 for (int y = 0;y < 12;y++){
|
andrew@0
|
144
|
andrew@0
|
145 if (j < matrixSize)
|
andrew@0
|
146 ofSetColor(0,0,255 * (*dMatrix)[j][11-y]);
|
andrew@0
|
147 else
|
andrew@0
|
148 ofSetColor(0,0,0);
|
andrew@0
|
149
|
andrew@0
|
150 ofRect(i*screenWidth/chromoLength,y*screenHeight/12,screenWidth/chromoLength,screenHeight/12);
|
andrew@0
|
151 }//end y
|
andrew@0
|
152 }//end i
|
andrew@0
|
153
|
andrew@0
|
154 }///end if matrix has content
|
andrew@0
|
155 else{
|
andrew@0
|
156 printf("Error - please load audio first");
|
andrew@0
|
157 }
|
andrew@0
|
158
|
andrew@0
|
159
|
andrew@0
|
160 }
|
andrew@0
|
161
|
andrew@0
|
162
|
andrew@0
|
163
|
andrew@1
|
164 /*
|
andrew@0
|
165 void testApp::loadLibSndFile(const char *infilename){
|
andrew@0
|
166
|
andrew@0
|
167 if (!sf_close(infile)){
|
andrew@0
|
168 printf("closed sndfile okay \n");
|
andrew@0
|
169 }
|
andrew@0
|
170
|
andrew@0
|
171 // Open Input File with lib snd file
|
andrew@0
|
172 if (! (infile = sf_open (infilename, SFM_READ, &sfinfo)))
|
andrew@0
|
173 { // Open failed
|
andrew@0
|
174 printf ("SF OPEN routine Not able to open input file %s.\n", infilename) ;
|
andrew@0
|
175 // Print the error message from libsndfile.
|
andrew@0
|
176 puts (sf_strerror (NULL)) ;
|
andrew@0
|
177
|
andrew@0
|
178 } else{
|
andrew@0
|
179 printf("SF OPEN : file %s okay, ", infilename);
|
andrew@0
|
180 printf("number of channels is %i\n", sfinfo.channels);
|
andrew@0
|
181 sndfileInfoString = "Opened okay ";
|
andrew@0
|
182
|
andrew@0
|
183 };
|
andrew@0
|
184
|
andrew@0
|
185 }
|
andrew@1
|
186 */
|
andrew@1
|
187 /*
|
andrew@0
|
188 void testApp::processAudioToDoubleMatrix(Chromagram* chromaG, DoubleMatrix* myDoubleMatrix, DoubleVector* energyVector){
|
andrew@0
|
189
|
andrew@0
|
190 myDoubleMatrix->clear();
|
andrew@0
|
191 energyVector->clear();
|
andrew@0
|
192
|
andrew@0
|
193 audioHolder.audioVector.clear();
|
andrew@0
|
194 audioHolder.audioMatrix.clear();
|
andrew@0
|
195
|
andrew@0
|
196 // energyIndex = 0;
|
andrew@0
|
197 // frameIndex = 0;
|
andrew@0
|
198 // chromaIndex = 0;// WHY NEED THIS?
|
andrew@0
|
199 chromaG->initialise(FRAMESIZE,2048);//framesize 512 and hopsize 2048
|
andrew@0
|
200 chromaG->maximumChromaValue = 0;
|
andrew@0
|
201
|
andrew@0
|
202
|
andrew@0
|
203
|
andrew@0
|
204
|
andrew@0
|
205 // HERE IS THE CLASSIC LOADING FILE CODE
|
andrew@0
|
206 //DEALS WITH MORE THAN MONO
|
andrew@0
|
207 int channels = sfinfo.channels;
|
andrew@0
|
208 int blocksize = FRAMESIZE;
|
andrew@0
|
209
|
andrew@0
|
210 float buf [channels * blocksize] ;
|
andrew@0
|
211 int k, m, readcount ;
|
andrew@0
|
212
|
andrew@0
|
213 DoubleVector d;
|
andrew@0
|
214 while ((readcount = sf_readf_float (infile, buf, blocksize)) > 0){
|
andrew@0
|
215 for (k = 0 ; k < readcount ; k++){
|
andrew@0
|
216 d.clear();
|
andrew@0
|
217 for (m = 0 ; m < channels ; m++){
|
andrew@0
|
218 d.push_back(buf [k * channels + m]);
|
andrew@0
|
219 // fprintf (outfile, " % 12.10f", buf [k * channels + m]) ;
|
andrew@0
|
220 // fprintf (outfile, "\n") ;
|
andrew@0
|
221 if (m == 0){
|
andrew@0
|
222 //makes the vector hold the mono file
|
andrew@0
|
223 //this is the one we use for chromagram analysis etc
|
andrew@0
|
224 audioHolder.audioVector.push_back(buf[k * channels + 0]);
|
andrew@0
|
225 frame[k] = buf[k*channels + 0];
|
andrew@0
|
226 }
|
andrew@0
|
227
|
andrew@0
|
228 }
|
andrew@0
|
229 audioHolder.audioMatrix.push_back(d);
|
andrew@0
|
230 //storing the full soundfile in multiple channels in the audioMatrix
|
andrew@0
|
231 }
|
andrew@0
|
232
|
andrew@0
|
233
|
andrew@0
|
234 chromaG->processframe(frame);
|
andrew@0
|
235
|
andrew@0
|
236 if (chromaG->chromaready)
|
andrew@0
|
237 {
|
andrew@0
|
238 DoubleVector d;
|
andrew@0
|
239
|
andrew@0
|
240 for (int i = 0;i<12;i++){
|
andrew@0
|
241 //chromoGramVector[chromaIndex][i] = chromoGramm.rawChroma[i] / chromoGramm.maximumChromaValue;
|
andrew@0
|
242 d.push_back(chromaG->rawChroma[i]);// / chromaG->maximumChromaValue);
|
andrew@0
|
243
|
andrew@0
|
244 }
|
andrew@0
|
245
|
andrew@0
|
246 myDoubleMatrix->push_back(d);
|
andrew@0
|
247
|
andrew@0
|
248 //There was a method to detect chord but deleted
|
andrew@0
|
249 // chord.C_Detect(chromoGramm.chroma,chromoGramm.chroma_low);
|
andrew@0
|
250 // rootChord[chromaIndex] = chord.root;
|
andrew@0
|
251
|
andrew@0
|
252
|
andrew@0
|
253 }//end if chromagRamm ready
|
andrew@0
|
254
|
andrew@0
|
255 // frameIndex++;
|
andrew@0
|
256
|
andrew@0
|
257 //get energy of the current frame and wait
|
andrew@0
|
258 double energyValue = getEnergyOfFrame();
|
andrew@0
|
259 energyVector->push_back(energyValue);
|
andrew@0
|
260
|
andrew@0
|
261
|
andrew@0
|
262
|
andrew@0
|
263 }//end readcount
|
andrew@0
|
264
|
andrew@0
|
265
|
andrew@0
|
266
|
andrew@0
|
267 printf("Max chroma value is %f \n", chromaG->maximumChromaValue);
|
andrew@0
|
268
|
andrew@0
|
269
|
andrew@0
|
270
|
andrew@0
|
271 //normalise
|
andrew@0
|
272 int length = myDoubleMatrix->size();
|
andrew@0
|
273 printf("length of chromagram is %d frames\n", length);
|
andrew@0
|
274 length = ((*myDoubleMatrix)[0]).size();
|
andrew@0
|
275 printf("height of dmatrix is %d\n", length);
|
andrew@0
|
276
|
andrew@0
|
277 for (int i = 0; i < myDoubleMatrix->size();i++){
|
andrew@0
|
278 for (int j = 0; j < ((*myDoubleMatrix)[0]).size();j++){
|
andrew@0
|
279 (*myDoubleMatrix)[i][j] /= chromaG->maximumChromaValue;
|
andrew@0
|
280 }
|
andrew@0
|
281 }
|
andrew@0
|
282
|
andrew@0
|
283
|
andrew@0
|
284 printf("size of energy vector is %d \n", (int) energyVector->size());
|
andrew@0
|
285
|
andrew@0
|
286 totalNumberOfFrames = (int) energyVector->size();//frameIndex;//used to use this - but switch to energy vector's size instead
|
andrew@0
|
287
|
andrew@0
|
288 // printf("Total frames %i energy index %i and Chroma index %i \n", frameIndex, energyIndex, chromaIndex);
|
andrew@0
|
289
|
andrew@0
|
290 printf("audio vector size is %i\n", (int) audioHolder.audioVector.size());
|
andrew@0
|
291 audioHolder.length = (int) audioHolder.audioVector.size();
|
andrew@0
|
292 }
|
andrew@0
|
293
|
andrew@1
|
294 */
|
andrew@0
|
295 //--------------------------------------------------------------
|
andrew@0
|
296 void testApp::keyPressed (int key){
|
andrew@0
|
297 if (key == '-'){
|
andrew@0
|
298 volume -= 0.05;
|
andrew@0
|
299 volume = MAX(volume, 0);
|
andrew@0
|
300 } else if (key == '+'){
|
andrew@0
|
301 volume += 0.05;
|
andrew@0
|
302 volume = MIN(volume, 1);
|
andrew@0
|
303 }
|
andrew@0
|
304
|
andrew@0
|
305 if (key == 'q')
|
andrew@0
|
306 screenToDraw = 1 - screenToDraw;
|
andrew@0
|
307
|
andrew@0
|
308 if (key == OF_KEY_DOWN){
|
andrew@1
|
309 if (fileLoader.chromaAnalysis.scrollWidth > 600)
|
andrew@1
|
310 fileLoader.chromaAnalysis.scrollWidth += 400;
|
andrew@0
|
311 else
|
andrew@1
|
312 fileLoader.chromaAnalysis.scrollWidth *= 2;
|
andrew@0
|
313 }
|
andrew@0
|
314
|
andrew@0
|
315 if (key == OF_KEY_RIGHT){
|
andrew@1
|
316 loadedAudio.setPosition(min(1.0, loadedAudio.getPosition() + (fileLoader.audioHolder.audioScaleSamples/(4.0*fileLoader.audioHolder.audioVector.size()))) );
|
andrew@0
|
317 // audioHolder.playPosition = loadedAudio.getPosition() * audioHolder.audioVector.size();
|
andrew@0
|
318 }
|
andrew@0
|
319
|
andrew@0
|
320 if (key == OF_KEY_LEFT){
|
andrew@1
|
321 loadedAudio.setPosition(max(0.0, loadedAudio.getPosition() - (fileLoader.audioHolder.audioScaleSamples/(4.0*fileLoader.audioHolder.audioVector.size()))));
|
andrew@0
|
322 // audioHolder.playPosition = loadedAudio.getPosition() * audioHolder.audioVector.size();
|
andrew@0
|
323 }
|
andrew@0
|
324
|
andrew@0
|
325
|
andrew@0
|
326 if (key == OF_KEY_UP){
|
andrew@1
|
327 if (fileLoader.chromaAnalysis.scrollWidth > 600)
|
andrew@1
|
328 fileLoader.chromaAnalysis.scrollWidth -= 400;
|
andrew@0
|
329 else
|
andrew@1
|
330 fileLoader.chromaAnalysis.scrollWidth /= 2;
|
andrew@0
|
331 }
|
andrew@0
|
332
|
andrew@0
|
333 if (key == ' '){
|
andrew@0
|
334 if (!audioPlaying) {
|
andrew@0
|
335 loadedAudio.play();
|
andrew@0
|
336 loadedAudio.setPaused(false);
|
andrew@0
|
337 audioPlaying = true;
|
andrew@0
|
338 audioPaused = false;
|
andrew@0
|
339 }
|
andrew@0
|
340 else{
|
andrew@0
|
341 audioPaused = !audioPaused;
|
andrew@0
|
342 loadedAudio.setPaused(audioPaused);
|
andrew@0
|
343 }
|
andrew@0
|
344
|
andrew@0
|
345 }
|
andrew@0
|
346
|
andrew@0
|
347 if (key == OF_KEY_RETURN){
|
andrew@0
|
348 audioPlaying = false;
|
andrew@0
|
349 loadedAudio.setPaused(true);
|
andrew@0
|
350 loadedAudio.setPosition(0.0);
|
andrew@0
|
351 }
|
andrew@0
|
352
|
andrew@0
|
353
|
andrew@0
|
354 if (key == 'o'){
|
andrew@0
|
355 openNewAudioFileWithdialogBox();
|
andrew@0
|
356 }
|
andrew@0
|
357
|
andrew@0
|
358
|
andrew@0
|
359 if (key == 'd'){
|
andrew@0
|
360 drawSpectralDifferenceFunction = !drawSpectralDifferenceFunction;
|
andrew@0
|
361 }
|
andrew@0
|
362
|
andrew@0
|
363 if (key == 'u'){
|
andrew@0
|
364 audioScale *= 2.;
|
andrew@1
|
365 fileLoader.audioHolder.audioScaleSamples *= 2.;
|
andrew@0
|
366 }
|
andrew@0
|
367
|
andrew@0
|
368 if (key == 'j'){
|
andrew@0
|
369 audioScale /= 2.;
|
andrew@1
|
370 fileLoader.audioHolder.audioScaleSamples /= 2.;
|
andrew@0
|
371 }
|
andrew@0
|
372 }
|
andrew@0
|
373
|
andrew@0
|
374 //--------------------------------------------------------------
|
andrew@0
|
375 void testApp::keyReleased (int key){
|
andrew@0
|
376
|
andrew@0
|
377 }
|
andrew@0
|
378
|
andrew@0
|
379 void testApp::openNewAudioFileWithdialogBox(){
|
andrew@0
|
380
|
andrew@0
|
381 //open audio file
|
andrew@0
|
382 string *filePtr;
|
andrew@0
|
383 filePtr = &soundFileName;
|
andrew@0
|
384
|
andrew@0
|
385 if (getFilenameFromDialogBox(filePtr)){
|
andrew@0
|
386 printf("Mainfile: Loaded name okay :\n'%s' \n", soundFileName.c_str());
|
andrew@0
|
387 }
|
andrew@0
|
388
|
andrew@0
|
389 loadNewAudio(soundFileName);
|
andrew@0
|
390
|
andrew@0
|
391 }
|
andrew@0
|
392
|
andrew@0
|
393 //--------------------------------------------------------------
|
andrew@0
|
394 void testApp::mouseMoved(int x, int y ){
|
andrew@0
|
395 width = ofGetWidth();
|
andrew@0
|
396 pan = (float)x / (float)width;
|
andrew@0
|
397 float height = (float)ofGetHeight();
|
andrew@0
|
398 float heightPct = ((height-y) / height);
|
andrew@1
|
399 xIndex = (int)(pan*fileLoader.chromaAnalysis.energyVector.size());
|
andrew@0
|
400 }
|
andrew@0
|
401
|
andrew@0
|
402 //--------------------------------------------------------------
|
andrew@0
|
403 void testApp::mouseDragged(int x, int y, int button){
|
andrew@0
|
404 width = ofGetWidth();
|
andrew@0
|
405 pan = (float)x / (float)width;
|
andrew@0
|
406 }
|
andrew@0
|
407
|
andrew@0
|
408 //--------------------------------------------------------------
|
andrew@0
|
409 void testApp::mousePressed(int x, int y, int button){
|
andrew@0
|
410 bNoise = true;
|
andrew@0
|
411 moveOn = true;
|
andrew@0
|
412 }
|
andrew@0
|
413
|
andrew@0
|
414
|
andrew@0
|
415 //--------------------------------------------------------------
|
andrew@0
|
416 void testApp::mouseReleased(int x, int y, int button){
|
andrew@0
|
417 bNoise = false;
|
andrew@0
|
418 }
|
andrew@0
|
419
|
andrew@0
|
420 //--------------------------------------------------------------
|
andrew@0
|
421 void testApp::windowResized(int w, int h){
|
andrew@0
|
422 width = w;
|
andrew@0
|
423 height = h;
|
andrew@0
|
424 }
|
andrew@0
|
425 //--------------------------------------------------------------
|
andrew@0
|
426 void testApp::audioRequested (float * output, int bufferSize, int nChannels){
|
andrew@0
|
427 //pan = 0.5f;
|
andrew@0
|
428 float leftScale = 1 - pan;
|
andrew@0
|
429 float rightScale = pan;
|
andrew@0
|
430
|
andrew@0
|
431 }
|
andrew@0
|
432
|
andrew@0
|
433
|
andrew@0
|
434 //--------------------------------------------------------------
|
andrew@0
|
435
|
andrew@0
|
436
|
andrew@0
|
437 bool testApp::getFilenameFromDialogBox(string* fileNameToSave){
|
andrew@0
|
438 //this uses a pointer structure within the loader and returns true if the dialogue box was used successfully
|
andrew@0
|
439 // first, create a string that will hold the URL
|
andrew@0
|
440 string URL;
|
andrew@0
|
441
|
andrew@0
|
442 // openFile(string& URL) returns 1 if a file was picked
|
andrew@0
|
443 // returns 0 when something went wrong or the user pressed 'cancel'
|
andrew@0
|
444 int response = ofxFileDialogOSX::openFile(URL);
|
andrew@0
|
445 if(response){
|
andrew@0
|
446 // now you can use the URL
|
andrew@0
|
447 *fileNameToSave = URL;
|
andrew@0
|
448 //printf("\n filename is %s \n", soundFileName.c_str());
|
andrew@0
|
449 return true;
|
andrew@0
|
450 }
|
andrew@0
|
451 else {
|
andrew@0
|
452 // soundFileName = "OPEN canceled. ";
|
andrew@0
|
453 printf("\n open file cancelled \n");
|
andrew@0
|
454 return false;
|
andrew@0
|
455 }
|
andrew@0
|
456
|
andrew@0
|
457 }
|
andrew@0
|
458
|
andrew@0
|
459 void testApp::openFileDialogBox(){
|
andrew@0
|
460
|
andrew@0
|
461 // first, create a string that will hold the URL
|
andrew@0
|
462 string URL;
|
andrew@0
|
463
|
andrew@0
|
464 // openFile(string& URL) returns 1 if a file was picked
|
andrew@0
|
465 // returns 0 when something went wrong or the user pressed 'cancel'
|
andrew@0
|
466 int response = ofxFileDialogOSX::openFile(URL);
|
andrew@0
|
467 if(response){
|
andrew@0
|
468 // now you can use the URL
|
andrew@0
|
469 soundFileName = URL;//"URL to open: \n "+URL;
|
andrew@0
|
470 }else {
|
andrew@0
|
471 soundFileName = "OPEN canceled. ";
|
andrew@0
|
472 }
|
andrew@0
|
473
|
andrew@0
|
474
|
andrew@0
|
475
|
andrew@0
|
476 }
|
andrew@0
|
477
|
andrew@0
|
478
|
andrew@0
|
479 void testApp::loadNewAudio(string soundFileName){
|
andrew@0
|
480
|
andrew@0
|
481 loadedAudio.loadSound(soundFileName);
|
andrew@0
|
482
|
andrew@0
|
483 //snd file method
|
andrew@0
|
484 const char *infilename = soundFileName.c_str() ;
|
andrew@1
|
485 fileLoader.loadLibSndFile(infilename);
|
andrew@0
|
486
|
andrew@1
|
487
|
andrew@0
|
488
|
andrew@0
|
489 audioPlaying = false;
|
andrew@0
|
490 }
|
andrew@0
|
491
|
andrew@0
|
492
|
andrew@0
|
493
|
andrew@0
|
494
|
andrew@0
|
495
|
andrew@1
|
496 /*
|
andrew@1
|
497
|
andrew@0
|
498 double testApp::getEnergyOfFrame(){
|
andrew@0
|
499
|
andrew@0
|
500 float totalEnergyInFrame = 0;
|
andrew@0
|
501
|
andrew@0
|
502 for (int i = 0;i<FRAMESIZE;i++){
|
andrew@0
|
503
|
andrew@0
|
504 totalEnergyInFrame += (frame[i] * frame[i]);
|
andrew@0
|
505
|
andrew@0
|
506 }
|
andrew@0
|
507 totalEnergyInFrame = sqrt(totalEnergyInFrame);
|
andrew@0
|
508
|
andrew@0
|
509 return totalEnergyInFrame;
|
andrew@0
|
510 }
|
andrew@0
|
511
|
andrew@1
|
512 */
|
andrew@0
|
513
|
andrew@0
|
514
|
andrew@0
|
515 //JUNK METHODS BEFORE SWITCHING TO VECTORS TO HOLD ENERGY AND CHROMA
|
andrew@0
|
516 //THESE ARE BETTER AS THEY ARE DYNAMIC
|
andrew@0
|
517
|
andrew@0
|
518 /*
|
andrew@0
|
519 void testApp::drawChromoGram(){
|
andrew@0
|
520 float screenHeight = ofGetHeight() ;
|
andrew@0
|
521 float screenWidth = ofGetWidth();
|
andrew@0
|
522 float heightFactor = 8;
|
andrew@0
|
523 int i, j, startingFrame;
|
andrew@0
|
524 startingFrame = currentPlayingFrame / scrollWidth;//i.e. number of scroll widths in
|
andrew@0
|
525 startingFrame *= scrollWidth;//starting frame in terms of energy frames
|
andrew@0
|
526 startingFrame /= CHROMA_CONVERSION_FACTOR; //in terms of chroma frames
|
andrew@0
|
527
|
andrew@0
|
528 float chromoLength = scrollWidth/CHROMA_CONVERSION_FACTOR;
|
andrew@0
|
529 for (i = 0; i < chromoLength; i++){
|
andrew@0
|
530 j = i + startingFrame;
|
andrew@0
|
531 for (int y = 0;y < 12;y++){
|
andrew@0
|
532 ofSetColor(255*chromoGramVector[j][11-y],0,0);
|
andrew@0
|
533 ofRect(i*screenWidth/chromoLength,y*screenHeight/12,screenWidth/chromoLength,screenHeight/12);
|
andrew@0
|
534 }//end y
|
andrew@0
|
535 }//end i
|
andrew@0
|
536
|
andrew@0
|
537 }
|
andrew@0
|
538 */
|
andrew@0
|
539
|
andrew@0
|
540
|
andrew@0
|
541
|
andrew@0
|
542 /*
|
andrew@0
|
543 void testApp::drawChromaMatrix(){
|
andrew@0
|
544 float screenHeight = ofGetHeight() ;
|
andrew@0
|
545 float screenWidth = ofGetWidth();
|
andrew@0
|
546 float heightFactor = 8;
|
andrew@0
|
547 int i, j, startingFrame;
|
andrew@0
|
548 startingFrame = currentPlayingFrame / scrollWidth;//i.e. number of scroll widths in
|
andrew@0
|
549 startingFrame *= scrollWidth;//starting frame in terms of energy frames
|
andrew@0
|
550 startingFrame /= CHROMA_CONVERSION_FACTOR; //in terms of chroma frames
|
andrew@0
|
551
|
andrew@0
|
552 float chromoLength = scrollWidth/CHROMA_CONVERSION_FACTOR;
|
andrew@0
|
553 for (i = 0; i < chromoLength; i++){
|
andrew@0
|
554 j = i + startingFrame;
|
andrew@0
|
555 for (int y = 0;y < 12;y++){
|
andrew@0
|
556 ofSetColor(0,255*chromaMatrix[j][11-y],0);
|
andrew@0
|
557 ofRect(i*screenWidth/chromoLength,y*screenHeight/12,screenWidth/chromoLength,screenHeight/12);
|
andrew@0
|
558 }//end y
|
andrew@0
|
559 }//end i
|
andrew@0
|
560
|
andrew@0
|
561 }
|
andrew@0
|
562 */
|
andrew@0
|
563
|
andrew@0
|
564
|
andrew@0
|
565
|
andrew@0
|
566
|
andrew@0
|
567 /*
|
andrew@0
|
568
|
andrew@0
|
569
|
andrew@0
|
570 int readcount = 1; // counts number of samples read from sound file
|
andrew@0
|
571 printf("processing audio from doublematrix \n");
|
andrew@0
|
572
|
andrew@0
|
573 while(readcount != 0 && moveOn == true)
|
andrew@0
|
574 {
|
andrew@0
|
575
|
andrew@0
|
576 // read FRAMESIZE samples from 'infile' and save in 'data'
|
andrew@0
|
577 readcount = sf_read_float(infile, frame, FRAMESIZE);
|
andrew@0
|
578
|
andrew@0
|
579
|
andrew@0
|
580 for (int i = 0;i < FRAMESIZE;i++)
|
andrew@0
|
581 audioHolder.audioVector.push_back(frame[i]);
|
andrew@0
|
582
|
andrew@0
|
583 printf("frame%f\n", frame[0]);
|
andrew@0
|
584 //processing frame - downsampled to 11025Hz
|
andrew@0
|
585 //8192 samples per chroma frame
|
andrew@0
|
586 chromaG->processframe(frame);
|
andrew@0
|
587
|
andrew@0
|
588 if (chromaG->chromaready)
|
andrew@0
|
589 {
|
andrew@0
|
590 DoubleVector d;
|
andrew@0
|
591
|
andrew@0
|
592 for (int i = 0;i<12;i++){
|
andrew@0
|
593 //chromoGramVector[chromaIndex][i] = chromoGramm.rawChroma[i] / chromoGramm.maximumChromaValue;
|
andrew@0
|
594 d.push_back(chromaG->rawChroma[i]);// / chromaG->maximumChromaValue);
|
andrew@0
|
595
|
andrew@0
|
596 }
|
andrew@0
|
597
|
andrew@0
|
598 myDoubleMatrix->push_back(d);
|
andrew@0
|
599
|
andrew@0
|
600 //There was a method to detect chord but deleted
|
andrew@0
|
601 // chord.C_Detect(chromoGramm.chroma,chromoGramm.chroma_low);
|
andrew@0
|
602 // rootChord[chromaIndex] = chord.root;
|
andrew@0
|
603
|
andrew@0
|
604
|
andrew@0
|
605 }//end if chromagRamm ready
|
andrew@0
|
606
|
andrew@0
|
607 //printf("calling drawSndFile %i", frameIndex);
|
andrew@0
|
608 // frameIndex++;
|
andrew@0
|
609
|
andrew@0
|
610 //get energy of the current frame and wait
|
andrew@0
|
611 double energyValue = getEnergyOfFrame();
|
andrew@0
|
612 energyVector->push_back(energyValue);
|
andrew@0
|
613
|
andrew@0
|
614
|
andrew@0
|
615 }//end while readcount
|
andrew@0
|
616
|
andrew@0
|
617
|
andrew@1
|
618 void testApp::drawEnergyVectorFromPointer(DoubleVector* energyVec){
|
andrew@1
|
619
|
andrew@1
|
620 ofSetColor(0xFF0066);
|
andrew@1
|
621 float screenHeight = ofGetHeight() ;
|
andrew@1
|
622 float screenWidth = ofGetWidth();
|
andrew@1
|
623 float heightFactor = 8;
|
andrew@1
|
624 int i, j, startingFrame;
|
andrew@1
|
625 startingFrame = currentPlayingFrame / scrollWidth;//i.e. number of scroll widths in
|
andrew@1
|
626 startingFrame *= scrollWidth;
|
andrew@1
|
627
|
andrew@1
|
628 for (i = 0; i < scrollWidth - 1; i++){
|
andrew@1
|
629 j = i + startingFrame;
|
andrew@1
|
630 if (j < (*energyVec).size())
|
andrew@1
|
631 ofLine(i*screenWidth/scrollWidth, screenHeight - ((*energyVec)[j]*screenHeight/heightFactor),
|
andrew@1
|
632 screenWidth*(i+1)/scrollWidth, screenHeight - ((*energyVec)[j+1]*screenHeight/heightFactor));
|
andrew@1
|
633
|
andrew@1
|
634 }
|
andrew@1
|
635 }
|
andrew@1
|
636
|
andrew@1
|
637 void testApp::drawSpectralDifference(DoubleMatrix* dMatrix){
|
andrew@1
|
638 int matrixSize = (*dMatrix).size();
|
andrew@1
|
639 if (matrixSize > 0){
|
andrew@1
|
640
|
andrew@1
|
641 float screenHeight = ofGetHeight() ;
|
andrew@1
|
642 float screenWidth = ofGetWidth();
|
andrew@1
|
643 float heightFactor = 8;
|
andrew@1
|
644 double difference;
|
andrew@1
|
645 int i, j, startingFrame;
|
andrew@1
|
646 startingFrame = currentPlayingFrame / scrollWidth;//i.e. number of scroll widths in
|
andrew@1
|
647 startingFrame *= scrollWidth;//starting frame in terms of energy frames
|
andrew@1
|
648 startingFrame /= CHROMA_CONVERSION_FACTOR; //in terms of chroma frames
|
andrew@1
|
649
|
andrew@1
|
650 float chromoLength = scrollWidth/CHROMA_CONVERSION_FACTOR;
|
andrew@1
|
651 for (i = 1; i < chromoLength; i++){//changed to add 1
|
andrew@1
|
652 j = i + startingFrame;
|
andrew@1
|
653 for (int y = 0;y < 12;y++){
|
andrew@1
|
654
|
andrew@1
|
655 if (j < matrixSize)
|
andrew@1
|
656 difference = (*dMatrix)[j][11-y] - (*dMatrix)[j-1][11-y];
|
andrew@1
|
657 else
|
andrew@1
|
658 difference = 0;
|
andrew@1
|
659
|
andrew@1
|
660 if (difference < 0)
|
andrew@1
|
661 difference = 0;//half wave rectify
|
andrew@1
|
662
|
andrew@1
|
663 ofSetColor(0,0,255 * difference);//, 0;
|
andrew@1
|
664 ofRect(i*screenWidth/chromoLength,y*screenHeight/12,screenWidth/chromoLength,screenHeight/12);
|
andrew@1
|
665 }//end y
|
andrew@1
|
666 }//end i
|
andrew@1
|
667
|
andrew@1
|
668 }///end if matrix has content
|
andrew@1
|
669 else{
|
andrew@1
|
670 printf("Error - please load audio first");
|
andrew@1
|
671 }
|
andrew@1
|
672
|
andrew@1
|
673 }
|
andrew@1
|
674
|
andrew@0
|
675 */
|