hardware les 04 - MIDI filtering


Hier de code om MIDI waarden te filteren in Teensy, meer informatie over de les van vandaag vind je in de powerpoint.

//dit zijn de pins waar de potmeters op aangesloten zijn
int potPin1 = 14;
int potPin2 = 15;

//2 integers om de MIDI waarde van de potmeters in op te slaan
int potMIDI1 = 0;
int potMIDI2 = 0;

//2 integers om de MIDI waarde van potmeters in de vorige keer dat loop() werd uitgevoerd op te slaan.
int _potMIDI1 = 0;
int _potMIDI2 = 0;

//hoe veel stapjes kijken we terug in de tijd?
const int historyLength = 8;

//waar in de history array gaan we nu schrijven
int historyIndex1 = 0;

//de array met waarden voor potmeter 1 terug in de tijd
// FILO first in - last out
int pot1History[historyLength];

void setup() {
  // put your setup code here, to run once:
  //pinmodes INPUT, INPUT_PULLUP, OUTPUT
  pinMode(potPin1, INPUT);
  pinMode(potPin2, INPUT);

  Serial.begin(9600);
  Serial.println("Hi ik ben een Teensy en ik leef!");
}

void loop() {
  //INPUT Lees potmeters uit
  //maak een integer "potValue1" en zet die gelijk aan de waarde van de stroom op potPin1
  int potValue1 = analogRead(potPin1);
  int potValue2 = analogRead(potPin2); //0 - 1023

  //FILTERING:
  //schrijf de waarde van de potmeter in de array op positie historyIndex1
  pot1History[historyIndex1] = potValue1;
  //schrijf naar de volgende in de array
  historyIndex1 ++;
  //historyIndex1 moet kleiner blijven dan de lengte van de array
  historyIndex1 = historyIndex1 % historyLength;

  //dit wordt het gemiddelde van de eerste potmeter
  int average1 = 0;
  for (int i = 0; i < historyLength; i ++) { 
    //tel alle waarden in de history array bij elkaar op
    average1 = average1 + pot1History[i];
  }
  //deel de som van de array door de lengte van de array om het gemiddelde te krijgen
  average1 = average1 / historyLength;

  Serial.println("min:0,max:1023,rawInput:" + String(potValue1) + ",filteredInput:" + String(average1)); 

  //TRANSFORMATIE
  //iets doen met de input
  //schaal van 0 - 1023 naar 0 - 127 om de waardes van de potmeters
  //als MIDI berichten door te kunnen sturen
  potMIDI1 = average1 / 8;
  potMIDI2 = potValue2 / 8;

  //OUTPUT
  if (potMIDI1 != _potMIDI1) { //is er iets veranderd in potMIDI1?
//    Serial.println("Er is iets veranderd bij potMIDI1 want: " + String(potMIDI1) + " is niet gelijk aan " + String(_potMIDI1));
    //zo ja, stuur MIDI CC
    usbMIDI.sendControlChange(1, potMIDI1, 0);
  }
  if (potMIDI2 != _potMIDI2) { //is er iets veranderd in potMIDI1?
//    Serial.println("Er is iets veranderd bij potMIDI1 want: " + String(potMIDI1) + " is niet gelijk aan " + String(_potMIDI1));
    //zo ja, stuur MIDI CC
    usbMIDI.sendControlChange(2, potMIDI2, 0);
  }

  //zet de waarde van de vorige MIDI waarde gelijk aan de huidige MIDI waarde
  _potMIDI1 = potMIDI1;
  _potMIDI2 = potMIDI2;
  delay(20);
}