Modes
The script gives the SQ four main modes: Keyboard, Sequencer, Pad Per Channel, and Mixer Control. Within some of these are a number of options which use the following terminology: Mode -> Submode -> Layout.
A button in the A-H section (E by default) is assigned to rotate through the Modes and another (F) rotates available submodes. The +/- buttons will rotate through layouts or octaves depending on the Mode/Sub mode.
Keyboard
The Keyboard mode has three submodes: Keys, Continuous and FPC. Keys is the initial keyboard layout with the C notes lit blue. In the Continuous submode, every pad will play a note of the currently selected key. The root note pads will be purple. The root note and scale can be set in the config.py or by assigning change_root or increment_scale functions to buttons. For both submodes, the +/- buttons adjust the octave.
The FPC submode will adjust the pads to control both banks of the FPC plugins. The bottom row will be purple and control back 1 and the top row will be blue and control bank 2.
Sequencer
The Sequencer has two submodes: Standard and Parameter Entry. In the Standard submode, steps can be set for the selected channel. In Parameter Entry submode, steps can be selected to adjust their parameters. The selected step will be lit purple and knobs 1-6 can be used to adjust the various parameters. The Shift and Repeat parameters cannot be edited. Turn knob 8 to close the graph editor. The +/- buttons have no functionality in the Parameter Entry submode.
In the Standard submode, the +/- buttons adjust between various layouts. In each layout, pads 1-16 control the respective steps of the selected channel. The layouts offer different control options for the top row, listed below.
32 Step
Allows access to steps 17 - 32 of the current channel. Steps will appear blue.
Pattern Access
Pads will select patterns directly. Four ranges of 16 patterns (1-16, 17-32 etc) can be accessed by using the change_select_range function. The currently selected range is indicated by the darker purple pad. Pads are white with 1, 5, 9, 13 purple.
Channel Select
Pads will select channels directly. Pads will appear purple with the currently selected channel appearing white.
Channel Mute
Channels can be muted/unmuted. Pads will be yellow when the corresponding channel is muted and bright yellow when not.
Pad Per Channel
In this mode, channels can be triggered by the corresponding pad. This mode has no submodes or layouts. All available channels will light their pad purple.
Mixer Control Mode
This mode allows mixer tracks 1-32 to be muted/unmuted by their corresponding pad. Muted tracks will be unlit and unmuted tracks will be lit white. This mode currently has no submodes or layouts. It may later be merged with Pad Per Channel.
Functions
A list of the available functions can be found here. While most of the functions control FL Studio directly, a few important functions control the script itself. The Shift function allows an extra function to be added to each A-H button, knobs, and button 1-6. The transport, solo, mute, arm and arrow buttons cannot have a secondary function added. By default the A button toggles the shift status. When shift is active, the + button will be unlit as an indicator.
Configuration
The script is highly configurable for individual user's needs. Users who are not programmers should feel comfortable editing these files. The worst that can happen is that the script will not work and need to be redownloaded. Two different files can be edited to customize the script. There are config.py and config_layout.py.
The config.py file has descriptions for what each variable controls. ACTIVE_MODES controls what modes users will be able to rotate through. COLORS controls what colors the change_color function will rotate through. The color format FL uses is a bit strange but can be selected here. Add as many as desired.
The config_layout.py file is where users can set what function the buttons and knob have. Here is the entry for the
button, for example: "g": { "functions": [ "clone_pattern",
"cut"
],
"track": 0},
The only code here that should be changed in this example is "clone_pattern", "cut", and 0. The "clone_pattern" in this example is the primary function for the
button, while "cut" is the function when shift is active. All functions should be in quotes and the commas should be left in place. The original code from the GitHub can always be pasted back if errors occur.The 0 for track is only applicable for certain functions. The default code controlling knob functionality gives us a better example:
encoder_mappings = {
"knob_1": { "functions": ["selected_level","nothing"],"track": 0},
"knob_2": { "functions": ["selected_pan","nothing"], "track": 0},
"knob_3": { "functions": ["set_random_min_octave","nothing"], "track": 0},
"knob_4": { "functions": ["set_random_max_octave","nothing"], "track": 0},
"knob_5": { "functions": ["set_random_offset","nothing"], "track": 0},
"knob_6": { "functions": ["set_mixer_route","nothing"], "track": 0},
"knob_7": { "functions": ["set_efx_track","nothing"], "track": 0},
"knob_8": { "functions": ["master_mixer_level","nothing"], "track": 0},
"knob_9": { "functions": ["mixer_level", "mixer_pan"], "track": 1},
"knob_10": { "functions": ["mixer_level", "mixer_pan"], "track": 2 },
"knob_11": { "functions": ["mixer_level", "mixer_pan"], "track": 3 },
"knob_12": { "functions": ["mixer_level", "mixer_pan"], "track": 4 },
"knob_13": { "functions": ["mixer_level", "mixer_pan"], "track": 5 },
"knob_14": { "functions": ["mixer_level", "mixer_pan"], "track": 6 },
"knob_15": { "functions": ["mixer_level", "mixer_pan"], "track": 7 },
"knob_16": { "functions": ["mixer_level", "mixer_pan"], "track": 8 },
"knob_17": { "functions": ["mixer_level", "mixer_pan"], "track": 9 },
"knob_18": { "functions": ["mixer_level", "mixer_pan"], "track": 10 },
"knob_19": { "functions": ["mixer_level", "mixer_pan"], "track": 11 },
"knob_20": { "functions": ["mixer_level", "mixer_pan"], "track": 12 },
"knob_21": { "functions": ["mixer_level", "mixer_pan"], "track": 13 },
"knob_22": { "functions": ["mixer_level", "mixer_pan"], "track": 14 },
"knob_23": { "functions": ["mixer_level", "mixer_pan"], "track": 15 },
"knob_24": { "functions": ["mixer_level", "mixer_pan"], "track": 16 },
"knob_25": { "functions": ["mixer_level", "mixer_pan"], "track": 17 },
"knob_26": { "functions": ["mixer_level", "mixer_pan"], "track": 18 },
"knob_27": { "functions": ["mixer_level", "mixer_pan"], "track": 19 },
"knob_28": { "functions": ["mixer_level", "mixer_pan"], "track": 20 },
"knob_29": { "functions": ["mixer_level", "mixer_pan"], "track": 21 },
"knob_30": { "functions": ["mixer_level", "mixer_pan"], "track": 22 },
"knob_31": { "functions": ["mixer_level", "mixer_pan"], "track": 23 },
"knob_32": { "functions": ["mixer_level", "mixer_pan"], "track": 24},
"jog_wheel": {"functions": ["jog_wheel", "jog_wheel"], "track": 0},
"touch_mod": {"functions": ["scroll", "nothing"], "track": 0},
"touch_cc": {"functions": ["nothing", "nothing"], "track": 0}
}
Knobs 9 and up control the various pages of knobs accessible through the
button on the SQ. The functions mixer_level and mixer_pan control dedicated tracks on the mixer. knob_9 in this case will always control the mixer_level and pan for track 1, 10 controls track 2 and so on. Track 0 will control the Master track. This can be applied to some button functions as well such as pattern_select, mute channel et al.While the functionality of the transport, arrow, solo, mute, arm and jog wheel functions can be changed, no shift function or specific track/channel control can be added. These functions are controlled on their own, smaller script which has less functionality. The functions are set in the device_presonusatomsqMIDIIN2.py file. Currently, the functions that can be set are limited to what is found in the Midi2Action class in this file.
Plugin Configuration
Plugins parameters can be custom controlled by the encoders. They can be added or edited in the plugindata.py file. If the name of a plugin matches a key entry in the plugin_dict dictionary, the script will assign the parameter number in the list to the corresponding knob. The first number sets the parameter for the touch pad to control. The following set the knobs, including all pages.
To add a plugin, assign a button the print_plugin_data function. Select the plugin the the channel rack. Press the button and open the Script Output under View. This will print out the plugin's parameters and corresponding numbers, as well as the name of the plugin in the first line. Add the exact name as a key in plugin_dict. The value can be set as a list of the parameter's number ordered as wished.
The following is an example for the FruityDance plugin. From the Script Output:
Fruity Dance {'Dance move': 0, 'Mirror character horizontally': 1, 'Show window': 2, 'Motion blending': 3,
'Speed multiplicator': 4, 'X coordinate': 5, 'Y coordinate': 6}
An example of what the plugin_dict should look like:
plugin_dict = {
'Fruity Dance': [0, 5, 6, 4, 1, 2, 3],
'Toxic Biohazard': [15, 16, 0, 1, 2, 3, 4, 5, 6],
}
In this example, 0 is assigned to the touchpad and will control the Dance Move. 5 is assigned to Knob 1 and will control the X coordinate and so on from there. Any knobs not assigned will not function.
The plugin must be open and focused for the knobs to control it. Otherwise, the knobs will have their default functions. If a plugin is not assigned, the knobs will control parameters as if they were set [0, 1, 2, 3, 4 ....] when the plugin is focused.
Note that EFX plugins cannot be controlled using this method. To control a plugin with a knob, set its function to 'nothing' and link it through FL Studio.