No internet connection
  1. Home
  2. How to

Dynamic way to change Stream Deck depending on selections within a specific window

Now that SF have triggers based on window titles we can change our Stream Decks based on what window is in focus.
But if you'd like to change the a streamdeck based on what is selected within specific window, this can be done with a timer script:

Here's one I've made for Nuendo, for the arrangement/main window. But it can easily be updated for other programs:

var app = sf.ui.cubendo

var lastSelection = [];
var currentSelection = [];

function selection() {
    var somethingSelected = app.getMenuItem('Edit', 'Select', 'None').isEnabled
    var moveToOrigin = app.getMenuItem('Edit', 'Move to', 'Origin').isEnabled
    var moveToCursor = app.getMenuItem('Edit', 'Move to', 'Cursor').isEnabled
    var mute = app.getMenuItem('Edit', 'Mute').isEnabled
    var lock = app.getMenuItem('Edit', 'Lock...').isEnabled
    var audioSelected = app.getMenuItem('Audio', 'Open Sample Editor').isEnabled;
    var midiSelected = app.getMenuItem('MIDI', 'Transpose Setup...').isEnabled;
    var markerSelected = !audioSelected && !midiSelected && !moveToOrigin && somethingSelected && !lock && !mute
    var videoSelected = !audioSelected && !midiSelected && moveToOrigin && lock && !mute
    var tempoSelected = !audioSelected && !midiSelected && !moveToOrigin && !lock && mute && moveToCursor
    var signatureSelected = !audioSelected && !midiSelected && !moveToOrigin && !lock && mute && !moveToCursor
    var nothingSelected = !somethingSelected

    currentSelection = [audioSelected, midiSelected, markerSelected, videoSelected, tempoSelected, signatureSelected]


    if (currentSelection + '' != lastSelection + '') {

        if (audioSelected)
            log('Audio Selected')
        else if (midiSelected)
            log('MIDI Selected')
        else if (markerSelected)
            log('Marker Selected')
        else if (videoSelected)
            log('Video Selected')
        else if (tempoSelected)
            log('Tempo Selected')
        else if (signatureSelected)
            log('Signature Selected')
        else
            log('Nothing Selected')

        // Set the variable lastFocusedWindowTitle to the focues window, for the next loop.
        lastSelection = currentSelection;
    }
};

if (app.getWindowWithTitleStartingWith(app.appName).isFocused)
    // If main window (window with program title) is in front, start loop
    sf.engine.runInBackground(function () {
        while (true) {
            // This checks for a user cancellation.
            sf.engine.checkForCancellation();

            // This will break the loop if main window is not in focus or you leave the Cubase/Nuendo 
            if (!app.getWindowWithTitleStartingWith(app.appName).isFocused)
                break;
            if (sf.ui.frontmostApp.activeBundleID != app.activeBundleID)
                break;

            // Checking what streamdeck to load
            selection()

            // This will do so we check every 100 ms if there's been a "change"
            sf.wait({
                executionMode: 'Background',
                intervalMs: 100,
                onError: 'Continue'
            });
        }
    });

Just set the script to be triggered every time a window is changed in your program, like this:

I've just added a space as the Window Title.

The only thing left is to change the log() parts to the stream decks you want to show using sf.soundflow.runCommand();

  • 0 replies
  1. Progress
  2. @JesperA closed this topic 2020-05-03 01:32:56.779Z.