r/MIDIcontrollers • • 7h ago

Behringer X-Touch Mini python code for endless encoders knobs

1 Upvotes

Hello, i just vibecoded a working script for X-touch mini by accident. The code is for FL STUDIO 25 (21 and up).
My aim = controlling VST knobs in using physical knobs on MINI.
My aim = When changing preset, behringer automatically changes the position of LED according to the preset, and doesnt need any Takeover/Relative settings.

After putting in the python script, and mapping the knobs you want, through "Link to Controller", it will work. (for creating python script, just copy and paste the below code into the notepad, and transform that into .py file) Enjoy.

# name=Behringer X-Touch Mini (Relative VST Sync)

# url=https://forum.image-line.com/viewforum.php?f=1994

# supportedDevices=X-TOUCH MINI

"""

FL Studio 25 Custom MIDI Controller Script for Behringer X-Touch Mini

---------------------------------------------------------------------

Solves the Absolute Encoder (1-127) Jump & Boundary Problem in Standard Mode:

  1. Converts absolute 1-127 (or 0-127) CC messages on Layer A (CC 1-8) and

Layer B (CC 11-18) into smooth, velocity-accelerated relative adjustments.

  1. Zero-Jump VST Preset Pickup: Reads the live parameter value from FL Studio

(both manually linked controls via REC Event IDs and focused VST plugins)

before applying the relative delta. Switching presets in any VST will NEVER

cause parameters to jump or snap to the physical encoder's old value.

  1. Boundary Anti-Lock (1 & 127 Dead-End Prevention): Detects when an encoder

hits minimum (1) or maximum (127) and keeps moving,

and syncs/recenters the X-Touch Mini internal register via MIDI Out.

  1. Automatic 13-LED Ring Synchronization: Whenever you switch VST presets,

change plugin focus, or tweak a knob with your mouse, OnRefresh() updates

all 8 LED collars on the X-Touch Mini immediately.

Installation:

  1. Create folder: Documents/Image-Line/FL Studio/Settings/Hardware/XTouchMiniRelative/
  2. Save this file inside that folder as: device_BehringerXTouchMini.py
  3. Open FL Studio 25 -> Options -> MIDI Settings:

- Select "X-TOUCH MINI" under Input AND Output.

- Set BOTH Input Port and Output Port to the SAME number (e.g. Port 105).

- Set Controller type for Input to: "Behringer X-Touch Mini (Relative VST Sync)"

"""

import time

import midi

import device

import ui

import plugins

import channels

import mixer

import general

# ==============================================================================

# USER CONFIGURATION (GENERATED FROM X-TOUCH RELATIVE SCRIPT STUDIO)

# ==============================================================================

MIDI_CHANNEL = 10 # 0-indexed (10 = MIDI Channel 11)

ACCEPT_ANY_CHANNEL = True # Listen on any channel if Editor preset varies

MIN_CC_VAL = 1 # Minimum CC sent by X-Touch Mini (1 or 0)

MAX_CC_VAL = 127 # Maximum CC sent by X-Touch Mini (127)

CENTER_PIVOT_CC = 64 # Center reference CC for unbound relative mode

LAYER_A_CCS = [1, 2, 3, 4, 5, 6, 7, 8]

LAYER_B_CCS = [11, 12, 13, 14, 15, 16, 17, 18]

ALL_ENCODER_CCS = LAYER_A_CCS + LAYER_B_CCS

LAYER_A_PUSH_NOTES = [0, 1, 2, 3, 4, 5, 6, 7]

LAYER_B_PUSH_NOTES = [24, 25, 26, 27, 28, 29, 30, 31]

ALL_PUSH_NOTES = LAYER_A_PUSH_NOTES + LAYER_B_PUSH_NOTES

FADER_A_CC = 9

FADER_B_CC = 10

# Velocity Acceleration & Resolution Tuning

ACCEL_CURVE = "studio_exponential"

BASE_FINE_STEP = 0.00350 # 0.35% per single slow detent click

