Midi een noot verhogen.

algemene C code
Berichten: 12
Geregistreerd: 15 Mrt 2013, 00:22

Re: Midi een noot verhogen.

Berichtdoor Round » 17 Mrt 2013, 18:02

walker schreef:Hoi Round,

In de laatste code van de functie checkMIDI van astrofrostbyte zit een typefoutje waardoor de noot waarde niet meer opgehoogd wordt:

if ( noteByte&0xF0 == 0x80) // note-Off commandbyte?
{ noteByte = incr_note(noteByte, 6);
}
noteByte moet hier commandByte zijn.



Hoi Walker,

Echt te gek, dat er nog mensen zijn die willen helpen.

Vol verwachting heb "de rode"noteByte veranderd in commandByte, maar het resultaat is, dat er nog steeds " helemaal niet " wordt opgeteld.
Het leek de oplossing te zijn, maar toch niet.
Ik ben net met Arduino's bezig, dus voor mij is het al heel lastig om een echt probleem te tackelen.
Maar ik blijf me er in verdiepen totdat het werkt zoals het moet.
Het project waar ik mee bezig ben is maanden werk geweest en ziet er super uit. De Arduino is eigenlijk nog de enige hobbel, dan kan ik het geheel afmaken.

In ieder geval hartelijk dank voor de tijd die je er in stopt.

Advertisement

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: Midi een noot verhogen.

Berichtdoor astrofrostbyte » 17 Mrt 2013, 19:24

Ah perfect , scherp gezien Walker, thanks. Zo te horen heeft walker wel wat ervaring met MIDI.
Je zou ook denken dat er wel een mooie MIDI library voor Arduino zou moeten bestaan ?, zoals : http://playground.arduino.cc/Main/MIDILibrary
Goede kans dat dit een robuuste communicatie laag bevat waar je dan zelf je dingetjes in kan hangen.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: Midi een noot verhogen.

Berichtdoor walker » 17 Mrt 2013, 19:33

Hoi Round,

Geen probleem ik wil je graag helpen.

Het heeft denk ik met het volgende te maken:
Jou MIDI bron (keyboard) stuurt geen 0x80 om een toets af te melden maar 0x90 (toets aanmelden) met velocity 0, dat verklaart ook waarom de teller met twee verhoogt wordt.
Je moet dus op het velocityByte gaan checken als dit 0 is moet de teller aangepast worden. Maar zoals ik al schreef in mijn vorige reactie worden de tonen niet afgemeld, wordt er MIDI data weggegooid en 1 kanaal gebruikt wordt.

Code: Alles selecteren
void checkMIDI()
    { if (Serial.available() >=3 )
      { if (0x80 && Serial.peek() )       // commandByte?
        { commandByte  = Serial.read();
          noteByte     = Serial.read();
          velocityByte = Serial.read();
          if ((commandByte&0xF0 == 0x90) && (velocityByte == 0))
          { noteByte = incr_note(noteByte, 6);
          }
          Serial.write(noteOn);
          Serial.write(noteByte);
          Serial.write(velocityByte);
          noteByte=0;
          velocityByte=0;
        }
        else     // No Commandbyte detected !
        { Serial.read();  // dummy read to flush non Command byte
        }
      }
    }//checkMIDI


Overigens nog bijzonderheid bij MIDI: het aan- of afmeld commando hoeft ook niet elke keer verstuurd te worden als meerdere tonen op hetzelfde kanaal aan- of afgemeld worden. Bijv:
0x90, key, vel, key, vel, enz.
Dit wordt gedaan om tijd te sparen tijdens het over sturen van de MIDI data.

Ik ben graag bereid om je verder te helpen. Ongeveer 20 jaar geleden heb ik veel met microcontrollers (8031) en MIDI gedaan voor het aansturen van muziek instrumenten.

Berichten: 12
Geregistreerd: 15 Mrt 2013, 00:22

Re: Midi een noot verhogen.

Berichtdoor Round » 17 Mrt 2013, 19:36

astrofrostbyte schreef:Je zou ook denken dat er wel een mooie MIDI library voor Arduino zou moeten bestaan ?, zoals : http://playground.arduino.cc/Main/MIDILibrary
Goede kans dat dit een robuuste communicatie laag bevat waar je dan zelf je dingetjes in kan hangen.


Als ik het goed begrijp zou zo'n Midi library de motor zijn, die je via externe commando's aan moet sturen. Ik ga er naar kijken, want het wordt steeds leuker.

Bedankt allebei.

Berichten: 12
Geregistreerd: 15 Mrt 2013, 00:22

Re: Midi een noot verhogen.

Berichtdoor Round » 17 Mrt 2013, 20:10

