ot-tools-io 0.11.2

A library crate for reading/writing binary data files used by the Elektron Octatrack DPS-1.
Documentation
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2026 Mike Robeson [dijksterhuis]
*/

use crate::Defaults;
use ot_tools_io_derive::{ArrayDefaults, AsMutDerive, AsRefDerive, BoxedArrayDefaults};
use serde::{Deserialize, Serialize};
use std::array::from_fn;

/// First page of settings controlling an Audio Track's Recording Buffer configuration.
#[derive(
    Copy,
    Clone,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd,
    Serialize,
    Deserialize,
    AsMutDerive,
    AsRefDerive,
)]
pub struct RecorderSetupSources {
    pub in_ab: u8,
    pub in_cd: u8,
    /// `64` is MAX. `63` and lower are actual values.
    pub rlen: u8,
    pub trig: u8,
    /// internal recording source
    pub src3: u8,
    pub xloop: u8,
}

impl Default for RecorderSetupSources {
    fn default() -> Self {
        Self {
            in_ab: 1,
            in_cd: 1,
            rlen: 64,
            trig: 0,
            src3: 0,
            xloop: 1,
        }
    }
}

#[cfg(test)]
mod recorder_setup_src {
    use crate::parts::test_helper::get_default_test_bank;
    use crate::parts::tracks::recorder::RecorderSetupSources;
    use crate::OtToolsIoError;

    #[test]
    fn default() -> Result<(), OtToolsIoError> {
        let b = get_default_test_bank()?;
        for x in b.parts_unsaved[0].recorder_setup.iter() {
            assert_eq!(x.src, RecorderSetupSources::default());
        }
        Ok(())
    }
}

/// Second page of settings controlling an Audio Track's Recording Buffer configuration.
#[derive(
    Copy,
    Clone,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd,
    Serialize,
    Deserialize,
    AsMutDerive,
    AsRefDerive,
)]
pub struct RecorderSetupProcessing {
    pub fin: u8,
    pub fout: u8,
    pub ab: u8,
    pub qrec: u8,
    pub qpl: u8,
    pub cd: u8,
}

impl Default for RecorderSetupProcessing {
    fn default() -> Self {
        Self {
            fin: 0,
            fout: 0,
            ab: 0,
            qrec: 255,
            qpl: 255,
            cd: 0,
        }
    }
}

#[cfg(test)]
mod recorder_setup_proc {
    use crate::parts::test_helper::get_default_test_bank;
    use crate::parts::tracks::recorder::RecorderSetupProcessing;
    use crate::OtToolsIoError;

    #[test]
    fn default() -> Result<(), OtToolsIoError> {
        let b = get_default_test_bank()?;
        for x in b.parts_unsaved[0].recorder_setup.iter() {
            assert_eq!(x.proc, RecorderSetupProcessing::default());
        }
        Ok(())
    }
}

/// Recorder Setup Pages
#[derive(
    Copy,
    Clone,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd,
    Serialize,
    Deserialize,
    AsMutDerive,
    AsRefDerive,
    Default,
    ArrayDefaults,
    BoxedArrayDefaults,
)]
pub struct RecorderSetup {
    pub src: RecorderSetupSources,
    pub proc: RecorderSetupProcessing,
}

#[cfg(test)]
mod recorder_setup {
    use crate::parts::test_helper::get_default_test_bank;
    use crate::parts::tracks::recorder::RecorderSetup;
    use crate::OtToolsIoError;

    #[test]
    fn default() -> Result<(), OtToolsIoError> {
        let b = get_default_test_bank()?;
        for x in b.parts_unsaved[0].recorder_setup.iter() {
            assert_eq!(x, &RecorderSetup::default());
        }
        Ok(())
    }
}