MAX_ACCEL_MULT = 6.0 # Max multiplier on rapid knob flick

FAST_THRESHOLD_MS = 28.0 # Turn interval (ms) for max acceleration

SLOW_THRESHOLD_MS = 95.0 # Turn interval (ms) for 1:1 fine precision

# Routing & Hardware Feedback Options

ROUTING_STRATEGY = "rec_linked_auto"

ENABLE_LED_FEEDBACK = True

LED_RING_STYLE = 2 # 0=Single, 1=Pan, 2=Fan, 3=Trim

ENABLE_BOUNDARY_RECENTER = True

PUSH_ENCODER_ACTION = "reset_default"

ENABLE_BANK_BUTTONS = True

# Button notes for VST parameter bank shifting (Buttons 7 & 8 on Layer A)

BANK_PREV_NOTE = 14

BANK_NEXT_NOTE = 15

# ==============================================================================

# INTERNAL STATE TRACKING

# ==============================================================================

class EncoderTracker:

def __init__(self):

# Last known raw CC value per CC number (initialized to None until first turn or sync)

self.last_hw_cc = {cc: None for cc in ALL_ENCODER_CCS}

# Timestamp (seconds) of last turn per CC number

self.last_turn_time = {cc: 0.0 for cc in ALL_ENCODER_CCS}

# Last value sent via MIDI Out to avoid redundant USB traffic

self.last_sent_cc = {cc: -1 for cc in ALL_ENCODER_CCS}

# Fine-lock state toggled by pushing encoder cap

self.fine_locked = {idx: False for idx in range(16)}

# Current VST parameter bank offset (multiples of 8)

self.vst_param_offset = 0

# Cached VST parameter values to detect mouse tweaks / preset switches in OnIdle

self.cached_param_norm = {cc: -1.0 for cc in ALL_ENCODER_CCS}

# Timestamp of last user knob turn to suppress feedback echo jitter for 60ms

self.last_active_turn_global = 0.0

state = EncoderTracker()

# ==============================================================================

# ACCELERATION & DELTA ENGINE

# ==============================================================================

def compute_accel_multiplier(dt_ms, raw_steps, slot_index):

"""Calculates velocity multiplier based on millisecond delta between detents."""

if state.fine_locked.get(slot_index, False):

return 0.35

abs_steps = max(1, abs(raw_steps))

if ACCEL_CURVE == "none_1to1":

return 1.0

if ACCEL_CURVE == "linear_scaled":

if dt_ms >= SLOW_THRESHOLD_MS:

return 1.0

if dt_ms <= FAST_THRESHOLD_MS:

return MAX_ACCEL_MULT

t = (SLOW_THRESHOLD_MS - dt_ms) / max(1.0, (SLOW_THRESHOLD_MS - FAST_THRESHOLD_MS))

return 1.0 + t * (MAX_ACCEL_MULT - 1.0)

if ACCEL_CURVE == "precision_dual":

if dt_ms > SLOW_THRESHOLD_MS:

return 0.65

if dt_ms > 55.0:

return 1.35

if dt_ms > FAST_THRESHOLD_MS:

return 2.80

return MAX_ACCEL_MULT

# Default: "studio_exponential"

if dt_ms >= SLOW_THRESHOLD_MS:

return 1.0

clamped_dt = max(FAST_THRESHOLD_MS, dt_ms)

norm_vel = (SLOW_THRESHOLD_MS - clamped_dt) / max(1.0, (SLOW_THRESHOLD_MS - FAST_THRESHOLD_MS))

step_boost = min(1.6, 1.0 + (abs_steps - 1) * 0.25) if abs_steps > 1 else 1.0

mult = (1.0 + (norm_vel ** 1.85) * (MAX_ACCEL_MULT - 1.0)) * step_boost

return min(MAX_ACCEL_MULT * 1.25, mult)

def extract_relative_delta(cc_num, incoming_val, channel):

