To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / CollidoscopeTeensy / CollidoscopeTeensy_original.ino @ 11:76344930dd84

History | View | Annotate | Download (8.7 KB)

1 1:b5bcad8e7803 f
/******************************************************************************
2 5:75b744078d66 f
 *  Copyright (C) 2015  Ben Bengler (mail@benbengler.com)
3
 *  Copyright (C) 2016  Queen Mary University of London
4
 *  Authors: Ben Bengler, Fiore Martin
5 1:b5bcad8e7803 f
 *
6 5:75b744078d66 f
 *  This file is part of Collidoscope.
7
 *
8
 *  Collidoscope is free software: you can redistribute it and/or modify
9
 *  it under the terms of the GNU General Public License as published by
10
 *  the Free Software Foundation, either version 3 of the License, or
11
 *  (at your option) any later version.
12
 *
13
 *  This program is distributed in the hope that it will be useful,
14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
 *  GNU General Public License for more details.
17
 *
18
 *  You should have received a copy of the GNU General Public License
19
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 1:b5bcad8e7803 f
 *
21 5:75b744078d66 f
 ****************************************************************************
22
 *
23 1:b5bcad8e7803 f
 *  Teensy 2 ++ pinout: https://www.pjrc.com/teensy/card4b.pdf
24
 *
25
 *  ANALOG INPUTS:
26
 *  Wavejet   -> F0 (38) [Horizontal rail 1]
27
 *  Wavejet   -> F1 (39) [Horizontal rail 2]
28 5:75b744078d66 f
 *  Filter 1  -> F2 (40) [Fader with moon/sun 1]
29
 *  Filter 2  -> F4 (42) [Fader with moon/sun 2]
30
 *  Duration 1-> F3 (41) [Fader with grains 1]
31
 *  Duration 2-> F5 (43) [Fader with grains 2]
32 1:b5bcad8e7803 f
 *
33
 *  DIGITAL INPUTS [INTERRUPTS]:
34
 *  Sel. length 1  -> INT0/INT1 (0, 1)  [Encoder 1]
35 5:75b744078d66 f
 *  Sel. length 2  -> INT2/INT3 (2, 3)  [Encoder 2]
36 1:b5bcad8e7803 f
 *
37
 *  DIGITAL INPUTS:
38
 *  Play1 toggle  -> B0 (20)
39
 *  Record1       -> B1 (21)
40
 *  Play2 toggle  -> B3 (22)
41
 *  Record2       -> B4 (24)
42
 *
43
 *  DIGITAL OUTPUTS:
44
 *  Record Button 1 Led -> D4 (4)
45
 *  Record Button 2 Led -> D5 (5)
46 5:75b744078d66 f
 *
47 1:b5bcad8e7803 f
 ******************************************************************************/
