use super::{Node, default_gain};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct Track {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub node: Node,
#[serde(default)]
pub pan: f32,
#[serde(default = "default_gain")]
pub gain: f32,
#[serde(default)]
pub at: f32,
#[serde(default)]
pub mute: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub automation: Vec<AutoLane>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sidechain: Option<Sidechain>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bus: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub sends: Vec<Send>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct Bus {
pub id: String,
#[serde(default = "default_gain")]
pub gain: f32,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub effects: Vec<Node>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
pub struct Send {
pub bus: String,
#[serde(default = "default_send_amount")]
pub amount: f32,
}
fn default_send_amount() -> f32 {
0.5
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
pub struct Sidechain {
pub source: String,
#[serde(default = "default_sidechain_amount")]
pub amount: f32,
#[serde(default = "default_sidechain_attack")]
pub attack: f32,
#[serde(default = "default_sidechain_release")]
pub release: f32,
}
fn default_sidechain_amount() -> f32 {
0.8
}
fn default_sidechain_attack() -> f32 {
0.005
}
fn default_sidechain_release() -> f32 {
0.25
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum AutoTarget {
Gain,
Pan,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum AutoCurve {
#[default]
Linear,
Step,
Exp,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AutoPoint {
pub t: f32,
pub v: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AutoLane {
pub target: AutoTarget,
#[serde(default)]
pub curve: AutoCurve,
pub points: Vec<AutoPoint>,
}