commit b0ec46916d4a1e50d72541bf1491fcf1917ff4e8 Author: Mikkel Munch Mortensen <3xm@detfalskested.dk> Date: Thu Dec 28 17:01:03 2023 +0100 Add first version of the PC2Scene script Allows you to launch Scenes via MIDI Program Change messages from external sources. diff --git a/pc2scene.control.js b/pc2scene.control.js new file mode 100644 index 0000000..27baf44 --- /dev/null +++ b/pc2scene.control.js @@ -0,0 +1,70 @@ +loadAPI(18); + +// Remove this if you want to be able to use deprecated methods without causing script to stop. +// This is useful during development. +host.setShouldFailOnDeprecatedUse(true); + +host.defineController("Generic", "PC2Scene", "0.1", "d8fd1407-e713-4c83-8ed1-1532c05895ba", "decibyte"); +host.defineMidiPorts(1, 0); + + +function init() { + // Set up the preferences for the controller script. There are 2 available + // settings: + // - The MIDI channel to listen for Program Change messages on. + // - Whether to show Scene changes as notifications on the screen. + preferences = host.getPreferences(); + midiChannel = preferences.getNumberSetting("MIDI channel for Program Change", "General", 1, 16, 1, "", 1); + showNotifications = preferences.getBooleanSetting("Show scene change notifications", "General", false); + + // Attach a callback to incoming MIDI events. + midiIn = host.getMidiInPort(0); + midiIn.setMidiCallback(onMidiIn); + + // Set up a Scene bank and iterate over all of them, in order to mark + // their names interesting (to be able to print them later on). + sceneCount = 128; + scenes = host.createSceneBank(sceneCount); + for (i = 0; i < sceneCount; i++) { + scene = scenes.getScene(i); + scene.name().markInterested(); + } + + host.println("PC2Scene initialized."); +} + +function flush() { +} + +function exit() { + host.println("Exited."); +} + +function onMidiIn(status, data1, data2) { + // Only look at Program Change messages. + if (isProgramChange(status)) { + // Get the MIDI channel for the incoming Program Change message and + // the MIDI channel from the preferences. + inChannel = MIDIChannel(status); + prefChannel = midiChannel.get() * 15; + + // Only change Scene if the Program Change message is from the + // correct channel. + if (inChannel == prefChannel) { + // Get the Scene, launch it and scroll to it. + scene = scenes.getScene(data1); + scene.launch(); + scenes.scrollIntoView(data1); + + // Print out debug information and optionally show the name of the + // new Scene if toggled on in the preferences. + sceneName = scene.name().get(); + host.println("Program Change " + data1 + " received on channel " + (MIDIChannel(status) + 1)); + message = 'Launching scene: "' + sceneName + '"'; + if (showNotifications.get()) { + host.showPopupNotification(message); + } + host.println(message); + } + } +}