Home News Forum Kijk/Luister Sample Sets Vergelijk Benodigdheden Foto's Links Downloads Over ons

 

Arduino mega 2560 als midi controler

Toon actieve onderwerpen


Berichten: 46

Geregistreerd: 30 nov 2015 14:39

Bericht 20 sep 2016 01:14

Arduino mega 2560 als midi controler

Dus lang verhaal kort,
Ik heb een Arduino Mega 2560 en gebruik de digitale I/O poorten als directe contacten, (ik weet het inefficient maar dat maakte het makkelijker programeren dacht ik)
Deel van het verhaal staat hier:
viewtopic.php?f=7&t=2491

Schema is als volgt:
i1^cimgpsh_orig.png


poort 22 tot 53 worden dus gebruikt als toetsen voor het pedaal.

Hierbij heb ik de volgende code geschreven gebaseerd op vergelijkbare projecten op het internet:

  Code:
boolean C = 0;
boolean CS = 0;
boolean D = 0;
boolean DS = 0;
boolean E = 0;
boolean F = 0;
boolean FS = 0;
boolean G = 0;
boolean GS = 0;
boolean A = 0;
boolean AS = 0;
boolean B = 0;
boolean C2 = 0;
boolean CS2 = 0;
boolean D2 = 0;
boolean DS2 = 0;
boolean E2 = 0;
boolean F2 = 0;
boolean FS2 = 0;
boolean G2 = 0;
boolean GS2 = 0;
boolean H = 0;
boolean HS = 0;
boolean B2 = 0;

boolean C3 = 0;
boolean CS3 = 0;
boolean D3 = 0;
boolean DS3 = 0;
boolean E3 = 0;
boolean F3 = 0;
boolean FS3 = 0;
boolean G3 = 0;







boolean Clast = 0;
boolean CSlast = 0;
boolean Dlast = 0;
boolean DSlast = 0;
boolean Elast = 0;
boolean Flast = 0;
boolean FSlast = 0;
boolean Glast = 0;
boolean GSlast = 0;
boolean Alast = 0;
boolean ASlast = 0;
boolean Blast = 0;

boolean C2last = 0;
boolean CS2last = 0;
boolean D2last = 0;
boolean DS2last = 0;
boolean E2last = 0;
boolean F2last = 0;
boolean FS2last = 0;
boolean G2last = 0;
boolean GS2last = 0;
boolean Hlast = 0;
boolean HSlast = 0;
boolean B2last = 0;

boolean C3last = 0;
boolean CS3last = 0;
boolean D3last = 0;
boolean DS3last = 0;
boolean E3last = 0;
boolean F3last = 0;
boolean FS3last = 0;
boolean G3last = 0;



int vol = 0;

void setup()  {
  Serial.begin(31250);
  pinMode(22, INPUT);
  pinMode(23, INPUT);
  pinMode(24, INPUT);
  pinMode(25, INPUT);
  pinMode(26, INPUT);
  pinMode(27, INPUT);
  pinMode(28, INPUT);
  pinMode(29, INPUT);
  pinMode(30, INPUT);
  pinMode(31, INPUT);
  pinMode(32, INPUT);
  pinMode(33, INPUT);
  pinMode(34, INPUT);
  pinMode(35, INPUT);
  pinMode(36, INPUT);
  pinMode(37, INPUT);
  pinMode(38, INPUT);
  pinMode(39, INPUT);
  pinMode(40, INPUT);
  pinMode(41, INPUT);
  pinMode(42, INPUT);
  pinMode(43, INPUT);
  pinMode(44, INPUT);
  pinMode(45, INPUT);
  pinMode(46, INPUT);
  pinMode(47, INPUT);
  pinMode(48, INPUT);
  pinMode(49, INPUT);
  pinMode(50, INPUT);
  pinMode(51, INPUT);
  pinMode(52, INPUT);
  pinMode(53, INPUT);
}

