# Limitations

Ultimate VJ is a Resolume-**like** workflow, not a claim of Resolume compatibility. This page is the honest
inventory of what it does not do. Everything below is either absent from the source or restricted by an
explicit guard.

## Scope of the claim

Ultimate VJ is an independent implementation. It does not promise full binary, file or plug-in compatibility with commercial VJ applications.
A limited legacy `.avc` importer exists; it does not reconstruct arbitrary proprietary effect chains.

## Platform

- **macOS only.** No Windows or Linux version exists.
- Requires **macOS 26.0** or later and an **Apple Silicon** Mac, for both the published cask and source
  builds.

## Import and third-party content

- Imported third-party effect records are **retained opaquely**. Native effects do not reconstruct arbitrary
  third-party effect chains, including proprietary presets of any kind.
- Plug-in hosting is unavailable — no FFGL, ISF or third-party plug-in loader exists.
- Older native effect settings keep their original pipeline until you explicitly rearrange or extend them.
- Grouped routing must be opened as a full set; it cannot arrive through **Import banks from set…**.
- Columns can be added in the Composition structure editor; ordinary batch paste must fit the
  existing grid. Import and duplication can grow it. Explicit removal can remove the last empty
  column; the empty trailing column is not an unconditional invariant.

## Effects and routing

- Dashboard routing and any **FFT band selection** are unavailable. The audio-level driver operates on the
  whole monitored level.
- **Group effect stacks are available** through Groups or group-header FX. The main Inspector
  still has Clip, Layer and Master scopes. Group routing requires full-set Open rather than bank import.
- The **modulation driver's phase offset and Random hold seed** have no UI controls, although
  they round-trip in files. This does not refer to effect controls such as Strobe's Phase or
  Slice Glitch's Pattern seed, which are exposed.
- Only one RenderWave effect exists (**Kaleidoscope · RenderWave**); everything else is Core Image or native
  Metal kernels.

## Output

- Multiple simultaneous physical outputs are unavailable — one selected output at a time.
- No mesh warping, masks, soft-edge calibration or per-surface colour controls. Mapping is rectangular crop
  plus convex four-corner perspective per surface.
- **Syphon and NDI are unavailable.** There is no frame-sharing output to other applications.
- No audio is captured in recordings, ever.

## Control and sync

- **No MIDI clock, no MIDI Time Code, no song-position pointer** — neither input nor output. Only Note On,
  Note Off and Control Change are handled.
- **Ableton Link syncs tempo and bar phase only.** Transport start/stop and play-state sync do not exist.
- Learned keyboard parameters set a **fixed captured value**; there is no continuous keyboard control.
- Only six numeric parameters are controllable externally at all (layer opacity, master opacity,
  crossfader, BPM, clip speed, clip playhead).
- Physical MIDI behaviour — device-specific LED colours, motorized-fader profiles, second-host operation — is
  unqualified. Claimed support rests on virtual endpoints in the app's own test suites.
- The **local control API binds loopback only**. LAN and second-host operation do not exist.
- Effect internals, mapping surfaces and several other areas are **deliberately not addressable** by the
  control API.

## Audio

- **File audio changes pitch with speed.** There is no pitch-preserving time stretch and no band-limiting
  resampler — only linear interpolation.
- Standalone multichannel audio uses its **first two channels** (mono is duplicated).
- **32 simultaneous voices**, counting transition hand-offs.
- **No guarantee against audio underruns.** Buffering and decoder failures are reported, not prevented.
- Microphone capture, permission prompts and audible output have not been verified against real hardware.

## Playback and rendering

- **Reverse decoding has substantially greater decoder cost** than forward playback on interframe codecs.
- No **sustained** frame-rate guarantee exists for any resolution, including 4K60. The app reports what was
  requested and what it measured; it does not promise what it will sustain.
- **No keyframe snapping.** Large real-time gaps beyond a quarter second in one tick are discarded rather
  than accumulated, so playback cannot catch up slowly.
- A brief held frame at loop wraps and after seeks is expected behaviour, not a perfect encoded seam.
- The CPU compositor retained in the core library is a **behavioural test reference**, not an alternative
  output path.

## Tempo detection

- BPM detection is an **onset estimator**. Syncopation, non-percussive music and half/double tempo remain
  genuinely ambiguous — the app tells you when it is unsure rather than picking silently.
- Reported **confidence is not a calibrated probability.**
- File tempo analysis covers the **first 120 seconds** only.

## Storage hygiene

- The `~/Library/Application Support/ULTIMATEVJ/Recovery/` folder is **never pruned**. Clean it manually.
- Media referenced by a set is tracked by **path**, never copied — unless you explicitly Collect it.

## Not verified

This section lists absences **established by reading the source**, which is strong evidence but not
build-level proof in every case:

- No MIDI clock or timecode anywhere in the MIDI receive path.
- No Link transport start/stop beyond the bridge surface.
- No sustained-performance claim in any code path.
- No user-facing Syphon or NDI frame-sharing output was found in the native output implementation.
  The compiled runtime packaging includes a Syphon framework; its presence does not expose an output control.
