m8_file_parser/instruments/modulator/
ahd_env.rs

1use crate::{writer::Writer, Version};
2
3use super::{M8Result, Mod, Reader};
4
5#[derive(PartialEq, Debug, Clone, Default)]
6pub struct AHDEnv {
7    pub dest: u8,
8    pub amount: u8,
9    pub attack: u8,
10    pub hold: u8,
11    pub decay: u8,
12}
13
14const AHDENV_COMMAND_NAMES: [[&'static str; 5]; 4] = [
15    ["EA1", "AT1", "HO1", "DE1", "ET1"],
16    ["EA2", "AT2", "HO2", "DE2", "ET2"],
17    ["EA3", "AT3", "HO3", "DE3", "ET3"],
18    ["EA4", "AT4", "HO4", "DE4", "ET4"],
19];
20
21impl AHDEnv {
22    pub fn command_names(_ver: Version, mod_id: usize) -> &'static [&'static str] {
23        &AHDENV_COMMAND_NAMES[mod_id]
24    }
25
26    pub fn from_reader2(reader: &mut Reader) -> M8Result<Self> {
27        let r = Self {
28            dest: reader.read(),
29            amount: reader.read(),
30            attack: reader.read(),
31            hold: reader.read(),
32            decay: reader.read(),
33        };
34        reader.read();
35        Ok(r)
36    }
37
38    pub fn from_reader3(reader: &mut Reader, dest: u8) -> M8Result<Self> {
39        Ok(Self {
40            dest,
41            amount: reader.read(),
42            attack: reader.read(),
43            hold: reader.read(),
44            decay: reader.read(),
45        })
46    }
47
48    pub fn write(&self, w: &mut Writer) {
49        w.write(self.amount);
50        w.write(self.attack);
51        w.write(self.hold);
52        w.write(self.decay);
53    }
54
55    pub fn to_mod(self) -> Mod {
56        Mod::AHDEnv(self)
57    }
58}