Scripting bearbetning med MIDI (2 / 11 steg)
Steg 2: En enkel skiss
Detta är en enkel skiss att visa grundläggande beteende och för att kontrollera att saker och ting fungerar.
SimpleMidi.pde
import themidibus.*; Importera bibliotek
import javax.sound.midi.MidiMessage;
Midibussar myBus;
int currentColor = 0;
int midiDevice = 3;
void setup() {
storlek (480, 320);
MidiBus.list();
myBus = ny midibussar (denna, midiDevice, 1);
}
void draw() {
Background(currentColor);
}
void midiMessage (MidiMessage meddelande, lång tidsstämpel, sträng bus_name) {
int Obs = (int)(message.getMessage() [1] & 0xFF);
int vel = (int)(message.getMessage() [2] & 0xFF);
println ("Bus" + bus_name + ": Obs" + OBS + ", vel" + vel);
om (vel > 0) {
currentColor = vel * 2;
}
Jag fick undrande om jag kunde använda YAML eller JSON så att en textfil kan representera mer komplexa strukturer. Visar sig att behandlingen ger du inbyggda JSON hantering. Perfekta.
För MIDI-skiss har konfigurationen uppdaterats för att använda JSON. En JSON fil och få på värdena är mestadels lätt men inte helt transparent. Du kan få på olika typer av data med hjälp av getInt, getFloat, getString, etc., men om du vill ta en lista med objekt du behöver getJSONArray och då behöver dra ut varje objekt som rätt typ.
För denna Config bestämde jag att någon lista över artiklar i de flesta fall kommer att vara av samma typ. Så jag lagt getStrings, getFloats och getInts.
Jag kunde nu använda en config-fil istället för att sätta enheter indexen till min skiss. JSON är inte så enkelt som namn: värde men det är inte alltför långt bort från det. Lite overkill för kort-filer, mycket praktiskt för mer komplexa strukturerade data.
Jag kommer inte gå in på detaljer på att koden här. Du kan läsa mer om det här.
Den första demo skissen visade ett sätt att skapa ett midibussar objekt. Ett annat sätt, och det är inte bara mer vänligt men lämpar sig för bättre konfiguration. Midibussar kan du ange vilka enheter du använder vid namn. Namnet måste matcha det som visas i listan över tillgängliga enheter, så du kan behöva först köra MidiBus.list för att se vad som finns.
När du vet namnen på saker kan konfigurationsfilen använda läsbar text i stället för kryptiska siffror.
Du kan också skicka in ett namn för bussen så att senare, när midiMessage anropas, din kod kan (om du vill) bete sig annorlunda beroende på källan till meddelandet.
Nu demo skissen (minus koden för Configgy.pde) ser ut så här:
import java.lang.reflect.Method;
import themidibus.*;
import javax.sound.midi.MidiMessage;
Configgy config;
int currentColor = 0;
ArrayList enheter = nya ArrayList();
void setup() {
storlek (480, 320);
config = nya Configgy("config.jsi");
String [] enhetsnamn = config.getStrings("devices");
println ("otillgänglig produkter").
println (join(MidiBus.unavailableDevices(), "\n"));
println("-----------------------------------------------------");
String [] available_inputs = MidiBus.availableInputs();
för (int jag = 0; jag < available_inputs.length;i++) {
för (int x = 0; x < deviceNames.length; x ++) {
println ("Kontrollera enheten" + enhetsnamn [x] + "mot" + available_inputs [i]);
om (available_inputs[i].indexOf(deviceNames[x]) > -1) {
println ("* *** Lägg till enhet" + enhetsnamn [x] + "****");
Devices.Add (nya midibussar (här, enhetsnamn [x], 1, deviceNames[x]));
}
}
}
om (devices.size() < 1) {
println ("kunde inte tilldela någon av de önskade enheter. \nExiting.");
Exit();
}
}
void draw() {
Background(currentColor);
}
void midiMessage (MidiMessage meddelande, lång tidsstämpel, sträng bus_name) {
int Obs = (int)(message.getMessage() [1] & 0xFF);
int vel = (int)(message.getMessage() [2] & 0xFF);
println ("Bus" + bus_name + ": Obs" + OBS + ", vel" + vel);
om (vel > 0) {currentColor = vel * 2.}
}
Filen config.jsi (lagras i data / mapp) är detta:
enheter: ["QuNexus", "01. Inre MIDI"]
Du måste justera detta oavsett enheter du har tillgängliga att använda.
När du kör skissen, din config filen kommer att laddas och koden kommer att försöka fylla en ArrayList med midibussar instanser baserat på enheten benämningar.
Observera att i detta exempel användningen av en ArrayList: kod är inte stör med specifik instans variabler för varje midibussar instans; denna kod referera inte någonsin dessa instanser.
Händelsehanteraren midiMessage anropas oavsett vilken av dessa enheter är att skicka meddelandet. Hundföraren skickas namnet på buss så kan du, om du vill, har koden vidta olika åtgärder beroende på källan till MIDI-meddelandet.
Om du undrar varför bry sig lägger till buss instanser på en lista om de ska aldrig användas, anledningen är att de fall utan någon form av ihållande tilldelning kommer att försvinna när installationen har slutförts. När de är borta, kommer det inte längre få kallas händelsehanteraren MIDI-meddelande.
Om du ville ha koden för att referera till någon av dessa fall kan du överväga att använda en HashMap för att hålla dem så att du kunde hämta specifika enheter med namn.