sim_lib_sound_bridge/bank.rs
1use std::collections::HashMap;
2
3use sim_lib_sound_timbre::Timbre;
4
5/// A bank mapping MIDI `(bank MSB, bank LSB, program)` selections to timbres,
6/// with a fallback for unmapped selections.
7///
8/// # Examples
9///
10/// ```
11/// use sim_lib_sound_bridge::TimbreBank;
12/// use sim_lib_sound_timbre::{pure_sine, sawtooth};
13///
14/// let mut bank = TimbreBank::new(pure_sine());
15/// bank.insert(0, 0, 1, sawtooth(8));
16/// assert_eq!(bank.get(0, 0, 1).name, "sawtooth");
17/// assert_eq!(bank.get(0, 0, 9).name, "pure_sine");
18/// ```
19#[derive(Clone, Debug, PartialEq)]
20pub struct TimbreBank {
21 entries: HashMap<(u8, u8, u8), Timbre>,
22 fallback: Timbre,
23}
24
25impl TimbreBank {
26 /// Builds an empty bank with the given fallback timbre.
27 pub fn new(fallback: Timbre) -> Self {
28 Self {
29 entries: HashMap::new(),
30 fallback,
31 }
32 }
33
34 /// Assigns `timbre` to the given bank/program selection.
35 pub fn insert(&mut self, bank_msb: u8, bank_lsb: u8, program: u8, timbre: Timbre) {
36 self.entries.insert((bank_msb, bank_lsb, program), timbre);
37 }
38
39 /// Returns the timbre for the selection, or the fallback if unmapped.
40 pub fn get(&self, bank_msb: u8, bank_lsb: u8, program: u8) -> &Timbre {
41 self.entries
42 .get(&(bank_msb, bank_lsb, program))
43 .unwrap_or(&self.fallback)
44 }
45
46 /// Returns the fallback timbre.
47 pub fn fallback(&self) -> &Timbre {
48 &self.fallback
49 }
50
51 /// Returns the mapped entries keyed by bank/program selection.
52 pub fn entries(&self) -> &HashMap<(u8, u8, u8), Timbre> {
53 &self.entries
54 }
55}