INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MIDI Kontroller programmieren
14.05.2018, 15:13
Beitrag #1
MIDI Kontroller programmieren
Hallöchen,
Ich habe da ein Problem bei der Programmierung meines MIDI Kontrollers.

Ich baue mir ein Kontroller mit 64 Potis, zwei Ultraschall Sensoren, 1 Joystick mit Taster und 16 Taster. Bei den Tastern sollen 12T Noten, 2 Bank Selekt und 2 Programm Change senden.
Das ganze läuft über den Nano.
Die Potis sind über 8 Multiplexer geschaltet und funktionieren super. XY des Joysticks sind ebenfalls über den multiplexer geschaltet und den Taster habe ich einen digitalen Pin zugewiesen. Das läuft auch.
Die 16 Taster sind über zwei schieberegister verbunden. Diese sind Hardware Endprellt und mit invertierten schmitt trigger dem Nano zugeführt. Als schieberegister sind zwei CD4021B verbaut, wobei der zweite im erste als seriel-seriel durchgeführt wird.

Meine Schwierigkeit liegt bei den 16 Tastern.
Sie senden die information, nur das ganz oft. Ich habe versucht nach Note on direkt ein Note off zu senden.
Da wurden über vierzig Note on und Note off gesendet.
Dabei geht jedes software Instrument in die Knie .

Wie kann ich es erreichen das jeweils nur eine Note gesendet wird?
Bei den Joystick funktioniert es ja.

Herzlichen dank im voraus.
Hier das Skript
Code:
byte controlChange = 176;    //Control-Change auf MIDI Kanal 1

int potiWert[64];
byte controllerWert[64];
byte controllerWertAlt[64];

byte i = 0;                  // i entspricht zaehler

byte bit1 = 0;
byte bit2 = 0;
byte bit3 = 0;

byte button = LOW;
byte buttonAlt = LOW;        //button und schalter für Joystick
byte schalter = 0;

int latchPin = 12;
int dataPin = 13;
int clockPin = 6;


byte switchVar1 = 0;
byte switchVar2 = 0;

void setup() {
  Serial.begin(115200);
  
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);

  pinMode(7, INPUT_PULLUP);

  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, INPUT);

}



void loop() {
  for (byte i = 0; i <= 7; i++) {
    bit1 = bitRead(i, 0);
    bit2 = bitRead(i, 1);
    bit3 = bitRead(i, 2);

    digitalWrite(2, bit1);
    digitalWrite(3, bit2);
    digitalWrite(4, bit3);

    potisAbfragen(i,A0);
    potisAbfragen(i+8,A1);
    potisAbfragen(i+16,A2);
    potisAbfragen(i+24,A3);
    potisAbfragen(i+32,A7);
    potisAbfragen(i+40,A5);
    potisAbfragen(i+48,A4);
    potisAbfragen(i+56,A6);

    buttonAbfragen();

  digitalWrite(latchPin,1);
  delayMicroseconds(20);
  digitalWrite(latchPin,0);

  switchVar1 = shiftIn(dataPin, clockPin);
  switchVar2 = shiftIn(dataPin, clockPin);

  //delay(150);

  }
}

byte shiftIn(int myDataPin, int myClockPin) {
  int i;
  int temp = 0;
  int pinState;
  byte myDataIn = 0;

  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, INPUT);


  for (i=7; i>=0; i--)
  {
    digitalWrite(myClockPin, 0);
    delayMicroseconds(2);
    temp = digitalRead(myDataPin);
    if (temp) {
      pinState = 1;
      myDataIn = myDataIn | (1 << i);
    }
    else {
      
      pinState = 0;
    }
    switch(switchVar1) {
      case 1:
      sendeMIDI(144, 36, 100);
      break;
      case 2:
      sendeMIDI(144, 37, 127);
      break;
      case 4:
      sendeMIDI(144, 38, 127);
      break;
      case 8:
      sendeMIDI(144, 39, 127);
      break;
      case 16:
      sendeMIDI(144, 40, 127);
      break;
      case 32:
      sendeMIDI(144, 41, 127);
      break;
      case 64:
      sendeMIDI(144, 42, 127);
      break;
      case 128:
      sendeMIDI(144, 43, 127);
      break;
      default:
      sendeMIDI(144, 43, 0);
     pinState = 0;
    
    
    }

    switch(switchVar2) {
      case 1:
      sendeMIDI(144, 44, 127);
      break;
      case 2:
      sendeMIDI(144, 45, 127);
      break;
      case 4:
      sendeMIDI(144, 46, 127);
      break;
      case 8:
      sendeMIDI(144, 47, 127);
      break;
      case 16:
      sendeMIDI(144, 48, 127);
      break;
      case 32:
      sendeMIDI(144, 49, 127);
      break;
      case 64:
      sendeMIDI(144, 50, 127);
      break;
      case 128:
      sendeMIDI(144, 51, 127);
      break;
      default:
     pinState = 0;
    
    }    

    digitalWrite(myClockPin, 1);

  }
  
  return myDataIn;
}

