hallo liebe gemeinde.
ich bin student und arbeite seit geraumer zeit an einem projekt. ich hab ein elektronisches drum pad entwickelt, was im gegensatz zu existierenden geräten nicht fest irgendwo verortet ist (wie auf einem tisch oder einem ständer), sondern ganz mobil vom drummer getragen wird. und zwar liegt das instrument in der einen hand und wird mit den fingern der anderen hand bespielt. das ganze funktioniert mit hilfe eines kleinen mikrokontrollers names ardunio. es wandelt die signale in midi-noten um und schickt sie vie usb zum rechner, wo sie dann wieder mit einem program (ich hab abelton) interpretiert und verarbeitet werden. die schläge werden an 5 pads anschlagdynamisch über piezo-elemente aufgenommen. das ganze funktioniert bereits schon ganz gut. aber ein paar probleme hab ich da doch noch:
(1) es gibt keine polyphonie. d.h. ich kann nicht zwei oder mehr pads gleichzeitig anschlagen.
(2) die pads nehmen die schläge nicht sauber genug auf. wenn ich einmal draufhaue, dann werden 2 sounds gespielt. das liegt vermutlich daran, dass die piezo-elemente einmal beim "draufhauen" und einmal beim "runternehmen" einen sound abgeben. also wahrscheinlich immer, wenn die spannungswerte sich ändern. aber bei einem elektronischen schlagzeug werden doch auch keine anderen sensoren verwendet, oder?
ich glaube, die fehler liegen zum großen teil in der programmierung. deshalb hier der code:
_________________________________________________________________________
unsigned char PadNote[5] = {30, 32, 34, 36, 38}; // definiert die midi-noten
#define NumPads 5 //definiert die anzahl der pads
int val = 0; // variable to store the value read from the sensor pin
int THRESHOLD = 100; // ist ein mindestwert, der erreicht werden muss (skala von 0 bis 1024)
boolean obpause = true;
void setup()
{
Serial.begin(115200); // use the serial port
}
void loop()
{
for(int pin=0; pin < NumPads; pin++) { //dieser loop geht alle pads durch
val = analogRead(pin); // liest den sensor und gibt der variable val der gelesenen wert
if ((val >= THRESHOLD)&&(obpause == true))
{
obpause = false;
int tmp = 0; //folgende zeilen sind lesen 7, kurz hintereinander empfangene werte aus und bilden daraus den mittelwert
int tmp_reading = 0;
for(int i=0; i<7; i++)
{
tmp_reading = analogRead(pin);
tmp += tmp_reading;
}
tmp = tmp / 7;
val = tmp;
val = map(val, THRESHOLD, 1023, 50, 127);
midi_note_on(0, PadNote[pin], val); //befehl zum senden des begins der midi-note
delay(100); //dieses delay sorgt dafür, dass das pad nicht so schnell hintereinander ausgelesen wird
midi_note_off(0, PadNote[pin], 127); //befehl zum senden des endes der midi-note
}
if((val<3)&&(obpause == false))
{
obpause = true;
}
}
}
///////////////////////////// funktionen zum senden der midi-noten
void midi_note_off(byte channel, byte key, byte velocity)
{
midi_command(0x80, channel, key, velocity);
}
void midi_note_on(byte channel, byte key, byte velocity)
{
midi_command(0x90, channel, key, velocity);
}
void midi_command(byte command, byte channel, byte param1, byte param2)
{
Serial.write(command | (channel & 0x0F));
Serial.write(param1 & 0x7F);
Serial.write(param2 & 0x7F);
}
___________________________________________________________________________________
aber vielleicht sind auch einfach die piezoelemente nicht optimal für so ein instrument? kennt sich da jemand aus? für hilfe wäre ich sehr, sehr dankbar!!
bestens, christof