FL Studio Integration¶
Guide to integrating with FL Studio's Python API.
Overview¶
FL Studio provides a Python API for scripting and automation. This server exposes that API through the MCP protocol.
Requirements¶
- FL Studio installed and running
- Python API enabled (automatic in recent versions)
- MIDI ports configured (optional, for MIDI features)
Python API Setup¶
FL Studio's Python API is automatically available when FL Studio is running. No additional installation required.
Verifying API Access¶
Test if the API is available:
If this fails, the FL Studio API is not available (but MIDI will still work).
Available APIs¶
Transport Control¶
Control playback and recording:
# Start/stop playback
transport_start()
transport_stop()
# Toggle recording
transport_record()
# Position control
pos = transport_get_song_pos()
transport_set_song_pos(position=1920) # 1 bar at 960 PPQ
Mixer Control¶
Control mixer tracks:
# Get/set volume (0.0 to 1.0)
vol = mixer_get_track_volume(track_num=0)
mixer_set_track_volume(track_num=0, volume=0.8)
# Track naming
name = mixer_get_track_name(track_num=1)
mixer_set_track_name(track_num=1, name="Drums")
Channel Control¶
Control generator channels:
# Channel info
count = channels_channel_count()
name = channels_get_channel_name(channel_num=0)
# Channel settings
channels_set_channel_volume(channel_num=0, volume=0.9)
channels_mute_channel(channel_num=0, mute=True)
Pattern Control¶
Manage patterns:
# Pattern info
count = patterns_pattern_count()
name = patterns_get_pattern_name(pattern_num=0)
# Rename patterns
patterns_set_pattern_name(pattern_num=0, name="Intro")
Project Information¶
Get project details:
# Project title
title = general_get_project_title()
# FL Studio version
version = general_get_version()
UI Control¶
Control FL Studio windows:
Playlist Control¶
Manage playlist tracks:
API Limitations¶
Read-Only Operations¶
Some operations are read-only. You can get values but not set them:
- Project title (read-only)
- FL Studio version (read-only)
- Playlist track names (currently read-only)
Timing¶
API calls are synchronous and may block briefly. For real-time applications, use MIDI instead.
Availability¶
The API is only available when:
- FL Studio is running
- The server can import FL Studio modules
- You're running on the same machine as FL Studio
Best Practices¶
Error Handling¶
Always check if FL Studio is available:
try:
version = general_get_version()
print(f"FL Studio {version} detected")
except:
print("FL Studio not available, using MIDI only")
Position Values¶
Song positions are in ticks:
- Default: 960 PPQ (parts per quarter note)
- 1 bar (4/4) = 3840 ticks
- 1 beat = 960 ticks
- 1 bar (3/4) = 2880 ticks
Track Numbering¶
- Track 0 = Master
- Track 1+ = Mixer inserts
- Channels start at 0
Volume Ranges¶
- API volume: 0.0 to 1.0 (float)
- MIDI velocity: 0 to 127 (int)
Convert between them:
# MIDI to API
api_volume = midi_velocity / 127.0
# API to MIDI
midi_velocity = int(api_volume * 127)
Troubleshooting¶
API Not Available¶
If FL Studio API calls fail:
- Check FL Studio is running
- Verify you're on Windows (FL Studio is Windows-only)
- Use MIDI as alternative (works without FL Studio API)
Import Errors¶
The server gracefully handles missing FL Studio modules:
- Returns stub modules when FL Studio not available
- MIDI features continue to work
- Error messages indicate unavailability
Permission Issues¶
FL Studio API requires:
- Same user account as FL Studio
- No elevated privileges needed
Advanced Usage¶
Workflow Automation¶
# Complete project setup
def setup_project():
# Stop playback
transport_stop()
transport_set_song_pos(position=0)
# Name mixer tracks
mixer_set_track_name(track_num=1, name="Drums")
mixer_set_track_name(track_num=2, name="Bass")
mixer_set_track_name(track_num=3, name="Lead")
# Set initial volumes
mixer_set_track_volume(track_num=1, volume=0.8)
mixer_set_track_volume(track_num=2, volume=0.7)
mixer_set_track_volume(track_num=3, volume=0.6)
# Name patterns
patterns_set_pattern_name(pattern_num=0, name="Intro")
patterns_set_pattern_name(pattern_num=1, name="Verse")
patterns_set_pattern_name(pattern_num=2, name="Chorus")
setup_project()
Combining with MIDI¶
Use FL Studio API for project structure and MIDI for note data:
# Setup structure via API
mixer_set_track_name(track_num=1, name="Melody")
patterns_set_pattern_name(pattern_num=0, name="Main")
# Send notes via MIDI
midi_connect()
for note in [60, 64, 67, 72]:
midi_send_note(note=note, velocity=80, duration=0.25)
Reference¶
FL Studio API Documentation¶
Window IDs¶
Common window IDs for ui_show_window():
- 0: Mixer
- 1: Playlist
- 2: Channel Rack
- 3: Browser