void loop()  {
  vol = analogRead(A5);
  vol = map(vol, 0, 1023, 0, 127);
 
 
  C = digitalRead(22);
  CS = digitalRead(23);
  D = digitalRead(24);
  DS = digitalRead(25);
  E = digitalRead(26);
  F = digitalRead(27);
  FS = digitalRead(28);
  G = digitalRead(29);
  GS = digitalRead(30);
  A = digitalRead(31);
  AS = digitalRead(32);
  B = digitalRead(33);
  C2 = digitalRead(34);
  CS2 = digitalRead(35);
  D2 = digitalRead(36);
  DS2 = digitalRead(37);
  E2 = digitalRead(38);
  F2 = digitalRead(39);
  FS2 = digitalRead(40);
  G2 = digitalRead(41);
  GS2 = digitalRead(42);
  H = digitalRead(31);
  HS = digitalRead(32);
  B2 = digitalRead(45);
  C3 = digitalRead(46);
  CS3 = digitalRead(47);
  D3 = digitalRead(48);
  DS3 = digitalRead(49);
  E3 = digitalRead(50);
  F3 = digitalRead(51);
  FS3 = digitalRead(52);
  G3 = digitalRead(53);

 
  if(C != Clast)  {
    if(C == 1)  {
      noteOn(0x90, 36, vol);
    }
    else  {
      noteOn(0x80, 36, 0x00);
      noteOn(0x80, 36, 0x00);
    }
  }
  if(CS != CSlast)  {
    if(CS == 1)  {
      noteOn(0x90, 37, vol);
    }
    else  {
      noteOn(0x80, 37, 0x00);
      noteOn(0x80, 37, 0x00);
    }
  }
  if(D != Dlast)  {
    if(D == 1)  {
      noteOn(0x90, 38, vol);
    }
    else  {
      noteOn(0x80, 38, 0x00);
      noteOn(0x80, 38, 0x00);
    }
  }
  if(DS != DSlast)  {
    if(DS == 1)  {
      noteOn(0x90, 39, vol);
    }
    else  {
      noteOn(0x80,39, 0x00);
      noteOn(0x80,39, 0x00);
    }
  }
  if(E != Elast)  {
    if(E == 1)  {
      noteOn(0x90, 40, vol);
    }
    else  {
      noteOn(0x80, 40, 0x00);
      noteOn(0x80, 40, 0x00);
    }
  }
  if(F != Flast)  {
    if(F == 1)  {
      noteOn(0x90, 41, vol);
    }
    else  {
      noteOn(0x80, 41, 0x00);
      noteOn(0x80, 41, 0x00);
    }
  }
  if(FS != FSlast)  {
    if(FS == 1)  {
      noteOn(0x90, 42, vol);
    }
    else  {
      noteOn(0x80, 42, 0x00);
      noteOn(0x80, 42, 0x00);
    }
  }
  if(G != Glast)  {
    if(G == 1)  {
      noteOn(0x90, 43, vol);
    }
    else  {
      noteOn(0x80, 43, 0x00);
      noteOn(0x80, 43, 0x00);
    }
  }
  if(GS != GSlast)  {
    if(GS == 1)  {
      noteOn(0x90, 44, vol);
    }
    else  {
      noteOn(0x80, 44, 0x00);
      noteOn(0x80, 44, 0x00);
    }
  }
  if(A != Alast)  {
    if(A == 1)  {
      noteOn(0x90, 45, vol);
    }
    else  {
      noteOn(0x80, 45, 0x00);
      noteOn(0x80, 45, 0x00);
    }
  }
  if(AS != ASlast)  {
    if(AS == 1)  {
      noteOn(0x90, 46, vol);
    }
    else  {
      noteOn(0x80, 46, 0x00);
      noteOn(0x80, 46, 0x00);
    }
  }
  if(B != Blast)  {
    if(B == 1)  {
      noteOn(0x90, 47, vol);
    }
    else  {
      noteOn(0x80, 47, 0x00);
      noteOn(0x80, 47, 0x00);
    }
  }
  if(C2 != C2last)  {
    if(C2 == 1)  {
      noteOn(0x90, 48, vol);
    }
    else  {
      noteOn(0x80, 48, 0x00);
      noteOn(0x80, 48, 0x00);
    }
  }
  if(CS2 != CSlast)  {
    if(CS2 == 1)  {
      noteOn(0x90, 49, vol);
    }
    else  {
      noteOn(0x80, 49, 0x00);
      noteOn(0x80, 49, 0x00);
    }
  }
  if(D2 != Dlast)  {
    if(D2 == 1)  {
      noteOn(0x90, 50, vol);
    }
    else  {
      noteOn(0x80, 50, 0x00);
      noteOn(0x80, 50, 0x00);
    }
  }
  if(DS2 != DSlast)  {
    if(DS2 == 1)  {
      noteOn(0x90, 51, vol);
    }
    else  {
      noteOn(0x80, 51, 0x00);
      noteOn(0x80, 51, 0x00);
    }
  }
  if(E2 != Elast)  {
    if(E2 == 1)  {
      noteOn(0x90, 52, vol);
    }
    else  {
      noteOn(0x80, 52, 0x00);
      noteOn(0x80, 52, 0x00);
    }
  }
  if(F2 != Flast)  {
    if(F2 == 1)  {
      noteOn(0x90, 53, vol);
    }
    else  {
      noteOn(0x80, 53, 0x00);
      noteOn(0x80, 53, 0x00);
    }
  }
  if(FS2 != FSlast)  {
    if(FS2 == 1)  {
      noteOn(0x90, 54, vol);
    }
    else  {
      noteOn(0x80, 54, 0x00);
      noteOn(0x80, 54, 0x00);
    }
  }
  if(G2 != Glast)  {
    if(G2 == 1)  {
      noteOn(0x90, 55, vol);
    }
    else  {
      noteOn(0x80, 55, 0x00);
      noteOn(0x80, 55, 0x00);
    }
  }
  if(GS2 != GSlast)  {
    if(GS2 == 1)  {
      noteOn(0x90, 56, vol);
    }
    else  {
      noteOn(0x80, 56, 0x00);
      noteOn(0x80, 56, 0x00);
    }
  }
  if(H != Alast)  {
    if(H == 1)  {
      noteOn(0x90, 57, vol);
    }
    else  {
      noteOn(0x80, 57, 0x00);
      noteOn(0x80, 57, 0x00);
    }
  }
  if(HS != ASlast)  {
    if(HS == 1)  {
      noteOn(0x90, 58, vol);
    }
    else  {
      noteOn(0x80, 58, 0x00);
      noteOn(0x80, 58, 0x00);
    }
  }
  if(B2 != Blast)  {
    if(B2 == 1)  {
      noteOn(0x90, 59, vol);
    }
    else  {
      noteOn(0x80, 59, 0x00);
      noteOn(0x80, 59, 0x00);
    }
  }
  if(C3 != Clast)  {
    if(C3 == 1)  {
      noteOn(0x90, 60, vol);
    }
    else  {
      noteOn(0x80, 60, 0x00);
      noteOn(0x80, 60, 0x00);
    }
  }
  if(CS3 != CSlast)  {
    if(CS3 == 1)  {
      noteOn(0x90, 61, vol);
    }
    else  {
      noteOn(0x80, 61, 0x00);
      noteOn(0x80, 61, 0x00);
    }
  }
  if(D3 != Dlast)  {
    if(D3 == 1)  {
      noteOn(0x90, 62, vol);
    }
    else  {
      noteOn(0x80, 62, 0x00);
      noteOn(0x80, 62, 0x00);
    }
  }
  if(DS3 != DSlast)  {
    if(DS3 == 1)  {
      noteOn(0x90, 63, vol);
    }
    else  {
      noteOn(0x80, 63, 0x00);
      noteOn(0x80, 63, 0x00);
    }
  }
  if(E3 != Elast)  {
    if(E3 == 1)  {
      noteOn(0x90, 64, vol);
    }
    else  {
      noteOn(0x80, 64, 0x00);
      noteOn(0x80, 64, 0x00);
    }
  }
  if(F3 != Flast)  {
    if(F3 == 1)  {
      noteOn(0x90, 65, vol);
    }
    else  {
      noteOn(0x80, 65, 0x00);
      noteOn(0x80, 65, 0x00);
    }
  }
  if(FS3 != FSlast)  {
    if(FS3 == 1)  {
      noteOn(0x90, 66, vol);
    }
    else  {
      noteOn(0x80, 66, 0x00);
      noteOn(0x80, 66, 0x00);
    }
  }
  if(G3 != Glast)  {
    if(G3 == 1)  {
      noteOn(0x90, 67, vol);
    }
    else  {
      noteOn(0x80, 67, 0x00);
      noteOn(0x80, 67, 0x00);
    }
  }

 
  Clast = C;
  CSlast = CS;
  Dlast = D;
  DSlast = DS;
  Elast = E;
  Flast = F;
  FSlast = FS;
  Glast = G;
  GSlast = GS;
  Alast = A;
  ASlast = AS;
  Blast = B;
  C2last = C2;
  CS2last = CS2;
  D2last = D2;
  DS2last = DS2;
  E2last = E2;
  F2last = F2;
  FS2last = FS2;
  G2last = G2;
  GS2last = GS2;
  Hlast = A2;
  HSlast = AS2;
  B2last = B2;
  C3last = C3;
  CS3last = CS3;
  D3last = D3;
  DS3last = DS3;
  E3last = E3;
  F3last = F3;
  FS3last = FS3;
  G3last = G3;

 
  delay(50);
}