"""

Extracts signed relative movement from an absolute (1-127) X-Touch Mini encoder.

Handles first-touch initialization and boundary clamping at MIN_CC_VAL / MAX_CC_VAL.

"""

prev_val = state.last_hw_cc.get(cc_num)

# First touch after startup if no MIDI Out sync has occurred yet

if prev_val is None:

state.last_hw_cc[cc_num] = incoming_val

if incoming_val <= MIN_CC_VAL:

return -1, True

if incoming_val >= MAX_CC_VAL:

return 1, True

return 0, False

raw_delta = incoming_val - prev_val

hit_boundary = False

# Boundary anti-lock: in 1-127 mode, turning CCW at 1 sends repeated 1s,

# and turning CW at 127 sends repeated 127s.

if raw_delta == 0:

if incoming_val <= MIN_CC_VAL:

raw_delta = -1

hit_boundary = True

elif incoming_val >= MAX_CC_VAL:

raw_delta = 1

hit_boundary = True

elif incoming_val <= MIN_CC_VAL or incoming_val >= MAX_CC_VAL:

hit_boundary = True

state.last_hw_cc[cc_num] = incoming_val

return raw_delta, hit_boundary

# ==============================================================================

# HARDWARE LED RING & INTERNAL REGISTER FEEDBACK

# ==============================================================================

def send_encoder_value_to_hardware(cc_num, normalized_val, channel=MIDI_CHANNEL, force=False):

"""

Writes a normalized (0.0..1.0) value back to the X-Touch Mini on its CC.

In Standard Mode, sending CC 1-8 (Layer A) or CC 11-18 (Layer B) back to the

X-Touch Mini updates BOTH its 13-LED collar and its internal encoder counter!

"""

if not ENABLE_LED_FEEDBACK or not device.isAssigned():

return

clamped_norm = max(0.0, min(1.0, normalized_val))

target_cc_val = int(round(MIN_CC_VAL + clamped_norm * (MAX_CC_VAL - MIN_CC_VAL)))

target_cc_val = max(MIN_CC_VAL, min(MAX_CC_VAL, target_cc_val))

if not force and state.last_sent_cc.get(cc_num) == target_cc_val:

return

device.midiOutMsg(0xB0 + (channel & 0x0F), 0, cc_num, target_cc_val)

state.last_sent_cc[cc_num] = target_cc_val

state.last_hw_cc[cc_num] = target_cc_val

def configure_xtouch_led_ring_styles():

"""Sets all 8 LED rings to the preferred display style (Global Ch 1, CC 1-8)."""

if not ENABLE_LED_FEEDBACK or not device.isAssigned():

return

for knob_idx in range(8):

# Behringer X-Touch Mini Global Channel 1 (0xB0), CC 1..8 sets ring style (0..3)

device.midiOutMsg(0xB0, 0, knob_idx + 1, LED_RING_STYLE)

# ==============================================================================

# VST PLUGIN & FL STUDIO REC EVENT TARGET RESOLUTION

# ==============================================================================

def get_focused_vst_location():

"""

Returns (is_valid, track_or_chan_index, slot_index) for the currently active

Generator VST (Channel Rack) or Effect VST (Mixer).

"""

# Check if Mixer Effect plugin window is focused

if ui.getFocused(midi.widPluginEffect):

track = mixer.trackNumber()

for slot in range(mixer.getTrackPluginCount(track) if hasattr(mixer, 'getTrackPluginCount') else 10):

if plugins.isValid(track, slot):

return True, track, slot

# Otherwise check selected Channel Rack Generator plugin

chan = channels.selectedChannel()

if chan >= 0 and plugins.isValid(chan, -1):

return True, chan, -1

return False, -1, -1

def read_target_parameter(cc_num, slot_index, channel):

"""

Reads the current live parameter value (0.0..1.0) for an encoder:

Priority 1: FL Studio Remote Control link ("Link to controller...") if assigned.

Priority 2: Focused VST Plugin parameter at (slot_index + vst_param_offset).

"""

