use crate::OtToolsIoError;
use enum_iterator::{all, Sequence};
use ot_tools_io_derive::enum_try_from_u32_to_unsigned_types;
use std::cmp::Ordering;
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq)]
pub enum SavedState {
Working,
Stored,
}
impl SavedState {
pub fn file_extension(&self) -> String {
match self {
SavedState::Working => "work".to_string(),
SavedState::Stored => "strd".to_string(),
}
}
}
impl std::fmt::Display for SavedState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{self:#?} state")
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum ArrId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
}
impl ArrId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn file_name(&self) -> String {
format!["arr{:0>2}", *self as u8 + 1].to_string()
}
pub fn file_stem(&self, state: &SavedState) -> String {
format![
"{name}.{ext}",
name = self.file_name(),
ext = state.file_extension()
]
.to_string()
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for ArrId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Arrangement {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for ArrId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum BankId {
A = 0,
B = 1,
C = 2,
D = 3,
E = 4,
F = 5,
G = 6,
H = 7,
I = 8,
J = 9,
K = 10,
L = 11,
M = 12,
N = 13,
O = 14,
P = 15,
}
impl BankId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn file_name(&self) -> String {
format!["bank{:0>2}", self.as_index() + 1].to_string()
}
pub fn file_stem(&self, state: &SavedState) -> String {
format![
"{name}.{ext}",
name = self.file_name(),
ext = state.file_extension()
]
.to_string()
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for BankId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Bank {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for BankId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::A),
1 => Ok(Self::B),
2 => Ok(Self::C),
3 => Ok(Self::D),
4 => Ok(Self::E),
5 => Ok(Self::F),
6 => Ok(Self::G),
7 => Ok(Self::H),
8 => Ok(Self::I),
9 => Ok(Self::J),
10 => Ok(Self::K),
11 => Ok(Self::L),
12 => Ok(Self::M),
13 => Ok(Self::N),
14 => Ok(Self::O),
15 => Ok(Self::P),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum PartId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
}
impl PartId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for PartId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Part {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for PartId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum PatternId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
Nine = 8,
Ten = 9,
Eleven = 10,
Twelve = 11,
Thirteen = 12,
Fourteen = 13,
Fifteen = 14,
Sixteen = 15,
}
impl PatternId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for PatternId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Pattern {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for PatternId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
8 => Ok(Self::Nine),
9 => Ok(Self::Ten),
10 => Ok(Self::Eleven),
11 => Ok(Self::Twelve),
12 => Ok(Self::Thirteen),
13 => Ok(Self::Fourteen),
14 => Ok(Self::Fifteen),
15 => Ok(Self::Sixteen),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum TrackId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
}
impl TrackId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for TrackId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Track {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for TrackId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum SceneId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
Nine = 8,
Ten = 9,
Eleven = 10,
Twelve = 11,
Thirteen = 12,
Fourteen = 13,
Fifteen = 14,
Sixteen = 15,
}
impl SceneId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for SceneId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Scene {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for SceneId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
8 => Ok(Self::Nine),
9 => Ok(Self::Ten),
10 => Ok(Self::Eleven),
11 => Ok(Self::Twelve),
12 => Ok(Self::Thirteen),
13 => Ok(Self::Fourteen),
14 => Ok(Self::Fifteen),
15 => Ok(Self::Sixteen),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum TrigId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
Nine = 8,
Ten = 9,
Eleven = 10,
Twelve = 11,
Thirteen = 12,
Fourteen = 13,
Fifteen = 14,
Sixteen = 15,
Seventeen = 16,
Eighteen = 17,
Nineteen = 18,
Twenty = 19,
TwentyOne = 20,
TwentyTwo = 21,
TwentyThree = 22,
TwentyFour = 23,
TwentyFive = 24,
TwentySix = 25,
TwentySeven = 26,
TwentyEight = 27,
TwentyNine = 28,
Thirty = 29,
ThirtyOne = 30,
ThirtyTwo = 31,
ThirtyThree = 32,
ThirtyFour = 33,
ThirtyFive = 34,
ThirtySix = 35,
ThirtySeven = 36,
ThirtyEight = 37,
ThirtyNine = 38,
Forty = 39,
FortyOne = 40,
FortyTwo = 41,
FortyThree = 42,
FortyFour = 43,
FortyFive = 44,
FortySix = 45,
FortySeven = 46,
FortyEight = 47,
FortyNine = 48,
Fifty = 49,
FiftyOne = 50,
FiftyTwo = 51,
FiftyThree = 52,
FiftyFour = 53,
FiftyFive = 54,
FiftySix = 55,
FiftySeven = 56,
FiftyEight = 57,
FiftyNine = 58,
Sixty = 59,
SixtyOne = 60,
SixtyTwo = 61,
SixtyThree = 62,
SixtyFour = 63,
}
impl TrigId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for TrigId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
8 => Ok(Self::Nine),
9 => Ok(Self::Ten),
10 => Ok(Self::Eleven),
11 => Ok(Self::Twelve),
12 => Ok(Self::Thirteen),
13 => Ok(Self::Fourteen),
14 => Ok(Self::Fifteen),
15 => Ok(Self::Sixteen),
16 => Ok(Self::Seventeen),
17 => Ok(Self::Eighteen),
18 => Ok(Self::Nineteen),
19 => Ok(Self::Twenty),
20 => Ok(Self::TwentyOne),
21 => Ok(Self::TwentyTwo),
22 => Ok(Self::TwentyThree),
23 => Ok(Self::TwentyFour),
24 => Ok(Self::TwentyFive),
25 => Ok(Self::TwentySix),
26 => Ok(Self::TwentySeven),
27 => Ok(Self::TwentyEight),
28 => Ok(Self::TwentyNine),
29 => Ok(Self::Thirty),
30 => Ok(Self::ThirtyOne),
31 => Ok(Self::ThirtyTwo),
32 => Ok(Self::ThirtyThree),
33 => Ok(Self::ThirtyFour),
34 => Ok(Self::ThirtyFive),
35 => Ok(Self::ThirtySix),
36 => Ok(Self::ThirtySeven),
37 => Ok(Self::ThirtyEight),
38 => Ok(Self::ThirtyNine),
39 => Ok(Self::Forty),
40 => Ok(Self::FortyOne),
41 => Ok(Self::FortyTwo),
42 => Ok(Self::FortyThree),
43 => Ok(Self::FortyFour),
44 => Ok(Self::FortyFive),
45 => Ok(Self::FortySix),
46 => Ok(Self::FortySeven),
47 => Ok(Self::FortyEight),
48 => Ok(Self::FortyNine),
49 => Ok(Self::Fifty),
50 => Ok(Self::FiftyOne),
51 => Ok(Self::FiftyTwo),
52 => Ok(Self::FiftyThree),
53 => Ok(Self::FiftyFour),
54 => Ok(Self::FiftyFive),
55 => Ok(Self::FiftySix),
56 => Ok(Self::FiftySeven),
57 => Ok(Self::FiftyEight),
58 => Ok(Self::FiftyNine),
59 => Ok(Self::Sixty),
60 => Ok(Self::SixtyOne),
61 => Ok(Self::SixtyTwo),
62 => Ok(Self::SixtyThree),
63 => Ok(Self::SixtyFour),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum SliceId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
Nine = 8,
Ten = 9,
Eleven = 10,
Twelve = 11,
Thirteen = 12,
Fourteen = 13,
Fifteen = 14,
Sixteen = 15,
Seventeen = 16,
Eighteen = 17,
Nineteen = 18,
Twenty = 19,
TwentyOne = 20,
TwentyTwo = 21,
TwentyThree = 22,
TwentyFour = 23,
TwentyFive = 24,
TwentySix = 25,
TwentySeven = 26,
TwentyEight = 27,
TwentyNine = 28,
Thirty = 29,
ThirtyOne = 30,
ThirtyTwo = 31,
ThirtyThree = 32,
ThirtyFour = 33,
ThirtyFive = 34,
ThirtySix = 35,
ThirtySeven = 36,
ThirtyEight = 37,
ThirtyNine = 38,
Forty = 39,
FortyOne = 40,
FortyTwo = 41,
FortyThree = 42,
FortyFour = 43,
FortyFive = 44,
FortySix = 45,
FortySeven = 46,
FortyEight = 47,
FortyNine = 48,
Fifty = 49,
FiftyOne = 50,
FiftyTwo = 51,
FiftyThree = 52,
FiftyFour = 53,
FiftyFive = 54,
FiftySix = 55,
FiftySeven = 56,
FiftyEight = 57,
FiftyNine = 58,
Sixty = 59,
SixtyOne = 60,
SixtyTwo = 61,
SixtyThree = 62,
SixtyFour = 63,
}
impl SliceId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for SliceId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
8 => Ok(Self::Nine),
9 => Ok(Self::Ten),
10 => Ok(Self::Eleven),
11 => Ok(Self::Twelve),
12 => Ok(Self::Thirteen),
13 => Ok(Self::Fourteen),
14 => Ok(Self::Fifteen),
15 => Ok(Self::Sixteen),
16 => Ok(Self::Seventeen),
17 => Ok(Self::Eighteen),
18 => Ok(Self::Nineteen),
19 => Ok(Self::Twenty),
20 => Ok(Self::TwentyOne),
21 => Ok(Self::TwentyTwo),
22 => Ok(Self::TwentyThree),
23 => Ok(Self::TwentyFour),
24 => Ok(Self::TwentyFive),
25 => Ok(Self::TwentySix),
26 => Ok(Self::TwentySeven),
27 => Ok(Self::TwentyEight),
28 => Ok(Self::TwentyNine),
29 => Ok(Self::Thirty),
30 => Ok(Self::ThirtyOne),
31 => Ok(Self::ThirtyTwo),
32 => Ok(Self::ThirtyThree),
33 => Ok(Self::ThirtyFour),
34 => Ok(Self::ThirtyFive),
35 => Ok(Self::ThirtySix),
36 => Ok(Self::ThirtySeven),
37 => Ok(Self::ThirtyEight),
38 => Ok(Self::ThirtyNine),
39 => Ok(Self::Forty),
40 => Ok(Self::FortyOne),
41 => Ok(Self::FortyTwo),
42 => Ok(Self::FortyThree),
43 => Ok(Self::FortyFour),
44 => Ok(Self::FortyFive),
45 => Ok(Self::FortySix),
46 => Ok(Self::FortySeven),
47 => Ok(Self::FortyEight),
48 => Ok(Self::FortyNine),
49 => Ok(Self::Fifty),
50 => Ok(Self::FiftyOne),
51 => Ok(Self::FiftyTwo),
52 => Ok(Self::FiftyThree),
53 => Ok(Self::FiftyFour),
54 => Ok(Self::FiftyFive),
55 => Ok(Self::FiftySix),
56 => Ok(Self::FiftySeven),
57 => Ok(Self::FiftyEight),
58 => Ok(Self::FiftyNine),
59 => Ok(Self::Sixty),
60 => Ok(Self::SixtyOne),
61 => Ok(Self::SixtyTwo),
62 => Ok(Self::SixtyThree),
63 => Ok(Self::SixtyFour),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct PlaybackSlotId(usize);
impl PlaybackSlotId {
pub const MAX_INDEX: usize = 127;
pub const MAX_ID: usize = 128;
pub fn from_index(v: usize) -> Option<Self> {
if v > Self::MAX_INDEX {
None
} else {
Some(PlaybackSlotId(v))
}
}
pub fn from_id(v: u8) -> Option<Self> {
if v == 0 || v > Self::MAX_ID as u8 {
None
} else {
Some(PlaybackSlotId(v as usize - 1))
}
}
pub fn as_index(&self) -> usize {
self.0
}
pub fn as_id(&self) -> u8 {
(self.0 + 1) as u8
}
pub fn iter_all() -> impl Iterator<Item = Self> {
(0..(Self::MAX_INDEX + 1)).flat_map(Self::from_index)
}
}
impl std::fmt::Display for PlaybackSlotId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "index={:#?} id={:#?}", self.as_index(), self.as_id())
}
}
impl PartialOrd for PlaybackSlotId {
fn partial_cmp(&self, other: &PlaybackSlotId) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for PlaybackSlotId {
fn cmp(&self, other: &Self) -> Ordering {
if self.0 > other.0 {
Ordering::Greater
} else if self.0 < other.0 {
Ordering::Less
} else {
Ordering::Equal
}
}
}
#[derive(Clone, Copy, PartialEq, Debug, Hash, PartialOrd, Ord, Eq, Sequence)]
#[repr(u8)]
pub enum RecBufId {
One = 0,
Two = 1,
Three = 2,
Four = 3,
Five = 4,
Six = 5,
Seven = 6,
Eight = 7,
}
impl RecBufId {
pub fn as_index(&self) -> usize {
*self as usize
}
pub fn iter() -> impl Iterator<Item = Self> {
all::<Self>()
}
}
impl std::fmt::Display for RecBufId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Track {self:#?}")
}
}
#[enum_try_from_u32_to_unsigned_types]
impl TryFrom<u32> for RecBufId {
type Error = OtToolsIoError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::One),
1 => Ok(Self::Two),
2 => Ok(Self::Three),
3 => Ok(Self::Four),
4 => Ok(Self::Five),
5 => Ok(Self::Six),
6 => Ok(Self::Seven),
7 => Ok(Self::Eight),
_ => Err(OtToolsIoError::InvalidIndex),
}
}
}