rebecca@26: void sendNote(VPNote note, int channel){ // send note function gathers info to output to max rebecca@26: outputToMax(note.VPNotePitch, note.VPNoteVelocity, channel); rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: 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 rebecca@26: String noteOut = ""; rebecca@26: if (!tracks[channel].mute){ rebecca@26: if (tracks[channel].ducking){ rebecca@26: if (velocity != 0){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + (channel+8)); rebecca@26: } rebecca@26: if (velocity == 0 && !tracks[channel].cycled){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + (channel+8)); rebecca@26: OscMessage message = new OscMessage("/pitch_vel_chan"); rebecca@26: message.add(noteOut); rebecca@26: oscP5return.send(message, ableton); rebecca@26: link.output(noteOut); rebecca@26: noteOut = ("" + note + " " + velocity + " " + channel); rebecca@26: } rebecca@26: if (velocity == 0 && tracks[channel].cycled){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + (channel+8)); rebecca@26: } rebecca@26: } rebecca@26: if (!tracks[channel].ducking){ rebecca@26: if (velocity != 0){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + channel); rebecca@26: } rebecca@26: if (velocity == 0 && !tracks[channel].cycled){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + (channel+8)); rebecca@26: OscMessage message = new OscMessage("/pitch_vel_chan"); rebecca@26: message.add(noteOut); rebecca@26: oscP5return.send(message, ableton); rebecca@26: link.output(noteOut); rebecca@26: noteOut = ("" + note + " " + velocity + " " + channel); rebecca@26: } rebecca@26: if (velocity == 0 && tracks[channel].cycled){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + channel); rebecca@26: } rebecca@26: } rebecca@26: link.output(noteOut); rebecca@26: OscMessage message = new OscMessage("/pitch_vel_chan"); rebecca@26: message.add(noteOut); rebecca@26: oscP5return.send(message, ableton); rebecca@26: rebecca@26: } rebecca@26: if (tracks[channel].mute){ rebecca@26: if (velocity == 0 && !tracks[channel].cycled){ rebecca@26: noteOut = ("" + note + " " + velocity + " " + (channel+8)); rebecca@26: link.output(noteOut); rebecca@26: OscMessage message = new OscMessage("/pitch_vel_chan"); rebecca@26: message.add(noteOut); rebecca@26: oscP5return.send(message, ableton); rebecca@26: noteOut = ("" + note + " " + velocity + " " + channel); rebecca@26: OscMessage message2 = new OscMessage("/pitch_vel_chan"); rebecca@26: message2.add(noteOut); rebecca@26: oscP5return.send(message, ableton); rebecca@26: link.output(noteOut); rebecca@26: } rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void mouseDragged(){ // not used rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void mouseReleased(){ // not used rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void mousePressed(){ // not used rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void keyPressed() { // takes keyboard input rebecca@26: if (key == 'c' || key == 'C') { rebecca@26: chordSelecter = !chordSelecter; rebecca@26: if (!chordSelecter) rebecca@26: trSelected = lastTrack; rebecca@26: else{ rebecca@26: lastTrack = trSelected; rebecca@26: trSelected = 0; rebecca@26: rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: if (key == ' ') { rebecca@26: if (trSelected != 0){ rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: noteOnArray[i] = false; rebecca@26: finishNote(i); rebecca@26: displayNoteOnArray[i] = false; rebecca@26: } rebecca@26: rebecca@26: if (trSelected != 0){ rebecca@26: for (int i = 24; i < 109; i++) rebecca@26: outputToMax(i, 0, trSelected); rebecca@26: } rebecca@26: tracks[trSelected] = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false); rebecca@26: imgNotes = null; rebecca@26: } rebecca@26: rebecca@26: if (trSelected == 0){ rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: noteOnArray[i] = false; rebecca@26: finishNote(i); rebecca@26: displayNoteOnArray[i] = false; rebecca@26: } rebecca@26: heresyMinor = false; rebecca@26: heresy7th = false; rebecca@26: heresy9th = false; rebecca@26: heresy11th = false; rebecca@26: heresy13th = false; rebecca@26: chordsTemp = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false); rebecca@26: imgNotes = null; rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: if (key == 'p' || key == 'P') { rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: for (int ii = 24; ii < 109; ii++) rebecca@26: outputToMax(ii, 0, trSelected); rebecca@26: noteOnArray[i] = false; rebecca@26: displayNoteOnArray[i] = false; rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: if (key == 'd' || key == 'D') { rebecca@26: if (trSelected != 0 && trSelected != 1){ rebecca@26: tracks[trSelected].ducking = !tracks[trSelected].ducking; rebecca@26: tracks[trSelected].cycled = false; rebecca@26: tracks[trSelected].cycledPosition = currentPulse%tracks[trSelected].loopLength; rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: if (key == 'w' || key == 'W') { rebecca@26: rebecca@26: trSelected = 0; rebecca@26: rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: noteOnArray[i] = false; rebecca@26: finishNoteCutOff(i); rebecca@26: displayNoteOnArray[i] = false; rebecca@26: } rebecca@26: heresyMinor = false; rebecca@26: heresy7th = false; rebecca@26: heresy9th = false; rebecca@26: heresy11th = false; rebecca@26: heresy13th = false; rebecca@26: rebecca@26: tracks[trSelected] = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false); rebecca@26: chordsTemp = new Track(tracks[trSelected].name, true, tracks[trSelected].loopLength, tracks[trSelected].quantize, false, false); rebecca@26: imgNotes = null; rebecca@26: } rebecca@26: rebecca@26: if (key == 'q' || key == 'Q'){ rebecca@26: quantizeValueIn = true; rebecca@26: sendToScreen(tracks[trSelected].name + " quantize?"); rebecca@26: } rebecca@26: rebecca@26: if (key == 'x' || key == 'X'){ rebecca@26: clickTrackOn = !clickTrackOn; rebecca@26: } rebecca@26: rebecca@26: if (key == 'e' || key == 'E'){ rebecca@26: eraseOn = !eraseOn; rebecca@26: if (!eraseOn) imgNotes = null; rebecca@26: } rebecca@26: rebecca@26: if (key == 'r' || key == 'R'){ rebecca@26: imgNotes = null; rebecca@26: } rebecca@26: rebecca@26: if (key == 'l' || key == 'L'){ rebecca@26: loopLengthValueIn = true; rebecca@26: sendToScreen(tracks[trSelected].name + " loop length?"); rebecca@26: } rebecca@26: rebecca@26: if (key == 'm' || key == 'M'){ rebecca@26: if (trSelected != 0){ rebecca@26: muteValueIn = true; rebecca@26: if (!tracks[trSelected].mute) rebecca@26: sendToScreen(tracks[trSelected].name + " mute in?"); rebecca@26: if (tracks[trSelected].mute) rebecca@26: sendToScreen(tracks[trSelected].name + " unmute in?"); rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: rebecca@26: if (key == '1') numberKey(1); rebecca@26: if (key == '2') numberKey(2); rebecca@26: if (key == '3') numberKey(3); rebecca@26: if (key == '4') numberKey(4); rebecca@26: if (key == '5') numberKey(5); rebecca@26: if (key == '6') numberKey(6); rebecca@26: if (key == '7') numberKey(7); rebecca@26: if (key == '8') numberKey(8); rebecca@26: if (key == '9') numberKey(9); rebecca@26: if (key == '0') numberKey(0); rebecca@26: rebecca@26: if (key == CODED) { rebecca@26: if (keyCode == UP && trSelected < Track.currentNumberOfTracks-1) rebecca@26: trSelected++; rebecca@26: if (keyCode == DOWN && trSelected > 1) { rebecca@26: trSelected--; rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: if (key == 's' || key == 'S'){ rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: for (int ii = 0; ii < tracks[0].loopLength; ii++){ rebecca@26: if (chordsTemp.sequence[i][ii] != null) rebecca@26: tracks[0].sequence[i][ii] = chordsTemp.sequence[i][ii]; rebecca@26: } rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void numberKey(int input){ // if a number is enterd, this method works out what to do with it rebecca@26: if (quantizeValueIn == true) rebecca@26: if (input == 1 || input == 2 || input == 4 || input == 8 || input == 0){ rebecca@26: tracks[trSelected].quantize = input; rebecca@26: quantizeValueIn = false; rebecca@26: aniOut = true; rebecca@26: } rebecca@26: rebecca@26: if (loopLengthValueIn == true){ rebecca@26: if (input >= 1 && input <= 8 ){ rebecca@26: Track tempTrack = new Track(tracks[trSelected].name, tracks[trSelected].polyphonic, (input * loopLength / 2), tracks[trSelected].quantize, false, false); rebecca@26: NoteEvent tempNote; rebecca@26: rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: if (tempTrack.loopLength >= tracks[trSelected].loopLength){ rebecca@26: for (int ii = 0; ii < tracks[trSelected].loopLength; ii++){ rebecca@26: tempTrack.sequence[i][ii] = tracks[trSelected].sequence[i][ii]; rebecca@26: } rebecca@26: }else{ rebecca@26: for (int ii = 0; ii < tempTrack.loopLength; ii++){ rebecca@26: tempTrack.sequence[i][ii] = tracks[trSelected].sequence[i][ii]; rebecca@26: } rebecca@26: } rebecca@26: } rebecca@26: tracks[trSelected] = tempTrack; rebecca@26: for (int i = 0; i < 16; i++) rebecca@26: if (noteOnArray[i] = true){ rebecca@26: noteOnArray[i] = false; rebecca@26: finishNoteCutOff(i); rebecca@26: displayNoteOnArray[i] = false; rebecca@26: } rebecca@26: rebecca@26: rebecca@26: loopLengthValueIn = false; rebecca@26: aniOut = true; rebecca@26: if (trSelected ==0){ rebecca@26: Track tempTrack2 = new Track(chordsTemp.name, chordsTemp.polyphonic, (input * loopLength / 2), chordsTemp.quantize, false, false); rebecca@26: NoteEvent tempNote2; rebecca@26: rebecca@26: for (int i = 0; i < 16; i++){ rebecca@26: if (tempTrack2.loopLength >= chordsTemp.loopLength){ rebecca@26: for (int ii = 0; ii < chordsTemp.loopLength; ii++){ rebecca@26: tempTrack2.sequence[i][ii] = chordsTemp.sequence[i][ii]; rebecca@26: } rebecca@26: }else{ rebecca@26: for (int ii = 0; ii < tempTrack2.loopLength; ii++){ rebecca@26: tempTrack2.sequence[i][ii] = chordsTemp.sequence[i][ii]; rebecca@26: } rebecca@26: } rebecca@26: } rebecca@26: chordsTemp = tempTrack2; rebecca@26: } rebecca@26: imgNotes = null; rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: if (muteValueIn == true){ rebecca@26: tracks[trSelected].muteIn = bar + input; rebecca@26: muteValueIn = false; rebecca@26: tracks[trSelected].muteDone = false; rebecca@26: aniOut = true; rebecca@26: } rebecca@26: rebecca@26: rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void sendToScreen(String name){ // prepares a question for asking the user and turns the question on rebecca@26: rebecca@26: screenQuestion = name; rebecca@26: screenAni = 0; rebecca@26: haveQuestion = true; rebecca@26: rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void checkCycled(){ // checks whether after ducking or muting all note offs are played. rebecca@26: for (int i = 1; i < Track.currentNumberOfTracks; i++) rebecca@26: if (tracks[i].cycled == false) rebecca@26: if (tracks[i].cycledPosition-1 == currentPulse%tracks[trSelected].loopLength) rebecca@26: tracks[i].cycled = true; rebecca@26: rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: rebecca@26: void checkForMutes(){ // looks for mute / unmuted changes in tracks rebecca@26: for (int i = 1; i < Track.currentNumberOfTracks; i++) rebecca@26: if (tracks[i].muteIn == bar && !tracks[i].muteDone){ rebecca@26: tracks[i].mute = !tracks[i].mute; rebecca@26: tracks[i].muteDone = true; rebecca@26: tracks[trSelected].cycled = false; rebecca@26: tracks[trSelected].cycledPosition = currentPulse%tracks[trSelected].loopLength; rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void writeQuestion(){ // animates screen questions rebecca@26: rebecca@26: if (screenAni < 10 && !aniOut){ rebecca@26: screenAni++; rebecca@26: } rebecca@26: rebecca@26: if (screenAni > 0 && aniOut){ rebecca@26: screenAni--; rebecca@26: } rebecca@26: rebecca@26: if (screenAni == 0){ rebecca@26: haveQuestion = false; rebecca@26: aniOut = false; rebecca@26: } rebecca@26: rebecca@26: fill(255,0,0, screenAni*12); rebecca@26: textSize((11-screenAni)*40); rebecca@26: text(screenQuestion, (screenAni*50)-200,(100-screenAni*10)+150); rebecca@26: rebecca@26: rebecca@26: } rebecca@26: rebecca@26: rebecca@26: //------------------------------------------------------------------------------------------------------------------------------- rebecca@26: rebecca@26: void oscEvent(OscMessage theOscMessage) { // recieves osc messages from openFrameworks rebecca@36: println("osc message : " + theOscMessage); rebecca@26: if(theOscMessage.checkAddrPattern("/test")==true) { rebecca@36: println("i1 : " + theOscMessage.get(1).intValue() + " i2 : " + theOscMessage.get(2).intValue() + " i3 : " + theOscMessage.get(3).intValue() + " i4 : " + theOscMessage.get(4).intValue()); rebecca@26: clickTrack = false; rebecca@26: String stringValue = theOscMessage.get(0).stringValue(); rebecca@26: int firstValue = theOscMessage.get(1).intValue(); rebecca@26: int secondValue = theOscMessage.get(2).intValue(); rebecca@26: int thirdValue = theOscMessage.get(3).intValue(); //velocity rebecca@26: int fourthValue = theOscMessage.get(4).intValue(); //channel rebecca@26: if (secondValue == 1){ andrew@49: if (firstValue != 0 && fourthValue == 1){ rebecca@26: noteOnArray[firstValue] = true; andrew@49: writeNote(firstValue-1, thirdValue, fourthValue); andrew@49: } andrew@49: else { andrew@49: noteOnArray[firstValue] = true; andrew@49: writeNote(firstValue, thirdValue, fourthValue); andrew@49: } andrew@49: } andrew@49: else if (firstValue != 0 && fourthValue == 1){ andrew@49: noteOnArray[firstValue] = false; andrew@49: writeNote(firstValue-=1, 0, fourthValue); rebecca@26: } rebecca@26: else{ andrew@49: noteOnArray[firstValue] = false; andrew@49: writeNote(firstValue, 0, fourthValue); rebecca@26: } rebecca@26: } rebecca@26: if(theOscMessage.checkAddrPattern("/chord")==true) { rebecca@42: chordCalc(); rebecca@42: // writeNote(15, 80, 6); rebecca@42: writeNote(14, 80, 6); rebecca@42: writeNote(13, 80, 6); rebecca@42: writeNote(12, 80, 6); rebecca@42: writeNote(11, 80, 6); rebecca@42: writeNote(10, 80, 6); rebecca@42: writeNote(9, 80, 6); rebecca@26: } rebecca@26: } rebecca@26: rebecca@26: rebecca@26: