andrew@50
|
1 void sendNote(VPNote note, int channel){ // send note function gathers info to output to max
|
andrew@50
|
2 outputToMax(note.VPNotePitch, note.VPNoteVelocity, channel);
|
andrew@50
|
3 }
|
andrew@50
|
4
|
andrew@50
|
5
|
andrew@50
|
6 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
7
|
andrew@50
|
8 void outputToMax(int note, int velocity, int channel){ // calculates the necessary note on and note offs depending on ducking and muting and sends them to max
|
andrew@50
|
9 String noteOut = "";
|
andrew@50
|
10 if (!tracks[channel].mute){
|
andrew@50
|
11 if (tracks[channel].ducking){
|
andrew@50
|
12 if (velocity != 0){
|
andrew@50
|
13 noteOut = ("" + note + " " + velocity + " " + (channel+8));
|
andrew@50
|
14 }
|
andrew@50
|
15 if (velocity == 0 && !tracks[channel].cycled){
|
andrew@50
|
16 noteOut = ("" + note + " " + velocity + " " + (channel+8));
|
andrew@50
|
17 OscMessage message = new OscMessage("/pitch_vel_chan");
|
andrew@50
|
18 message.add(noteOut);
|
andrew@50
|
19 oscP5return.send(message, ableton);
|
andrew@50
|
20 link.output(noteOut);
|
andrew@50
|
21 noteOut = ("" + note + " " + velocity + " " + channel);
|
andrew@50
|
22 }
|
andrew@50
|
23 if (velocity == 0 && tracks[channel].cycled){
|
andrew@50
|
24 noteOut = ("" + note + " " + velocity + " " + (channel+8));
|
andrew@50
|
25 }
|
andrew@50
|
26 }
|
andrew@50
|
27 if (!tracks[channel].ducking){
|
andrew@50
|
28 if (velocity != 0){
|
andrew@50
|
29 noteOut = ("" + note + " " + velocity + " " + channel);
|
andrew@50
|
30 }
|
andrew@50
|
31 if (velocity == 0 && !tracks[channel].cycled){
|
andrew@50
|
32 noteOut = ("" + note + " " + velocity + " " + (channel+8));
|
andrew@50
|
33 OscMessage message = new OscMessage("/pitch_vel_chan");
|
andrew@50
|
34 message.add(noteOut);
|
andrew@50
|
35 oscP5return.send(message, ableton);
|
andrew@50
|
36 link.output(noteOut);
|
andrew@50
|
37 noteOut = ("" + note + " " + velocity + " " + channel);
|
andrew@50
|
38 }
|
andrew@50
|
39 if (velocity == 0 && tracks[channel].cycled){
|
andrew@50
|
40 noteOut = ("" + note + " " + velocity + " " + channel);
|
andrew@50
|
41 }
|
andrew@50
|
42 }
|
andrew@50
|
43 link.output(noteOut);
|
andrew@50
|
44 OscMessage message = new OscMessage("/pitch_vel_chan");
|
andrew@50
|
45 message.add(noteOut);
|
andrew@50
|
46 oscP5return.send(message, ableton);
|
andrew@50
|
47
|
andrew@50
|
48 }
|
andrew@50
|
49 if (tracks[channel].mute){
|
andrew@50
|
50 if (velocity == 0 && !tracks[channel].cycled){
|
andrew@50
|
51 noteOut = ("" + note + " " + velocity + " " + (channel+8));
|
andrew@50
|
52 link.output(noteOut);
|
andrew@50
|
53 OscMessage message = new OscMessage("/pitch_vel_chan");
|
andrew@50
|
54 message.add(noteOut);
|
andrew@50
|
55 oscP5return.send(message, ableton);
|
andrew@50
|
56 noteOut = ("" + note + " " + velocity + " " + channel);
|
andrew@50
|
57 OscMessage message2 = new OscMessage("/pitch_vel_chan");
|
andrew@50
|
58 message2.add(noteOut);
|
andrew@50
|
59 oscP5return.send(message, ableton);
|
andrew@50
|
60 link.output(noteOut);
|
andrew@50
|
61 }
|
andrew@50
|
62 }
|
andrew@50
|
63 }
|
andrew@50
|
64
|
andrew@50
|
65
|
andrew@50
|
66 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
67
|
andrew@50
|
68 void mouseDragged(){ // not used
|
andrew@50
|
69 }
|
andrew@50
|
70
|
andrew@50
|
71
|
andrew@50
|
72 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
73
|
andrew@50
|
74 void mouseReleased(){ // not used
|
andrew@50
|
75 }
|
andrew@50
|
76
|
andrew@50
|
77
|
andrew@50
|
78 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
79
|
andrew@50
|
80 void mousePressed(){ // not used
|
andrew@50
|
81 }
|
andrew@50
|
82
|
andrew@50
|
83
|
andrew@50
|
84 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
85
|
andrew@50
|
86 void keyPressed() { // takes keyboard input
|
andrew@50
|
87 if (key == 'c' || key == 'C') {
|
andrew@50
|
88 chordSelecter = !chordSelecter;
|
andrew@50
|
89 if (!chordSelecter)
|
andrew@50
|
90 trSelected = lastTrack;
|
andrew@50
|
91 else{
|
andrew@50
|
92 lastTrack = trSelected;
|
andrew@50
|
93 trSelected = 0;
|
andrew@50
|
94
|
andrew@50
|
95 }
|
andrew@50
|
96 }
|
andrew@50
|
97
|
andrew@50
|
98 if (key == ' ') {
|
andrew@50
|
99 if (trSelected != 0){
|
andrew@50
|
100 for (int i = 0; i < 16; i++){
|
andrew@50
|
101 noteOnArray[i] = false;
|
andrew@50
|
102 finishNote(i);
|
andrew@50
|
103 displayNoteOnArray[i] = false;
|
andrew@50
|
104 }
|
andrew@50
|
105
|
andrew@50
|
106 if (trSelected != 0){
|
andrew@50
|
107 for (int i = 24; i < 109; i++)
|
andrew@50
|
108 outputToMax(i, 0, trSelected);
|
andrew@50
|
109 }
|
andrew@50
|
110 tracks[trSelected] = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false);
|
andrew@50
|
111 imgNotes = null;
|
andrew@50
|
112 }
|
andrew@50
|
113
|
andrew@50
|
114 if (trSelected == 0){
|
andrew@50
|
115 for (int i = 0; i < 16; i++){
|
andrew@50
|
116 noteOnArray[i] = false;
|
andrew@50
|
117 finishNote(i);
|
andrew@50
|
118 displayNoteOnArray[i] = false;
|
andrew@50
|
119 }
|
andrew@50
|
120 heresyMinor = false;
|
andrew@50
|
121 heresy7th = false;
|
andrew@50
|
122 heresy9th = false;
|
andrew@50
|
123 heresy11th = false;
|
andrew@50
|
124 heresy13th = false;
|
andrew@50
|
125 chordsTemp = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false);
|
andrew@50
|
126 imgNotes = null;
|
andrew@50
|
127 }
|
andrew@50
|
128 }
|
andrew@50
|
129
|
andrew@50
|
130 if (key == 'p' || key == 'P') {
|
andrew@50
|
131 for (int i = 0; i < 16; i++){
|
andrew@50
|
132 for (int ii = 24; ii < 109; ii++)
|
andrew@50
|
133 outputToMax(ii, 0, trSelected);
|
andrew@50
|
134 noteOnArray[i] = false;
|
andrew@50
|
135 displayNoteOnArray[i] = false;
|
andrew@50
|
136 }
|
andrew@50
|
137 }
|
andrew@50
|
138
|
andrew@50
|
139 if (key == 'd' || key == 'D') {
|
andrew@50
|
140 if (trSelected != 0 && trSelected != 1){
|
andrew@50
|
141 tracks[trSelected].ducking = !tracks[trSelected].ducking;
|
andrew@50
|
142 tracks[trSelected].cycled = false;
|
andrew@50
|
143 tracks[trSelected].cycledPosition = currentPulse%tracks[trSelected].loopLength;
|
andrew@50
|
144 }
|
andrew@50
|
145 }
|
andrew@50
|
146
|
andrew@50
|
147 if (key == 'w' || key == 'W') {
|
andrew@50
|
148
|
andrew@50
|
149 trSelected = 0;
|
andrew@50
|
150
|
andrew@50
|
151 for (int i = 0; i < 16; i++){
|
andrew@50
|
152 noteOnArray[i] = false;
|
andrew@50
|
153 finishNoteCutOff(i);
|
andrew@50
|
154 displayNoteOnArray[i] = false;
|
andrew@50
|
155 }
|
andrew@50
|
156 heresyMinor = false;
|
andrew@50
|
157 heresy7th = false;
|
andrew@50
|
158 heresy9th = false;
|
andrew@50
|
159 heresy11th = false;
|
andrew@50
|
160 heresy13th = false;
|
andrew@50
|
161
|
andrew@50
|
162 tracks[trSelected] = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false);
|
andrew@50
|
163 chordsTemp = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false);
|
andrew@50
|
164 imgNotes = null;
|
andrew@50
|
165 }
|
andrew@50
|
166
|
andrew@50
|
167 if (key == 'q' || key == 'Q'){
|
andrew@50
|
168 quantizeValueIn = true;
|
andrew@50
|
169 sendToScreen(tracks[trSelected].name + " quantize?");
|
andrew@50
|
170 }
|
andrew@50
|
171
|
andrew@50
|
172 if (key == 'x' || key == 'X'){
|
andrew@50
|
173 clickTrackOn = !clickTrackOn;
|
andrew@50
|
174 }
|
andrew@50
|
175
|
andrew@50
|
176 if (key == 'e' || key == 'E'){
|
andrew@50
|
177 eraseOn = !eraseOn;
|
andrew@50
|
178 if (!eraseOn) imgNotes = null;
|
andrew@50
|
179 }
|
andrew@50
|
180
|
andrew@50
|
181 if (key == 'r' || key == 'R'){
|
andrew@50
|
182 imgNotes = null;
|
andrew@50
|
183 }
|
andrew@50
|
184
|
andrew@50
|
185 if (key == 'l' || key == 'L'){
|
andrew@50
|
186 loopLengthValueIn = true;
|
andrew@50
|
187 sendToScreen(tracks[trSelected].name + " loop length?");
|
andrew@50
|
188 }
|
andrew@50
|
189
|
andrew@50
|
190 if (key == 'm' || key == 'M'){
|
andrew@50
|
191 if (trSelected != 0){
|
andrew@50
|
192 muteValueIn = true;
|
andrew@50
|
193 if (!tracks[trSelected].mute)
|
andrew@50
|
194 sendToScreen(tracks[trSelected].name + " mute in?");
|
andrew@50
|
195 if (tracks[trSelected].mute)
|
andrew@50
|
196 sendToScreen(tracks[trSelected].name + " unmute in?");
|
andrew@50
|
197 }
|
andrew@50
|
198 }
|
andrew@50
|
199
|
andrew@50
|
200
|
andrew@50
|
201 if (key == '1') numberKey(1);
|
andrew@50
|
202 if (key == '2') numberKey(2);
|
andrew@50
|
203 if (key == '3') numberKey(3);
|
andrew@50
|
204 if (key == '4') numberKey(4);
|
andrew@50
|
205 if (key == '5') numberKey(5);
|
andrew@50
|
206 if (key == '6') numberKey(6);
|
andrew@50
|
207 if (key == '7') numberKey(7);
|
andrew@50
|
208 if (key == '8') numberKey(8);
|
andrew@50
|
209 if (key == '9') numberKey(9);
|
andrew@50
|
210 if (key == '0') numberKey(0);
|
andrew@50
|
211
|
andrew@50
|
212 if (key == CODED) {
|
andrew@50
|
213 if (keyCode == UP && trSelected < Track.currentNumberOfTracks-1)
|
andrew@50
|
214 trSelected++;
|
andrew@50
|
215 if (keyCode == DOWN && trSelected > 1) {
|
andrew@50
|
216 trSelected--;
|
andrew@50
|
217 }
|
andrew@50
|
218 }
|
andrew@50
|
219
|
andrew@50
|
220 if (key == 's' || key == 'S'){
|
andrew@50
|
221 for (int i = 0; i < 16; i++){
|
andrew@50
|
222 for (int ii = 0; ii < tracks[0].loopLength; ii++){
|
andrew@50
|
223 if (chordsTemp.sequence[i][ii] != null)
|
andrew@50
|
224 tracks[0].sequence[i][ii] = chordsTemp.sequence[i][ii];
|
andrew@50
|
225 }
|
andrew@50
|
226 }
|
andrew@50
|
227 }
|
andrew@50
|
228
|
andrew@50
|
229
|
andrew@50
|
230 }
|
andrew@50
|
231
|
andrew@50
|
232
|
andrew@50
|
233 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
234
|
andrew@50
|
235 void numberKey(int input){ // if a number is enterd, this method works out what to do with it
|
andrew@50
|
236 if (quantizeValueIn == true)
|
andrew@50
|
237 if (input == 1 || input == 2 || input == 4 || input == 8 || input == 0){
|
andrew@50
|
238 tracks[trSelected].quantize = input;
|
andrew@50
|
239 quantizeValueIn = false;
|
andrew@50
|
240 aniOut = true;
|
andrew@50
|
241 }
|
andrew@50
|
242
|
andrew@50
|
243 if (loopLengthValueIn == true){
|
andrew@50
|
244 if (input >= 1 && input <= 8 ){
|
andrew@50
|
245 Track tempTrack = new Track(tracks[trSelected].name, tracks[trSelected].polyphonic, (input * loopLength / 2), tracks[trSelected].quantize, false, false);
|
andrew@50
|
246 NoteEvent tempNote;
|
andrew@50
|
247
|
andrew@50
|
248 for (int i = 0; i < 16; i++){
|
andrew@50
|
249 if (tempTrack.loopLength >= tracks[trSelected].loopLength){
|
andrew@50
|
250 for (int ii = 0; ii < tracks[trSelected].loopLength; ii++){
|
andrew@50
|
251 tempTrack.sequence[i][ii] = tracks[trSelected].sequence[i][ii];
|
andrew@50
|
252 }
|
andrew@50
|
253 }else{
|
andrew@50
|
254 for (int ii = 0; ii < tempTrack.loopLength; ii++){
|
andrew@50
|
255 tempTrack.sequence[i][ii] = tracks[trSelected].sequence[i][ii];
|
andrew@50
|
256 }
|
andrew@50
|
257 }
|
andrew@50
|
258 }
|
andrew@50
|
259 tracks[trSelected] = tempTrack;
|
andrew@50
|
260 for (int i = 0; i < 16; i++)
|
andrew@50
|
261 if (noteOnArray[i] = true){
|
andrew@50
|
262 noteOnArray[i] = false;
|
andrew@50
|
263 finishNoteCutOff(i);
|
andrew@50
|
264 displayNoteOnArray[i] = false;
|
andrew@50
|
265 }
|
andrew@50
|
266
|
andrew@50
|
267
|
andrew@50
|
268 loopLengthValueIn = false;
|
andrew@50
|
269 aniOut = true;
|
andrew@50
|
270 if (trSelected ==0){
|
andrew@50
|
271 Track tempTrack2 = new Track(chordsTemp.name, chordsTemp.polyphonic, (input * loopLength / 2), chordsTemp.quantize, false, false);
|
andrew@50
|
272 NoteEvent tempNote2;
|
andrew@50
|
273
|
andrew@50
|
274 for (int i = 0; i < 16; i++){
|
andrew@50
|
275 if (tempTrack2.loopLength >= chordsTemp.loopLength){
|
andrew@50
|
276 for (int ii = 0; ii < chordsTemp.loopLength; ii++){
|
andrew@50
|
277 tempTrack2.sequence[i][ii] = chordsTemp.sequence[i][ii];
|
andrew@50
|
278 }
|
andrew@50
|
279 }else{
|
andrew@50
|
280 for (int ii = 0; ii < tempTrack2.loopLength; ii++){
|
andrew@50
|
281 tempTrack2.sequence[i][ii] = chordsTemp.sequence[i][ii];
|
andrew@50
|
282 }
|
andrew@50
|
283 }
|
andrew@50
|
284 }
|
andrew@50
|
285 chordsTemp = tempTrack2;
|
andrew@50
|
286 }
|
andrew@50
|
287 imgNotes = null;
|
andrew@50
|
288 }
|
andrew@50
|
289 }
|
andrew@50
|
290
|
andrew@50
|
291 if (muteValueIn == true){
|
andrew@50
|
292 tracks[trSelected].muteIn = bar + input;
|
andrew@50
|
293 muteValueIn = false;
|
andrew@50
|
294 tracks[trSelected].muteDone = false;
|
andrew@50
|
295 aniOut = true;
|
andrew@50
|
296 }
|
andrew@50
|
297
|
andrew@50
|
298
|
andrew@50
|
299 }
|
andrew@50
|
300
|
andrew@50
|
301
|
andrew@50
|
302 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
303
|
andrew@50
|
304 void sendToScreen(String name){ // prepares a question for asking the user and turns the question on
|
andrew@50
|
305
|
andrew@50
|
306 screenQuestion = name;
|
andrew@50
|
307 screenAni = 0;
|
andrew@50
|
308 haveQuestion = true;
|
andrew@50
|
309
|
andrew@50
|
310 }
|
andrew@50
|
311
|
andrew@50
|
312
|
andrew@50
|
313 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
314
|
andrew@50
|
315 void checkCycled(){ // checks whether after ducking or muting all note offs are played.
|
andrew@50
|
316 for (int i = 1; i < Track.currentNumberOfTracks; i++)
|
andrew@50
|
317 if (tracks[i].cycled == false)
|
andrew@50
|
318 if (tracks[i].cycledPosition-1 == currentPulse%tracks[trSelected].loopLength)
|
andrew@50
|
319 tracks[i].cycled = true;
|
andrew@50
|
320
|
andrew@50
|
321 }
|
andrew@50
|
322
|
andrew@50
|
323
|
andrew@50
|
324 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
325
|
andrew@50
|
326
|
andrew@50
|
327 void checkForMutes(){ // looks for mute / unmuted changes in tracks
|
andrew@50
|
328 for (int i = 1; i < Track.currentNumberOfTracks; i++)
|
andrew@50
|
329 if (tracks[i].muteIn == bar && !tracks[i].muteDone){
|
andrew@50
|
330 tracks[i].mute = !tracks[i].mute;
|
andrew@50
|
331 tracks[i].muteDone = true;
|
andrew@50
|
332 tracks[trSelected].cycled = false;
|
andrew@50
|
333 tracks[trSelected].cycledPosition = currentPulse%tracks[trSelected].loopLength;
|
andrew@50
|
334 }
|
andrew@50
|
335 }
|
andrew@50
|
336
|
andrew@50
|
337
|
andrew@50
|
338
|
andrew@50
|
339 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
340
|
andrew@50
|
341 void writeQuestion(){ // animates screen questions
|
andrew@50
|
342
|
andrew@50
|
343 if (screenAni < 10 && !aniOut){
|
andrew@50
|
344 screenAni++;
|
andrew@50
|
345 }
|
andrew@50
|
346
|
andrew@50
|
347 if (screenAni > 0 && aniOut){
|
andrew@50
|
348 screenAni--;
|
andrew@50
|
349 }
|
andrew@50
|
350
|
andrew@50
|
351 if (screenAni == 0){
|
andrew@50
|
352 haveQuestion = false;
|
andrew@50
|
353 aniOut = false;
|
andrew@50
|
354 }
|
andrew@50
|
355
|
andrew@50
|
356 fill(255,0,0, screenAni*12);
|
andrew@50
|
357 textSize((11-screenAni)*40);
|
andrew@50
|
358 text(screenQuestion, (screenAni*50)-200,(100-screenAni*10)+150);
|
andrew@50
|
359
|
andrew@50
|
360
|
andrew@50
|
361 }
|
andrew@50
|
362
|
andrew@50
|
363
|
andrew@50
|
364 //-------------------------------------------------------------------------------------------------------------------------------
|
andrew@50
|
365
|
andrew@50
|
366 void oscEvent(OscMessage theOscMessage) { // recieves osc messages from openFrameworks
|
andrew@50
|
367 println("osc message : " + theOscMessage);
|
andrew@50
|
368 if(theOscMessage.checkAddrPattern("/test")==true) {
|
andrew@50
|
369 println("i1 : " + theOscMessage.get(1).intValue() + " i2 : " + theOscMessage.get(2).intValue() + " i3 : " + theOscMessage.get(3).intValue() + " i4 : " + theOscMessage.get(4).intValue());
|
andrew@50
|
370 clickTrack = false;
|
andrew@50
|
371 String stringValue = theOscMessage.get(0).stringValue();
|
andrew@50
|
372 int firstValue = theOscMessage.get(1).intValue();
|
andrew@50
|
373 int secondValue = theOscMessage.get(2).intValue();
|
andrew@50
|
374 int thirdValue = theOscMessage.get(3).intValue(); //velocity
|
andrew@50
|
375 int fourthValue = theOscMessage.get(4).intValue(); //channel
|
andrew@50
|
376 if (secondValue == 1){
|
andrew@50
|
377 noteOnArray[firstValue] = true;
|
andrew@50
|
378 writeNote(firstValue, thirdValue, fourthValue);
|
andrew@50
|
379 }
|
andrew@50
|
380 else{
|
andrew@50
|
381 noteOnArray[firstValue] = false;
|
andrew@50
|
382 writeNote(firstValue, 0, fourthValue);
|
andrew@50
|
383 }
|
andrew@50
|
384 }
|
andrew@50
|
385 if(theOscMessage.checkAddrPattern("/chord")==true) {
|
andrew@50
|
386 chordCalc();
|
andrew@50
|
387 // writeNote(15, 80, 6);
|
andrew@50
|
388 writeNote(14, 80, 6);
|
andrew@50
|
389 writeNote(13, 80, 6);
|
andrew@50
|
390 writeNote(12, 80, 6);
|
andrew@50
|
391 writeNote(11, 80, 6);
|
andrew@50
|
392 writeNote(10, 80, 6);
|
andrew@50
|
393 writeNote(9, 80, 6);
|
andrew@50
|
394 }
|
andrew@50
|
395 }
|
andrew@50
|
396
|
andrew@50
|
397
|
andrew@50
|
398
|