old school music tracker audio backend
1#[derive(Debug, Default, Copy, Clone)]
2pub enum NoteCommand {
3 #[default]
4 None, // _, 0
5 SetTempo(u8), // A, 1
6 JumpToOrder(u8), // B, 2
7 BreakToRow(u8), // C, 3
8 /// Has lot of extra effects depending on value
9 VolumeSlideDown(u8), // D, 4
10 PitchSlideDown(u8), // E, 5
11 PitchSlideUp(u8), // F, 6
12 SlideToNote(u8), // G, 7
13 Vibrato(u8), // H, 8
14 Tremor(u8), // I, 9
15 Arpeggio(u8), // J, 10
16 VibratoAndVolSlideDown(u8), // K, 11
17 SlideToNoteAndVolSlideDown(u8), // L, 12
18 SetChannelVol(u8), // M, 13
19 /// Some extra effects depending on value
20 ChannelVolumeSlideDown(u8), // N, 14
21 SetSampleOffset(u8), // O. 15
22 /// also can do fine panning
23 PanningSlide(u8), // P, 16
24 RetriggerNote(u8), // Q, 17
25 Tremolo(u8), // R, 18
26 /// Can do a lot of stuff, most of which doesn't have a value
27 AlmostEverything(u8), // S, 19
28 /// Can also do slides
29 TempoChange(u8), // T, 20
30 FineVibrato(u8), // U, 21
31 SetGlobalVolume(u8), // V, 22
32 GlobalVolumeSlide(u8), // W, 23
33 SetPanning(u8), // X, 24
34 Panbrello(u8), // Y, 25
35 MIDIMacros(u8), // Z, 26
36 // Effect byte value reaches until 31, so some missing?
37}
38
39pub struct UnknownCommand;
40
41impl TryFrom<(u8, u8)> for NoteCommand {
42 type Error = UnknownCommand;
43
44 fn try_from((command_type, command_value): (u8, u8)) -> Result<Self, Self::Error> {
45 match command_type {
46 0 => Ok(Self::None),
47 1 => Ok(Self::SetTempo(command_value)),
48 2 => Ok(Self::JumpToOrder(command_value)),
49 3 => Ok(Self::BreakToRow(command_value)),
50 4 => Ok(Self::VolumeSlideDown(command_value)),
51 5 => Ok(Self::PitchSlideDown(command_value)),
52 6 => Ok(Self::PitchSlideUp(command_value)),
53 7 => Ok(Self::SlideToNote(command_value)),
54 8 => Ok(Self::Vibrato(command_value)),
55 9 => Ok(Self::Tremor(command_value)),
56 10 => Ok(Self::Arpeggio(command_value)),
57 11 => Ok(Self::VibratoAndVolSlideDown(command_value)),
58 12 => Ok(Self::SlideToNoteAndVolSlideDown(command_value)),
59 13 => Ok(Self::SetChannelVol(command_value)),
60 14 => Ok(Self::ChannelVolumeSlideDown(command_value)),
61 15 => Ok(Self::SetSampleOffset(command_value)),
62 16 => Ok(Self::PanningSlide(command_value)),
63 17 => Ok(Self::RetriggerNote(command_value)),
64 18 => Ok(Self::Tremolo(command_value)),
65 19 => Ok(Self::AlmostEverything(command_value)),
66 20 => Ok(Self::TempoChange(command_value)),
67 21 => Ok(Self::FineVibrato(command_value)),
68 22 => Ok(Self::SetGlobalVolume(command_value)),
69 23 => Ok(Self::GlobalVolumeSlide(command_value)),
70 24 => Ok(Self::SetPanning(command_value)),
71 25 => Ok(Self::Panbrello(command_value)),
72 26 => Ok(Self::MIDIMacros(command_value)),
73 _ => Err(UnknownCommand),
74 }
75 }
76}