VOLTAreference

Reference / Work in Studio

Production tools in Studio

Work in Studio

Open in the workbench →
On this page · 4 sections

Find the production-oriented workbench tools and the detailed references that describe their current behavior.

What it is#

The "serious tool" layer of volta-studio: audio device control, master/ input recording, a producer-facing export dialog with a loudness report, provenance-stamped bounces, plugin delay compensation, audible take diffs, and live-room sync stats/invite links.

Surface (all native studio)#

  • io panel → AUDIO OUT — output device / fixed buffer / sample-rate pickers + apply (rebuilds the engine at the negotiated rate from the installed song and captured session sound resources; falls back to the old config on failure), negotiated-config + live output-latency readout. Persists in audio-config.json beside the eframe store. PLUGIN LATENCY below it: per-plugin samples + the PDC compensation target (see Mixing tracks and buses §6.5).
  • Transport Record → Record Audio (+ io-panel input arm) — 32-bit-float stereo WAVs in ~/Documents/Volta/Recordings/<song>-<timestamp>.wav; elapsed readout; toast with the finalized path. Master lane = what the device hears; input lane = what the engine hears.
  • File → Export Audio… — master or per-track stems, 16-bit (deterministic TPDF dither) / 24-bit / 32-float, rate choice, length in bars; renders through the deterministic offline exporter and reports LUFS-I / dBTP / duration. Files land in ~/Documents/Volta/Bounces/<song>/, each stamped. An arranged song exports its form, not every track flat, and cycles pre-fills to the form's length (Arrange a song §6). The dialog identifies the song by the name the header shows (never its file path), and its title tag starts as that name; it states the range from its beginning, the estimated music duration and the destination. The estimate uses the analyzed source's tempo and meter maps, arrangement horizon and constant master varispeed; tail time is stated separately. The preview is cached by source and import generation; native hosts use their import-aware compiler when the analysis result omits IR. Invalid source reports that duration is unavailable. Browser export downloads the finished WAV using the browser's download settings.
  • Provenance stamps — a vlta RIFF chunk (JSON: web-scheme SHA-256 content hash + source + imports + cycles). File → Open accepts a stamped WAV and reopens the embedded source. Foreign audio tools ignore the chunk.
  • History → Compare → AUDIO (desktop and browser) — choose a bar passage and render the working copy and saved idea with their captured imports, controls and sound resources. The render follows each arrangement with pre-roll; A/B switching shares an elapsed playback clock. Optional loudness matching attenuates the louder side. Raw null analysis and the delta chart remain under Difference analysis. Missing resources and unsupported live inputs report a refusal. See Save ideas, compare versions and record takes for capture and recall limits.
  • Room dialog — one role vocabulary (host / editor / listener, with an Ask to edit request a host can allow), Copy listen link (<server>/r/<room>) and Copy edit link (?edit=<room>&relay=<origin>), paste-a-link join (/r/<id>, ?room=, ?edit=), and the relay-clock readout sync · offset ±ms · rtt ms behind a details disclosure.

How it's implemented#

Native boot and device rebuild acknowledge the prepared module while the engine is still owned by the caller, before an output callback exists. Initialization consumes control commands without rendering samples. A device rebuild retains the installed module, sample bank/tempos/zones, wavetables, plugin states and transport snapshot; newer editor text and changed source files are not compiled. Fixed-buffer negotiation retries initialize a fresh engine from the same snapshot. Uncapturable plugin state refuses before stopping the old stream; missing or unrestorable captured state refuses before starting the replacement. This restores transport position and the sounding track set, not individual active voices or effect tails across the destroyed engine.

  • Host: engine-host/src/audio.rs — AudioConfig/start_with_initializer/ AudioSession (negotiation + teardown + latency), Recorder/RecordTap lanes (rtrb ring → volta-rec writer), InputControl::shutdown, MidiControl::shutdown.
  • Engine: offline.rs — ExportRender.samples, encode_wav_as (16-TPDF/24/32f; the golden-pinned encode_wav untouched), stamp_wav/read_wav_stamp (the vlta chunk); command.rs — Command::PlayPcm/StopPcm and the PDC CompDelay per track in LoadPayload, applied pre-master-sum by lib.rs; backends query latency at activate (engine/src/plugin/clap_backend.rs and its VST3 / AU siblings).
  • Shell/UI: EngineBridge methods (set_audio_config, set_recording, export_audio/export_status, render_pair/play_pcm, room stats) in ui/src/bridge.rs, implemented by app-native/src/main.rs; dialogs and panel sections in ui/src/app/dialogs.rs + ui/src/app/io.rs; recording / export paths in app-native/src/export.rs; menu items in app-native/src/menus.rs.

Notes & limits#

Sample-rate changes rebuild the engine (a brief gap is expected). Device negotiation and stream start run on the audio thread with a bounded wait (AUDIO_THREAD_WAIT, 8 s), so a wedged device reports an error instead of hanging the UI; a fixed buffer outside the device's range, or one the device rejects at build time, falls back to the device default; PDC limits in Mixing tracks and buses §6.5; stems are solo re-renders through the master path (CLI semantics), not bus taps; recording drops (never blocks) on a >10 s disk stall and logs the gap; export bakes bounceOf/sampleOf before rendering. Deferred ideas live in Ideas §9 (pro-producer harvest).