walker schreef:Jou MIDI bron (keyboard) stuurt geen 0x80 om een toets af te melden maar 0x90 (toets aanmelden) met velocity 0, dat verklaart ook waarom de teller met twee verhoogt wordt.
Je moet dus op het velocityByte gaan checken als dit 0 is moet de teller aangepast worden. Maar zoals ik al schreef in mijn vorige reactie worden de tonen niet afgemeld, wordt er MIDI data weggegooid en 1 kanaal gebruikt wordt.



Hoi Walker, wat leuk dat je eerder met muziek en midi bezig geweest bent. Vorig jaar heb ik een laserharp gebouwd volgen een nieuw principe.

http://www.youtube.com/watch?v=zeHg8RXzh68

Ik heb jouw stukje code ingevoegd, maar ik durf het haast niet te zeggen, er wordt nog steeds niet opgeteld.

Ga er niet wakker van liggen hoor!!!, dat doe ik wel, maar het is dan ook mijn project. :mrgreen:
Laatst gewijzigd door Round op 17 Mrt 2013, 20:11, in totaal 1 keer gewijzigd.

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: Midi een noot verhogen.

Berichtdoor walker » 17 Mrt 2013, 23:16

Je laserharp ziet er prachtig uit en werkt mooi, echt geweldig.

Ik ben nog bezig geweest om wat code te maken met de Midi library. De code heb ik getest met een M-Audio keyboard en een Roland RA-800 en hiermee werkt het.

Code: Alles selecteren
#include <MIDI.h>

byte currentKey;

byte incr_note(byte newkey, byte cnt) {
  static byte notecount = 0;
  static byte prevkey = 255;

  if (newkey == prevkey) {
    if (++notecount >= cnt) {
      notecount = 0;
    }
  } else {    // newkey != prevkey
    prevkey = newkey;
    notecount = 0;
  }

  return (newkey + notecount);
}

void HandleNoteOff(byte channel, byte pitch, byte velocity) {
  MIDI.sendNoteOff(currentKey, 0, channel);
}

void HandleNoteOn(byte channel, byte pitch, byte velocity) {

  // Do whatever you want when you receive a Note On.
 
  if (velocity == 0) {
    // This acts like a NoteOff.
    HandleNoteOff(channel, pitch, velocity);
    return;
  }

  // Try to keep your callbacks short (no delays ect) as the contrary would slow down the loop()
  // and have a bad impact on real-time performance.
  currentKey = incr_note(pitch, 6);
  MIDI.sendNoteOn(currentKey, velocity, channel);
}

void setup() {
  // Initiate MIDI communications, listen to all channels
  MIDI.begin(MIDI_CHANNEL_OMNI); 
  MIDI.turnThruOff(); // MIDI Thru uitschakelen
 
  // Connect the HandleNoteOn function to the library, so it is called upon reception of a NoteOn.
  MIDI.setHandleNoteOn(HandleNoteOn);  // Put only the name of the function
  MIDI.setHandleNoteOff(HandleNoteOff);
}


void loop() {
  // Call MIDI.read the fastest you can for real-time performance.
  MIDI.read();
}


Je moet de Midi library in de libraries folder kopiëren en de Arduino IDE herstarten.

Ik heb het voorbeeld MIDI_Callbacks aangepast.

Berichten: 12
Geregistreerd: 15 Mrt 2013, 00:22

Re: Midi een noot verhogen.

Berichtdoor Round » 18 Mrt 2013, 00:40

walker schreef:Ik ben nog bezig geweest om wat code te maken met de Midi library. De code heb ik getest met een M-Audio keyboard en een Roland RA-800 en hiermee werkt het.


Ik kom net weer thuis en zag je reactie en die natuurlijk meteen toegepast en YEP, YEP, YEP :D het werkt.
Dat voelt toch als een feestje. Ik ben er erg blij mee.
Heel erg bedankt, want daar was ik zelf beslist niet uitgekomen.
Morgen ga ik weer driftig verder met de bedrading van mijn project. Ik zal morgen vast wat foto's plaatsen, want ik wil jullie graag op de hoogte houden van de ontwikkelingen.
Wat zal ik lekker slapen :mrgreen:

Berichten: 12
Geregistreerd: 15 Mrt 2013, 00:22

Re: Midi een noot verhogen.

Berichtdoor Round » 18 Mrt 2013, 01:06

Hier vast een foto van de vorderingen

Afbeelding

Ik ben eigenlijk een dubbel drumstel aan het bouwen, met één van de eerste electronische drumpads van Roland. Deze zijn dus zo'n 35 jaar oud. Maar zelf ben ik ook al wat ouder. 64 jaar om precies te zijn.

Tegenwoordig is de techniek erg verbeterd en speelt men met z.g.n. meshheads, waardoor de aanslag veel natuurlijker is en de gevoeligheid duidelijk veel beter is. Ik heb zelf een dubbel triggersysteem gemaakt en de pads voorzien van mesheads. Ook deze moest ik zelf maken omdat de driehoekige vorm van de pads als meshead niet te koop zijn. Het middelste pad boven de baspedalen is zoals het gaat worden.
Onder elk pads zitten 3 blauwe powerleds, die via een derde trigger flitsen op iedere aanslag.