void noteOn(byte cmd, byte data1, byte data2) {
   Serial.write(cmd);
   Serial.write(data1);
   Serial.write(data2);
   delay(10);
}


Kan niet fout gaan dacht ik, wel dus...
Wat er gebeurt is dat ondanks dat als een toets word aangeslagen de arduino via midi de juiste toets weergeeft, ondertussen alle toetsen respectievelijk in volgorde van laag naar hoog aan en uit gezet worden.
Ik heb geen idee waar het aan ligt en voor ik me suf zoek op het internet en een nieuwe code verzin hoopte ik de experts onder ons het eens te vragen. Wie weet krijgen we hier wel de goedkoopste manier uit om je pedaal/keyboard/knoppen te midificeren...

Wie kan mij helpen de code te verbeteren?
Je hebt geen permissies om de bijlage(n)) in dit bericht te zien.

Berichten: 369

Geregistreerd: 12 dec 2014 14:23

Woonplaats: Zetten

Bericht 20 sep 2016 06:27

Re: Arduino mega 2560 als midi controler

Interessant idee zeg! Helaas kan ik je niet helpen, mijn enige programmeerervaring is websites met frames in html. Frames ja, 15 jaar geleden dus ;)

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 20 sep 2016 08:08

Re: Arduino mega 2560 als midi controler

Hallo Prince
Hoe heb je het pedaal aan de arduino precies aangesloten? Ik vraag me af of het de code is of de aansluiting welke het probleem veroorzaakt.
Als een pedaaltoets "open" is (niet aangeslagen), wordt deze dan ook via een weerstand met 0 verbonden, of ligt hij "los".
Dit kan nl. ook heel goed die golf beweging veroorzaken omdat de Inputs zweven.

Groet
Erik

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 20 sep 2016 08:39

Re: Arduino mega 2560 als midi controler

Hier nog een Idee je code overzichtelijker te maken (ik heb het even snel in een Texteditor gemaakt en niet gecontroleerd of alle haakjes goed staan!)

  Code:
const int firstPin = 22;
const int firstNote = 36;

