pub struct TrackState {Show 14 fields
pub name: String,
pub muted: bool,
pub soloed: bool,
pub armed: bool,
pub color_index: usize,
pub kind: TrackKind,
pub clips: Vec<Clip>,
pub fx_chain: Vec<FxInstance>,
pub volume: f32,
pub mixer_id: Option<usize>,
pub handle: Option<Arc<TrackHandle>>,
pub instrument_type: Option<InstrumentType>,
pub synth_params: Vec<f32>,
pub sequencer: Option<Box<SequencerState>>,
}Fields§
§name: String§muted: bool§soloed: bool§armed: bool§color_index: usize§kind: TrackKind§clips: Vec<Clip>§fx_chain: Vec<FxInstance>Track-level FX chain.
volume: f32Fader position as a linear gain, mirroring the audio thread’s
TrackConfig::volume. Travel is
TrackConfig::MIN_VOLUME..=TrackConfig::MAX_VOLUME; the audio
thread’s copy is clamped to it by TrackConfig::set_volume, so this
mirror is the only place an out-of-range value could survive.
mixer_id: Option<usize>Unique ID for this track (matches the mixer’s track ID).
handle: Option<Arc<TrackHandle>>Handle to the audio engine’s track state. When present, mute/solo/arm/volume writes go directly to the audio thread via atomics.
instrument_type: Option<InstrumentType>What type of instrument this track has.
On a sequencer track this is the child: the thing in the plugin slot
making the sound. There is no separate instrument type for a
sequencer, which is what lets the child’s panel, preset bank and saved
parameters all keep working untouched. What marks the track is
TrackState::sequencer.
synth_params: Vec<f32>Parameter values (mirrors the audio thread’s plugin params).
sequencer: Option<Box<SequencerState>>The step sequencer driving this track, when it has one.
Edited only through crate::sequencer::ops::dispatch — see that
module for why there is exactly one way in.
Boxed because eight patterns are nineteen kilobytes, and a
TrackState is cloned whole for every undo entry and moved whenever
the track list grows. A track with no sequencer should pay a pointer
for the possibility, not a pattern bank.
Implementations§
Source§impl TrackState
impl TrackState
Sourcepub const VOLUME_STEP_DB: f32 = 1.0
pub const VOLUME_STEP_DB: f32 = 1.0
One press of the fader, in dB.
The fader is stepped in dB rather than in linear gain so that every press moves the readout by exactly one. A linear step small enough to be useful near the top of the travel is a 6 dB jump near the bottom, and three consecutive linear detents around unity all round to the same displayed number — a control that does not appear to respond.
Sourcepub const VOLUME_FLOOR_DB: f32 = -40.0
pub const VOLUME_FLOOR_DB: f32 = -40.0
Bottom of the fader’s travel, below which it goes to silence.
−40 dB rather than the −60 a drawn fader usually bottoms out at: this
one is stepped a keypress at a time, and 20 extra presses to reach a
level that is inaudible anyway is travel nobody wants. Muting a track
outright is m.
pub fn new( name: &str, color_index: usize, armed: bool, kind: TrackKind, clips: Vec<Clip>, ) -> Self
Sourcepub fn sync_to_audio(&self)
pub fn sync_to_audio(&self)
Sync mute/solo/arm/volume to the audio thread handle (if wired up).
Sourcepub fn volume_db(&self) -> Option<f32>
pub fn volume_db(&self) -> Option<f32>
The fader position in dB relative to unity. None at the bottom of
the travel, where the answer is negative infinity.
Sourcepub fn adjust_volume(&mut self, steps: i32) -> f32
pub fn adjust_volume(&mut self, steps: i32) -> f32
Move the fader by steps presses and push the result to the audio
thread. Returns the new linear gain.
The current position is rounded onto the dB grid before stepping, so the fader self-corrects: the default of 0.75 is −2.5 dB, off the grid, and the first press lands it on −2 or −3 and every press after that moves exactly one. A session saved with a hand-edited volume snaps the same way.
Trait Implementations§
Source§impl Clone for TrackState
impl Clone for TrackState
Source§fn clone(&self) -> TrackState
fn clone(&self) -> TrackState
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more