Skip to main content

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}