int inputPins[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

int vol = 0;

void setup()  {
  Serial.begin(31250);
 
  for (int i = firstPin; i < firstpin + 32; i++){
      pinMode(i, INPUT);
  }
}

void loop()  {
  vol = analogRead(A5);
  vol = map(vol, 0, 1023, 0, 127);
 
  for (int i = 0; i < 32; i++) {
   int input = digitalRead(i+firstPin);
   if (inputPins[i] != input){
      if (input == HIGH) {
         noteOn(0x90, i + firstNote, vol);
      }
      else {
         noteOn(0x80, i + firstNote, 0x00);
         noteOn(0x80, i + firstNote, 0x00);
      }
      inputPins[i] = input;
   }
  }

  delay(50);
}

void noteOn(byte cmd, byte data1, byte data2) {
   Serial.write(cmd);
   Serial.write(data1);
   Serial.write(data2);
   delay(10);
}

Berichten: 105

Geregistreerd: 30 jul 2012 09:33

Bericht 20 sep 2016 09:44

Re: Arduino mega 2560 als midi controler

Het laatste stukje code is inderdaad veel overzichtelijker en compacter.
Wat me opvalt is dat in geen van beide proggies rekening wordt gehouden met contact-debouncing (tegengaan van contact-dender). Of je weet zeker dat je hier geen rekening mee wilt/hoeft te houden (bv. gebruik van hall-sensoren lost e.e.a. geheel/grotendeels op; of je laat het Hauptwerk uitzoeken, maar krijgt het daardoor wel onnodig druk), of je moet in je code nog voorzieningen treffen om niet onnodig veel note-on/note-off sequences te sturen bij 1 keer een toets indrukken of loslaten.
Weet dat bij de Arduino-IDE standaard een aantal aardige libraries meekomen. Eén ervan is Debounce (bedoeld voor inderdaad contact-debouncing). Verder is er ook een MIDI library. Geen idee of dat met deze Mega versie bruikbaar is, maar kijk er maar eens naar.
Ik gebruik zelf geen Arduino's maar Teensy's. Behoorlijk vergelijkbaar met de Arduino's maar lekker eenvoudig als midi-encoder te gebruiken omdat de Teensy gevoed wordt via een USB-kabel (bv. aan je computer) maar deze tegelijkertijd ook gebruikt kan worden om MIDI over heen te zenden (heb je dus meteen je USB-MIDI interface naar je computer.

bert
Laatst bijgewerkt door bert op 20 sep 2016 19:54, in totaal 1 keer bewerkt.

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 20 sep 2016 11:12

Re: Arduino mega 2560 als midi controler

bert schreef:Wat me opvalt is dat in geen van beide proggies rekening wordt gehouden met contact-debouncing (tegengaan van contact-dender).

Ik heb de code alleen vereenvoudigt en ik geloof ook niet dat het daarmee gedaan is. Daarom wilde ik ook eerst eens weten hoe het pedaal eigenlijk aangesloten is. Ik heb zelf nog nooit iets met een Arduino gedaan.

bert schreef: Weet dat bij de Arduino-IDE standaard een aantal aardige libraries meekomen. Eén ervan is Bounce (bedoeld voor inderdaad contact-debouncing).

Lijkt mij een hele goede tip.

Berichten: 46

Geregistreerd: 30 nov 2015 14:39

Bericht 20 sep 2016 18:28

Re: Arduino mega 2560 als midi controler

Ik ga er het een en ander mee proberen. Het pedaal werkt met drukschakelaars die in ruststand ingedrukt zijn. In ingedrukte stand maken ze geen contact. Hoe het is aangesloten is dat voor een toon bijvoorbeeld de C1 de 22 contact maakt met ground.

Mijn ervaring met programeren is minimaal en ik zal moeten onderzoekken waar ik dat bounce vandaan kan halen.

Dit is de informatie die ik nodig heb.

Berichten: 5125

Geregistreerd: 12 feb 2011 01:09

Bericht 20 sep 2016 18:36

Re: Arduino mega 2560 als midi controler

Hier http://www.instructables.com/id/Custom-Arduino-MIDI-Controller/ staat een tutorial met Midi waar ook code te downloaden is. De eerste link die ik tegenkwam in de zoekmachine. Maar er zal vast meer zijn.

Berichten: 105

Geregistreerd: 30 jul 2012 09:33

Bericht 20 sep 2016 19:53

Re: Arduino mega 2560 als midi controler

prince0810 schreef:Dit is de informatie die ik nodig heb.

Ik weet niet wat je gebruikt om je Arduino mee te programmeren, maar als ik er even vanuit ga dat je de IDE gebruikt zoals van https://www.arduino.cc/en/Main/Software te downloaden is, dan kun je in de Reference Manual die je erbij krijgt wel opzoeken hoe e.e.a. met de Debounce library in z'n werk gaat. Zie ook: http://playground.arduino.cc/Code/Debounce.
Dus als je de genoemde IDE geïnstalleerd hebt, dan hoef je niet op zoek, maar kun je gewoon d.m.v. #include <Debounce.h> de juiste spullen naar binnen slepen in je programma.
Ik weet niet of je dit bedoelde, anders roept u maar...

bert

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 21 sep 2016 07:48

Re: Arduino mega 2560 als midi controler

prince0810 schreef:Het pedaal werkt met drukschakelaars die in ruststand ingedrukt zijn. In ingedrukte stand maken ze geen contact. Hoe het is aangesloten is dat voor een toon bijvoorbeeld de C1 de 22 contact maakt met ground.


Dus in rusttoestand is pin 22 via een weerstand aan ground verbonden en als het pedaal ingedrukt wordt, dan wordt een verbinding mit +5V gemaakt?

Berichten: 562

Geregistreerd: 07 okt 2015 20:35

Woonplaats: Huizen NH

Bericht 21 sep 2016 17:49

Re: Arduino mega 2560 als midi controler

Ik zou eens een simpele voltmeter op die contact-aansluitingen hangen; meestal staat er toch in rust ( open contact) 5 volt op dit soort dingen?/ dater dus sprake is van een interne pull-upweerstand.

HG

Geert

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 21 sep 2016 20:26

Re: Arduino mega 2560 als midi controler

De interne pull up weerstand wordt enkel gekoppeld als de ingang via INPUT_PULLUP zo geconfigureerd wordt en is dus in het code voorbeeld niet geaktiveerd.
Dit kan dus ook veel helpen ja. Maar ik wou eerst eens weten hoe het nou precies aangesloten is voordat ik verdere tips kan geven.
Avatar gebruiker

Berichten: 25

Geregistreerd: 17 aug 2015 10:36

Woonplaats: Aalst GLD

Bericht 04 okt 2016 11:55

Re: Arduino mega 2560 als midi controler

Even een algemene opmerking bij het laatste stukje code wat je post: Je maakt voor het opslaan van de status van de toetsen gebruiken van het type 'int'. Deze zijn op deze processor 16 bit.
Veel efficienter is het om van het type 'char' gebruik te maken. Het kost de helft aan geheugen en is veel minder intensief voor de 8 bit processor die je gebruikt.

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 04 okt 2016 14:02

Re: Arduino mega 2560 als midi controler

mvhorssen schreef:Even een algemene opmerking bij het laatste stukje code wat je post: Je maakt voor het opslaan van de status van de toetsen gebruiken van het type 'int'. Deze zijn op deze processor 16 bit.
Veel efficienter is het om van het type 'char' gebruik te maken. Het kost de helft aan geheugen en is veel minder intensief voor de 8 bit processor die je gebruikt.


Ik heb een int gebruikt, omdat de functie "DigitalRead" ook een int teruggeeft.
Ook de constanten HIGH en LOW zijn type 'int'.

Als je echt wilt optimeren, dan moet je iets meer in de diepte duiken en ipv zulke funkties direkt het portregister uitlezen. Daar kan je dan echt performance winnen.

Berichten: 5125

Geregistreerd: 12 feb 2011 01:09

Bericht 04 okt 2016 16:26

Re: Arduino mega 2560 als midi controler

Jan Wim schreef:ha eindelijk eens iets waar ik niets van snap :lol:
Het valt wel te leren ;)

