Arduino polyfoniska mikrotonala midi converter (2 / 3 steg)
Steg 2: kod
Arduino koden är bifogat nedan som en textfil.
Dessa värden bör anpassas.
#define pitchbendRange 2 / / pitchbend range i halvtoner
#define octaveSteps 10 / / antalet steg i en oktav
#define middleNote 60 / / ställa in denna MIDI-not - 60 är mitten C (0-127)
#define numVoices 16 / / Använd den här många MIDI-kanaler (1-16)
Jag använde ovanstående värden i video demo. Det visar en Propellerhead anledning rack med 16 piano moduler tilldelats 16 MIDI-kanaler. Jag spelade två oktaver av 10 TET omfattning på ett tangentbord börjar med D-tangenten under mitten C och slutar på Bb knapp mitten c.
Du kan se att varje kanal och modul är klev igenom som jag spelar varje successiva not. Anledningen till detta är att pitchbend är en kanal inställningar. När spelar Polyfoniskt, om varje ton skickades till en enda MIDI-kanal, då den nya pitchbend inställningen skulle ändra trimning av tidigare spelat men fortfarande klingande anteckningar. Så jag har det igenom 16 kanaler så att 16 toner kan spelas samtidigt som varje med sina egna pitchbend värderingar. Om du anger numVoices till 1 fungerar det bra med en monosynth.
Stega igenom de viktigaste loopen, läser arduino i 3 byte--en MIDI-not ON eller OFF i taget. Sedan det MIDI-not och beräknas pitchbend att skicka ut. I stället för beräkningen av dessa värden dynamiskt, som jag nämnde ovan tycker jag ett par uppslagstabeller kunde genomföras där du beräkna värdena ska mappas till. Detta skulle möjliggöra mappning till någon skala.
Nästa kontroller arduino om kommandot är en anmärkning på och, om så är fallet, skickar ut de mappade Obs och pitchbend värden och steg till nästa MIDI-kanal. Om kommandot är en anteckning av, finner arduino MIDI-kanal där denna anteckning är på och stänger av.
Njut!
-------
Uppdatering: Jag gjorde koden (v1.1 bifogas) effektivare genom att kontrollera om kommandot är en anteckning på eller Observera OFF innan du gör en kalkyl.
Också, jag gjorde mer forskning med MIDI-OX och Yamaha CP-33 manualen runt det andra problemet i mina anteckningar nedan (steg 3) och fann att en stadig ström av (hex) F8 och (hex) FE MIDI realtime meddelanden är skyldige. Jag försökte skriva lite kod för att snabbt kan identifiera dem och gå vidare som nedan, men det verkade arduino inte kunde uppehället upp. Jag kunde få en anteckning via arduino bara efter några sekunder eller så.
göra {
kommandot = Serial.read();
} samtidigt (kommandot == 248 || kommandot == 254);