Stap 2: Code
De arduino code is die hieronder zijn toegevoegd als een tekstbestand.
Deze waarden moeten worden aangepast.
#define pitchbendRange 2 // the pitchbend range in semitones #define octaveSteps 10 // the number of steps in an octave #define middleNote 60 // tune to this MIDI note - 60 is middle C (0-127) #define numVoices 16 // use this many MIDI channels (1-16)
Ik gebruikte de bovenstaande waarden in de videomanifestatie. Het toont een Propellerhead Reason rek met 16 piano modules die zijn toegewezen aan de 16 MIDI-kanalen. Ik speelde twee octaven 10 TET schaal op een toetsenbord met de D-toets onder de centrale C begint en eindigt op de Bb-toets boven midden C.
U kunt zien dat elk kanaal en de module zijn stapte t/m als ik elke opeenvolgende noot speelt. De reden hiervoor is dat pitchbend is een kanaal-instelling. Wanneer spelen polyphonically, als elke notitie werden verzonden naar een één MIDI-kanaal, en vervolgens de nieuwe pitchbend-instelling de afstemming veranderen zou van eerder gespeeld maar nog klinkende notities. Dus ik heb het doorlopen 16 kanalen zodat 16 notities kunnen worden afgespeeld op een moment, elk met hun eigen pitchbend-waarden. Als u numVoices op 1 instelt, die het werkt prima met een monosynth.
Stepping via de hoofdlus, leest de arduino in 3 bytes--één MIDI Opmerking ON of OFF tegelijk. Vervolgens berekent het de MIDI opmerking en pitchbend waarde uit te zenden. In plaats van de berekening van deze waarden dynamisch, zoals ik hierboven vermeld denk ik dat een paar opzoektabellen kan worden uitgevoerd wanneer u de waarden toewijzen aan vooraf. Hierdoor zouden de toewijzing aan elke schaal.
Vervolgens de arduino wordt gecontroleerd als de opdracht een opmerking ON en, als dat zo is, de toegewezen waarden van de opmerking en pitchbend en stappen naar het volgende kanaal van de MIDI stuurt. Als de opdracht is een notitie af, vindt de arduino het MIDI kanaal selecteren waar die opmerking is ingeschakeld en uitgeschakeld.
Geniet van!
-------
Update: Ik maakte de code (v1.1 aangesloten) efficiënter door te controleren of de opdracht is een notitie op of opmerking OFF voorafgaand aan elke berekening doen.
Ook, ik heb meer onderzoek met behulp van MIDI-OX en de handleiding Yamaha CP-33 rond het tweede probleem in mijn onderstaande opmerkingen (stap 3) en vond dat een gestage stroom van (hex) F8 en (hex) FE MIDI-realtime berichten zijn de boosdoener. Ik heb geprobeerd om sommige code snel herkennen en verder gaan zoals hieronder, maar het leek dat de arduino niet kon houden te schrijven. Ik was in staat om een notitie t/m de arduino alleen om de paar seconden of zo.
do { command = Serial.read(); } while (command == 248 || command == 254);