use ot_tools_io_derive::{AsMutDerive, AsRefDerive};
use serde::{Deserialize, Serialize};
#[derive(
Copy,
Clone,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
Deserialize,
AsMutDerive,
AsRefDerive,
)]
pub struct PatternScaleSettings {
pub master_len_per_track_multiplier: u8,
pub master_len_per_track: u8,
pub master_scale_per_track: u8,
pub master_len: u8,
pub master_scale: u8,
pub scale_mode: u8,
}
#[allow(dead_code)]
enum MasterLenCalc {
PerTrack(u16),
Global(u16),
InvalidScaleMode(u16),
}
impl PatternScaleSettings {
#[allow(dead_code)]
fn calculate_master_length(&self) -> MasterLenCalc {
match self.scale_mode {
0 => MasterLenCalc::Global(self.master_len as u16),
1 => MasterLenCalc::PerTrack(
(self.master_len_per_track as u16 + 1)
* (self.master_len_per_track_multiplier as u16 + 1),
),
_ => MasterLenCalc::InvalidScaleMode(self.scale_mode as u16),
}
}
}
impl Default for PatternScaleSettings {
fn default() -> Self {
Self {
master_len_per_track_multiplier: 0,
master_len_per_track: 16,
master_scale_per_track: 2,
master_len: 16,
master_scale: 2,
scale_mode: 0,
}
}
}
#[derive(
Copy,
Clone,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
Deserialize,
AsMutDerive,
AsRefDerive,
)]
pub struct PatternChainBehavior {
pub use_pattern_setting: u8,
pub use_project_setting: u8,
}
#[allow(clippy::derivable_impls)]
impl Default for PatternChainBehavior {
fn default() -> Self {
Self {
use_pattern_setting: 0,
use_project_setting: 0,
}
}
}
#[derive(
Copy,
Clone,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
Deserialize,
AsMutDerive,
AsRefDerive,
)]
pub struct TrackPatternSettings {
pub start_silent: u8,
pub plays_free: u8,
pub trig_mode: u8,
pub trig_quant: u8,
pub oneshot_trk: u8,
}
impl Default for TrackPatternSettings {
fn default() -> Self {
Self {
start_silent: 255,
plays_free: 0,
trig_mode: 0,
trig_quant: 0,
oneshot_trk: 0,
}
}
}
#[derive(
Copy,
Clone,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
Deserialize,
AsMutDerive,
AsRefDerive,
)]
pub struct TrackPerTrackModeScale {
pub per_track_len: u8,
pub per_track_scale: u8,
}
impl Default for TrackPerTrackModeScale {
fn default() -> Self {
Self {
per_track_len: 16,
per_track_scale: 2,
}
}
}