5 & 6: Teensy - MIDI


Hier de presentatie van de Teensy-MIDI-les

Teensy-les3.pdf

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);
}