seltsame Midi Ausgabe in Hairless Midi-Serial

Hallo zusammen,

ich bekomme eine seltsame Midi Ausgabe in Hairless Midi-Serial.
Ich habe ein Midi Drum Kit gebaut, bei dem 9 Pads an einem Multiplexer mit 16 Kanälen angeschlossen sind. 8 Pads funktionieren und geben bei einem einfachen Schlag auf das jeweilige Pad eine korrekte Midi Nachricht aus (siehe Anhang).
Pads, die am Kanal 9-16 am Multiplexer angeschlossen werden, geben allerdings eine falsche Midi Nachricht aus (die Note Off Nachricht fehlt! Siehe Anhang). Ich benutze einen Arduino UNO mit einem MUX74HC4067 Multiplexer und 9 Piezo Sensoren. Das Fritzing Setup liegt auch im Anhang.
Hat jemand eine Idee, woran das liegen könnte?
Vielen Dank schon mal im Voraus : )
Ich habe bereits mehrere Foren durchsucht, und finde einfach keine Lösung.
Das ist der Code:

#include "MUX74HC4067.h"
#include <MIDI.h>

MUX74HC4067 mux(8, 9, 10, 11, 12);

#define NUMBER_OF_PADS 9
#define VELOCITY_ACTIVE 1
#define LOG_MAPPING 1
#define MIDI_CHANNEL 1
#define MIDI_MAX_VELOCITY 1024
#define MIDI_NOTE_ON 0b1001
#define MIDI_NOTE_OFF 0b1000

uint8_t padNote[NUMBER_OF_PADS] = {51, 41, 45, 38, 37, 46, 36, 39, 44};
uint16_t padCycles[NUMBER_OF_PADS] = {40, 40, 40, 40, 60, 40, 60, 60, 60};
uint16_t padThreshold[NUMBER_OF_PADS] = {1, 1, 1, 1, 1, 1, 10, 10, 10};
uint16_t padCurrentCycles[NUMBER_OF_PADS];
uint8_t activePad;

void setup()
{
  Serial.begin(38400);
  mux.signalPin(A0, INPUT, ANALOG);
}

void loop(){

/////////// Drum Pads ////////////////////////////////////////////////////////////
  
  for (uint8_t pin = 0; pin < NUMBER_OF_PADS; pin++) {
    uint16_t val = mux.read(pin);      
    if ((val > padThreshold[pin]) && (!padActive(pin))) {
      val = VELOCITY_ACTIVE ? velocityAlgorithm(val,LOG_MAPPING) : MIDI_MAX_VELOCITY;
      uint8_t note = padNote[pin];
      midi_tx_note_on(MIDI_CHANNEL, note, val);
      padCurrentCycles[pin] = 0;
      activePad |= 1 << pin;
    }
    if (padActive(pin)) {
      padCurrentCycles[pin] += 1;
      if (padCurrentCycles[pin] >= padCycles[pin]) {
          midi_tx_note_off(MIDI_CHANNEL, padNote[pin]);
          activePad &= ~(1 << pin);
      }
    }
  }
}

/////////// Velocity Algorithm ////////////////////////////////////////////////////////////

uint8_t velocityAlgorithm(uint16_t val, uint8_t logswitch) {
  if (logswitch) {
     return log(val + 1)/ log(1024) * 127;
  }
    return (val - 0) * (127 - 0) / (1023 - 0) + 0;
}
uint8_t padActive(uint8_t currentPin) {
  return (activePad >> currentPin) & 1;
}

/////////// MIDI Message //////////////////////////////////////////////////////////////////


void midi_tx_note_on(uint8_t channel, uint8_t pitch, uint8_t velocity) {
    channel += 0xB0 - 1;
  if (channel >= 0xB0 && channel <= 0xBF)
  Serial.write((MIDI_NOTE_ON << 4) | (MIDI_CHANNEL - 1));
  Serial.write(pitch);
  Serial.write(velocity);
}
void midi_tx_note_off(uint8_t channel, uint8_t pitch) {
    channel += 0xB0 - 1;
  if (channel >= 0xB0 && channel <= 0xBF)
  Serial.write((MIDI_NOTE_OFF << 4) | (MIDI_CHANNEL - 1));
  Serial.write(pitch);
  Serial.write(0);
}

right-Midi-Message.jpg

wrong-Midi-Message.jpg

Kein VCC am Multiplexer angeschlossen?

uint8_t activePad;

Da passen keine neun Bits rein, versuche uint16_t.

Vielen Dank agmue,

Das war's! : ))))

Ich hab auch mal denn VCC Port vom Multiplexer an den 5V Port vom Arduino geklemmt.
Scheint aber keinen Unterschied zu machen. Vielleicht wird der wichtig, wenn ich weitere Piezos anschließe.

tomgraph:
Vielen Dank agmue,

Das war's! : ))))

Bitte gerne :smiley:

tomgraph:
Ich hab auch mal denn VCC Port vom Multiplexer an den 5V Port vom Arduino geklemmt.
Scheint aber keinen Unterschied zu machen. Vielleicht wird der wichtig, wenn ich weitere Piezos anschließe.

Ohne Grund hat das IC diesen Anschluß nicht. Möglicherweise holt sich das IC den Strom über die Schutzdioden, was die aber nur begrenzt mitmachen. Irgendwann funktioniert Elektronik mit Rauch ;D