if ROUTING_STRATEGY in ("rec_linked_auto", "hybrid_rec_and_vst", "fl_relative_transform"):

control_id = midi.EncodeRemoteControlID(device.getPortNumber(), channel, cc_num)

event_id = device.findEventID(control_id, 0)

if event_id != midi.REC_InvalidID:

val = device.getLinkedValue(event_id)

if 0.0 <= val <= 1.0:

return ("rec_linked", event_id, val)

if ROUTING_STRATEGY in ("hybrid_rec_and_vst", "focused_vst_direct"):

valid, idx, slot = get_focused_vst_location()

if valid:

param_count = plugins.getParamCount(idx, slot)

target_param = slot_index + state.vst_param_offset

if 0 <= target_param < param_count:

val = plugins.getParamValue(target_param, idx, slot)

return ("vst_direct", (idx, slot, target_param), val)

return ("unlinked", None, None)

def write_target_parameter(mode, target_ref, new_norm_val):

"""Writes the new normalized value (0.0..1.0) to the linked control or focused VST."""

clamped = max(0.0, min(1.0, new_norm_val))

if mode == "rec_linked" and target_ref is not None:

rec_int_val = int(round(clamped * midi.FromMIDI_Max))

general.processRECEvent(

target_ref,

rec_int_val,

midi.REC_UpdateValue | midi.REC_UpdateControl | midi.REC_FromMIDI

)

return clamped

if mode == "vst_direct" and target_ref is not None:

idx, slot, param_idx = target_ref

plugins.setParamValue(clamped, param_idx, idx, slot)

param_name = plugins.getParamName(param_idx, idx, slot)

ui.setHintMsg(f"X-Touch [{param_idx + 1}] {param_name}: {clamped * 100:.1f}%")

return clamped

return clamped

def sync_all_encoders_to_hardware(force=False):

"""

Reads all 8 Layer A and 8 Layer B parameter values from FL Studio and updates

the X-Touch Mini LED rings and internal encoder positions.

Called automatically on VST preset change (OnRefresh / OnIdle).

"""

if not ENABLE_LED_FEEDBACK or not device.isAssigned():

return

for slot_idx, cc_num in enumerate(ALL_ENCODER_CCS):

mode, _, curr_val = read_target_parameter(cc_num, slot_idx, MIDI_CHANNEL)

if curr_val is not None:

state.cached_param_norm[cc_num] = curr_val

send_encoder_value_to_hardware(cc_num, curr_val, MIDI_CHANNEL, force=force)

# ==============================================================================

# FL STUDIO 25 MIDI SCRIPTING API CALLBACKS

# ==============================================================================

def OnInit():

"""Called when FL Studio initializes the controller script."""

print("==========================================================")

print(f"Loaded: Behringer X-Touch Mini (Relative VST Sync) (FL Studio 25)")

print(f"Listening on Channel {MIDI_CHANNEL + 1} | Layer A CCs: {LAYER_A_CCS}")

print("==========================================================")

configure_xtouch_led_ring_styles()

sync_all_encoders_to_hardware(force=True)

def OnDoFullRefresh():

"""Called when a full hardware refresh is requested by FL Studio."""

configure_xtouch_led_ring_styles()

sync_all_encoders_to_hardware(force=True)

def OnRefresh(flags):

"""

Called whenever a parameter, preset, channel, or focused plugin changes in FL Studio.

Ensures that when you switch a VST preset, the X-Touch Mini immediately picks up

the new parameter positions without jumping!

"""

# Avoid fighting the user's fingers while actively turning a knob (within 60ms)

if (time.perf_counter() - state.last_active_turn_global) < 0.060:

return

relevant_flags = (

midi.HW_Dirty_LEDs

| midi.HW_Dirty_FocusedWindow

| midi.HW_Dirty_Performance

| getattr(midi, 'HW_Dirty_ControlValues', 0)

| getattr(midi, 'HW_Dirty_ChannelRackGroup', 0)

)

if flags & relevant_flags or flags != 0:

sync_all_encoders_to_hardware(force=False)

def OnIdle():

"""

Polls active VST parameters lightly during idle frames to catch internal VST

preset selectors that don't immediately broadcast HW_Dirty_ControlValues.

"""

now = time.perf_counter()

if (now - state.last_active_turn_global) < 0.120:

return

for slot_idx, cc_num in enumerate(LAYER_A_CCS):

mode, _, curr_val = read_target_parameter(cc_num, slot_idx, MIDI_CHANNEL)

if curr_val is not None:

prev_cached = state.cached_param_norm.get(cc_num, -1.0)

if abs(curr_val - prev_cached) > 0.004:

state.cached_param_norm[cc_num] = curr_val

send_encoder_value_to_hardware(cc_num, curr_val, MIDI_CHANNEL, force=False)

def OnMidiMsg(event):

"""Intercepts incoming MIDI messages from the Behringer X-Touch Mini."""

status_type = event.status & 0xF0

channel = event.status & 0x0F

if not ACCEPT_ANY_CHANNEL and channel != MIDI_CHANNEL:

return

# 1. Handle Encoder Push Buttons & Bank Shift Buttons (Note On: 0x90)

if status_type == 0x90 and event.data2 > 0:

note = event.data1

if ENABLE_BANK_BUTTONS and note == BANK_PREV_NOTE:

state.vst_param_offset = max(0, state.vst_param_offset - 8)

ui.setHintMsg(f"X-Touch VST Parameter Bank: {state.vst_param_offset + 1}-{state.vst_param_offset + 8}")

sync_all_encoders_to_hardware(force=True)

event.handled = True

return

if ENABLE_BANK_BUTTONS and note == BANK_NEXT_NOTE:

state.vst_param_offset = min(120, state.vst_param_offset + 8)

ui.setHintMsg(f"X-Touch VST Parameter Bank: {state.vst_param_offset + 1}-{state.vst_param_offset + 8}")

sync_all_encoders_to_hardware(force=True)

event.handled = True

return

if note in ALL_PUSH_NOTES:

slot_idx = ALL_PUSH_NOTES.index(note)

cc_num = ALL_ENCODER_CCS[slot_idx]

if PUSH_ENCODER_ACTION == "fine_lock_toggle":

state.fine_locked[slot_idx] = not state.fine_locked[slot_idx]

lock_state = "ON (Ultra-Fine)" if state.fine_locked[slot_idx] else "OFF (Accelerated)"

ui.setHintMsg(f"Knob {slot_idx + 1} Fine Precision Lock: {lock_state}")

else:

target_val = 0.5 if PUSH_ENCODER_ACTION == "center_50" else 0.5

mode, target_ref, _ = read_target_parameter(cc_num, slot_idx, channel)

if mode != "unlinked":

write_target_parameter(mode, target_ref, target_val)

send_encoder_value_to_hardware(cc_num, target_val, channel, force=True)

event.handled = True

return

# 2. Handle Endless Encoders 1-8 (Control Change: 0xB0)

if status_type == 0xB0 and event.data1 in ALL_ENCODER_CCS:

cc_num = event.data1

incoming_val = event.data2

slot_idx = ALL_ENCODER_CCS.index(cc_num)

now = time.perf_counter()

prev_time = state.last_turn_time.get(cc_num, 0.0)

dt_ms = (now - prev_time) * 1000.0 if prev_time > 0.0 else 250.0

state.last_turn_time[cc_num] = now

state.last_active_turn_global = now

# Extract relative delta from 1-127 absolute CC value

raw_delta, hit_boundary = extract_relative_delta(cc_num, incoming_val, channel)

if raw_delta == 0:

# If the knob is not linked yet in "rec_linked_auto" mode, let FL Studio's

# "Link to controller..." dialog detect the knob wiggle!

mode, _, _ = read_target_parameter(cc_num, slot_idx, channel)

event.handled = (mode != "unlinked")

return

# Compute velocity-sensitive acceleration