Berichten: 46

Geregistreerd: 30 nov 2015 14:39

Bericht 04 okt 2016 21:10

Re: Arduino mega 2560 als midi controler

Mijn excuses, was in de USA en het internet is daar wat minder toegankelijk als hier...
Ik ben niet helemaal helder geweest over de schakelaars als ik het zo terug lees. Deze bestaan uit simpele drukschakelaars. Dit is het type schakelaar dat door de tuimelaar in ruststand ingedrukt is en dan geen contact maakt. Word een pedaal toets ingedrukt komt de schakelaar vrij en maakt deze contact.

Verder in tegenstelling tot eerder vermeld maakt dus in contact toestand poort 22-53 contact met de 5v rail zonder weerstand. in ruststand is er geen contact.

Heb de code nog niet gewijzigd omdat ik nog niet geheel begrijp hoe het zit, maar om duidelijkheid te geven over wat ik binnen krijg over midi dat is dus dit:
  Code:
TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT               
000248ED   2  --     90    24    2E    1  C  2 Note On               
000248F7   2  --     90    25    2E    1  C# 2 Note On               
00024901   2  --     90    26    2E    1  D  2 Note On               
0002490B   2  --     90    27    2E    1  Eb 2 Note On               
00024915   2  --     90    28    2E    1  E  2 Note On               
0002491F   2  --     90    29    2E    1  F  2 Note On               
00024929   2  --     90    2A    2E    1  F# 2 Note On               
00024933   2  --     90    2B    2E    1  G  2 Note On               
0002493D   2  --     90    2C    2E    1  G# 2 Note On               
00024947   2  --     90    2D    2E    1  A  2 Note On               
00024951   2  --     90    2E    2E    1  Bb 2 Note On               
0002495C   2  --     90    2F    2E    1  B  2 Note On               
00024966   2  --     90    30    2E    1  C  3 Note On               
00024970   2  --     90    31    2E    1  C# 3 Note On               
0002497A   2  --     90    32    2E    1  D  3 Note On               
00024984   2  --     90    33    2E    1  Eb 3 Note On               
0002498E   2  --     90    34    2E    1  E  3 Note On               
00024998   2  --     90    35    2E    1  F  3 Note On               
000249A2   2  --     90    36    2E    1  F# 3 Note On               
000249AC   2  --     90    37    2E    1  G  3 Note On               
000249B6   2  --     90    38    2E    1  G# 3 Note On               
000249C1   2  --     90    39    2E    1  A  3 Note On               
000249CB   2  --     90    3A    2E    1  Bb 3 Note On               
000249D5   2  --     90    3B    2E    1  B  3 Note On               
000249DF   2  --     90    3C    2E    1  C  4 Note On               
000249E9   2  --     90    3D    2E    1  C# 4 Note On               
000249F3   2  --     90    3E    2E    1  D  4 Note On               
000249FD   2  --     90    3F    2E    1  Eb 4 Note On               
00024A07   2  --     90    40    2E    1  E  4 Note On               
00024A11   2  --     90    41    2E    1  F  4 Note On               
00024A1B   2  --     90    42    2E    1  F# 4 Note On               
00024A25   2  --     90    43    2E    1  G  4 Note On               
00024A62   2  --     80    24    00    1  C  2 Note Off             
00024A6C   2  --     80    24    00    1  C  2 Note Off             
00024A76   2  --     80    25    00    1  C# 2 Note Off             
00024A80   2  --     80    25    00    1  C# 2 Note Off             
00024A8A   2  --     80    26    00    1  D  2 Note Off             
00024A96   2  --     80    26    00    1  D  2 Note Off             
00024A9F   2  --     80    27    00    1  Eb 2 Note Off             
00024AA9   2  --     80    27    00    1  Eb 2 Note Off             
00024AB3   2  --     80    28    00    1  E  2 Note Off             
00024ABD   2  --     80    28    00    1  E  2 Note Off             
00024AC7   2  --     80    29    00    1  F  2 Note Off             
00024AD1   2  --     80    29    00    1  F  2 Note Off             
00024ADB   2  --     80    2A    00    1  F# 2 Note Off             
00024AE5   2  --     80    2A    00    1  F# 2 Note Off             
00024AEF   2  --     80    2B    00    1  G  2 Note Off             
00024AFA   2  --     80    2B    00    1  G  2 Note Off             
00024B04   2  --     80    2C    00    1  G# 2 Note Off             
00024B0E   2  --     80    2C    00    1  G# 2 Note Off             
00024B18   2  --     80    2D    00    1  A  2 Note Off             
00024B23   2  --     80    2D    00    1  A  2 Note Off             
00024B2C   2  --     80    2E    00    1  Bb 2 Note Off             
00024B36   2  --     80    2E    00    1  Bb 2 Note Off             
00024B40   2  --     80    2F    00    1  B  2 Note Off             
00024B4A   2  --     80    2F    00    1  B  2 Note Off             
00024B55   2  --     80    30    00    1  C  3 Note Off             
00024B5F   2  --     80    30    00    1  C  3 Note Off             
00024B69   2  --     80    31    00    1  C# 3 Note Off             
00024B73   2  --     80    31    00    1  C# 3 Note Off             
00024B7D   2  --     80    32    00    1  D  3 Note Off             
00024B87   2  --     80    32    00    1  D  3 Note Off             
00024B91   2  --     80    33    00    1  Eb 3 Note Off             
00024B9B   2  --     80    33    00    1  Eb 3 Note Off             
00024BA5   2  --     80    34    00    1  E  3 Note Off             
00024BAF   2  --     80    34    00    1  E  3 Note Off             
00024BB9   2  --     80    35    00    1  F  3 Note Off             
00024BC3   2  --     80    35    00    1  F  3 Note Off             
00024BCE   2  --     80    36    00    1  F# 3 Note Off             
00024BD8   2  --     80    36    00    1  F# 3 Note Off             
00024BE3   2  --     80    37    00    1  G  3 Note Off             
00024BED   2  --     80    37    00    1  G  3 Note Off             
00024BF7   2  --     80    38    00    1  G# 3 Note Off             
00024C01   2  --     80    38    00    1  G# 3 Note Off             
00024C0B   2  --     80    39    00    1  A  3 Note Off             
00024C15   2  --     80    39    00    1  A  3 Note Off             
00024C1F   2  --     80    3A    00    1  Bb 3 Note Off             
00024C29   2  --     80    3A    00    1  Bb 3 Note Off             
00024C33   2  --     80    3B    00    1  B  3 Note Off             
00024C3D   2  --     80    3B    00    1  B  3 Note Off             
00024C47   2  --     80    3C    00    1  C  4 Note Off             
00024C52   2  --     80    3C    00    1  C  4 Note Off             
00024C5C   2  --     80    3D    00    1  C# 4 Note Off             
00024C66   2  --     80    3D    00    1  C# 4 Note Off             
00024C70   2  --     80    3E    00    1  D  4 Note Off             
00024C7A   2  --     80    3E    00    1  D  4 Note Off             
00024C84   2  --     80    3F    00    1  Eb 4 Note Off             
00024C8E   2  --     80    3F    00    1  Eb 4 Note Off             
00024C98   2  --     80    40    00    1  E  4 Note Off             
00024CA2   2  --     80    40    00    1  E  4 Note Off             
00024CAD   2  --     80    41    00    1  F  4 Note Off             
00024CB7   2  --     80    41    00    1  F  4 Note Off             
00024CC1   2  --     80    42    00    1  F# 4 Note Off             
00024CCB   2  --     80    42    00    1  F# 4 Note Off             
00024CD5   2  --     80    43    00    1  G  4 Note Off             
00024CDF   2  --     80    43    00    1  G  4 Note Off             
00024D4E   2  --     90    24    2F    1  C  2 Note On               
00024D58   2  --     90    25    2F    1  C# 2 Note On               
00024D62   2  --     90    26    2F    1  D  2 Note On               
00024D6C   2  --     90    27    2F    1  Eb 2 Note On               
00024D77   2  --     90    28    2F    1  E  2 Note On               
00024D81   2  --     90    29    2F    1  F  2 Note On               
00024D8B   2  --     90    2A    2F    1  F# 2 Note On               
00024D95   2  --     90    2B    2F    1  G  2 Note On               
00024D9F   2  --     90    2C    2F    1  G# 2 Note On               
00024DA9   2  --     90    2D    2F    1  A  2 Note On               
00024DB3   2  --     90    2E    2F    1  Bb 2 Note On               
00024DBD   2  --     90    2F    2F    1  B  2 Note On               
00024DC7   2  --     90    30    2F    1  C  3 Note On               
00024DD2   2  --     90    31    2F    1  C# 3 Note On               
00024DDB   2  --     90    32    2F    1  D  3 Note On               
00024DE6   2  --     90    33    2F    1  Eb 3 Note On               
00024DF0   2  --     90    34    2F    1  E  3 Note On               
00024DFA   2  --     90    35    2F    1  F  3 Note On               
00024E04   2  --     90    36    2F    1  F# 3 Note On               
00024E0E   2  --     90    37    2F    1  G  3 Note On               
00024E18   2  --     90    38    2F    1  G# 3 Note On               
00024E22   2  --     90    39    2F    1  A  3 Note On               
00024E2C   2  --     90    3A    2F    1  Bb 3 Note On               
00024E36   2  --     90    3B    2F    1  B  3 Note On               
00024E40   2  --     90    3C    2F    1  C  4 Note On               
00024E4B   2  --     90    3D    2F    1  C# 4 Note On               
00024E55   2  --     90    3E    2F    1  D  4 Note On               
00024E5F   2  --     90    3F    2F    1  Eb 4 Note On               
00024E69   2  --     90    40    2F    1  E  4 Note On               
00024E73   2  --     90    41    2F    1  F  4 Note On               
00024E7D   2  --     90    42    2F    1  F# 4 Note On               
00024E87   2  --     90    43    2F    1  G  4 Note On               
00024EC4   2  --     80    24    00    1  C  2 Note Off             
00024ECE   2  --     80    24    00    1  C  2 Note Off             


