This project contains three Bitwig Studio controller extensions. Some of it was written with Cursor.
Currently, requires the latest API version. Copy the release files with .bwextension
to
c:\Users\<your-user>\Documents\Bitwig Studio\Extensions
and add the extensions to your running
Bitwig in the settings -> controllers section
Create music similar to trackers from the 90s by having patterns and having pattern triggers.
Core Concept: Empty trigger clips in a "Patterns" group automatically launch corresponding content clips in a "Devices" group when their names match.
- Name-Based Triggering: Pattern clips (usually empty) trigger device clips with matching names
- Transport-Aware Operations: Device clips only trigger when transport is playing; stop when transport stops
- Stop Commands: Use
[stop] TrackName
to stop specific device tracks - Continue/Stop playing pattern: Choose whether device clips continue playing after pattern clips end
- Remap Button: Triggers reload of mapping between pattern and device clips - this is a workaround for until a better solution is found
- Error Handling: Missing clips or invalid mappings are ignored
The Pattern Tracker extension allows a 90s tracker-like experience using Bitwig's clip launcher
The extension requires two specific Group Tracks in your Bitwig project:
Create a Group Track named exactly "Devices" containing:
- Device/Instrument tracks with the actual musical content
- Content clips with note and/or audio clips (e.g., "Intro", "Verse A", "Chorus", "Bridge")
- Audio clips, note clips with working device chains that make up your patterns
- Unique names required: No two clips should have identical names to avoid mapping conflicts
- Nested groups supported: You can organize tracks into subgroups for better organization
Create a Group Track named exactly "Patterns" containing:
- Child tracks with pattern clips that reference device clips from the Devices group by name
- Stop command clips named
[stop] TrackName
(e.g.,[stop] Bass
,[stop] Drums
) This immediately stops the track with the name after the command (it is not possible to stop clips with the API) - Nested groups supported: You can organize trigger tracks into subgroups for better organization
- Real-time Updates: Automatic remapping when clip names change or clips are moved around
-
Configure Settings (in preferences):
- Number of Tracks per Group:
- Default 5
- How many tracks are "seen" by this extension within the Devices and the Patterns group
- the higher, the more resources this may drain from your system
- Number of root Groups: Default 2 (Patterns + Devices groups) - if the first two groups are the aforementioned groups, you don't need more than the value 2 here.
- Number of Slots per Track:
- Default is 5
- How many slots in the clip launcher are "seen" by this extension within the Devices and the Patterns group
- the higher, the more resources this may drain from your system
- Stop Keyword: Default
[stop]
(customize if you want to use a different word) - It is unknown if these settings could just be fixed to maximum values due to possible performance considerations. The extension needs to observe changes in your project and remap automatically.
- Number of Tracks per Group:
-
Initial Mapping:
- Press "Remap Clips" button in extension settings after loading your project. This is required and serves as a workaround for limitations of the Bitwig API.
Step recording with various step lengths
-
Toggle: Enable/disable: arm or disarm this extension
-
Disabled when switching to a different clip: disables itself automatically when opening a different clip. Depends on two settings that require to have a value bigger than 0:
- Scenes per track observed
- Tracks observed
Everything beyond these observation scopes is ignored in terms of the functionality provided, i.e., the step recording is not disabled automatically and the internal step recording cursor is not reset to the start of the clip
When changing either observation settings, reload the extension (by disabling and enabling it again). The extension cannot update these values while running due to the limitations of the API available.
-
Step Recording: Play notes on your MIDI keyboard to add them to the currently selected clip in the clip launcher
-
Navigate backward/forward: Move cursor back and forth. This allows to fix mistakes or insert gaps. Can be combined with Toggle: clear while moving cursor to either delete while navigating or go back and add more
-
Musical Note Lengths: Standard note lengths from 32/1 down to 1/64
-
Triplet Support: Regular and triplet timing for all note values
-
Note Velocity: velocity of the midi input or a fixed value is used for all notes added to the selected clip. Two settings allow to change that:
- Fixed Velocity: set to ✓ for the Note Velocity Value setting to be used
- Note Velocity: the fixed velocity value (0-127) to use
-
Chord Detection: 100ms threshold for chord recognition to enter chords at the current position
-
MIDI Learn Navigation: CC-based cursor movement controls
-
Toggle: clear old notes: New notes at the same position replace existing ones or don't depending on the toggle setting
-
Toggle: clear while moving cursor: delete notes when moving forward or backward, allows to insert gaps or delete mistakes
-
Button. clear notes under cursor: deletes notes at the current position
-
Sleep when transport is playing: is temporarily disabled when transport is playing, but remembers if it was enabled prior to starting transport
-
MIDI learn for all features: go to preferences of controller extension and click on "Learning..." button and send CC values. When learning was successful, neither "Learning..." nor "Not Mapped" appear clicked.
Enables using one hardware MIDI controller with multiple Bitwig extensions simultaneously:
- MIDI Routing: Receives MIDI input from one hardware device and forwards to multiple outputs (LoopMIDI or other virtual MIDI ports are recommended for this)
- Multi-Extension Support: Use your controller with original manufacturer extension plus custom extensions like the step recording extension
- Complete MIDI Support: Forwards all MIDI message types including Note On/Off, CC, and SysEx
- Simultaneous Operation: Hardware controller functions normally while custom extensions receive input
The MIDI Splitter is the key to using multiple extensions with one controller. Here's how to set it up:
- Windows: LoopMIDI (free)
- Mac: unknown
- Linux: unknown
Hardware Controller (e.g., Akai MPK mini plus)
↓
MIDI Splitter Extension
↓
┌─────────────┐
↓ ↓
Virtual Port A Virtual Port B
↓ ↓
Original Second
Hardware Extension (e.g. step recorder from above)
Extension
- Install sdkman on WSL2 (https://sdkman.io/install)
sdk install java
sdk install maven
sdk install mvnd
- Copy .env.dist to .env and replace
<user>
with your real user. - run
./install.sh