use crate::core::soundfont::SoundFont;
use crate::SoundFontId;
use crate::Synth;
impl Synth {
pub fn add_font(&mut self, font: SoundFont, reset_presets: bool) -> SoundFontId {
let id = self.core.font_bank.add_font(font);
if reset_presets {
self.program_reset();
}
id
}
fn update_presets(&mut self) {
for id in 0..self.core.channels.len() {
let sfontnum = self.core.channels[id].sfontnum();
if let Some(sfontnum) = sfontnum {
let banknum = self.core.channels[id].banknum();
let prognum = self.core.channels[id].prognum();
let preset = self.core.font_bank.preset(sfontnum, banknum, prognum);
self.core.channels[id].set_preset(preset);
}
}
}
pub fn remove_font(&mut self, id: SoundFontId, reset_presets: bool) -> Result<(), ()> {
let sfont = self.core.font_bank.remove_font(id);
if sfont.is_some() {
if reset_presets {
self.program_reset();
} else {
self.update_presets();
}
Ok(())
} else {
log::error!("No SoundFont with id = {:?}", id);
Err(())
}
}
pub fn count_fonts(&self) -> usize {
self.core.font_bank.count()
}
pub fn nth_sfont(&self, num: usize) -> Option<&SoundFont> {
self.core.font_bank.get_nth_font(num)
}
pub fn sfont(&self, id: SoundFontId) -> Option<&SoundFont> {
self.core.font_bank.get_font(id)
}
pub fn set_bank_offset(&mut self, sfont_id: SoundFontId, offset: u32) {
self.core.font_bank.bank_offsets.set(sfont_id, offset)
}
pub fn bank_offset(&self, sfont_id: SoundFontId) -> Option<u32> {
self.core
.font_bank
.bank_offsets
.get(sfont_id)
.map(|o| o.offset)
}
}
#[cfg(test)]
mod test {
use crate::{SoundFont, Synth, SynthDescriptor};
#[test]
fn font_and_preset() {
let mut synth = Synth::new(SynthDescriptor::default()).unwrap();
assert_eq!(synth.count_fonts(), 0);
let sin = {
let mut file = std::fs::File::open("./testdata/sin.sf2").unwrap();
let font = SoundFont::load(&mut file).unwrap();
let id = synth.add_font(font, true);
assert_eq!(synth.count_fonts(), 1);
let font = synth.sfont(id).unwrap();
let preset = font.preset(0, 0).unwrap();
assert_eq!(preset.name(), "Sine Wave");
assert_eq!(preset.banknum(), 0);
assert_eq!(preset.num(), 0);
id
};
let boom = {
let mut file = std::fs::File::open("./testdata/Boomwhacker.sf2").unwrap();
let font = SoundFont::load(&mut file).unwrap();
let id = synth.add_font(font, true);
assert_eq!(synth.count_fonts(), 2);
let font = synth.sfont(id).unwrap();
let preset = font.preset(0, 0).unwrap();
assert_eq!(preset.name(), "Boomwhacker");
assert_eq!(preset.banknum(), 0);
assert_eq!(preset.num(), 0);
id
};
{
}
{
let font = synth.sfont(sin).unwrap();
let preset = font.preset(0, 0).unwrap();
assert_eq!(preset.name(), "Sine Wave");
assert_eq!(preset.banknum(), 0);
assert_eq!(preset.num(), 0);
}
{
let font = synth.sfont(boom).unwrap();
let preset = font.preset(0, 0).unwrap();
assert_eq!(preset.name(), "Boomwhacker");
assert_eq!(preset.banknum(), 0);
assert_eq!(preset.num(), 0);
}
}
}