Hi zusammen,
ich habs nun hinbekommen.
Ich hab alles nochmal neu verdrahtet und dann gings auf einmal...zumindest ein "Hello World"-Effekt, der aber dann gleich mit dem nächsten Problem weiterging 
Der aktuelle Stand ist, dass ich
- den Midi Out wie beschrieben verdrahtet hab
- mit einem Midi-Kabel direkt in den MIDI-IN meiner Soundkarte am Windows-Rechner reingeh.
- Am Windows-Rechner das Programm "MidiOx" gestartet
Dann hab ich die ersten Tests gefahren:
Versuch 1
Im Skript den Wert "NUM_PIEZOS" auf 1 eingestellt und START_SLOT auf 0.
Piezo am AnalogInput0 angeschlossen.
--> Ergebnis: Keine Note wurde getriggert .
Versuch 2
NUM_PIEZOS auf 2 und START_SLOT bei 0 belassen.
Test 1: Piezo am AnalogInput0 angeschlossen:
--> Ergebnis: Die Note D und direkt danach die Note C wurden getriggert
Test 2:Piezo am AnalogInput1 angeschlossen:
--> Gleiches Ergebnis: Zuerst Note D und dann Note C
Versuch 3
NUM_PIEZOS auf 3 und START_SLOT bei 0 belassen.
Test 1: Piezo am AnalogInput0 angeschlossen:
--> Ergebnis: die Noten C, dann D und dann A wurden getriggert
Test 2: Piezo am AnalogInput1 angeschlossen
--> Ergebis: die Noten D, dann A und dann C wurden getriggert
Test 3: Piezo am AnalogInput2 angeschlossen
-> Ergebnis: die Noten A, dann C und dann D wurden getriggert.
Ich bin einfach zu unerfahren im Arduino-coden, um auf die Lösung zu kommen.
Aber anscheined sollte das Skript astrein sein, da es schon mehrmals im Netz verwendet wurde (und auch in dem Youtube Video des Skript Erstellers tiptop funktioniert.)
Ein mechanisches Problem kann es ja eigentlich nicht sein, da ja nur ein Piezo eingesteckt ist und somit der Fehler nicht in einem mittriggern durch Vibrationen liegen kann.
Hier mal das gesamte Skript, evtl. fällt einem von euch ja sofort der Fehler auf:
//Piezo defines
#define NUM_PIEZOS 3
#define SNARE_THRESHOLD 20 //anything < TRIGGER_THRESHOLD is treated as 0
#define KICK_THRESHOLD 20
#define HIHAT_THRESHOLD 20
#define START_SLOT 0 //first analog slot of piezos
//MIDI note defines for each trigger
#define SNARE_NOTE 38
#define HIHAT_NOTE 45
#define KICK_NOTE 36
//MIDI defines
#define NOTE_ON_CMD 0x90
#define NOTE_OFF_CMD 0x80
#define MAX_MIDI_VELOCITY 127
//MIDI baud rate
#define SERIAL_RATE 31250
//Program defines
//ALL TIME MEASURED IN MILLISECONDS
#define SIGNAL_BUFFER_SIZE 100
#define PEAK_BUFFER_SIZE 30
#define MAX_TIME_BETWEEN_PEAKS 20
#define MIN_TIME_BETWEEN_NOTES 50
//map that holds the mux slots of the piezos
unsigned short slotMap[NUM_PIEZOS];
//map that holds the respective note to each piezo
unsigned short noteMap[NUM_PIEZOS];
//map that holds the respective threshold to each piezo
unsigned short thresholdMap[NUM_PIEZOS];
//Ring buffers to store analog signal and peaks
short currentSignalIndex[NUM_PIEZOS];
short currentPeakIndex[NUM_PIEZOS];
unsigned short signalBuffer[NUM_PIEZOS][SIGNAL_BUFFER_SIZE];
unsigned short peakBuffer[NUM_PIEZOS][PEAK_BUFFER_SIZE];
boolean noteReady[NUM_PIEZOS];
unsigned short noteReadyVelocity[NUM_PIEZOS];
boolean isLastPeakZeroed[NUM_PIEZOS];
unsigned long lastPeakTime[NUM_PIEZOS];
unsigned long lastNoteTime[NUM_PIEZOS];
void setup()
{
Serial.begin(SERIAL_RATE);
//initialize globals
for(short i=0; i<NUM_PIEZOS; ++i)
{
currentSignalIndex[i] = 0;
currentPeakIndex[i] = 0;
memset(signalBuffer[i],0,sizeof(signalBuffer[i]));
memset(peakBuffer[i],0,sizeof(peakBuffer[i]));
noteReady[i] = false;
noteReadyVelocity[i] = 0;
isLastPeakZeroed[i] = true;
lastPeakTime[i] = 0;
lastNoteTime[i] = 0;
slotMap[i] = START_SLOT + i;
}
thresholdMap[0] = KICK_THRESHOLD;
thresholdMap[1] = SNARE_THRESHOLD;
thresholdMap[2] = HIHAT_THRESHOLD;
noteMap[0] = KICK_NOTE;
noteMap[1] = SNARE_NOTE;
noteMap[2] = HIHAT_NOTE;
}
void loop()
{
unsigned long currentTime = millis();
for(short i=0; i<NUM_PIEZOS; ++i)
{
//get a new signal from analog read
unsigned short newSignal = analogRead(slotMap[i]);
signalBuffer[i][currentSignalIndex[i]] = newSignal;
//if new signal is 0
if(newSignal < thresholdMap[i])
{
if(!isLastPeakZeroed[i] && (currentTime - lastPeakTime[i]) > MAX_TIME_BETWEEN_PEAKS)
{
recordNewPeak(i,0);
}
else
{
//get previous signal
short prevSignalIndex = currentSignalIndex[i]-1;
if(prevSignalIndex < 0) prevSignalIndex = SIGNAL_BUFFER_SIZE-1;
unsigned short prevSignal = signalBuffer[i][prevSignalIndex];
unsigned short newPeak = 0;
//find the wave peak if previous signal was not 0 by going
//through previous signal values until another 0 is reached
while(prevSignal >= thresholdMap[i])
{
if(signalBuffer[i][prevSignalIndex] > newPeak)
{
newPeak = signalBuffer[i][prevSignalIndex];
}
//decrement previous signal index, and get previous signal
prevSignalIndex--;
if(prevSignalIndex < 0) prevSignalIndex = SIGNAL_BUFFER_SIZE-1;
prevSignal = signalBuffer[i][prevSignalIndex];
}
if(newPeak > 0)
{
recordNewPeak(i, newPeak);
}
}
}
currentSignalIndex[i]++;
if(currentSignalIndex[i] == SIGNAL_BUFFER_SIZE) currentSignalIndex[i] = 0;
}
}
void recordNewPeak(short slot, short newPeak)
{
isLastPeakZeroed[slot] = (newPeak == 0);
unsigned long currentTime = millis();
lastPeakTime[slot] = currentTime;
//new peak recorded (newPeak)
peakBuffer[slot][currentPeakIndex[slot]] = newPeak;
//1 of 3 cases can happen:
// 1) note ready - if new peak >= previous peak
// 2) note fire - if new peak < previous peak and previous peak was a note ready
// 3) no note - if new peak < previous peak and previous peak was NOT note ready
//get previous peak
short prevPeakIndex = currentPeakIndex[slot]-1;
if(prevPeakIndex < 0) prevPeakIndex = PEAK_BUFFER_SIZE-1;
unsigned short prevPeak = peakBuffer[slot][prevPeakIndex];
if(newPeak > prevPeak && (currentTime - lastNoteTime[slot])>MIN_TIME_BETWEEN_NOTES)
{
noteReady[slot] = true;
if(newPeak > noteReadyVelocity[slot])
noteReadyVelocity[slot] = newPeak;
}
else if(newPeak < prevPeak && noteReady[slot])
{
noteFire(noteMap[slot], noteReadyVelocity[slot]);
noteReady[slot] = false;
noteReadyVelocity[slot] = 0;
lastNoteTime[slot] = currentTime;
}
currentPeakIndex[slot]++;
if(currentPeakIndex[slot] == PEAK_BUFFER_SIZE) currentPeakIndex[slot] = 0;
}
void noteFire(unsigned short note, unsigned short velocity)
{
if(velocity > MAX_MIDI_VELOCITY)
velocity = MAX_MIDI_VELOCITY;
midiNoteOn(note, velocity);
midiNoteOff(note, velocity);
}
void midiNoteOn(byte note, byte midiVelocity)
{
Serial.write(NOTE_ON_CMD);
Serial.write(note);
Serial.write(midiVelocity);
}
void midiNoteOff(byte note, byte midiVelocity)
{
Serial.write(NOTE_OFF_CMD);
Serial.write(note);
Serial.write(midiVelocity);
}