En dat gaat dus achtermekaar door ook als ik de toetsen loskoppel... Ik ga me maar eens verdiepen in de andere geposte code hier.

Verder heb ik alle contacten nagemeten en deze werken goed.

Berichten: 54

Geregistreerd: 29 mei 2012 10:36

Bericht 05 okt 2016 08:30

Re: Arduino mega 2560 als midi controler

Zoals al vermoedt "zweven" je inputs dus in rusttoestand en zijn daarmee ongedefinieerd.

Nu heb je 2 mogelijkheden dit te verhelpen:
1. De interne PULLUP weerstand gebruiken door de inputs als INPUT_PULLUP te definieren. De Inputs zijn dan standaard altijd "HIGH" en je kontakten moeten dan dus de input met gnd (LOW) verbinden ipv met 5V. Aansluitend moet dan natuurlijk de code aangepast worden zodat note on/off inverteerd wordt.
2. Elke input via een eigen 10k weerstand (dus 1 weerstand per input pin) met gnd verbinden.

Daarmee zou het ergste verholpen moeten zijn. Waarschijnlijk krijg je aansluitend dan toch nog een probleem met het "bouncen" van de kontakten zoals Bert ook al had geschreven. Ik zou daarom gelijk ook die library gebruiken.
http://playground.arduino.cc/Code/Bounce
(Bounce is de nieuwe versie van debounce)

