use std::mem::MaybeUninit;
use crate::{Synth, Result, Status, Chan, Key, Vel, Ctrl, Val, Prog, Bank, FontId, PresetId, ffi};
impl Synth {
pub fn note_on(&self, chan: Chan, key: Key, vel: Vel) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_noteon(self.handle, chan as _, key as _, vel as _) })
}
pub fn note_off(&self, chan: Chan, key: Key) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_noteoff(self.handle, chan as _, key as _) })
}
pub fn cc(&self, chan: Chan, ctrl: Ctrl, val: Val) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_cc(self.handle, chan as _, ctrl as _, val as _) })
}
pub fn get_cc(&self, chan: Chan, ctrl: Ctrl) -> Result<Val> {
let mut val = MaybeUninit::uninit();
self.zero_ok(unsafe { ffi::fluid_synth_get_cc(self.handle, chan as _, ctrl as _, val.as_mut_ptr()) })
.map(|_| unsafe { val.assume_init() as _ })
}
pub fn pitch_bend(&self, chan: Chan, val: Val) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_pitch_bend(self.handle, chan as _, val as _) })
}
pub fn get_pitch_bend(&self, chan: Chan) -> Result<Val> {
let mut pitch_bend = MaybeUninit::uninit();
self.zero_ok(unsafe { ffi::fluid_synth_get_pitch_bend(self.handle, chan as _, pitch_bend.as_mut_ptr()) })
.map(|_| unsafe { pitch_bend.assume_init() as _ })
}
pub fn pitch_wheel_sens(&self, chan: Chan, val: Val) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_pitch_wheel_sens(self.handle, chan as _, val as _) })
}
pub fn get_pitch_wheel_sens(&self, chan: Chan) -> Result<Val> {
let mut val = MaybeUninit::uninit();
self.zero_ok(unsafe { ffi::fluid_synth_get_pitch_wheel_sens(self.handle, chan as _, val.as_mut_ptr()) })
.map(|_| unsafe { val.assume_init() as _ })
}
pub fn program_change(&self, chan: Chan, prog: Prog) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_program_change(self.handle, chan as _, prog as _) })
}
pub fn channel_pressure(&self, chan: Chan, val: Val) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_channel_pressure(self.handle, chan as _, val as _) })
}
pub fn bank_select(&self, chan: Chan, bank: Bank) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_bank_select(self.handle, chan as _, bank) })
}
pub fn sfont_select(&self, chan: Chan, sfont_id: FontId) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_sfont_select(self.handle, chan as _, sfont_id) })
}
pub fn program_select(&self, chan: Chan, sfont_id: FontId, bank_num: Bank, preset_num: PresetId) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_program_select(self.handle, chan as _, sfont_id, bank_num, preset_num) })
}
pub fn get_program(&self, chan: Chan) -> Result<(FontId, Bank, PresetId)> {
let mut sfont_id = MaybeUninit::uninit();
let mut bank_num = MaybeUninit::uninit();
let mut preset_num = MaybeUninit::uninit();
self.zero_ok(unsafe {
ffi::fluid_synth_get_program(self.handle, chan as _,
sfont_id.as_mut_ptr(),
bank_num.as_mut_ptr(),
preset_num.as_mut_ptr())
}).map(|_| unsafe { (
sfont_id.assume_init(),
bank_num.assume_init(),
preset_num.assume_init(),
) })
}
pub fn program_reset(&self) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_program_reset(self.handle) })
}
pub fn system_reset(&self) -> Status {
self.zero_ok(unsafe { ffi::fluid_synth_system_reset(self.handle) })
}
}