use crate::analysis::TimbreProfile;
use crate::transfer::TimbreTransfer;
pub struct InstrumentSynthesizer {
pub profile: TimbreProfile,
transfer: TimbreTransfer,
}
impl InstrumentSynthesizer {
pub fn new(profile: TimbreProfile) -> Self {
let fft_size = 2048;
Self {
transfer: TimbreTransfer::new(fft_size),
profile,
}
}
pub fn synthesize_note(
&mut self,
source_audio: &[f32],
note: u8,
sample_rate: f32,
) -> Vec<f32> {
if let Some(envelope) = self.profile.envelope_for_note(note) {
self.transfer.set_target(envelope.clone());
self.transfer.amount = 1.0;
}
self.transfer.process_block(source_audio)
}
pub fn synthesize_range(
&mut self,
source_audio: &[f32],
note_low: u8,
note_high: u8,
sample_rate: f32,
) -> Vec<(u8, Vec<f32>)> {
let mut results = Vec::new();
for note in note_low..=note_high {
let audio = self.synthesize_note(source_audio, note, sample_rate);
results.push((note, audio));
}
results
}
}