Files
Paul Lipscomb 7ecc718f5d Reorganize top-level directories with clearer naming convention
app -> app-desktop-macos, presets -> app-presets, server -> remote-server,
daw-config-reaper -> osc-config-daw, plugin-reaper-realearn -> plugin-reaper-relearn.
Updated run.py and presets.py path references accordingly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 17:51:05 -04:00

1175 lines
34 KiB
Lua

--- name: DAW control
--- realearn_version: 2.16.0
--- author: helgoboss
--- device_manufacturer: Generic
--- device_name: Generic
--- description: |
--- This main preset is built for controllers that offer DAW control elements.
---
--- This preset is optimized for controllers with exactly 8 channels. At the moment, the number of channels
--- can only be changed by adjusting the preset source file.
--- used_schemes: [daw]
--!strict
local realearn = require("realearn")
-- ### Configuration ###
-- Number of channels on the surface
local channel_count = 8
-- Rates when pressing button a longer time
local bank_switch_rate = 100
local track_switch_rate = 60
local zoom_rate = 100
local scroll_rate = 100
-- Set `follow_track_selection` to `true` in order to switch between tracks by selecting them.
local follow_track_selection = true
-- Setting this to false is supposed to prevent navigation to the master track when using `follow_track_selection`
-- but doesn't work 100% correctly.
local support_nav_to_master_track = true
local scroll_arrange_view = true
local scroll_mixer = true
-- ### Content ###
local parameters: { realearn.Parameter } = {
{
index = 1,
name = "Seek coarse/fine",
},
{
index = 2,
name = "Zoom on/off",
},
}
if not follow_track_selection then
table.insert(parameters, {
index = 0,
name = "Track",
})
end
local groups: { realearn.Group } = {
{
id = "switching",
name = "Switching",
},
{
id = "volume",
name = "Volume",
},
{
id = "pan",
name = "Pan",
},
{
id = "pan-reset",
name = "Pan reset",
},
{
id = "selection",
name = "Selection",
},
{
id = "mute",
name = "Mute",
},
{
id = "solo",
name = "Solo",
},
{
id = "arm",
name = "Arm",
},
{
id = "touch",
name = "Touch",
},
{
id = "transport",
name = "Transport",
},
{
id = "zoom",
name = "Zoom",
activation_condition = realearn.ActivationCondition.Modifier {
modifiers = {
{
parameter = 2,
on = true,
},
},
},
},
{
id = "master",
name = "Master",
},
{
id = "scroll",
name = "Scroll",
activation_condition = realearn.ActivationCondition.Modifier {
modifiers = {
{
parameter = 2,
on = false,
},
},
},
},
{
id = "lcd",
name = "LCD",
},
{
id = "meter",
name = "Meter",
},
{
id = "time-modes",
name = "Time modes",
},
}
local browse_tracks_target = realearn.Target.BrowseTracks {
scroll_arrange_view = scroll_arrange_view,
scroll_mixer = scroll_mixer,
}
local adjust_track_param_target = realearn.Target.FxParameterValue {
parameter = realearn.FxParameterDescriptor.ById {
index = 0,
},
}
local track_switching_target = if follow_track_selection then browse_tracks_target else adjust_track_param_target
local track_bank_step_size_interval = not follow_track_selection and { 0.0008, 0.0008 } or nil
local track_bank_step_factor_interval = follow_track_selection and { 8, 8 } or nil
local track_switch_step_size_interval = not follow_track_selection and { 0.0001, 0.0001 } or nil
local track_switch_step_factor_interval = follow_track_selection and { 1, 1 } or nil
local lcd_assignment_text_feedback = realearn.Feedback.Text {
text_expression = "{{ target.numeric_value }}",
}
local lcd_assignment_numeric_feedback = realearn.Feedback.Numeric {
transformation = "x = y + 0.01",
}
local lcd_assignment_browse_tracks_target = realearn.Target.BrowseTracks {}
local lcd_assignment_adjust_track_param_target = realearn.Target.FxParameterValue {
parameter = realearn.FxParameterDescriptor.ById {
index = 0,
},
poll_for_feedback = false,
}
local mappings: { realearn.Mapping } = {
{
id = "5cfd2ff0-85ce-4e70-98e8-eb53e5e94bb1",
name = "Bank -",
group = "switching",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "bank-left",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_size_interval = track_bank_step_size_interval,
step_factor_interval = track_bank_step_factor_interval,
},
target = track_switching_target,
},
{
id = "07b0202f-b8b8-48e4-a530-f228450864f0",
name = "Bank - faster",
group = "switching",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "bank-left",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_size_interval = track_bank_step_size_interval,
step_factor_interval = track_bank_step_factor_interval,
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
timeout = 300,
rate = bank_switch_rate,
},
},
target = track_switching_target,
},
{
id = "0baab91f-2c4e-43ae-8cac-dca727963b46",
feedback_enabled = false,
name = "Bank +",
group = "switching",
source = realearn.Source.Virtual {
id = "bank-right",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
step_size_interval = track_bank_step_size_interval,
step_factor_interval = track_bank_step_factor_interval,
},
target = track_switching_target,
},
{
id = "0a7e122c-3eda-4355-906a-a057eefa515b",
feedback_enabled = false,
name = "Bank + faster",
group = "switching",
source = realearn.Source.Virtual {
id = "bank-right",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
step_size_interval = track_bank_step_size_interval,
step_factor_interval = track_bank_step_factor_interval,
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
timeout = 300,
rate = bank_switch_rate,
},
},
target = track_switching_target,
},
{
id = "cf45689a-5537-465d-ad44-460dbebf4802",
name = "Track -",
group = "switching",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "ch-left",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_size_interval = track_switch_step_size_interval,
step_factor_interval = track_switch_step_factor_interval,
},
target = track_switching_target,
},
{
id = "76465b5f-c9b3-4aa6-ba77-b891021cf38e",
name = "Track - faster",
group = "switching",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "ch-left",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_size_interval = track_switch_step_size_interval,
step_factor_interval = track_switch_step_factor_interval,
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
timeout = 300,
rate = track_switch_rate,
},
},
target = track_switching_target,
},
{
id = "d40ffa44-a446-4499-b9d6-787c5ff8e188",
feedback_enabled = false,
name = "Track +",
group = "switching",
source = realearn.Source.Virtual {
id = "ch-right",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
step_size_interval = track_switch_step_size_interval,
step_factor_interval = track_switch_step_factor_interval,
},
target = track_switching_target,
},
{
id = "97db991c-a15b-4c27-aeb2-04b2ae3242c2",
name = "Track + faster",
group = "switching",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "ch-right",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
step_size_interval = track_switch_step_size_interval,
step_factor_interval = track_switch_step_factor_interval,
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
timeout = 300,
rate = track_switch_rate,
},
},
target = track_switching_target,
},
{
id = "afa35458-3160-4f49-bb90-279aae51779f",
name = "Play/pause",
group = "transport",
source = realearn.Source.Virtual {
id = "play",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
},
target = realearn.Target.TransportAction {
action = "PlayPause",
},
},
{
id = "67b3a516-246f-43a6-b850-050eb415520a",
name = "Stop",
group = "transport",
source = realearn.Source.Virtual {
id = "stop",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
out_of_range_behavior = "Min",
},
target = realearn.Target.TransportAction {
action = "Stop",
},
},
{
id = "f14ebd63-0127-496d-9acb-281b5a7bb3db",
name = "Repeat",
group = "transport",
source = realearn.Source.Virtual {
id = "cycle",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
out_of_range_behavior = "Min",
},
target = realearn.Target.TransportAction {
action = "Repeat",
},
},
{
id = "00626498-80a6-41d4-bc9f-f273098e3dcf",
name = "Record",
group = "transport",
source = realearn.Source.Virtual {
id = "record",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
out_of_range_behavior = "Min",
},
target = realearn.Target.TransportAction {
action = "Record",
},
},
{
id = "1f827b7b-db04-478a-a05b-36e898f6b245",
name = "Scrub coarse",
group = "transport",
feedback_enabled = false,
activation_condition = realearn.ActivationCondition.Modifier {
modifiers = {
{
parameter = 1,
on = false,
},
},
},
source = realearn.Source.Virtual {
id = "jog",
},
target = realearn.Target.ReaperAction {
command = 992,
invocation = "Relative",
},
},
{
id = "a259062e-dfde-4e6c-8e0a-014a078fc1be",
name = "Scrub fine",
group = "transport",
feedback_enabled = false,
activation_condition = realearn.ActivationCondition.Modifier {
modifiers = {
{
parameter = 1,
on = true,
},
},
},
source = realearn.Source.Virtual {
id = "jog",
},
glue = {
step_factor_interval = { 0, 0 },
},
target = realearn.Target.ReaperAction {
command = 974,
invocation = "Relative",
},
},
{
id = "1e5c604f-9040-47c0-ab37-a05383e7be00",
name = "Seek coarse/fine",
group = "switching",
source = realearn.Source.Virtual {
id = "scrub",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
fire_mode = realearn.FireMode.Normal {
press_duration_interval = { 0, 250 },
},
},
target = realearn.Target.FxParameterValue {
parameter = realearn.FxParameterDescriptor.ById {
index = 1,
},
},
},
{
id = "ee81c405-d355-45e0-80b4-913633295193",
name = "Zoom on/off",
group = "switching",
source = realearn.Source.Virtual {
id = "zoom",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
fire_mode = realearn.FireMode.Normal {
press_duration_interval = { 0, 250 },
},
},
target = realearn.Target.FxParameterValue {
parameter = realearn.FxParameterDescriptor.ById {
index = 2,
},
},
},
{
id = "f13678b1-da81-46a5-b318-861a813d7183",
name = "Previous",
group = "transport",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "rewind",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 40172,
invocation = "Trigger",
},
},
{
id = "previous-led",
name = "Previous LED",
group = "transport",
control_enabled = false,
source = realearn.Source.Virtual {
id = "rewind",
character = "Button",
},
glue = {
target_interval = { 0, 0.00001 },
},
target = realearn.Target.Seek {},
},
{
id = "7f0d2cbb-0346-4229-89dd-db58cac3a460",
name = "Next",
group = "transport",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "fast-fwd",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 40173,
invocation = "Trigger",
},
},
{
id = "next-led",
name = "Next LED",
group = "transport",
control_enabled = false,
source = realearn.Source.Virtual {
id = "fast-fwd",
character = "Button",
},
glue = {
target_interval = { 0.99999, 1 },
reverse = true,
},
target = realearn.Target.Seek {},
},
{
id = "8b0ce5db-a371-4b4c-9fe8-ca086bc706bf",
name = "Zoom out horizontally",
group = "zoom",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-left",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = zoom_rate,
},
},
target = realearn.Target.ReaperAction {
command = 998,
invocation = "Relative",
},
},
{
id = "9b6fe0b8-d5f3-438b-9830-6bb782121c2d",
name = "Zoom in horizontally",
group = "zoom",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-right",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = zoom_rate,
},
},
target = realearn.Target.ReaperAction {
command = 998,
invocation = "Relative",
},
},
{
id = "c3c34680-0396-4b24-8714-e210062f46cd",
name = "Zoom out vertically",
group = "zoom",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-down",
character = "Button",
},
glue = {
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = zoom_rate,
},
},
target = realearn.Target.ReaperAction {
command = 40112,
invocation = "Trigger",
},
},
{
id = "e93e8981-8127-446f-b5d9-34bb576fbc2b",
name = "Zoom in vertically",
group = "zoom",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-up",
character = "Button",
},
glue = {
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = zoom_rate,
},
},
target = realearn.Target.ReaperAction {
command = 40111,
invocation = "Trigger",
},
},
{
id = "8b6d4cf5-d4f2-4701-af71-90d839da2318",
name = "Scroll down",
group = "scroll",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-down",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_factor_interval = { 8, 8 },
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = scroll_rate,
},
},
target = realearn.Target.ReaperAction {
command = 989,
invocation = "Relative",
},
},
{
id = "b633c2d1-c283-4021-a1fc-76b6abd407b9",
name = "Scroll up",
group = "scroll",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-up",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
step_size_interval = { 0.08, 0.08 },
step_factor_interval = { 8, 8 },
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = scroll_rate,
},
},
target = realearn.Target.ReaperAction {
command = 989,
invocation = "Relative",
},
},
{
id = "b9fa3db6-8bed-4c8a-82fa-580d3d0da92c",
name = "Scroll left",
group = "scroll",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-left",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_factor_interval = { 8, 8 },
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = scroll_rate,
},
},
target = realearn.Target.ReaperAction {
command = 40140,
invocation = "Relative",
},
},
{
id = "344405d5-b50d-47d4-a22e-aa99a7454a25",
name = "Scroll right",
group = "scroll",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "cursor-right",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
reverse = true,
step_factor_interval = { 8, 8 },
fire_mode = realearn.FireMode.AfterTimeoutKeepFiring {
rate = scroll_rate,
},
},
target = realearn.Target.ReaperAction {
command = 40141,
invocation = "Relative",
},
},
{
id = "261067ef-c2f0-41de-b10f-418cc718cf1c",
name = "Master touch",
group = "master",
source = realearn.Source.Virtual {
id = "main/fader/touch",
character = "Button",
},
target = realearn.Target.TrackAutomationTouchState {
track = realearn.TrackDescriptor.Master {},
touched_parameter = "Volume",
},
},
{
id = "2f45cdf6-bac9-4a97-8a3e-c296d2cc7e0f",
name = "Master volume",
group = "master",
source = realearn.Source.Virtual {
id = "main/fader",
},
target = realearn.Target.TrackVolume {
track = realearn.TrackDescriptor.Master {},
},
},
{
id = "970e04c9-e262-478e-85ce-9e84875fb5f5",
name = "Marker",
group = "master",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "marker",
character = "Button",
},
glue = {
out_of_range_behavior = "Min",
button_filter = "PressOnly",
},
target = realearn.Target.ReaperAction {
command = 40157,
invocation = "Trigger",
},
},
{
id = "c49238b9-189e-42d3-984a-955fe63c46e8",
name = "Global read",
group = "master",
source = realearn.Source.Virtual {
id = "read",
character = "Button",
},
glue = {
target_interval = { 1, 1 },
absolute_mode = "ToggleButton",
},
target = realearn.Target.AutomationModeOverride {
override = realearn.AutomationModeOverride.Mode {
mode = "Read",
},
},
},
{
id = "b805f628-16e1-42ca-ac36-3bb95133815f",
name = "Global write",
group = "master",
source = realearn.Source.Virtual {
id = "write",
character = "Button",
},
glue = {
target_interval = { 1, 1 },
absolute_mode = "ToggleButton",
},
target = realearn.Target.AutomationModeOverride {
override = realearn.AutomationModeOverride.Mode {
mode = "Touch",
},
},
},
{
id = "13d79d42-4d59-4930-a976-b4374e0a69b6",
name = "Click",
group = "master",
source = realearn.Source.Virtual {
id = "click",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
},
target = realearn.Target.ReaperAction {
command = 40364,
},
},
{
id = "any-solo",
name = "Any solo",
group = "master",
source = realearn.Source.Virtual {
id = "solo",
character = "Button",
},
target = realearn.Target.AnyOn {
parameter = "TrackSolo",
},
},
-- Done
{
id = "7b90c136-f89c-477e-b812-525b4a7da5ed",
name = "Assignment",
group = "lcd",
control_enabled = false,
source = realearn.Source.Virtual {
id = "lcd/assignment",
},
glue = {
target_interval = if follow_track_selection then nil else { 0, 0.01 },
feedback = if follow_track_selection then lcd_assignment_text_feedback else lcd_assignment_numeric_feedback,
},
target = if follow_track_selection
then lcd_assignment_browse_tracks_target
else lcd_assignment_adjust_track_param_target,
},
-- Done
{
id = "7GFNQfZp9uqovhV5zWtvh",
name = "Timecode",
group = "lcd",
control_enabled = false,
source = realearn.Source.Virtual {
id = "lcd/timecode",
},
glue = {
feedback = realearn.Feedback.Text {
text_expression = "{{ target.position.project_default.mcu }}",
},
},
target = realearn.Target.Seek {
feedback_resolution = "High",
},
},
-- Time modes
{
id = "time-mode-measures-beats",
name = "Measures.Beats",
group = "time-modes",
control_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
glue = {
source_interval = { 0, 0 },
},
target = realearn.Target.ReaperAction {
command = 40411,
invocation = "Trigger",
},
},
{
id = "time-mode-seconds",
name = "Seconds",
group = "time-modes",
control_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 40412,
invocation = "Trigger",
},
},
{
id = "time-mode-samples",
name = "Samples",
group = "time-modes",
control_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 40413,
invocation = "Trigger",
},
},
{
id = "time-mode-hmsf",
name = "Hours:Minutes:Seconds:Frames",
group = "time-modes",
control_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 40414,
invocation = "Trigger",
},
},
{
id = "time-mode-absolute-frames",
name = "Absolute Frames",
group = "time-modes",
control_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 41972,
invocation = "Trigger",
},
},
{
id = "time-mode-minutes-seconds",
name = "Minutes:Seconds",
group = "time-modes",
control_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
target = realearn.Target.ReaperAction {
command = 40410,
invocation = "Trigger",
},
},
{
id = "cycle-time-modes",
name = "Cycle time modes",
group = "master",
feedback_enabled = false,
source = realearn.Source.Virtual {
id = "smpte-beats",
character = "Button",
},
glue = {
absolute_mode = "IncrementalButton",
wrap = true,
},
target = realearn.Target.BrowseGroupMappings {
group = "time-modes",
},
},
}
-- For each channel
for ch = 0, channel_count - 1 do
local human_ch = ch + 1
local prefix = "ch" .. human_ch .. "/"
local track_expression_incl_master_track = "((selected_track_index != none) && selected_track_index || 0) + " .. ch
local track_expression_excl_master_track = "max(selected_track_index, 0) + " .. ch
local track_expression_via_track_selection = if support_nav_to_master_track
then track_expression_incl_master_track
else track_expression_excl_master_track
local track_expression_via_parameter = "p[0] * 10000 + " .. ch
local track_expression = if follow_track_selection
then track_expression_via_track_selection
else track_expression_via_parameter
local track_volume = realearn.Mapping {
id = prefix .. "vol",
name = "Tr" .. human_ch .. " Vol",
group = "volume",
source = realearn.Source.Virtual {
id = prefix .. "fader",
},
target = realearn.Target.TrackVolume {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_pan_control = realearn.Mapping {
id = prefix .. "pan",
name = "Tr" .. human_ch .. " Pan",
group = "pan",
source = realearn.Source.Virtual {
id = prefix .. "v-pot",
},
glue = {
step_size_interval = { 0.005, 1.0 },
},
target = realearn.Target.TrackPan {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_pan_feedback = realearn.Mapping {
id = prefix .. "pan/feedback",
name = "Tr" .. human_ch .. " Pan Feedback",
control_enabled = false,
group = "pan",
source = realearn.Source.Virtual {
id = prefix .. "v-pot/boost-cut",
},
target = realearn.Target.TrackPan {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_pan_reset = realearn.Mapping {
id = prefix .. "pan/reset",
name = "Tr" .. human_ch .. " Pan Reset",
feedback_enabled = false,
group = "pan-reset",
source = realearn.Source.Virtual {
id = prefix .. "v-select",
character = "Button",
},
glue = {
target_interval = { 0.5, 0.5 },
},
target = realearn.Target.TrackPan {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_selection = realearn.Mapping {
id = prefix .. "selection",
name = "Tr" .. human_ch .. " Selection",
group = "selection",
source = realearn.Source.Virtual {
id = prefix .. "select",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
},
target = realearn.Target.TrackSelectionState {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
scroll_mixer = true,
},
}
local track_mute = realearn.Mapping {
id = prefix .. "mute",
name = "Tr" .. human_ch .. " Mute",
group = "mute",
source = realearn.Source.Virtual {
id = prefix .. "mute",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
},
target = realearn.Target.TrackMuteState {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_solo = realearn.Mapping {
id = prefix .. "solo",
name = "Tr" .. human_ch .. " Solo",
group = "solo",
source = {
kind = "Virtual",
id = prefix .. "solo",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
},
target = realearn.Target.TrackSoloState {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_arm = realearn.Mapping {
id = prefix .. "arm",
name = "Tr" .. human_ch .. " Arm",
group = "arm",
source = realearn.Source.Virtual {
id = prefix .. "record-ready",
character = "Button",
},
glue = {
absolute_mode = "ToggleButton",
},
target = realearn.Target.TrackArmState {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
local track_touch = realearn.Mapping {
id = prefix .. "touch",
name = "Tr" .. human_ch .. " Touch",
group = "touch",
source = realearn.Source.Virtual {
id = prefix .. "fader/touch",
character = "Button",
},
target = realearn.Target.TrackAutomationTouchState {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
touched_parameter = "Volume",
},
}
-- Done
local track_name_display = realearn.Mapping {
id = prefix .. "name",
name = "Tr" .. human_ch .. " Name",
group = "lcd",
control_enabled = false,
source = realearn.Source.Virtual {
id = prefix .. "lcd/line1",
},
glue = {
feedback = realearn.Feedback.Text {
color = realearn.PropColor {
prop = "target.track.color",
},
text_expression = "{{ target.track.name }}",
},
},
target = realearn.Target.TrackTool {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
-- Done
local track_pan_display = realearn.Mapping {
id = prefix .. "pan/lcd",
name = "Tr" .. human_ch .. " Pan LCD",
group = "lcd",
control_enabled = false,
source = realearn.Source.Virtual {
id = prefix .. "lcd/line2",
},
glue = {
feedback = realearn.Feedback.Text {
kind = "Text",
text_expression = "{{ target.pan.mcu }}",
},
},
target = realearn.Target.TrackPan {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
-- Done
local track_peak = {
id = prefix .. "peak",
name = "Tr" .. human_ch .. " Peaks",
group = "meter",
control_enabled = false,
source = realearn.Source.Virtual {
id = prefix .. "meter/peak",
},
target = realearn.Target.TrackPeak {
track = realearn.TrackDescriptor.Dynamic {
expression = track_expression,
},
},
}
table.insert(mappings, track_volume)
table.insert(mappings, track_pan_control)
table.insert(mappings, track_pan_feedback)
table.insert(mappings, track_pan_reset)
table.insert(mappings, track_selection)
table.insert(mappings, track_mute)
table.insert(mappings, track_solo)
table.insert(mappings, track_arm)
table.insert(mappings, track_touch)
table.insert(mappings, track_name_display)
table.insert(mappings, track_pan_display)
table.insert(mappings, track_peak)
end
return realearn.Compartment {
parameters = parameters,
groups = groups,
mappings = mappings,
}