Scripting bearbetning med MIDI (8 / 11 steg)
Steg 9: Ännu en buss...
Du kan titta på sista källkoden för att se vad jag kom fram till för Obs hanterare, köra det med exempel Renoise fil eller titta på videon att bara se den i aktion. Det finns en mycket bra chans att koden inte exakt vad jag har visat här. Som jag har som beskriver skissen har jag ompröva hur saker ska fungera. Detta är typ av förberedande kodande.
Medan provar detta och att jag insåg att det kan vara svårt att förväg planera varje förändring och växla och hoppa kanske du vill se i skissen. När jag skulle ändra koden eller redigera MIDI-spår i Renoise och se resultaten tänkte jag, Hej, en plötslig nyans förändring skulle vara bra, eller det skulle vara i rätt takt att kasta upp dubbla full storlek bilder för halv ett bar. Med andra ord, fanns det några Välj effekter jag ville men bara vid avgörande tillfällen.
Redigera detta till Renoise trigger spåren skulle vara knepigt. Så mycket trevligare att aktivera vissa saker i realtid med hjälp av en annan domänkontrollant medan låten spelas upp.
Jag hade började experimentera med min QuNexus tangentbord. Den här enheten kan du skifta oktav så jag kunde ha arbetat med en mängd anteckningar inte redan utsetts. Men jag ville använda en controller som kan vara mer intuitivt, något annat än ett vanligt tangentbord.
Jag plockade upp en Novation Launchpad någon gång förra året. Det finns ett rutnät av touch-pad växlar. Det finns ingen velocity kontroll, bara på/av, bra för att utlösa prover och loopar och sådant. Den skickar MIDI-noter inom ett förinställt intervall. Nu har jag visst det finns ett sätt att ändra vad anteckningar tilldelas till varje knapp, men eftersom bussen namn vidarebefordras till MIDI-not handlers i skissen jag tryggt kan återanvända de befintliga anteckningarna.
En annan strategi kan vara att ställa in i startfönstret på särskilda kanaler. Du kan bestämma dig om du väljer beteende på ännu en kanal eller förgrening baserad på buss namn bättre passar du mentala modell av vad som händer.
Det finns olika platser koden kan växla beteende baserat på buss namn. En, naturligtvis, är inne i någon av metoderna som Obs-hantering. En annan skulle vara i invokeNoteHandler. Även om jag har förbi buss namnet på Obs hanterarna mina idéer för hur du använder kändes startfönstret som en bra passform för den befintliga journalanteckningen hantering av koden. Till exempel om jag skickar C48 från startfönstret jag skulle inte se till att göra en annan variant på 4 x 4 rutnät-fyllningsmönstret, men något helt annat. Lägga till ett test i onNote48 för särskilda enheten kände clunky. Antar att jag definierade en annan uppsättning Obs hanterare, specifika för denna enhet?
Detta skulle spara mig besväret att behöva lägga detta enhetsnamn check till varje enskild onNoteNN metod på off-chans det är en anmärkning värde överlappning. Nackdelen är att ha ett enhetsnamn hårdkodade i min skiss.
... och ännu ett konfigurationsalternativ
Medan jag ville sända vissa MIDI-meddelanden välj hanterare baserat på buss namn ville jag inte hårdkoda buss namnet. Hemma har jag ett val av domänkontrollanter, men när jag skriver detta dömer jag råkar vara på HeatSync Labs. Jag kom inte med i startfönstret; QuNexus passar mycket bättre i min laptop väska.
Snarare än att förlita sig på namnet på en specifik domänkontrollant i koden lagt jag en annan konfigurationsalternativ som tillåter mappning enhetsnamn på någon annan text.
Posten config.jsi ser ut så här:
device_mappings: {"Sjösätta": "grid", "QuNexus": "grid"}
I skissen ser koden som sätter upp enheter nu också för att se om det finns en enhet mappning för en hittade enhet, och om så är fallet sedan används det mappningsnamn som buss namn snarare än då med tanke på enhetens namn.
Detta krävde ännu en förändring av Configgy.pde. Vad är nytt är att du kan lagra ett namn :{} inställning och komma tillbaka en HashMap av namn/värde-par string.
Så griper skissen dessa enhetsmappningar namn...
HashMap mappningar = config.getHashMap("device_mappings");
... och senare...
om (mappings.containsKey (enhetsnamn [x])) {
println ("+ +++ Lägg till enhet använder mappning" + mappings.get (deviceNames[x]));
Devices.Add (nya midibussar (denna, available_inputs [i], 1, (sträng) mappings.get (deviceNames[x])));
} annat {
Devices.Add (nya midibussar (denna, available_inputs [i], 1, deviceNames[x]));
}
Nu kan MIDI-meddelandet avsänding kod söka efter meddelanden från en buss som heter rutnät. den faktiska enheten kan vara valfritt antal enheter beroende på vad du har bifogat och hur du har kopplat namn.
Nu avsänding på MIDI-meddelanden kan ringa specialiserade hanterare:
void invokeNoteHandler (int Obs, int hastighet, int kanal, sträng bus_name) {
försök {
Undergrupp [] cls = ny klass [3].
CLS [0] = int.class;
CLS [1] = int.class;
CLS [2] = String.class;
om (bus_name.equals("grid")) {
Metoden handler = this.getClass () .getMethod ("onGridNote" + note, cls);
handler.Invoke (denna, hastighet, kanal, bus_name);
} annat {
Metoden handler = this.getClass () .getMethod ("onNote" + note, cls);
handler.Invoke (denna, hastighet, kanal, bus_name);
}
} fånga (undantag e) {
println ("* ***** fel hantering OBS" + OBS + ", velocity" +
Velocity + ", kanalisera" + kanal + ", bus_name" + bus_name + "******");
e.printStackTrace(); }
}