andrew@1
|
1 /*
|
andrew@1
|
2 * RecordedMultitrackAudio.cpp
|
andrew@1
|
3 * MultipleAudioMathcher
|
andrew@1
|
4 *
|
andrew@1
|
5 * Created by Andrew on 31/01/2012.
|
andrew@1
|
6 * Copyright 2012 QMUL. All rights reserved.
|
andrew@1
|
7 *
|
andrew@1
|
8 */
|
andrew@1
|
9
|
andrew@1
|
10 #include "RecordedMultitrackAudio.h"
|
andrew@1
|
11
|
andrew@1
|
12
|
andrew@1
|
13 void RecordedMultitrackAudio::loadTestAudio(){
|
andrew@1
|
14
|
andrew@1
|
15
|
andrew@2
|
16 const char *infilename = "../../../data/sound/basicClavScale.wav";
|
andrew@1
|
17
|
andrew@1
|
18 //LoadedAudioHolder lah;
|
andrew@1
|
19 // lah.loadAudioFile(infilename);
|
andrew@1
|
20 // loadedAudioFiles.push_back(lah);
|
andrew@1
|
21
|
andrew@1
|
22 //Take care here - we need a pointer to create new instance
|
andrew@1
|
23 //but not then delete the instance before the vector of all audio tracks has been used
|
andrew@1
|
24 //the above code using lah has problem that it deletes objects once out of the scope of testApp.setup()
|
andrew@1
|
25 //when lah is in theory no longer used - something like that possible? - at least pointers to onset detection seem deleted
|
andrew@2
|
26 loadedAudioPtr = new LoadedAudioHolder();
|
andrew@1
|
27 loadedAudioPtr->loadAudioFile(infilename);
|
andrew@1
|
28 // loadedAudioFiles.push_back(*loadedAudioPtr);
|
andrew@1
|
29 loadedAudioFiles[0] = *loadedAudioPtr;
|
andrew@1
|
30
|
andrew@1
|
31 loadedAudioFiles[0].fileLoader.onsetDetect.window.setToRelativeSize(0, 0.0, 1, 0.25);
|
andrew@2
|
32 loadedAudioFiles[0].setTrackType(0);// fileLoader.onsetDetect.trackType = 0;
|
andrew@1
|
33
|
andrew@1
|
34 // printf("Loaded audio %i\n", (int)numberOfAudioTracks);
|
andrew@1
|
35 printf("loaded max val is %f\n", loadedAudioFiles[0].fileLoader.onsetDetect.onsetDetector.maximumDetectionValue);
|
andrew@1
|
36
|
andrew@1
|
37 printf("BEFORE LOADING 1\n");
|
andrew@1
|
38 printInfo();
|
andrew@1
|
39
|
andrew@2
|
40 infilename = "../../../data/sound/basicClavScale2.wav";
|
andrew@2
|
41
|
andrew@1
|
42 loadedAudioPtr = new LoadedAudioHolder;
|
andrew@1
|
43 loadedAudioPtr->loadAudioFile(infilename);
|
andrew@1
|
44 // loadedAudioFiles.push_back(*loadedAudioPtr);
|
andrew@1
|
45 loadedAudioFiles[1] = *loadedAudioPtr;
|
andrew@1
|
46 loadedAudioFiles[1].fileLoader.onsetDetect.window.setToRelativeSize(0, 0.3, 1, 0.25);
|
andrew@2
|
47 loadedAudioFiles[1].setTrackType(1);
|
andrew@2
|
48 // loadedAudioFiles[1].fileLoader.onsetDetect.trackType = 0;
|
andrew@1
|
49
|
andrew@1
|
50 printf("AFTER LOADING 1\n");
|
andrew@1
|
51 printInfo();
|
andrew@1
|
52
|
andrew@1
|
53 numberOfAudioTracks = 2;
|
andrew@1
|
54
|
andrew@1
|
55
|
andrew@1
|
56 }
|
andrew@1
|
57
|
andrew@1
|
58
|
andrew@1
|
59
|
andrew@1
|
60 void RecordedMultitrackAudio::drawTracks(){
|
andrew@1
|
61
|
andrew@1
|
62 for (int i = 0;i < numberOfAudioTracks;i++){
|
andrew@1
|
63 loadedAudioFiles[i].draw();
|
andrew@1
|
64 }
|
andrew@2
|
65
|
andrew@2
|
66 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2), 20, 20);
|
andrew@1
|
67 }
|
andrew@1
|
68
|
andrew@1
|
69
|
andrew@1
|
70 void RecordedMultitrackAudio::updatePosition(){
|
andrew@1
|
71 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
72 loadedAudioFiles[i].updateToPlayPosition();
|
andrew@1
|
73 }
|
andrew@1
|
74
|
andrew@1
|
75
|
andrew@2
|
76 void RecordedMultitrackAudio::matchNewPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){
|
andrew@2
|
77 //start at beginning but OPTIMISE later
|
andrew@2
|
78
|
andrew@2
|
79 if (channel <= numberOfAudioTracks){
|
andrew@2
|
80 for (int i = 0;i < loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets.size();i++){
|
andrew@2
|
81
|
andrew@2
|
82 if (checkMatch(loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].aubioPitch, pitchIn)) {
|
andrew@2
|
83 loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].matched = true;
|
andrew@2
|
84 }
|
andrew@2
|
85 else{
|
andrew@2
|
86 loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].matched = false;
|
andrew@2
|
87 }
|
andrew@2
|
88
|
andrew@2
|
89 }
|
andrew@2
|
90 }
|
andrew@2
|
91
|
andrew@2
|
92 recentPitch = pitchIn;
|
andrew@2
|
93 }
|
andrew@2
|
94
|
andrew@2
|
95 bool RecordedMultitrackAudio::checkMatch(const double& recordedPitch, const double& livePitch){
|
andrew@2
|
96 if (abs(recordedPitch - livePitch) < 40)
|
andrew@2
|
97 return true;
|
andrew@2
|
98 else
|
andrew@2
|
99 return false;
|
andrew@2
|
100 }
|
andrew@2
|
101
|
andrew@2
|
102
|
andrew@1
|
103 void RecordedMultitrackAudio::switchScreens(){
|
andrew@1
|
104 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
105 loadedAudioFiles[i].switchScreens();
|
andrew@1
|
106 }
|
andrew@1
|
107
|
andrew@1
|
108
|
andrew@1
|
109 void RecordedMultitrackAudio::togglePlay(){
|
andrew@1
|
110 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
111 loadedAudioFiles[i].togglePlay();
|
andrew@1
|
112 }
|
andrew@1
|
113
|
andrew@1
|
114 void RecordedMultitrackAudio::stop(){
|
andrew@1
|
115 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
116 loadedAudioFiles[i].stop();
|
andrew@1
|
117 }
|
andrew@1
|
118
|
andrew@1
|
119
|
andrew@1
|
120 void RecordedMultitrackAudio::printInfo(){
|
andrew@1
|
121 loadedAudioFiles[0].fileLoader.onsetDetect.printChromaInfo();
|
andrew@1
|
122 loadedAudioFiles[0].printEvents();
|
andrew@1
|
123 }
|
andrew@1
|
124
|
andrew@1
|
125 void RecordedMultitrackAudio::windowResized(const int& w, const int& h){
|
andrew@1
|
126 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
127 loadedAudioFiles[i].windowResized(w, h);
|
andrew@1
|
128 }
|
andrew@1
|
129
|
andrew@1
|
130 void RecordedMultitrackAudio::zoomIn(){
|
andrew@1
|
131 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
132 loadedAudioFiles[i].fileLoader.zoomIn();
|
andrew@1
|
133 }
|
andrew@1
|
134
|
andrew@1
|
135 void RecordedMultitrackAudio::zoomOut(){
|
andrew@1
|
136 for (int i = 0;i < numberOfAudioTracks;i++)
|
andrew@1
|
137 loadedAudioFiles[i].fileLoader.zoomOut();
|
andrew@1
|
138 }
|
andrew@1
|
139
|
andrew@1
|
140
|