Complete reference for FL Studio's Python API: MIDI controller scripting (14 modules, 427+ functions), piano roll note manipulation, Edison audio editing, and FLP file parsing with PyFLP.
import general
print(f"API Version: {general.getVersion()}")
Place scripts in Shared\Python\User Scripts folder.
Purpose: Control FL Studio through hardware MIDI controllers and send feedback to devices.
Runs: Continuously while FL Studio is open.
Available modules: transport, mixer, channels, arrangement, patterns, playlist, device, ui, general, plugins, screen, launchMapPages, utils, callbacks
Entry points:
def OnInit():
"""Called when script starts."""
pass
def OnDeInit():
"""Called when script stops."""
pass
def OnMidiMsg(msg):
"""Called for incoming MIDI messages."""
pass
def OnControlChange(msg):
"""Called for CC messages."""
pass
def OnNoteOn(msg):
"""Called for note-on messages."""
pass
def OnRefresh(flags):
"""Called when FL Studio state changes."""
pass
Purpose: Manipulate notes and markers in the piano roll editor.
Runs: Once when user invokes through Scripts menu.
Available modules: flpianoroll, enveditor
import flpianoroll
score = flpianoroll.score
for note in score.notes:
note.velocity = 0.8 # Set all velocities to 80%
Purpose: Edit and process audio samples in Edison.
Runs: Once within Edison's context.
Available modules: enveditor
Navigate to the appropriate reference file based on what you need to control.
Read these files ONLY when you need specific API signatures.
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| transport | 20 | Play, stop, record, position, tempo, looping | api-transport.md |
| mixer | 69 | Track volume/pan/mute/solo, EQ, routing, effects | api-mixer.md |
| channels | 48 | Channel rack, grid bits, step sequencer, notes | api-channels.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| arrangement + patterns | 9 + 25 | Markers, time, pattern control, groups | api-arrangement-patterns.md |
| playlist | 41 | Playlist tracks, live mode, performance, blocks | api-playlist.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| device | 34 | MIDI I/O, sysex, dispatch, hardware refresh | api-device.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| ui + general | 71 + 24 | Windows, navigation, undo/redo, version, snap | api-ui-general.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| plugins | 13 | Plugin parameters, presets, names, colors | api-plugins.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| screen + launchMapPages | 9 + 12 | AKAI Fire screen, launchpad page management | api-screen-launchmap.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| utils + constants | 21 | Color conversion, math, note names, MIDI tables | api-utils-constants.md |
| Module | Functions | What It Controls | Reference |
|---|---|---|---|
| -------- | ----------- | ----------------- | ----------- |
| callbacks | 26 | All callback functions, FlMidiMsg class, event flow | api-callbacks.md |
Note, Marker, ScriptDialog, score classes for piano roll manipulation plus Edison enveditor utilities.
External library for reading/writing .flp project files without FL Studio running. Batch processing, analysis, automated generation.
See pyflp.md
# name=My Controller
# url=https://example.com
import device
import mixer
import transport
def OnInit():
if device.isAssigned():
print(f"Connected: {device.getName()}")
def OnDeInit():
print("Script shut down")
def OnControlChange(msg):
if msg.data1 == 7: # Volume CC
mixer.setTrackVolume(mixer.trackNumber(), msg.data2 / 127.0)
msg.handled = True
def OnNoteOn(msg):
track = msg.data1 % 8
mixer.setActiveTrack(track)
msg.handled = True
def OnRefresh(flags):
pass # Update hardware display here
def OnInit():
if not device.isAssigned():
print("No output device linked!")
return
# Safe to use device.midiOutMsg() etc.
def OnControlChange(msg):
if msg.data1 == 7:
mixer.setTrackVolume(0, msg.data2 / 127.0)
msg.handled = True # Prevent FL Studio from also processing this
def OnRefresh(flags):
if device.isAssigned():
# Update volume fader LED
vol = int(mixer.getTrackVolume(0) * 127)
device.midiOutMsg(0xB0, 0, 7, vol)
For complete examples (MIDI learn, scale enforcer, LED feedback, batch quantization, sysex handling, performance monitoring, automation engine, debugging):
device.directFeedback() for controller echodevice.isAssigned() before device functionsdevice.isAssigned() returns TrueShared\Python\User Scripts folderflpianoroll.score.notesOnIdle() (called every ~20ms)device.setHasMeters() only if peak meters are neededdevice.isDoubleClick(index)device.dispatch(ctrlIndex, message)device.midiOutMsg(0x90, 0, note, velocity) for note-on LEDsOn* callbacks for modern codeui module; full UI automation not availabledevice.getName() to identify, handle per-port共 1 个版本