Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/InventiveRhythm/fluXis/llms.txt

Use this file to discover all available pages before exploring further.

Map events are the visual layer of a fluXis map. While hit objects and timing points define when to play, events define what to show — screen flashes, colour shifts, playfield rotations, shader overlays, camera moves, and much more. Events live in a separate file referenced by the map’s EffectFile property (typically a .fse file), and they are loaded and sorted by time before gameplay begins. Every event shares the same base property (time) and many also carry group, duration, and ease fields for smooth animated transitions.
All time values are in milliseconds from the start of the audio track — the same coordinate space as hit objects and timing points. Events are sorted by time on load, so their order in the JSON file does not matter.

Effect file structure

The .fse file is a plain JSON object whose keys correspond to event-type arrays:
{
  "flash": [],
  "laneswitch": [],
  "colorfade": [],
  "pulse": [],
  "shader": [],
  "shake": [],
  "beatpulse": [],
  "playfieldmove": [],
  "playfieldscale": [],
  "playfieldrotate": [],
  "layerfade": [],
  "hitease": [],
  "scroll-multiply": [],
  "time-offset": [],
  "camera-move": [],
  "camera-scale": [],
  "camera-rotate": [],
  "loops": [],
  "notes": []
}
Any array may be omitted or left empty; the engine initialises missing lists to empty on load.

Common fields

Nearly every event type includes the following properties:
FieldTypeDescription
timenumberTrigger time in milliseconds (required).
groupstringOptional event group name for use with LoopEvent. Omitted from JSON when empty.
durationnumberLength of the animated transition in milliseconds (0 = instant).
easeEasingosu-framework easing function (integer or string). 0 = None (linear). Note: laneswitch and pulse use the key easing instead of ease.

Event types