Het is de bedoeling om te drummen :D , maar een aantal pads zijn bedoeld om ritmische patronen te spelen. Round Robin heet dat.
Dus als ik b.v. 6 pianoklanken programmeer op 6 keys van een sampler en deze via de Arduino (Ja daar is hij dus voor !) op één pad aansluit, kan ik op één pad een melodie spelen. Dit kan nu met meerdere pads via dezelfde Arduino, omdat op de sampler 12 banken zijn met elk weer 12 te programmeren klanken. Ik ga proberen te drummen en orchestrale composities te spelen. Een "one man" orkest.

Ik hoop, dat ik het een beetje duidelijk uitleg. Maar als het geheel klaar is, zal ik een filmpje maken en dan wordt alles meteen duidelijk. Door jullie medewerking kan ik weer verder met Round Robin.

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: Midi een noot verhogen.

Berichtdoor walker » 18 Mrt 2013, 09:58

Ziet er echt indrukwekkend, erg professioneel en mooi uit. Welk materiaal gebruik je hiervoor?

In de code die we nu hebben worden alleen de key informatie met het MIDI kanaal door gegeven, maar andere data niet. Ik heb de MIDI thru, jammer genoeg, uit moeten schakelen omdat anders de "master key" ook steeds door gegeven wordt.

Dus als ik b.v. 6 pianoklanken programmeer op 6 keys van een sampler en deze via de Arduino (Ja daar is hij dus voor !) op één pad aansluit, kan ik op één pad een melodie spelen. Dit kan nu met meerdere pads via dezelfde Arduino, omdat op de sampler 12 banken zijn met elk weer 12 te programmeren klanken.

Er wordt nu 1 teller gebruikt, dat betekent als je met een pad "het loopje" aan het spelen bent en tussen door op een andere pad slaat, de teller weer gereset wordt en "het loopje" voor die pad start. Anders moet je de teller weer op een vaste key waarde zetten en de teller niet door een andere key waarden laten resetten. Eventueel, als je meer loopjes naast elkaar wilt hebben, meer tellers die op andere key waardes lopen.

Berichten: 12
Geregistreerd: 15 Mrt 2013, 00:22

Re: Midi een noot verhogen.

Berichtdoor Round » 18 Mrt 2013, 11:29

walker schreef:Ziet er echt indrukwekkend, erg professioneel en mooi uit. Welk materiaal gebruik je hiervoor?

In de code die we nu hebben worden alleen de key informatie met het MIDI kanaal door gegeven, maar andere data niet. Ik heb de MIDI thru, jammer genoeg, uit moeten schakelen omdat anders de "master key" ook steeds door gegeven wordt.

Er wordt nu 1 teller gebruikt, dat betekent als je met een pad "het loopje" aan het spelen bent en tussen door op een andere pad slaat, de teller weer gereset wordt en "het loopje" voor die pad start. Anders moet je de teller weer op een vaste key waarde zetten en de teller niet door een andere key waarden laten resetten. Eventueel, als je meer loopjes naast elkaar wilt hebben, meer tellers die op andere key waardes lopen.


Goedenmorgen Walker.

Jij bent er ook vroeg bij. ;)

Voor de meshheads gebruik ik Batyline gaasdoek, dat ik op een metalen(vernikkelde) rand lijm. Die randen heb ik laten lasersnijden.
Batyline is eigenlijk bedoeld voor stoelen, maar is waanzinnig sterk en kost weinig. Zeker in vergelijking met ronde meshheads die te koop zijn. Het frame is van ronde buis 16 mm. Door de buis loopt ook de bedrading. Het frame is opklapbaar en kan ik d.m.v. twee bouten op de vloer zetten. De connectoren voor de pads en cymbals zitten dan in de vloer. De aan te sturen apparatuur komt ook in de vloer en kan dan weer via de connectoren ( 3 stuks met elk 16 verbindingen ) zie foto. aangestuurd worden.

Afbeelding

De vloer heeft wielen aan de onder- en achterzijde, zodat het voor vervoer te hanteren is.

Wat de code betreft, denk ik dat het gaat werken, zoals ik dat graag zou willen. De samplers (Roland SP404 en een SP606) doen nu wat ze moeten doen, maar hier ben ik, zoals je begrijpt nog maar kort mee bezig geweest. Eventueel een tweede Arduino plaatsen maakt wat kosten betreft ook niet zoveel meer uit en dan worden een aantal zaken wat eenvoudiger.
Ik ben er super blij mee.

Met de totale opzet ga ik nog een stap verder, maar dat wil ik je privé wel vertellen, maar wil ik i.v.m. met de introductie nog even voor me houden. Ik weet niet waar je woont, maar je bent altijd van harte welkom als je het zou willen zien.
Ik woon in Haringhuizen (vlakbij Schagen NH)

Vorige

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten