Add first version of the PC2Scene script

Allows you to launch Scenes via MIDI Program Change messages from
external sources.
This commit is contained in:
Mikkel Munch Mortensen 2023-12-28 17:01:03 +01:00
commit b0ec46916d

70
pc2scene.control.js Normal file
View file

@ -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);
}
}
}