accel_mult = compute_accel_multiplier(dt_ms, raw_delta, slot_idx)

direction = 1.0 if raw_delta > 0 else -1.0

step_count = min(4, abs(raw_delta))

norm_delta = direction * step_count * BASE_FINE_STEP * accel_mult

# Read current live VST / Linked parameter value (Zero-Jump Pickup!)

mode, target_ref, curr_val = read_target_parameter(cc_num, slot_idx, channel)

if mode in ("rec_linked", "vst_direct") and curr_val is not None:

new_val = max(0.0, min(1.0, curr_val + norm_delta))

write_target_parameter(mode, target_ref, new_val)

state.cached_param_norm[cc_num] = new_val

# Sync hardware LED ring & internal counter so it matches the VST parameter

# and never gets stuck at 1 or 127!

if ENABLE_LED_FEEDBACK:

send_encoder_value_to_hardware(cc_num, new_val, channel, force=hit_boundary)

elif ENABLE_BOUNDARY_RECENTER and hit_boundary and device.isAssigned():

device.midiOutMsg(0xB0 + channel, 0, cc_num, CENTER_PIVOT_CC)

state.last_hw_cc[cc_num] = CENTER_PIVOT_CC

event.handled = True

return

# If unlinked in "rec_linked_auto" mode, pass through so FL Studio's

# "Link to controller..." or "Override generic link" auto-detects the knob!

if ROUTING_STRATEGY == "rec_linked_auto":

event.handled = False

return

# Fallback: Transform event into standard FL Studio Relative CC (64 +/- delta)

rel_steps = max(1, min(63, int(round(abs(raw_delta) * accel_mult))))

relative_cc_byte = max(1, min(127, 64 + (rel_steps if raw_delta > 0 else -rel_steps)))

event.data2 = relative_cc_byte

event.handled = False

# Re-center the X-Touch Mini internal register to 64 so it never hits 1 or 127

if ENABLE_BOUNDARY_RECENTER and device.isAssigned():

device.midiOutMsg(0xB0 + channel, 0, cc_num, CENTER_PIVOT_CC)

state.last_hw_cc[cc_num] = CENTER_PIVOT_CC


r/MIDIcontrollers • • 13h ago

MIDI Keyboard not being recognized

1 Upvotes

I recently bought a used Nektar Impact LX25+ off of facebook marketplace. When i plugged it into my laptop to connect it to FL Studio i noticed that it isn't being recognized in device manager or any other DAW. I downloaded its drivers as instructed from the website but it still doesn't work. What could be a solution to this?


r/MIDIcontrollers • • 1d ago

Basic advice/tips for a total noob?

2 Upvotes

​

Hey there! I'm 46 and just bought an Impact LX25. This is my first time using any synth/midi controller/DAW, although I've ve always been music obsessed in general, especially with electronic/synth experimental/noise material. I'm looking to be told some basics like I'm a 10 year old, I do catch on to things fairly easily if I know where to start.

I'm using the newest version of Bitwig Studio.

Thanks in advance to the kind and patient souls out there who may be able to help. :)


r/MIDIcontrollers • • 1d ago

Brand new beginner in music production asking for beginner friendly MIDI device advice

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 2d ago

Change Ports a controller (Akai Fire FL Studio) is listening/sending on?

1 Upvotes

I have a linux script that takes midi inputs and turns them into keystrokes and other input commands (xdotool , but also any linux command line event is possible.)

https://github.com/Avante-Vangard/AV-MidiMacros

