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