48
49
50
#include <Encoder.h>
51
#include <Bounce.h>
52
53
///////////////////////////////////////////////////
54
//MIDI settings
55
const int midi_chan_inst1 = 1; // MIDI channel for Instrument 1
56
const int midi_chan_inst2 = 2; // MIDI channel for Instrument 2
57
58
const int cc_length = 1;    // MIDI cc controlling selection length
59
const int cc_duration = 2;  // MIDI cc controlling duration
60
const int cc_filter = 7;    // MIDI cc controlling LP filter
61
const int cc_play = 4;      // MIDI cc controlling PLAY
62
const int cc_record = 5;    // MIDI cc controlling RECORD
63 5:75b744078d66 f
64 1:b5bcad8e7803 f
65
///////////////////////////////////////////////////
66
//Default Values:
67
const int  Enc_def = 64; //default selection length
68
int MIDI_led_state = LOW;
69
70
///////////////////////////////////////////////////
71
// Interface Inputs
72
73
//Buttons:
74
75
const int Pin_play1 = 20;       //B0
76
const int Pin_record1 = 21;     //B1
77
const int Pin_play2 = 23;       //B3
78
const int Pin_record2 = 24;     //B4
79
const int Pin_record1_led =  4; //D4
80
const int Pin_record2_led =  5; //D5
81
const int Pin_MIDIled =  6;
82
83
Bounce button1 = Bounce(Pin_play1, 5);
84
Bounce button2 = Bounce(Pin_record1, 5);
85
Bounce button3 = Bounce(Pin_play2, 5);
86
Bounce button4 = Bounce(Pin_record2, 5);
87
88
89
//Encoder
90
Encoder Enc1 (0, 1);  //Encoder for section length on Wavejet 1
91
Encoder Enc2 (2, 3);  //Encoder for section length on Wavejet 2
92
93
94
// Variables
95 11:76344930dd84 f
const int jitter_thresh = 10; // threshold value for analog INs to suppress sending MIDI due to input jitter
96 1:b5bcad8e7803 f
97
void setup() {
98
99
pinMode(Pin_play1, INPUT_PULLUP);
100
pinMode(Pin_record1, INPUT_PULLUP);
101
pinMode(Pin_play2, INPUT_PULLUP);
102
pinMode(Pin_record2, INPUT_PULLUP);
103
104
105
pinMode(Pin_MIDIled, OUTPUT);
106
pinMode(Pin_record1_led, OUTPUT);
107
pinMode(Pin_record2_led, OUTPUT);
108
}
109
110
//Store recent values to detect parameter change
111
long Enc1_old = -999;
112
long Enc2_old = -999;
113
114
uint16_t Jet1_old = 0;
115
int16_t Jet1_old_MIDI = -1;
116
uint16_t Jet2_old = 0;
117
int16_t Jet2_old_MIDI = -1;
118
119
uint16_t filter1_old = 0;
120
int16_t filter1_old_MIDI = -1;
121
uint16_t filter2_old = 0;
122
int16_t filter2_old_MIDI = -1;
123
124
uint16_t dur1_old = 0;
125
int16_t dur1_old_MIDI = -1;
126
uint16_t dur2_old = 0;
127
int16_t dur2_old_MIDI = -1;
128
129
void loop() {
130
131
  digitalWrite(Pin_MIDIled, LOW);
132
  digitalWrite(Pin_record1_led, HIGH);
133
  digitalWrite(Pin_record2_led, HIGH);
134
  button1.update();
135
  button2.update();
136
  button3.update();
137
  button4.update();
138
139
140 11:76344930dd84 f
  uint16_t Jet1_new = analogRead(0);      //read Wavejet/Rail 1; ADJUST INPUT RANGE ACCORDING TO SENSOR
141
  uint16_t Jet2_new = analogRead(1);      //read Wavejet/Rail 2; ADJUST INPUT RANGE ACCORDING TO SENSOR
142
  uint16_t filter1_new = analogRead(2);   //read filter Instrument 1;
143
  uint16_t filter2_new = analogRead(4);   //read filter Instrument 2;
144 1:b5bcad8e7803 f
  uint16_t dur1_new = analogRead(3);
145
  uint16_t dur2_new = analogRead(5);
146
147
148
  //Encoder 1 [Controls selection length of wave 1]
149
  long Enc1_new = Enc1.read();
150
  Enc1_new = constrain(Enc1_new, 0, 127); //constrain to 7-bit MIDI range
151
152
  //Dynamic reset of counter to MIDI range
153
  if (Enc1_new <= 0){
154
    Enc1.write(0);
155
  }
156
  else if (Enc1_new >= 127){
157
    Enc1.write(127);
158
  }
159
160
  //Encoder 2 [Controls selection length of wave 2]
161
  long Enc2_new = Enc2.read();
162
  Enc2_new = constrain(Enc2_new, 0, 127); //constrain to 7-bit MIDI range
163
164
  //Dynamic reset of counter to MIDI range
165
  if (Enc2_new <= 0){
166
    Enc2.write(0);
167
  }
168
  else if (Enc2_new >= 127){
169
    Enc2.write(127);
170
  }
171
172
 //Instrument 1 Controls//////////////////////////////////////
173
174
 //Loop/Keymode Switch Instrument 1
175
176
 if (button1.risingEdge()) {
177
   usbMIDI.sendControlChange(cc_play, 1, midi_chan_inst1);
178
 }
179
180
 if (button1.fallingEdge()) {
181
   usbMIDI.sendControlChange(cc_play, 0, midi_chan_inst1);
182
 }
183
184
185
 //Record Instrument 1
186
 if (button2.fallingEdge()) {
187
   usbMIDI.sendControlChange(cc_record, 1, midi_chan_inst1);
188
 }
189
190
 //send MIDI Wavejet 1 [Position Instrument 1]
191 11:76344930dd84 f
 //<calibrate>
192 1:b5bcad8e7803 f
 if (Jet1_new > Jet1_old+jitter_thresh || Jet1_new < Jet1_old-jitter_thresh) {
193 5:75b744078d66 f
    int16_t midiVal = constrain( map(Jet1_new, 18, 800, 0, 149), 0, 149 );
194 1:b5bcad8e7803 f
    if( midiVal != Jet1_old_MIDI ){
195
      Jet1_old_MIDI = midiVal;
196
      usbMIDI.sendPitchBend( midiVal, midi_chan_inst1 );
197
    }
198
199
    Jet1_old = Jet1_new;
200
    digitalWrite(Pin_MIDIled, HIGH);
201
 }
202
203
204
 //send MIDI Filter 1 [Filter Instrument 1]
205 5:75b744078d66 f
 if ( filter1_new != filter1_old ) {
206 1:b5bcad8e7803 f
    int16_t midiVal = constrain( map(filter1_new, 0, 1024, 0, 127), 0, 127 );
207
    if( midiVal != filter1_old_MIDI){
208
      //Serial.println( midiVal );
209
      filter1_old_MIDI = midiVal;
210
      usbMIDI.sendControlChange(cc_filter, midiVal, midi_chan_inst1);
211
    }
212
213
    filter1_old = filter1_new;
214
    digitalWrite(Pin_MIDIled, HIGH);
215
  }
216
217 5:75b744078d66 f
  if ( dur1_new != dur1_old ) {
218 1:b5bcad8e7803 f
219
    int16_t midiVal = constrain( map(dur1_new, 0, 1024, 0, 127), 0, 127 );
220
    if( midiVal != dur1_old_MIDI){
221
      dur1_old_MIDI = midiVal;
222
      usbMIDI.sendControlChange(cc_duration, midiVal, midi_chan_inst1);
223
    }
224
225
    dur1_old = dur1_new;
226
    digitalWrite(Pin_MIDIled, HIGH);
227
  }
228
229
  //send MIDI Encoder 1 [Selection length Instrument 1]
230
  if (Enc1_new != Enc1_old) {
231
    Enc1_old = Enc1_new;
232
    usbMIDI.sendControlChange(cc_length, Enc1_new, midi_chan_inst1);
233
    digitalWrite(Pin_MIDIled, HIGH);
234
  }
235
236
237
238
  //Instrument 2 Controls//////////////////////////////////////
239
240
  //Loop/Keymode Switch Instrument 2
241
242
  if (button3.risingEdge()) {
243
    usbMIDI.sendControlChange(cc_play, 1, midi_chan_inst2);
244
  }
245
246
  if (button3.fallingEdge()) {
247
    usbMIDI.sendControlChange(cc_play, 0, midi_chan_inst2);
248
  }
249
250
  //Record Instrument 2
251
  if (button4.fallingEdge()) {
252
    usbMIDI.sendControlChange(cc_record, 1, midi_chan_inst2);
253
  }
254
255
  //send MIDI Wavejet 2 [Position Instrument 2]
256 11:76344930dd84 f
  //<calibrate>
257 1:b5bcad8e7803 f
  if (Jet2_new > Jet2_old+jitter_thresh || Jet2_new < Jet2_old-jitter_thresh) {
258 5:75b744078d66 f
    int16_t midiVal = constrain( map( Jet2_new, 15, 780, 0, 149 ), 0, 149 );
259 1:b5bcad8e7803 f
    if( midiVal != Jet2_old_MIDI ){
260
      Jet2_old_MIDI = midiVal;
261
      usbMIDI.sendPitchBend( midiVal, midi_chan_inst2 );
262
    }
263
264
    Jet2_old = Jet2_new;
265
    digitalWrite(Pin_MIDIled, HIGH);
266
  }
267
268 5:75b744078d66 f
   if ( filter2_new != filter2_old ) {
269 1:b5bcad8e7803 f
    int16_t midiVal = constrain( map(filter2_new, 0, 1024, 0, 127), 0, 127 );
270
    if( midiVal != filter2_old_MIDI){
271
      //Serial.println( midiVal );
272
      filter2_old_MIDI = midiVal;
273
      usbMIDI.sendControlChange(cc_filter, midiVal, midi_chan_inst2);
274
    }
275
276
    filter2_old = filter2_new;
277
    digitalWrite(Pin_MIDIled, HIGH);
278
   }
279
280 5:75b744078d66 f
   if ( dur2_new != dur2_old ) {
281 1:b5bcad8e7803 f
    int16_t midiVal = constrain( map(dur2_new, 0, 1024, 0, 127), 0, 127 );
282
    if( midiVal != dur2_old_MIDI){
283
      //Serial.println( midiVal );
284
      dur2_old_MIDI = midiVal;
285
      usbMIDI.sendControlChange(cc_duration, midiVal, midi_chan_inst2);
286
    }
287
288
    dur2_old = dur2_new;
289
    digitalWrite(Pin_MIDIled, HIGH);
290
   }
291
292
293
  //send MIDI Encoder 2 [Selection length Instrument 2]
294
  if (Enc2_new != Enc2_old) {
295
    Enc2_old = Enc2_new;
296
    usbMIDI.sendControlChange(cc_length, Enc2_new, midi_chan_inst2);
297
    digitalWrite(Pin_MIDIled, HIGH);
298
  }
299
300
}