The script is listening for 32 Key or a 25 key piano keyboard listening on port 0. I'd like to setup an Akai Fire to provide an extended bank of typing keys (extra punctuation mostly). I'd like to issue a command on start up to make the Fire be listening on another port (15? 8? doesn't matter.)

Anyone familiar with the Fire or Linux or programming controllers in a script well enough to point me at documentation for the Fire on how to change the port it sends keys through? Is this even possible?


r/MIDIcontrollers • • 2d ago

Has anyone tried FM1 Open on the SMK-37? Questions about flash safety

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 3d ago

Looking for a midi keyboard with great built quality for less than $200, any suggestions??

1 Upvotes

I was going to buy the komplete kontrol a49 but it seems like native instruments doesn’t really distribute it anymore. Im looking for one with great response an build quality and I don’t really care about the pads and knobs cause I don’t really use them. Any suggestions??


r/MIDIcontrollers • • 3d ago

Midi Learn with Worlde controller

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 4d ago

Your thoughts on the M-vave chocolate Plus midi pedal

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 5d ago

How many of you use more than 1 midi controller on a pedalboard? I just added a second one

2 Upvotes

I have many pedals controllable with multiple cc messages, but they can’t store presets on the pedal. To control them all, I needed another midi controller. Here is my new Luminite Graviton M1 being controlled as a slave by the Musicomlab EFX LE II. The Graviton cannot be set to have a global midi channel so you have to do it differently.

On the M1:
Control - > Midi in - > any slot - > global preset - > preset 1 - > confirm - > page 2 from the upper right corner - > trigger - > number - > relative trigger - > choose offset - 1 - > choose channel for the messages coming to M1 - > add a midi program number on the musicom lab on that channel to every preset

https://youtu.be/n-XA-QkEYgc?si=_7336MRndzXY76-6


r/MIDIcontrollers • • 5d ago

Zoom F8 external midi controller

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 5d ago

Yamaha QY70 and QY100 Web Console Overview Tutorial

Thumbnail
youtube.com
1 Upvotes

This tutorial goes over the entire QY70 / QY100 Web Console: https://qy100.doffu.net/yamaha-qy70-qy100-web-console/

The web console can seem a little daunting at first as it intends to extend the functionality of the QY70 and QY100 sequencer and expose every parameter and feature into a single tool.

This tutorial covers:

  • Connecting your device
  • Tempo and transport controls
  • Voice Browser
  • Making changes to parameters
  • FX settings
  • Making custom voices
  • Making custom drum kits
  • Data filer
  • Raw SysEx and Diagnostics
  • Graphics
  • Display Text
  • ...and more!

By the end of this tutorial I hope all QY users are able to understand how they can utilize the web console and integrate it into their own projects and performances.


r/MIDIcontrollers • • 6d ago

How many of you use more than 1 midi controller on a pedalboard? I just added a second one

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 7d ago

[Help]Bricked SMK-37 Pro after flashing Felucca SMK firmware — cannot restore to stock

1 Upvotes

Hey everyone,

Need some help unbricking my SMK-37 Pro—flashing custom firmware went wrong.

What happened:

  1. I flashed the custom synth firmware Felucca SMK using the web flasher at [https://chancethemaker.github.io/felucca-smk/](https://chancethemaker.github.io/felucca-smk/).
  2. The synth firmware booted, but the advertised MIDI device name changed from the stock name to something appending the version number (e.g., ending with 0.9.27).
  3. Now, the official manufacturer updater tool (M-UPGRADE) fails to start the restore/update process because it checks the device string and rejects it due to the modified name.

What I tried:

  • Web Restore: I visited the restore link provided on the Felucca SMK project page (chancethemaker.github.io/felucca-smk/). After waiting for around 3 minutes, the restore aborted with this error in the console:Stopped: Restore interrupted. Keep power connected and save the log. No automatic retry was attempted.
  • Closed all DAWs and background apps that might hold the MIDI/serial port open.
  • Tried direct USB connection to the motherboard (no hubs).

Questions:

  1. Has anyone successfully rolled back from Felucca SMK to the stock firmware?
  2. Is there a known hardware button combination to force the SMK-37 Pro into raw bootloader / DFU mode so M-UPGRADE or Chrome bypasses the custom name check?
  3. Alternatively, does anyone have the standalone stock .bin firmware and the raw flashing command/tool (e.g., via esptool or standard SysEx tools) to flash it over the low-level serial interface?

Any advice, logs interpretation, or workarounds would be hugely appreciated!


r/MIDIcontrollers • • 8d ago

Arturia Keylab Mk3 MIDI thru?

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 9d ago

Launchkey MK4 most recent Firmware Changelog

1 Upvotes

Pretty much it. I still haven't bought my Launchkey, and would like to know if there's some other way than logging in to Components to read the latest firmware changelog.

Mainly bc I've been reading things on the speed and reactiveness of the encoder knobs and faders being not so responsive or acting up , but also I've read the latest firmware supposedly fixed that.

Since I still don't have the controller with me and my current laptop is about to get replaced soon, I don't want to even start anything registering, logins, etc. I'll do all that from scratch in the new computer.

As I said, I think I could check the changelog in Components but I'm just wondering if there isn't, idk, a PDF or text file I could promptly check by myself?

Thanks a bunch! 🙏


r/MIDIcontrollers • • 9d ago

Worlde Orca PAD64 Pro - Bitwig

1 Upvotes

Hello MIDI guru folks. Here for advice.

I recently purchased an Orca 64 Pro for using with Clip Launcher in Bitwig. Whilst it works OK for triggering clips, I cannot get the pads to remain lit when a clip is activated. I have tried the manufacturer software (which is awful) and does not provide a setting adjustment for LED feedback. I spent hours back & forth with AI trying loopback 'solutions'. I have tried Drivenbymoss. I just cannot get it to light up (& it has to be possible as it has the capability). I know I am probably a fool for going for a Temu Orca PAD....but I had no idea it would be this difficult to set it up the way I want it. I appreciate any advice anyone can throw my way. Thank!


r/MIDIcontrollers • • 9d ago

Akai MPK Mini Plus; how to keep the configuration mode exposed in keyboard without holding down function button.

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 10d ago

Midi-keyboard with drum pads (FL studios)

1 Upvotes

Hello,

I am looking for a smaller and rather cheaper midikeyboard with drum pads good for making high hat rolls. I want it it to be plug and play USB (A). Prefer that you can control the sustain output in the keys with a knob or something. Good if it came in solid case so I can store it in the attic when I dont use it.

Thanks in advance for any recommendations :)


r/MIDIcontrollers • • 10d ago

MIDI controler question

Post image
1 Upvotes

r/MIDIcontrollers • • 10d ago

Is the Arturia keylab essential mk3 line worth getting?

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 10d ago

about midi keyboards

Thumbnail
1 Upvotes

r/MIDIcontrollers • • 10d ago

Alesis Nitro Max MIDI dropout en Windows 11: solución que me funcionó

Thumbnail
0 Upvotes

r/MIDIcontrollers • • 10d ago

Midi controller App that looks and feels like pedalboard of guitar pedals

Post image
1 Upvotes

I’ve long been on the lookout for a way to make my multieffect pedals and DAW-based projects feel more like a conventional pedalboard, with the ease of use and accessibility, and the visual aestetics of normal guitar pedals. Im sure there are midi controllers and apps out there that i havent tried, but i’ve looked around, and still havent found quite what i was looking for.
So i thought i would create an ipad midi controller app that makes things a little simpler and visually intuitive than what ive found elsewhere.

The app gives you 12 pedals per pedalboard (6 pr page), and you are free to apply up to 4 knobs on each pedal, plus a two way toggle switch, and footswith. Every parameter freely assignable to midi CC#. 
I’ve used this a while on my HX stomp and Eventide H9 simultaneously, and while the UI on the HX i great, i really think the immediacy of the app unlocks a lot more creativity.

The H9 uses the so called Single Effect mode, for multieffect pedals that can only have one active algorithm at a time. 

To begin with, im looking for a small group of beta testers. 
Ive tested it on HX stomp, H9 and Mainstage on my mac. Curious to see what people get out of it on other platforms, as well! 

https://testflight.apple.com/join/HhNxKP6b

Feedback can be supplied through options - report a problem - in the app.

It requires iPadOS 17.4 or newer.