summaryrefslogtreecommitdiff
path: root/klangfarbrs
diff options
context:
space:
mode:
authorGrant Shangreaux <grant@unabridgedsoftware.com>2021-12-17 20:41:38 -0600
committerGrant Shangreaux <grant@unabridgedsoftware.com>2021-12-17 20:41:38 -0600
commit3eb0824c6477bc7720b3ed0ac49f58a34cfa0546 (patch)
tree33ea1ae98d16c83a120753680cb375aa170109f4 /klangfarbrs
parent887247d8a54ee54ec891aeefc19c18c241af6c09 (diff)
Add: more detailed Risset's Bell implementation
also hooks duration up to the main synth to control the length of the Instrument notes that get played, since they aren't subject to the ADSR envelope
Diffstat (limited to 'klangfarbrs')
-rw-r--r--klangfarbrs/src/instrument.rs26
-rw-r--r--klangfarbrs/src/lib.rs13
2 files changed, 34 insertions, 5 deletions
diff --git a/klangfarbrs/src/instrument.rs b/klangfarbrs/src/instrument.rs
index bf08fe4..3170464 100644
--- a/klangfarbrs/src/instrument.rs
+++ b/klangfarbrs/src/instrument.rs
@@ -1,4 +1,4 @@
-use super::{ Partial, Sample, Hz, SamplesPerSecond };
+use super::{ Partial, Millisecond, Sample, Hz, SamplesPerSecond };
pub struct Instrument {
pub partials: Vec<Partial>,
@@ -13,6 +13,28 @@ impl Instrument {
}
}
+ pub fn bell(base_freq: Hz, duration: Millisecond, sample_rate: SamplesPerSecond) -> Self {
+ let bell_partials = vec![
+ (1.0, 1.0, 0.56, 0.0),
+ (0.67, 0.9, 0.56, 1.0),
+ (1.0, 0.65, 0.82, 0.0),
+ (1.8, 0.55, 0.92, 1.7),
+ (2.67, 0.325, 1.19, 0.0),
+ (1.67, 0.35, 1.7, 0.0),
+ (1.46, 0.25, 2.0, 0.0),
+ (1.33, 0.2, 2.74, 0.0),
+ (1.33, 0.15, 3.0, 0.0),
+ (1.0, 0.1, 3.76, 0.0),
+ (1.33, 0.075, 4.07, 0.0),
+ ];
+
+ Self {
+ partials: bell_partials.iter()
+ .map(|&p| Partial::new(p.0, p.1, p.2, p.3, sample_rate, duration, base_freq))
+ .collect()
+ }
+ }
+
pub fn sample(&mut self) -> Sample {
match self.next() {
Some(s) => { s },
@@ -52,3 +74,5 @@ mod tests {
assert_eq!(inst.last(), Some(0.0));
}
}
+
+// Partial::new(1.0, 1.0, p, 0.0, sample_rate, 2000, base_freq)
diff --git a/klangfarbrs/src/lib.rs b/klangfarbrs/src/lib.rs
index de3322a..aa133e7 100644
--- a/klangfarbrs/src/lib.rs
+++ b/klangfarbrs/src/lib.rs
@@ -82,14 +82,14 @@ impl MonoSynth {
Self {
osc: Osc::new(freq, sprt),
- instrument: Instrument::new(freq, vec![0.56, 0.92, 1.19, 1.7, 2.0, 2.74, 3.0, 3.76, 4.07], sprt),
+ instrument: Instrument::bell(freq, 10000, sprt),
sample_rate: sprt,
frequency: freq,
apply_bend: false,
phasor_bend: Vector2::new(0.0, 0.0),
play_instrument: false,
continuous: true,
- duration: 0,
+ duration: 5000,
envelope: Envelope::new(30, 500, 0.5, 1000, sprt),
cutoff: 0.0,
frequency_modulation: false,
@@ -185,6 +185,11 @@ impl MonoSynth {
}
#[export]
+ fn duration(&mut self, _owner: &Node, duration: Millisecond) {
+ self.duration = duration
+ }
+
+ #[export]
fn set_attack(&mut self, _owner: &Node, attack: Millisecond) {
self.attack = attack
}
@@ -215,7 +220,7 @@ impl MonoSynth {
#[export]
fn trigger(&mut self, _owner: &Node,
) {
- self.instrument = Instrument::new(self.frequency, vec![0.56, 0.92, 1.19, 1.7, 2.0, 2.74, 3.0, 3.76, 4.07], self.sample_rate);
+ self.instrument = Instrument::bell(self.frequency, self.duration, self.sample_rate);
self.envelope = Envelope::new(self.attack, self.decay, self.sustain, self.release, self.sample_rate);
}
@@ -244,7 +249,7 @@ impl MonoSynth {
// self.phasor.phase = next_phase;
// }
- if !self.continuous {
+ if !self.continuous && !self.play_instrument {
sample *= match self.envelope.next() {
Some(a) => a,
None => 0.0,