#![allow(dead_code)]
pub(super) mod info;
mod region;
use info::PresetInfo;
pub use region::*;
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct Preset {
pub(crate) name: String,
pub(crate) patch_number: i32,
pub(crate) bank_number: i32,
pub(crate) library: i32,
pub(crate) genre: i32,
pub(crate) morphology: i32,
pub(crate) regions: Vec<PresetRegion>,
}
impl Preset {
fn new(
info: &PresetInfo,
preset_id: usize,
zones: &[Zone],
instruments: &[Instrument],
) -> Result<Self, SoundFontError> {
let name = info.name.clone();
let zone_count = info.zone_end_index - info.zone_start_index + 1;
if zone_count <= 0 {
return Err(SoundFontError::InvalidPreset(preset_id));
}
let span_start = info.zone_start_index as usize;
let span_end = span_start + zone_count as usize;
let zone_span = &zones[span_start..span_end];
let regions = PresetRegion::create(preset_id, zone_span, instruments)?;
Ok(Self {
name,
patch_number: info.patch_number,
bank_number: info.bank_number,
library: info.library,
genre: info.genre,
morphology: info.morphology,
regions,
})
}
pub(crate) fn create(
infos: &[PresetInfo],
zones: &[Zone],
instruments: &[Instrument],
) -> Result<Vec<Preset>, SoundFontError> {
if infos.len() <= 1 {
return Err(SoundFontError::PresetNotFound);
}
let count = infos.len() - 1;
let mut presets: Vec<Preset> = Vec::new();
for (preset_id, info) in infos.iter().take(count).enumerate() {
presets.push(Preset::new(info, preset_id, zones, instruments)?);
}
Ok(presets)
}
pub fn get_name(&self) -> &str {
&self.name
}
pub fn get_patch_number(&self) -> i32 {
self.patch_number
}
pub fn get_bank_number(&self) -> i32 {
self.bank_number
}
pub fn get_library(&self) -> i32 {
self.library
}
pub fn get_genre(&self) -> i32 {
self.genre
}
pub fn get_morphology(&self) -> i32 {
self.morphology
}
pub fn get_regions(&self) -> &[PresetRegion] {
&self.regions[..]
}
}