use super::{
adsr_event::{AdsrEvent, AdsrEventType},
adsr_processor::AdsrProcessor,
};
use crate::{commands::Id, effects::Channel, graph::DspParameters, prelude::*};
use std::time::Duration;
pub struct Adsr {
pub node: GraphNode,
event_transmitter: Channel::Sender<AdsrEvent>,
}
static EVENT_CHANNEL_CAPACITY: usize = 32;
impl Adsr {
pub fn new(context: &dyn Context, channel_count: usize, sample_rate: usize) -> Self {
let id = Id::generate();
let (event_transmitter, event_receiver) = Channel::bounded(EVENT_CHANNEL_CAPACITY);
let processor = Box::new(AdsrProcessor::new(
event_receiver,
sample_rate,
context.maximum_frame_count(),
));
Self {
node: GraphNode::new(
id,
context,
channel_count,
channel_count,
processor,
DspParameters::empty(),
),
event_transmitter,
}
}
pub fn note_on_at_time(&mut self, time: Timestamp) {
let _ = self
.event_transmitter
.send(AdsrEvent::new(time, AdsrEventType::NoteOn));
}
pub fn note_off_at_time(&mut self, time: Timestamp) {
let _ = self
.event_transmitter
.send(AdsrEvent::new(time, AdsrEventType::NoteOff));
}
pub fn set_attack_time(&mut self, attack_time: Duration) {
let _ = self.event_transmitter.send(AdsrEvent::new(
Timestamp::zero(),
AdsrEventType::SetAttack(attack_time),
));
}
pub fn set_decay_time(&mut self, decay_time: Duration) {
let _ = self.event_transmitter.send(AdsrEvent::new(
Timestamp::zero(),
AdsrEventType::SetDecay(decay_time),
));
}
pub fn set_sustain_level(&mut self, sustain_level: Level) {
let _ = self.event_transmitter.send(AdsrEvent::new(
Timestamp::zero(),
AdsrEventType::SetSustain(sustain_level),
));
}
pub fn set_release_time(&mut self, release_time: Duration) {
let _ = self.event_transmitter.send(AdsrEvent::new(
Timestamp::zero(),
AdsrEventType::SetRelease(release_time),
));
}
pub fn set_adsr(
&mut self,
attack_time: Duration,
decay_time: Duration,
sustain_level: Level,
release_time: Duration,
) {
self.set_attack_time(attack_time);
self.set_decay_time(decay_time);
self.set_sustain_level(sustain_level);
self.set_release_time(release_time);
}
}