use crate::{ffi, Bank, Chan, Ctrl, FontId, Key, PresetId, Prog, Result, Status, Synth, Val, Vel};
use std::mem::MaybeUninit;
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 key_pressure(&self, chan: Chan, key: Key, val: Val) -> Status {
self.zero_ok(unsafe {
ffi::fluid_synth_key_pressure(self.handle, chan as _, key 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) })
}
}