Teensy 4.1 MIDI beim Drücken analoger Tasten (TONE ON) beim Loslassen (TONE OFF)

Hallo zusammen :blush:

Ich habe ein kleines Problem.

Ich habe an meinem Teensy 4.1 Board am A6 eine Platine mit 5 Tasten.
Die Tasten liefern alle unterschiedliche Werte beim Drücken.
Die einzelnen Tasten konnte ich in der Funktion auch erfolgreich rausfiltern.

Die Tasten sollen als MIDI-Instrument dienen.

Nun zu meinem Problem.

  1. Möchte ich bei einem Tastendruck, dass die Meldung, dass die Taste gedrückt wurde nur einmal kommt, auch wenn sie gehalten wird.
  2. Nach dem Loslassen soll die Meldung kommen, dass die Taste logelassen wurde (auch nur einmal)

Wie kann ich das man besten realisieren?

Lieben Gruß

Thimo

const int analogInPin = A6;  

int oldVal = 0;
int newVal;
void setup() {

  Serial.begin(9600);
  newVal = key5abfrage(analogRead(analogInPin));
}

void loop() {
   newVal = key5abfrage(analogRead(analogInPin));
  if ((abs(newVal-oldVal) >= 1 && (newVal != 0)))
  {   
  Serial.println(newVal);
  oldVal = newVal;
  }

 delay (100) ;
  
}

int key5abfrage(int sensorValue) {
  if ((sensorValue > 0) && (sensorValue < 150)) {
    return 1;
  }
  else if ((sensorValue > 150) && (sensorValue < 250) ) {
    return 2;
  }
  else if ((sensorValue > 300) && (sensorValue < 400)) {
    return 3;
  }
  else if ((sensorValue > 460) && (sensorValue < 600)) {
    return 4;
  }
  else if ((sensorValue > 610) && (sensorValue < 800)) {
    return 5;
  }
  else{
    return 0;
  }
}

Für jeden Taster den Zustand merken und nur etwas melden, wenn sich der Zustand ändert.

Gruß Tommy

ungetestet:

const int analogInPin = A6;

int oldVal = 0;
int newVal;
void setup()
{
  Serial.begin(9600);
  newVal = key5abfrage(analogRead(analogInPin));
}

void loop()
{
  newVal = key5abfrage(analogRead(analogInPin));
  if ((abs(newVal - oldVal) >= 1 && (newVal != 0)))
  {
    Serial.println(newVal);
    oldVal = newVal;
  }
  delay (100) ;
}

int key5abfrage(int sensorValue)
{
  uint8_t returnWert = 0;
  static uint8_t lastReturn = 0;
  if ((sensorValue > 0) && (sensorValue < 150))
  {
    returnWert = 1;
  }
  else if ((sensorValue > 150) && (sensorValue < 250) )
  {
    returnWert = 2;
  }
  else if ((sensorValue > 300) && (sensorValue < 400))
  {
    returnWert = 3;
  }
  else if ((sensorValue > 460) && (sensorValue < 600))
  {
    returnWert = 4;
  }
  else if ((sensorValue > 610) && (sensorValue < 800))
  {
    returnWert = 5;
  }
  if (lastReturn != returnWert)
  {
    Serial.print(F("Taste "));
    if (returnWert == 0)
    {
      Serial.print(F("nicht "));
    }
    Serial.println(F("gedrückt"));
    lastReturn = returnWert;
  }
  return returnWert;
}

Das funktioniert soweit :slight_smile:

Allerdings kann ich scheinbar keine andere Taste drücken, solange noch eine gedrückt ist.

Naja, zwei Tasten gleichzeitig kannst Du mit Deinem Sketch auch nicht :wink:
Der erste Eintrag, der gefunden wird, wird ausgewertet - Bei mir wird der letzte Eintrag ausgewertet.

Wenn Du eine Summe haben willst, dann addieren.

int key5abfrage(int sensorValue)
{
  uint8_t returnWert = 0;
  static uint8_t lastReturn = 0;
  if ((sensorValue > 0) && (sensorValue < 150))
  {
    returnWert += 1;
  }
  else if ((sensorValue > 150) && (sensorValue < 250) )
  {
    returnWert += 2;
  }
  else if ((sensorValue > 300) && (sensorValue < 400))
  {
    returnWert += 3;
  }
  else if ((sensorValue > 460) && (sensorValue < 600))
  {
    returnWert += 4;
  }
  else if ((sensorValue > 610) && (sensorValue < 800))
  {
    returnWert += 5;
  }
  if (lastReturn != returnWert)
  {
    Serial.print(F("Taste "));
    if (returnWert == 0)
    {
      Serial.print(F("nicht "));
    }
    Serial.println(F("gedrückt"));
    lastReturn = returnWert;
  }
  return returnWert;
}

Wobei sich mir das nicht erschliesst, wie Du zwei Tasten abfragen willst.
Der Wert am AnalogPin wird ja nicht für jeden Button einzeln abgefragt. Du bekommst da nur einen Wert...

Mit einem R2R-Netzwerk kann das schon gelingen, beispielsweise für DIP-Switches, allerdings nicht für eine Klaviatur schnell gespielter Töne.

Das ist wegen der Verschaltung der Taster mit Widerstände zu einem Spannungsteiler.

Da mußt Du die Schaltung ändern. Entweder wie gesagt R2R Netzwerk oder Ein Eingang pro Taster.

Ja, dieser Problematik wurde ich erst bewusst, als ich den obigen Code getestet hatte.
War jetzt auch nur zum Ausprobieren gedacht dieses 5-Tasten Board.
Werde mir zum Einspielen von Tönen um andere Eingabe-Button kümmern.

Auf jeden Fall, danke für die hilfreichen Antworten :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.