Documentation
The concepts first, the buttons second. If you understand objects, the world and patterns, everything else in the application follows from those three.
The application opens on a welcome screen and is organised into workspaces along the top. You will spend almost all of your time in two of them.
DJ and Perform are described here because the format already carries what they need — the trigger system, the pattern engine and per-object streaming are all in 1.0. What is missing is the surface, not the substance.
Before you start a project, open the profile window and set the world. Everything about distance, Doppler and reverb depends on it, and it is far easier to set once at the beginning than to change halfway through.
An object is one sound with a position. Not a channel, not a bus — a source that exists somewhere in a room and can move.
Each object carries its own audio, its own position over time, its own gain, and optionally a set of rules about how it reacts. That bundle travels together through the whole chain: it is still a bundle in the delivered file, and still a bundle when a player opens it. Nothing is folded down until the last possible moment, on the listener's device.
How many you can have at once depends on your licence — 192 on Studio, 512 on Pro, 1024 on Enterprise. Playback is never capped, on any tier.
Focus decides how sharply an object is drawn. A wide focus spreads it across neighbouring speakers and fills the room; a narrow one pins it to a point. It is set per object and as a default for the whole package, and the number means the same thing in the monitor, in the export and in a player on someone else's device.
An anchor binds an object to one particular speaker while leaving its position alone — useful when a source has to come out of a specific box regardless of geometry. If the file lands on a rig that has no such speaker, the object quietly falls back to free panning. An anchored mix still opens everywhere.
Every track in one table: name, on, mute and solo, volume, ball, XYZ, where its motion comes from, which pattern or path, stereo spread, focus, and which speaker it is assigned to. Sort it, search it, filter by ball or by audio.
Two ways to assign a whole layout at once. In order maps tracks to channels by their sequence — the fastest route when a multichannel file arrives in a known order. In position places each track at the real coordinates of the speaker it belongs to, which is what you want when the rig is unusual.
Not everything wants to be an object. Room tone, a reverb return, a stereo pad — these belong in a bed, which is a fixed channel layout that plays to the speakers directly. A project can mix beds and objects freely, and both survive an ADM export.
A world is a room described in real metres, either as a sphere with a radius or a box with width, depth and height, plus a listener position inside it.
The world is what makes physics possible. With one defined, true Doppler at 343 m/s and distance attenuation follow as consequences rather than effects you dial in. Without a world, neither runs — and that is deliberate. A music project should never suddenly acquire Doppler because somebody moved an object quickly.
Two further consequences, propagation delay and reverb derived from the room volume, are calculated and written into the file but not yet rendered in Studio. The application says so on the panel rather than leaving you to work it out. They are part of the scene a player receives; what is missing is the monitoring path, and that is honest work still to do.
Physics can be bypassed globally for A/B listening. That switch is a monitoring state and is never written into a file.
There are three ways to move an object, and they can be combined.
Every pattern can be tilted and stretched on all three axes, which is what turns 156 trajectories into something closer to an infinite set. Tempo comes either from the project, from the object's own BPM, or from a plain number of seconds per cycle. Direction can be forwards, backwards, or bouncing between the two.
Each object has its own motion gate — a dot in the inspector — and there is a global runner that gates all of them at once. An object only moves when both are open. This is how you audition one moving object against a still scene.
A trigger is a rule that resolves during playback, on the listener's device. This is the part no other streamable format offers, and it is what the format exists for.
Triggers are grouped into four namespaces:
A trigger fires a sequence: a series of steps that move an object, change its gain, start or stop a pattern, or wait. Sequences run to completion and clean up after themselves, so a scene always returns to a known state.
Two kinds of trigger behave differently and it is worth knowing which is which. An impulse has no duration — a tap, a shake — and always runs its sequence to the end. A value is a continuous level — a heart rate, a noise floor — and you choose what happens when it stops: hold the value, snap back, or glide.
You can fire triggers by hand from the react pad while the transport runs, which is the only sane way to build a reactive scene.
A spherical array hands you a folder of numbered files and no indication of which way anything pointed. Two things go wrong there, and both are silent.
Sorting. Nineteen files sort lexically as 1, 10, 11, …, 19, 2, 3 — so capsule two ends up at position eleven. The scene looks plausible and is wrong. Files are read numerically here, always.
Dead channels. A loose cable produces a file, just a silent one. Every channel is measured before import and marked live, quiet, dead or clipped, and you can solo any capsule while looking at where it points.
Seven arrays are built in. For anything else, describe the capsule directions once and save it — a new microphone is a new file, not a new version of the application. If nobody documented the geometry, directions are spread evenly over a sphere by the golden angle and labelled as an estimate, because a guess presented as a fact is worse than a guess.
Recording works from inside the application too: pick the interface and a folder, and every capsule lands as its own numbered file, ready to import.
Lift separates an existing stereo master into stems on your own machine — nothing is uploaded — and then distributes them into the room. Thirteen genre presets give you a starting distribution rather than a blank scene, and the distribution editor lets you adjust fan, scale and zone mapping and save your own.
It is not an upmixer. What comes out are real objects you can then move, trigger and export like any other.
You do not need a certified room. Binaural over headphones is enough to author, and any rig geometry works for checking.
The loudness reference is the stereo fold, not the binaural one. Binaural measures several decibels lower because folding many delayed copies of the same signal comb-filters it — using that number for normalisation would push everything far too loud.
One project, several correct masters. What you export depends on who is asking.
| Target | What it is for |
|---|---|
| ADM-BWF | The master format distributors accept for immersive delivery |
| IAMF | The streaming route, including the Eclipsa-branded platforms |
| SMXD | The saimox delivery — streamable, reactive, per-object |
| Downfolds | Fixed speaker renders from 1.0 mono to 9.1.6 |
| Binaural | A two-channel fold for headphones |
| IAB, NHK 22.2, Auro-3D | Cinema, broadcast and the Auro layouts, on Enterprise |
Loudness targets are applied per platform on export, so the same project produces a correct master for each destination without remixing. There is no watermark and no per-release charge on any tier.
Two files, one format family, different jobs.
Both open by double-click from the Finder, and a player reads the cover, the catalogue information and the energy envelope straight out of the file before decoding a single sample. Both are plain ZIP containers with a manifest, a spatial description and audio. Nothing about reading them is secret and nothing about writing them costs a fee — see Formats for how they compare to ADM and IAMF.
Three players, one rendering core. The split that makes that possible is worth understanding, because it explains why a piece sounds the same everywhere.
The core parses and computes. The platform decodes and renders. libsaimox — the shared library described below — reads the container, reads the scene, and works out where every object is at every tick. What crosses the boundary is one flat array per frame — five values per object: x, y, z, gain, active. Decoding the audio and putting it into your ears is done by whatever the platform does best: AVAudioEngine on Apple, Web Audio and WebCodecs in the browser, Oboe on Android.
That is why the conformance fingerprint means something. The maths lives in one place, so two devices reporting the same number are not similar — they are identical.
Free on the App Store, for iPhone, iPad and Apple silicon Macs. Five tabs: library, player, space, info and settings.
With headphones that have motion sensors — AirPods Pro, AirPods Max and similar — the sound stage stays where it is while you turn your head. Three things have to be true: the headphones must have the sensors, tracking must be on in the player, and iOS must have granted motion access. If you refused that question once, iOS never asks again; it goes back on under Privacy & Security, Motion & Fitness.
Over AirPlay it is switched off deliberately. With a second or two of buffering the room would turn visibly later than your head, which is worse than no tracking at all.
The motion data never leaves the device. It is used in the moment and kept nowhere.
In the space view you can orbit the room from outside or sit inside it. A coupling button ties the listening position to the view, so turning the camera turns your head in the scene. It is the same gesture as the one in Studio's Space Monitor, deliberately — learn it once.
Plug in a cable or pick a TV in AirPlay and the external display fills with the view you chose in settings — the room, the energy curve, the artwork or the numbers — while the phone stays playable. There is no switch to find.
The sound is independent of the picture. With a USB-C hub you can send the room to a projector over HDMI and the audio to a PA over the headphone jack, and drive the whole thing from the phone. Pick the output with the AirPlay button, because iOS will otherwise decide for you.
Projectors and televisions add thirty to a hundred and fifty milliseconds of their own delay, so the balls arrive slightly after the sound. A cable beats AirPlay and a projector in game mode beats one in cinema mode. We do not correct it by delaying the audio, because that would be the wrong trade.
A piece opened from an address does not download in full before it starts. The player keeps a rolling buffer of raw slices — roughly a minute ahead — and decodes as it goes. That survives a train tunnel; an eight-second decoded buffer did not.
Set a target in settings and every piece is brought to it, measured to BS.1770-4. Quiet pieces are raised only as far as their peak allows, so nothing is squashed by a limiter, and a piece already close to full scale stays below the target. That is correct behaviour, not a fault.
Folding many objects to two ears without attenuation clips reliably, so the player reduces by a fixed amount that depends on how many there are — the same amount Studio uses, so a piece sounds the same in both. The fader goes to +6 dB if you want it back.
Online now. No installation, no account, nothing to sign up for — a link opens a piece in three dimensions in any current browser. Five pieces are playing on this site →
It runs the same libsaimox, compiled to WebAssembly. The division of labour is the same as everywhere else: WASM parses the container and computes the motion, JavaScript fetches the bytes, decodes Opus through WebCodecs and renders the audio through Web Audio.
Nothing about your listening is reported anywhere. The render happens in your browser.
Next in line, running the same core with the same conformance fingerprint — so a piece behaves exactly as it does on iOS. It adds the one thing iOS will not allow: keeping your library on a memory card or an external drive.
One library, written in Rust, that every player runs. It is the reason a piece behaves the same on an iPhone, in a browser and inside Studio, and it is free for anyone to build on.
The library parses and computes. It reads the container, reads the scene, resolves patterns, triggers and physics, and works out where every object sits at every tick. What it hands back per frame is a flat array — five values per object: x, y, z, gain, active.
It does not decode audio and does not touch your speakers. That is left to whatever the platform already does well: AVAudioEngine on Apple, Web Audio and WebCodecs in the browser, Oboe on Android, Core Audio inside Studio. A library that tried to own the audio path would be worse at it than the platform, and far harder to port.
It also never touches the network or a filesystem. Every entry point takes bytes and returns values — the host decides where those bytes came from, which is why the same library serves a local file and a streamed one without knowing the difference.
Every build reports a short identifier derived from the movement formulas themselves — the pattern maths, the phase origin, how tempo resolves, the order transforms are applied in, how clips are windowed.
Two builds reporting the same fingerprint compute the same positions. Not close, not within a tolerance — the same. When the maths changes, the number changes, and every player that reports the old one is visibly out of date rather than quietly different.
If you write your own player, this is how you check it against ours: one call, one comparison.
You do not need permission and there is no fee from us. Writing your own player, putting one in a device, or writing saimox files from your own software is explicitly allowed — for a million units as much as for one.
Every function is reachable without the mouse. Arrow keys navigate, Enter triggers, Delete removes, Shift and Command extend a selection, and the transport has its own shortcuts. This was designed in from the start rather than retrofitted, because a tool you have to point at is a tool that slows you down after the first week.
Esc cancels. Every import, export and batch job stops cleanly when you press it, without leaving half-written files behind. The complete shortcut list is in the application under Help.