use super::snapshot::ParameterTarget;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone)]
pub struct SequenceStep {
pub parameters: Vec<ParameterTarget>,
pub duration_notes: f64,
}
impl SequenceStep {
pub fn new(parameters: Vec<ParameterTarget>, duration_notes: f64) -> Self {
Self {
parameters,
duration_notes: duration_notes.max(0.0),
}
}
pub fn single(
node_id: impl Into<rill_core::NodeId>,
param: impl Into<String>,
value: f32,
duration_notes: f64,
) -> Self {
Self {
parameters: vec![ParameterTarget::new(node_id.into(), param, value)],
duration_notes: duration_notes.max(0.0),
}
}
pub fn duration_samples(&self, tempo: f32, sample_rate: f32) -> u64 {
let qn = (60.0 / tempo.max(1.0)) * sample_rate;
(qn * self.duration_notes as f32) as u64
}
}