Berichten: 105

Geregistreerd: 30 jul 2012 09:33

Bericht 05 okt 2016 12:33

Re: Arduino mega 2560 als midi controler

Aha, was het dus toch de Bounce library. Dit had ik aanvankelijk in m'n eerste post gezet. Even later zag ik ergens bij het nakijken op internet dat ie 'Debounce' heette, dus gauw veranderd. Maar nu zie ik dat Erik schrijft dat de nieuwere versie toch Bouce heet. Hoe verwarrend wil je 't hebben (waaraan ik met deze post natuurlijk ook weer bijgedragen heb :? ).

Maar, hoe dan ook prince0810, het is raadzaam de aanwijzingen van Erik op te volgen. (Ik heb destijds zelf voor zijn oplossing onder punt 1 gekozen.)

bert

Berichten: 562

Geregistreerd: 07 okt 2015 20:35

Woonplaats: Huizen NH

Bericht 05 okt 2016 18:46

Re: Arduino mega 2560 als midi controler

Erg interessant lijkt mij, voor diegenen die met dit soort kleine bordjes weer eens iets anders willen doen dan ledjes laten knipperen.
Maar dus, afgezien ervan, dat het erg leuk is om zelf code te genereren, dit verder te ontwikkelen en dan te zien, dat het werkt uiteindelijk, vraag ik mij af of het ook nuttig kan zijn, gezien de diverse Midi-encoders en decoders die vaak erg konkurrerend in de markt zijn gezet, en waarvan je zeker weet, dat ze het aankunnen om veel Midi data ( zwelpedalen etc) tegelijkertijd te kunnen verwerken.

