A practical guide to track files, music playback, iSaber mode, idle ambience, track gestures, and the music player configuration on Crystal Focus X.
tracks/<font>/tracks/extra/VUMETER/The CFX has a built-in music player that can play WAV audio files such as background music, character themes, ambient soundscapes, or any other audio you want. Tracks play through the saber speaker alongside normal saber sounds.
| Type | Filename Pattern | Location | Purpose |
|---|---|---|---|
| Global tracks | track1.wav, track2.wav, ... | tracks/ | Shared across all fonts |
| Font-local tracks | track1.wav, track2.wav, ... | <font>/tracks/ | Specific to one sound font |
| Idle tracks | idle1.wav, idle2.wav, ... | <font>/tracks/ | Auto-play ambient audio for a font |
A special file named cantina.wav can also live in the global tracks/ folder for quick serial access.
SD Card Root/
└── tracks/
├── track1.wav
├── track2.wav
├── track3.wav
└── cantina.wav
Global tracks are shared across all fonts, but they require iSaber mode to be active.
1-MyFont/
├── hum.wav
├── clash1.wav
├── ...
└── tracks/
├── track1.wav
├── track2.wav
├── idle1.wav
└── idle2.wav
Font-local tracks belong to one sound font only. When you change fonts, the local track library changes too.
0-Jedi/
└── tracks/
├── track1.wav
└── track2.wav
When themes are active, global tracks go in the theme’s tracks/ folder. Font-local tracks still live inside the font folder within that theme.
For the best compatibility, keep your track files in this format:
TL;DR: WAV, 16-bit PCM, mono, 44.1 kHz recommended or 22.05 kHz.
| Setting | Recommended value |
|---|---|
| File type | .wav |
| Encoding | 16-bit PCM |
| Channels | Mono |
| Sample rate | 44.1 kHz recommended, 22.05 kHz also supported |
Using this format helps avoid playback issues and keeps behavior consistent across regular tracks, idle tracks, and themed track folders.
.wav extension.track1.wav, track2.wav, track3.wav, and so on.idle1.wav, idle2.wav, and so on.Important: If you skip a number, files after that gap will not be found. For example, if you havetrack1.wavandtrack3.wavbut notrack2.wav, onlytrack1.wavwill be detected.
The CFX handles two separate track pools. Font-local tracks are always available when the current font has a tracks/ subfolder. They work immediately with no extra setup. Global tracks require iSaber mode to be active.
tracks/ folder.tracks/ subfolder, if it exists.Tip: If your fonts do not have their own tracks/ subfolders, you need to activate iSaber mode through the vocal menu before the player can use global tracks.
Tracks play only when the blade is OFF. If a track is playing and you ignite the blade, the track stops automatically.
This only works when tracks are available.
When trackgest=0, holding the activator while the blade is off skips to the next track.
When trackgest=1 is enabled, you can skip by twisting the saber while holding the activator.
When track gestures are enabled, the long-press skip method is disabled.
Idle tracks are ambient audio files that play automatically when the saber is idle and the blade is off. They are always font-specific and must live inside the font’s tracks/ subfolder.
Use case: Idle tracks are great for breathing sounds, ambient environments, or subtle background audio while the saber is resting.
loop=0, the player automatically advances to the next track and continues playback through the library.loop=1, the current track repeats until you manually skip or stop it.Tracks do not play while the blade is on. If a track is playing and you ignite the blade, the track stops immediately. This is by design so the audio system stays focused on saber effects.
shuffle=| Value | Mode | Description |
|---|---|---|
0 | Random | Pure random, with repeats allowed |
1 | Sequential | Tracks play in order and wrap around |
2 | Random without repeats | All tracks play in random order before any repeat |
3 | Expressive | More varied random-style behavior |
shuffle=2
loop=| Value | Behavior |
|---|---|
0 | Auto-advance to the next track |
1 | Loop the current track continuously |
loop=0
pause=| Value | Behavior |
|---|---|
0 | Pause stops and rewinds to the beginning |
1 | Pause freezes in place and resumes from the same position |
pause=1
trackgest=| Value | Behavior |
|---|---|
0 | Track gestures off, long-press skip enabled |
1 | Track gestures on, twist navigation enabled |
trackgest=1
In the vocal menu’s font list, the last entry after all your sound fonts is the Tracks item. Its selection sound and display image come from the global tracks/ folder. Selecting it activates iSaber mode, which tells the music player to use global tracks instead of font-local ones.
When you go back and select a regular font, iSaber mode is disabled again and the player switches back to that font’s local tracks, if available.
When tracks are available, the OLED can show a VU meter page that visualizes audio levels in real time during playback. The background image comes from vumeter.bmp in either the active theme’s extra/VUMETER/ folder or the root /extra/VUMETER/ folder.
The VU meter page appears in the OLED page rotation and can be cycled with the AUX button while the blade is off.
| Command | Action |
|---|---|
w-track | Play next track |
w-track=N | Play track number N |
w-ptrack | Play previous track |
w-ltrack=N | Play local font track number N |
w-pltrack | Play previous local font track |
w-itrack=N | Play global iSaber track number N |
w-pitrack | Play previous global iSaber track |
w-dltrack=N | Play idle track number N |
w-stoptrack | Stop track playback |
w-pausetrack | Toggle pause or resume |
Important: Track numbers in serial commands are 0-based. That meansw-track=0playstrack1.wav,w-track=1playstrack2.wav, and so on.
SD Card Root/
└── 1-MyFont/
├── hum.wav
├── clash1.wav
└── tracks/
├── track1.wav
└── track2.wav
No special config is needed. Double-click the activator with the blade off to start playback.
SD Card Root/
├── tracks/
│ ├── track1.wav
│ ├── track2.wav
│ ├── track3.wav
│ └── font.bmp
├── 1-Jedi/
│ └── ...
└── 2-Sith/
└── ...
Use the vocal menu’s Tracks entry to activate iSaber mode, then double-click the activator to play.
SD Card Root/
├── tracks/
│ ├── track1.wav
│ └── track2.wav
├── 1-Jedi/
│ ├── hum.wav
│ └── tracks/
│ ├── track1.wav
│ ├── idle1.wav
│ └── idle2.wav
└── 2-Sith/
├── hum.wav
└── tracks/
└── track1.wav
0-Jedi/
├── config.txt
├── tracks/
│ ├── track1.wav
│ └── track2.wav
├── 1-Guardian/
│ └── tracks/
│ ├── track1.wav
│ └── idle1.wav
└── 2-Sentinel/
└── ...
| Task | How |
|---|---|
| Play or pause a track | Double-click activator with blade off |
| Skip to next track | Hold activator 1 to 2 seconds with blade off when trackgest=0 |
| Skip forward | Twist right while holding activator when trackgest=1 |
| Skip backward | Twist left while holding activator when trackgest=1 |
| Use global tracks | Select the Tracks entry in the vocal menu |
| Use font-local tracks | Select a normal font in the vocal menu |
| Set shuffle mode | shuffle=0/1/2/3 in config.txt |
| Enable looping | loop=1 in config.txt |
| Enable pause-in-place | pause=1 in config.txt |
| Enable twist navigation | trackgest=1 in config.txt |
| Stop track via serial | Send w-stoptrack |
tracks/ subfolder inside the font.shuffle= setting also affects idle tracks.