use core::num::NonZeroI8;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Control {
Bank(i8),
Wheel(i8),
Breath(i8),
Pedal(i8),
PortamentoTime(i8),
DataEntry(i8),
Volume(i8),
Balance(i8),
Pan(i8),
Expression(i8),
EffectA(i8),
EffectB(i8),
UserA(i8),
UserB(i8),
UserC(i8),
UserD(i8),
Lsb {
which: i8,
value: i8,
},
Damper(bool),
Bend(bool),
Sostenuto(bool),
Soft(bool),
Legato(bool),
Hold(bool),
Variation(i8),
Resonance(i8),
ReleaseTime(i8),
AttackTime(i8),
CutoffFrequency(i8),
ShaperA(i8),
ShaperB(i8),
ShaperC(i8),
ShaperD(i8),
ShaperE(i8),
Decay(bool),
HiPassFilter(bool),
SwitchA(bool),
SwitchB(bool),
Portamento(i8),
Velocity(i8),
Reverb(i8),
Tremelo(i8),
Chorus(i8),
Detune(i8),
Phaser(i8),
DataIncrement,
DataDecrement,
NrpnLsbSelect(i8),
NrpnMsbSelect(i8),
RpnLsbSelect(i8),
RpnMsbSelect(i8),
Mute,
Reset,
Local(bool),
Stop,
OmniOff,
OmniOn,
Monophonic(Option<NonZeroI8>),
Polyphonic,
Undefined {
which: i8,
value: i8,
},
}
impl Control {
pub(crate) fn new(which: i8, value: i8) -> Self {
match which {
0 => Control::Bank(value),
1 => Control::Wheel(value),
2 => Control::Breath(value),
4 => Control::Pedal(value),
5 => Control::PortamentoTime(value),
6 => Control::DataEntry(value),
7 => Control::Volume(value),
8 => Control::Balance(value),
10 => Control::Pan(value),
11 => Control::Expression(value),
12 => Control::EffectA(value),
13 => Control::EffectB(value),
16 => Control::UserA(value),
17 => Control::UserB(value),
18 => Control::UserC(value),
19 => Control::UserD(value),
32..=63 => Control::Lsb {
which: which & 0x1F,
value,
},
64 => Control::Damper(value >= 64),
65 => Control::Bend(value >= 64),
66 => Control::Sostenuto(value >= 64),
67 => Control::Soft(value >= 64),
68 => Control::Legato(value >= 64),
69 => Control::Hold(value >= 64),
70 => Control::Variation(value),
71 => Control::Resonance(value),
72 => Control::ReleaseTime(value),
73 => Control::AttackTime(value),
74 => Control::CutoffFrequency(value),
75 => Control::ShaperA(value),
76 => Control::ShaperB(value),
77 => Control::ShaperC(value),
78 => Control::ShaperD(value),
79 => Control::ShaperE(value),
80 => Control::Decay(value >= 64),
81 => Control::HiPassFilter(value >= 64),
82 => Control::SwitchA(value >= 64),
83 => Control::SwitchB(value >= 64),
84 => Control::Portamento(value),
88 => Control::Velocity(value),
91 => Control::Reverb(value),
92 => Control::Tremelo(value),
93 => Control::Chorus(value),
94 => Control::Detune(value),
95 => Control::Phaser(value),
96 => Control::DataIncrement,
97 => Control::DataDecrement,
98 => Control::NrpnLsbSelect(value),
99 => Control::NrpnMsbSelect(value),
100 => Control::RpnLsbSelect(value),
101 => Control::RpnMsbSelect(value),
120 => Control::Mute,
121 => Control::Reset,
122 => Control::Local(value >= 64),
123 => Control::Stop,
124 => Control::OmniOff,
125 => Control::OmniOn,
126 => Control::Monophonic(NonZeroI8::new(value)),
127 => Control::Polyphonic,
which => Control::Undefined { which, value },
}
}
}