Maar het wordt natuurlijk echt leuk, als je een bepaalde funktionaliteit die niet door die comm boys wordt geboden, kunt programmeren.

Ik ben benieuwd....

HG

Geert

Berichten: 46

Geregistreerd: 30 nov 2015 14:39

Bericht 06 okt 2016 22:44

Re: Arduino mega 2560 als midi controler

En inmidels met dank aan Erik werkt het,

De code is als volgt geworden:

  Code:
const int firstPin = 22;
const int firstNote = 36;

int inputPins[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

int vol = 0;

void setup()  {
  Serial.begin(31250);
 
  for (int i = firstPin; i < firstpin + 32; i++){
      pinMode(i, INPUT_PULLUP);
  }
}

void loop()  {
  vol = analogRead(A5);
  vol = map(vol, 0, 1023, 0, 127);
 
  for (int i = 0; i < 32; i++) {
   int input = digitalRead(i+firstPin);
   if (inputPins[i] != input){
      if (input == LOW) {
         noteOn(0x90, i + firstNote, vol);
      }
      else {
         noteOn(0x80, i + firstNote, 0x00);
         noteOn(0x80, i + firstNote, 0x00);
      }
      inputPins[i] = input;
   }
  }

  delay(50);
}

void noteOn(byte cmd, byte data1, byte data2) {
   Serial.write(cmd);
   Serial.write(data1);
   Serial.write(data2);
   delay(10);
}


Hierbij word er contact gemaakt met ground en zijn de poorten 22-53 standaard 5v.

vanwege de 50ms delay is het debouncen niet nodig. Pedaal werkt subliem.

Dit valt natuurlijk veel verder uit te werken. Op een arduino kun je makkelijk de zwelpedalen en de registerknoppen ook kwijt. En met een grote diode matrix ook alle keyboards. De mogelijkheden zijn ongekend natuurlijk... Ik weet niet wat de limitaties zijn op het ogenblik...
Avatar gebruiker

Berichten: 25

Geregistreerd: 17 aug 2015 10:36

Woonplaats: Aalst GLD

Bericht 07 okt 2016 10:12

Re: Arduino mega 2560 als midi controler

Ik heb nog een paar vragen/opmerkingen:
- Waarom wordt de noteOff 2x verstuurd?
- Waarom is er een dealy van 10mS ingevoegd na het versturen van een MIDI bericht?
- Het lijkt erop dat het volume nog niet goed verstuurd wordt.

Ik heb de code nog wat aangepast. In de aangepaste code is het Midi kanaal en de controller id voor het volume aanpasbaar via 1 constante. Ik heb de code even in de Arduino IDE geplakt en gebouwd. Ik heb de code niet functioneel getest.

  Code:
const int firstPin = 22;
const int firstNote = 36;
int inputPins[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//Voer hier het kanaal nummer in waarmee de noteOn en noteOff events worden verstuurd
const byte MidiChannel = 1;

//Voer hier het controller nummer in waarmee het volume wordt verstuurd
const byte Volume_ControllerNumber = 1;

void setup() 
{
  Serial.begin(31250);
 
  for (int i = firstPin; i < (firstPin + 32); i++)
  {
    pinMode(i, INPUT_PULLUP);
  }
}

void loop() 
{
  //Get volume
  int vol = analogRead(A5);
  vol = map(vol, 0, 1023, 0, 127);
  controlChange(Volume_ControllerNumber, vol);

  //Get keys
  for (int i = 0; i < 32; i++)
  {
    int input = digitalRead(i+firstPin);
    if (inputPins[i] != input)
    {
      if (input == LOW)
      {
        noteOn(i + firstNote, 0);
      }
      else
      {
        noteOff(i + firstNote, 0);
      }
      inputPins[i] = input;
    }
  }
 
  delay(50);
}

void noteOn(byte key, byte velocity)
{
  const byte NoteOnCode = 143;
 
  Serial.write(NoteOnCode + MidiChannel);
  Serial.write(key);
  Serial.write(velocity);
}

void noteOff(byte key, byte velocity)
{
  const byte NoteOffCode = 127;
 
  Serial.write(NoteOffCode + MidiChannel);
  Serial.write(key);
  Serial.write(velocity);
}

void controlChange(byte controllerNumber, byte value)
{
  const byte ControlChangeCode = 175;

  Serial.write(ControlChangeCode + MidiChannel);
  Serial.write(controllerNumber);
  Serial.write(value);
}

Keer terug naar Computers voor Hauptwerk

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 12 gasten




Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF. phpBB.nl Vertaling

 

Copyright (c) 2008 PCorgan.com. All rights reserved. Mail: info@PCorgan.com