5 & 6: Teensy - MIDI
Hier de presentatie van de Teensy-MIDI-les
Code om data te sturen als het verschil groter is dan 2:
int prevInput = 0;
void setup() {
//analog input juist zetten
pinMode(14,INPUT);
Serial.begin(9600);
}
void loop() {
//haal de waarde van de potmeter binnen
int input = analogRead(14);
//Als het verschil tussen de vorige waarde en de huidige
//waarde groter is dan 2, dan pas doorsturen.
//abs maakt een negatief getal positief. Dus je kan dan
//altijd checken of het verschil 2 of meer is,
//ongeacht of je naar boven of naar beneden draait.
if (abs(prevInput - input) > 2) {
//schaal de waarde van 0 - 1023 naar 0 - 127
int scaledInput = avgInput / 8;
//stuur de midi-waarde door via usb
usbMIDI.sendControlChange(1, scaledInput, 1);
}
prevInput = input;
delay(5);
}
code om data met een lopend gemiddelde door te sturen:
int avgInput = 0;
int prevInput = 0;
void setup() {
//analog input juist zetten
pinMode(14,INPUT);
Serial.begin(9600);
}
void loop() {
//haal de waarde van de potmeter binnen
int input = analogRead(14);
//lopend gemiddelde uitlezen:
//er wordt steeds een deel van de oude waarde opgeteld
//bij een klein deel van de nieuwe waarde.
//hierdoor zal de waarde steeds langzaam naar de huidige waarde
//toebewegen - je krijgt daarmee eigenlijk een low-pass filter.
avgInput = (input * 0.5) + (avgInput * 0.5);
//midi van 0 - 1023 naar 0 - 127 schalen
int scaledInput = avgInput / 8;
//als de waarde niet hetzelfde is als de vorige input
//stuur dan door
if (scaledInput != prevInput) {
usbMIDI.sendControlChange(1, scaledInput, 1);
prevInput = scaledInput;
}
delay(20);
}
Code om midi te ontvangen in Teensy
void setup() {
// put your setup code here, to run once:
pinMode(13,OUTPUT);
//functie (controlData) die aangeroepen wordt
//als er cc-data binnenkomt.
usbMIDI.setHandleControlChange(controlData);
}
void loop() {
// Zorg dat er altijd naar midi-input geluisterd wordt.
// probeer delay in je loop te voorkomen.
// anders kan ie soms geen midi-data ontvangen.
usbMIDI.read();
}
void controlData(byte channel, byte control, byte value) {
//als control gelijk is aan 1:
if (control == 1) {
//bij een oneven getal gaat de led aan
//bij een even getal gaat de led uit
digitalWrite(13, value % 2);
}
//print hieronder de binnenkomende waarden:
Serial.print("channel: ");
Serial.print(channel);
Serial.print(" control: ");
Serial.print(control);
Serial.print(" value: ");
Serial.println(value);
}