A screen flash overlays a solid or fading colour rectangle across the entire screen (or behind the playfield). It animates from a start colour/opacity to an end colour/opacity over duration milliseconds.JSON key: flash
{
  "time": 4000,
  "duration": 500,
  "background": false,
  "ease": 0,
  "start-color": "#FFFFFF",
  "start-alpha": 1.0,
  "end-color": "#FFFFFF",
  "end-alpha": 0.0
}
background
boolean
default:"false"
When true, the flash renders behind the playfield (background layer). When false, it renders in front of everything.
start-color
string
Hex colour string for the beginning of the transition (default #FFFFFF).
start-alpha
float
Opacity at the start of the transition (0.01.0, default 1.0).
end-color
string
Hex colour string for the end of the transition (default #FFFFFF).
end-alpha
float
Opacity at the end of the transition (0.01.0, default 0.0).
Dynamically changes the number of active lanes mid-map. The transition is animated over speed milliseconds using the specified easing. This is the mechanism behind variable-keymode maps (e.g. alternating between 4K and 7K sections).JSON key: laneswitch
{
  "time": 16000,
  "count": 6,
  "speed": 300,
  "easing": 12
}
count
integer
required
The target lane count to switch to. Must be within the keymode range supported by the map.
speed
number
default:"0"
Duration of the lane-width animation in milliseconds. 0 means an instant switch.
easing
Easing
default:"OutQuint"
Easing function for the width animation. Defaults to OutQuint (value 12).
Set ls-v2: true in the .fsc file to use the improved visibility algorithm that correctly maps finger positions during the switch. All maps created with the modern editor have this flag set automatically.
Smoothly fades one or more of the three lane colour roles (primary, secondary, middle) to a new hex colour. The transition respects duration and ease. Only colour roles with their fade-* flag set to true are affected.JSON key: colorfade
{
  "time": 8000,
  "fade-primary": true,
  "primary": "#FF4466",
  "fade-secondary": false,
  "secondary": "#FFFFFF",
  "fade-middle": false,
  "middle": "#FFFFFF",
  "duration": 1000,
  "ease": 0,
  "playfield": 0,
  "subfield": 0
}
fade-primary
boolean
default:"false"
When true, the primary lane colour is transitioned.
primary
Color4
Target colour for the primary role.
fade-secondary
boolean
default:"false"
When true, the secondary lane colour is transitioned.
secondary
Color4
Target colour for the secondary role.
fade-middle
boolean
default:"false"
When true, the middle lane colour is transitioned.
middle
Color4
Target colour for the middle role.
playfield
integer
default:"0"
Zero-based index of the playfield to target. 0 = primary playfield.
subfield
integer
default:"0"
Sub-playfield index for split/mirrored dual-mode maps.
Expands and contracts a border ring around the playfield, creating a “pulse” effect. The ring grows to width pixels over the in-phase (in-percent * duration) and shrinks back to zero for the remainder of duration.JSON key: pulse
{
  "time": 2000,
  "width": 32,
  "duration": 400,
  "in-percent": 0.25,
  "easing": 0
}
width
float
default:"32"
Maximum border thickness in pixels at the peak of the pulse.
duration
number
default:"0"
Total duration of the pulse animation in milliseconds.
in-percent
float
default:"0"
Fraction of duration used for the expand phase (0.01.0). The remaining fraction is used for the collapse.
easing
Easing
default:"Out"
Easing function for the pulse animation. Uses the key easing (not ease). Defaults to Out.
Rapidly displaces the entire gameplay view in a random direction for the given duration, simulating an impact or explosion. Magnitude controls the maximum displacement distance.JSON key: shake
{
  "time": 5000,
  "duration": 600,
  "magnitude": 15
}
duration
number
required
How long the shake lasts in milliseconds.
magnitude
float
default:"10"
Maximum displacement in pixels per shake frame. Higher values produce a more violent effect.
Applies or animates a full-screen post-processing shader effect. Each shader has up to three independent strength parameters whose meanings vary by shader type. The transition can animate from start-params to end-params over duration milliseconds.JSON key: shader
{
  "time": 10000,
  "shader": "Bloom",
  "duration": 1000,
  "ease": 0,
  "use-start": true,
  "start-params": { "strength": 0.0 },
  "end-params":   { "strength": 0.8 }
}
shader
string
required
Name of the shader to apply. Valid values (from ShaderType enum):
NameDescription
BloomAdditive glow around bright elements
GreyscaleDesaturates the screen
InvertInverts all colours
ChromaticChromatic aberration (RGB fringe)
MosaicPixelation / mosaic tile effect
NoiseFilm grain / noise overlay
VignetteDark vignette around screen edges
RetroScanline retro CRT effect
HueShiftRotates hue of the entire screen
GlitchGlitch blocks — strength1=X, strength2=Y, strength3=block size
SplitScreenTiled mirror — strength2=splits X, strength3=splits Y
FishEyeFisheye lens distortion
ReflectionsRecursive reflections — strength2=scale
Glitch2Secondary glitch — strength1=amount, strength2=speed
use-start
boolean
default:"false"
When true, the shader is instantly set to start-params before animating to end-params.
start-params
object
Initial shader parameter values when use-start is true.
end-params
object
Target shader parameter values after the transition. Contains strength, strength2, and strength3 floats.
Creates a repeating zoom-in/zoom-out pulse that syncs to the beat. The playfield scales up to strength and returns to normal, repeating every interval beats for as long as the event is active.JSON key: beatpulse
{
  "time": 0,
  "strength": 1.05,
  "zoom": 0.25,
  "interval": 1
}
strength
float
default:"1.05"
Scale factor at the peak of each pulse (e.g. 1.05 = 5% zoom-in).
zoom
float
default:"0.25"
Fraction of the beat interval spent zooming in. The remaining fraction is used to zoom back out. Value is 0.01.0.
interval
float
default:"1"
How many beats between each pulse repetition. 1 = every beat, 2 = every other beat, 0.5 = twice per beat.
Fades the opacity of a specific visual layer within a playfield. Useful for hiding notes, the stage background, receptor keys, or the entire playfield.JSON key: layerfade
{
  "time": 30000,
  "duration": 500,
  "alpha": 0.0,
  "ease": 0,
  "layer": 0,
  "playfield": 0,
  "subfield": 0
}
alpha
float
required
Target opacity (0.0 = fully transparent, 1.0 = fully opaque).
layer
integer (FadeLayer)
default:"0"
Which layer to fade:
ValueNameDescription
0HitObjectsThe note/hold rendering layer
1StageThe playfield stage background
2ReceptorsThe receptor key indicators
3PlayfieldThe entire playfield
4HUDThe score / health HUD overlay
playfield
integer
default:"0"
Zero-based index of the target playfield.
subfield
integer
default:"0"
Sub-playfield index for dual-mode maps.
Animates the playfield’s position by offsetting it along the X, Y, and Z axes. All three axes transition simultaneously over duration using the given easing.JSON key: playfieldmove
{
  "time": 12000,
  "x": 100,
  "y": 0,
  "z": 0,
  "duration": 800,
  "ease": 12,
  "playfield": 0,
  "subfield": 0
}
x
float
default:"0"
Horizontal offset in pixels. Positive moves the playfield right.
y
float
default:"0"
Vertical offset in pixels. Positive moves the playfield down.
z
float
default:"0"
Depth offset (reserved for future 3D support). Currently has no visual effect.
playfield
integer
default:"0"
Zero-based index of the target playfield.
subfield
integer
default:"0"
Sub-playfield index for dual-mode maps.
Animates the playfield’s scale on X and Y axes independently. Values above 1.0 enlarge the playfield; values below 1.0 shrink it.JSON key: playfieldscale
{
  "time": 16000,
  "x": 1.2,
  "y": 1.0,
  "duration": 600,
  "ease": 12,
  "playfield": 0,
  "subfield": 0
}
x
float
default:"1"
Horizontal scale factor. 1.0 = normal width.
y
float
default:"1"
Vertical scale factor. 1.0 = normal height.
playfield
integer
default:"0"
Zero-based index of the target playfield.
subfield
integer
default:"0"
Sub-playfield index for dual-mode maps.
Rotates the entire playfield around its centre point. The rotation is expressed in degrees and animated over duration.JSON key: playfieldrotate
{
  "time": 20000,
  "roll": 45,
  "duration": 1000,
  "ease": 12,
  "playfield": 0,
  "subfield": 0
}
roll
float
default:"0"
Rotation angle in degrees. Positive values rotate clockwise. The playfield snaps back to 0 only if another playfieldrotate event explicitly sets it.
playfield
integer
default:"0"
Zero-based index of the target playfield.
subfield
integer
default:"0"
Sub-playfield index for dual-mode maps.
Changes the easing function applied to how hit objects approach the judgement line within their scroll group. This affects the visual feel of note movement — e.g. notes can accelerate in (InQuad) or decelerate out (OutQuad).JSON key: hitease
{
  "time": 24000,
  "ease": 3
}
ease
Easing
required
Any valid osu-framework Easing enum value. 0 = None (linear movement, the default).
Animates the scroll-speed multiplier for a named scroll group from its current value to multiplier over duration ms. Unlike a static ScrollVelocity, this provides a smooth eased transition between speeds.JSON key: scroll-multiply
{
  "time": 32000,
  "multiplier": 2.0,
  "duration": 500,
  "ease": 0,
  "groups": ["fast-layer"]
}
multiplier
float
default:"1"
Target scroll speed multiplier.
groups
string[]
Named scroll groups to apply the multiplier to. Empty array targets the default group.
Shifts the visual arrival time of all hit objects, making notes appear to arrive earlier or later on screen. Useful for creating rush/delay gimmicks where notes visually drift toward or away from the receptor while being hit on time musically.JSON key: time-offset
{
  "time": 40000,
  "offset": 200,
  "duration": 1000,
  "use-start": false,
  "start-offset": 0,
  "ease": 0
}
offset
number
required
Target visual time offset in milliseconds. Positive = notes appear earlier (rushed); negative = notes appear later (delayed).
use-start
boolean
default:"false"
When true, the offset snaps to start-offset before animating to offset.
start-offset
number
default:"0"
Initial offset when use-start is true.
Moves the game camera (the outer viewport transform) to a new X/Y position over duration milliseconds. Operates on a layer above all playfields.JSON key: camera-move
{
  "time": 50000,
  "x": 50,
  "y": -30,
  "duration": 800,
  "ease": 0
}
x
float
default:"0"
Horizontal camera offset in pixels.
y
float
default:"0"
Vertical camera offset in pixels.
Scales the camera viewport uniformly, zooming in or out on all playfields at once.JSON key: camera-scale
{
  "time": 52000,
  "scale": 1.15,
  "duration": 600,
  "ease": 0
}
scale
float
default:"1"
Uniform scale factor. 1.0 = no zoom, 1.5 = 50% zoom in, 0.8 = slight zoom out.
Rotates the entire camera viewport around its centre. All playfields and UI elements rotate together.JSON key: camera-rotate
{
  "time": 54000,
  "roll": -10,
  "duration": 800,
  "ease": 0
}
roll
float
default:"0"
Rotation angle in degrees. Positive = clockwise.
Repeats a named group of events a given number of times, each occurrence offset by distance milliseconds. This is a compile-time directive — when the effect file is loaded the engine expands all loop events into their constituent copies before sorting.JSON key: loops
{
  "time": 60000,
  "target": "my-flash-group",
  "distance": 500,
  "count": 8
}
target
string
required
The group name of the events to repeat. All events with a matching group field will be copied.
distance
number
required
Time offset in milliseconds between successive loop iterations.
count
integer
required
How many times to repeat the group (not including the original).
Displays a text string on screen at a specific time. Used for subtitles, karaoke lyrics, or in-game annotations. Content is free-form text.JSON key: notes
{
  "time": 5000,
  "content": "Welcome to fluXis!"
}
content
string
required
The text string to display on screen.

Quick-reference table

JSON keyC# classPrimary purpose
flashFlashEventFull-screen colour overlay
laneswitchLaneSwitchEventDynamic lane count changes
colorfadeColorFadeEventAnimate lane note colours
pulsePulseEventExpanding border ring
shakeShakeEventScreen shake on impact
shaderShaderEventPost-process shader effects
beatpulseBeatPulseEventPeriodic zoom pulse
layerfadeLayerFadeEventFade individual playfield layers
playfieldmovePlayfieldMoveEventTranslate playfield position
playfieldscalePlayfieldScaleEventScale playfield dimensions
playfieldrotatePlayfieldRotateEventRotate playfield
hiteaseHitObjectEaseEventChange note scroll easing
scroll-multiplyScrollMultiplierEventAnimated scroll speed
time-offsetTimeOffsetEventVisual note arrival offset
camera-moveCameraMoveEventMove camera viewport
camera-scaleCameraScaleEventZoom camera
camera-rotateCameraRotateEventRotate camera
loopsLoopEventRepeat event groups
notesNoteEventOn-screen text
The group field on any event combined with a LoopEvent lets you build complex repeating patterns (e.g. a flash every beat for 8 bars) with a single compact declaration rather than dozens of individual entries.

Build docs developers (and LLMs) love