m8_file_parser/instruments/modulator/
ahd_env.rs1use 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}