void potisAbfragen(byte zaehler, int analogPin) {                            //Eigenbefehl wann und wo
  potiWert[zaehler] = 0.2 * potiWert[zaehler] + 0.8 * analogRead(analogPin); //Wert Glätung
  controllerWert[zaehler] = map(potiWert[zaehler],0,1023,0,127);             //umrechnen in MIDI Wert
  if (controllerWert[zaehler] != controllerWertAlt[zaehler]) {               //Wertevergleich
    sendeMIDI(controlChange, (1+zaehler), controllerWert[zaehler]);          //sendet cc ab 1 conttrollerWert
    controllerWertAlt[zaehler] = controllerWert[zaehler];                    //schreibt cWAlt als neuen controllerWert
  }
}

void buttonAbfragen() {
  button = digitalRead(7);
  if(button == LOW && buttonAlt == HIGH) {
   if(schalter == 0) {
    sendeMIDI(176, 64, 127);
    schalter = 1;
   }
   else {
    sendeMIDI(176, 64, 0);
    schalter = 0;
   }
  }
  buttonAlt = button;
}

void sendeMIDI(byte statusByte, byte dataByte1, byte dataByte2) {
  Serial.write(statusByte);
  Serial.write(dataByte1);
  Serial.write(dataByte2);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2018, 15:41
Beitrag #2
RE: MIDI Kontroller programmieren
Ich kenne mich mit MIDI nicht aus.
Warum sendest Du bereits im Einlesen der 8 Bit die Noten?

Wäre es nicht besser, erst ein Byte vollständig einzulesen, zu Vergleichen, ob sich überhaupt etwas geändert hat und nur dann die Noten zu senden?

Derzeit ist Dein Finger viel langsamer, als Deine Abfrage. Deshalb werden die Noten mehrfach gesendet. Wenn Du Dir den alten Wert merkst und nur etwas sendest, wenn der neue Wert != dem alten Wert ist, umgehst Du dieses Problem.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.05.2018, 15:07
Beitrag #3
RE: MIDI Kontroller programmieren
Hey Tommy56,
Danke dir , habe jetzt erst Zeit gefunden.

Ich kann dir nur zum Teil folgen, bin noch nicht lange dabei.

Meinst du bei Switch case?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.05.2018, 19:31
Beitrag #4
RE: MIDI Kontroller programmieren
(15.05.2018 15:07)Baimie schrieb:  Hey Tommy56,
Danke dir , habe jetzt erst Zeit gefunden.

Ich kann dir nur zum Teil folgen, bin noch nicht lange dabei.

Meinst du bei Switch case?
Auch. Ich hatte auch noch andere Sachen beschrieben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.05.2018, 21:01 (Dieser Beitrag wurde zuletzt bearbeitet: 15.05.2018 21:03 von Franz54.)
Beitrag #5
RE: MIDI Kontroller programmieren
Da gibts aber doch auch wieder Stress, weil man ja auch mal eine Note mehrfach hintereinander anschlägt. Das würde dann vom Programm unterbunden werden. Da müßte wohl noch eine Prellzeit berücksichtigt werden. Eine Maximal Zeit, in der real keine zwei Noten aufeinander folgen können.

Franz

http://www.superlaugh.com/behappy
Hier was zum Thema Deutsche Politik Angry
Und hier zum Thema richtige Politik Big Grin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.05.2018, 21:18
Beitrag #6
RE: MIDI Kontroller programmieren
(15.05.2018 21:01)Franz54 schrieb:  Da gibts aber doch auch wieder Stress, weil man ja auch mal eine Note mehrfach hintereinander anschlägt. Das würde dann vom Programm unterbunden werden. Da müßte wohl noch eine Prellzeit berücksichtigt werden. Eine Maximal Zeit, in der real keine zwei Noten aufeinander folgen können.

Franz
Wenn ich eine Note 2 Mal hintereinander anschlage, habe ich dazwischen den Finger wieder runter.
Richtig, entprellen muss noch sein, da muss er schauen, wie gut seine Taster sind. Meistens genügen 10 ms. So schnell haust Du nicht 2 Mal hintereinander auf die Taste.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.05.2018, 21:36 (Dieser Beitrag wurde zuletzt bearbeitet: 15.05.2018 22:13 von Franz54.)
Beitrag #7
RE: MIDI Kontroller programmieren
(14.05.2018 15:41)Tommy56 schrieb:  Wenn Du Dir den alten Wert merkst und nur etwas sendest, wenn der neue Wert != dem alten Wert ist, umgehst Du dieses Problem.

Das hier meinte ich. Wenn ich zwei mal drücke ist das genauso wie einmal gedrückt und einmal geprellt. Das Programm erkennt keinen neuen Wert, also wird er nicht gesendet. Deswegen kann ich nicht sagen, dass ich nur einen Neuen Wert senden darf.
Ich habe mal Prellzeiten von diesen Minitastern mit dem Osi getestet, die sind weit über 100ms gegangen. auf der sicheren Seite war ich mit 200ms Entprellzeit Confused

Ich sehe gerade, dass ich das nicht mit dem Osi überprüft habe, sondern mit einem Programm, das die Preller zählen soll. Und das Programm war Unsinn. Das hat eigentlich nur die LOOP Durchgänge gezählt, bei denen die Taste auf HIGH war. Es hat aber nicht überprüft, ob die Taste dazwischen wieder mal auf LOW war. Also es hat nicht die Preller gezählt, sondern eigentlich die LOOP Durchgänge, die der Finger auf der Taste war, plus die Prellzeit. ConfusedBlush

http://www.superlaugh.com/behappy
Hier was zum Thema Deutsche Politik Angry
Und hier zum Thema richtige Politik Big Grin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.05.2018, 22:21
Beitrag #8
RE: MIDI Kontroller programmieren
(15.05.2018 21:36)Franz54 schrieb:  
(14.05.2018 15:41)Tommy56 schrieb:  Wenn Du Dir den alten Wert merkst und nur etwas sendest, wenn der neue Wert != dem alten Wert ist, umgehst Du dieses Problem.

Das hier meinte ich. Wenn ich zwei mal drücke ist das genauso wie einmal gedrückt und einmal geprellt. Das Programm erkennt keinen neuen Wert, also wird er nicht gesendet. Deswegen kann ich nicht sagen, dass ich nur einen Neuen Wert senden darf.
Doch. Wie ich schon geschrieben habe: Wenn Du 2 Mal drückst, hast Du dazwischen los gelassen. Also Wert1, loslassen(Wert0), wieder drücken Wert1

Wenn Du Taster hast, sie 200 ms prellen, solltest Du sie weg werfen.
Selbst Reedkontakte, die aufgrund ihrer langen Zungen sehr prellfreudig sind (Stimmgabel) sind nbei mir <= 10ms fertig.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Big Grin Brauche dringend Hilfe mit dem Programmieren von Servo und Taster holzchistli 4 698 19.06.2018 16:45
Letzter Beitrag: hotsystems
  Programmieren, welche Software ist möglich W-P-Grimma 5 741 03.04.2018 16:33
Letzter Beitrag: Tommy56
  Hilfe beim Programmieren Klawino 28 2.415 10.03.2018 13:36
Letzter Beitrag: hotsystems
  Brauche Unterstützung bei Programmieren Geeros#18 4 620 12.02.2018 22:14
Letzter Beitrag: Chopp
  Makeblock mit Scratch programmieren- Probleme Keinen Schimmer 17 5.393 30.12.2017 00:40
Letzter Beitrag: koma1965
  Arduino mit Android programmieren. maxx 4 1.025 28.11.2017 18:32
Letzter Beitrag: hotsystems
  Attiny45-20 programmieren PeterCrash 4 898 22.09.2017 20:49
Letzter Beitrag: Mathias
  ATtinys programmieren Thor Wallhall 11 1.789 14.09.2017 21:26
Letzter Beitrag: Thor Wallhall
  ATtiny13 mit der Arduino IDE 1.0.6 programmieren - geht das? Gelegenheitsbastler 5 3.846 11.09.2017 15:24
Letzter Beitrag: Mathias
  Kommandozeilen-Parser programmieren tollewurst 2 712 21.08.2017 22:15
Letzter Beitrag: georg01

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste