ot-tools-io 0.11.3

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]
*/

//! Current Trig mode setting for MIDI tracks.
use crate::projects::parse_hashmap_string_value;
use ot_tools_io_derive::{AsMutDerive, AsRefDerive};
// use crate::OtToolsIoErrors;
use crate::projects::ProjectParseError;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

/// Current Trig mode setting for MIDI tracks.
#[derive(
    Copy,
    Clone,
    Debug,
    Eq,
    Hash,
    Ord,
    PartialEq,
    PartialOrd,
    Serialize,
    Deserialize,
    AsMutDerive,
    AsRefDerive,
)]
pub struct MidiTrackTrigModes {
    // helpfully these are all just called TRIG_MODE_MIDI
    // but there's 8 of them so they must refer to the channels somehow
    // all default to 0.
    // refers to whether MIDI track is on TRACK or CHRMOATIC trig mode.
    // should be u8 as *possible* for more trig modes to be added (although unlikely)
    /// Trig mode for MIDI Track 1
    pub trig_mode_midi_track_1: u8,

    /// Trig mode for MIDI Track 2
    pub trig_mode_midi_track_2: u8,

    /// Trig mode for MIDI Track 3
    pub trig_mode_midi_track_3: u8,

    /// Trig mode for MIDI Track 4
    pub trig_mode_midi_track_4: u8,

    /// Trig mode for MIDI Track 5
    pub trig_mode_midi_track_5: u8,

    /// Trig mode for MIDI Track 6
    pub trig_mode_midi_track_6: u8,

    /// Trig mode for MIDI Track 7
    pub trig_mode_midi_track_7: u8,

    /// Trig mode for MIDI Track 8
    pub trig_mode_midi_track_8: u8,
}

#[allow(clippy::derivable_impls)] // clear documentation for non-rustaceans
impl Default for MidiTrackTrigModes {
    fn default() -> Self {
        Self {
            trig_mode_midi_track_1: 0,
            trig_mode_midi_track_2: 0,
            trig_mode_midi_track_3: 0,
            trig_mode_midi_track_4: 0,
            trig_mode_midi_track_5: 0,
            trig_mode_midi_track_6: 0,
            trig_mode_midi_track_7: 0,
            trig_mode_midi_track_8: 0,
        }
    }
}

impl TryFrom<&HashMap<String, String>> for MidiTrackTrigModes {
    type Error = ProjectParseError;
    fn try_from(value: &HashMap<String, String>) -> Result<Self, Self::Error> {
        let trig_mode_midi_track_1 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_1", None)?;
        let trig_mode_midi_track_2 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_2", None)?;
        let trig_mode_midi_track_3 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_3", None)?;
        let trig_mode_midi_track_4 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_4", None)?;
        let trig_mode_midi_track_5 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_5", None)?;
        let trig_mode_midi_track_6 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_6", None)?;
        let trig_mode_midi_track_7 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_7", None)?;
        let trig_mode_midi_track_8 =
            parse_hashmap_string_value::<u8>(value, "trig_mode_midi_track_8", None)?;

        Ok(Self {
            trig_mode_midi_track_1,
            trig_mode_midi_track_2,
            trig_mode_midi_track_3,
            trig_mode_midi_track_4,
            trig_mode_midi_track_5,
            trig_mode_midi_track_6,
            trig_mode_midi_track_7,
            trig_mode_midi_track_8,
        })
    }
}