summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrant Shangreaux <grant@unabridgedsoftware.com>2021-10-30 23:56:38 -0500
committerGrant Shangreaux <grant@unabridgedsoftware.com>2021-10-30 23:56:38 -0500
commit4565611763cbb041384230580f9c7de4fea7da6f (patch)
tree9d983f4da2dc60a578379958eda028242412ae71
parentb9559897c05b8c2f67e34372685952d586af5c3d (diff)
Add: square wave and waveform switch interface in godot
-rw-r--r--klangfarb/main.gd17
-rw-r--r--klangfarbrs/src/lib.rs21
2 files changed, 33 insertions, 5 deletions
diff --git a/klangfarb/main.gd b/klangfarb/main.gd
index f91dbb7..8abf461 100644
--- a/klangfarb/main.gd
+++ b/klangfarb/main.gd
@@ -1,10 +1,13 @@
extends AudioStreamPlayer
# controllable frequency interface
-export(float, 20, 8000, 10) var freq = 440.0
+export(float, 20, 8000, 5) var freq = 440.0
+# control wave form
+export(String, "sine", "square") var waveform = "sine"
# load the GDNative script connected to the rust lib
var Osc = preload("res://Osc.gdns")
+
# make an instance of our one "class" in rust lib
var wave = Osc.new()
@@ -20,10 +23,18 @@ func _fill_buffer() -> void:
# playback stream buffer
playback.push_buffer(wave.frames(freq, to_fill))
-func _process(_delta):
- _fill_buffer()
+func _process(delta):
+ if waveform == "square":
+ wave.square()
+ playback.clear_buffer()
+ else:
+ wave.sine()
+ playback.clear_buffer()
+ _fill_buffer()
func _ready() -> void:
+ # buffer length of 100ms gives us ~realtime response to input changes
+ self.stream.buffer_length = 0.1
# ensure Godot/Sine have the same sample rate
wave.set_sample_rate(self.stream.mix_rate)
# get our AudioStreamPlayback object
diff --git a/klangfarbrs/src/lib.rs b/klangfarbrs/src/lib.rs
index a418995..7954eb2 100644
--- a/klangfarbrs/src/lib.rs
+++ b/klangfarbrs/src/lib.rs
@@ -23,9 +23,9 @@ pub struct Osc {
}
/// The various waveforms the `Osc` can generate.
-enum Waveform {
+pub enum Waveform {
Sine,
- // Square,
+ Square,
// Triangle,
// Saw,
// Noise,
@@ -36,6 +36,13 @@ fn generate_sample(osc: &Osc) -> f32 {
match osc.waveform {
Waveform::Sine => {
(TAU * osc.phase).sin()
+ },
+ Waveform::Square => {
+ if osc.phase < 0.5 {
+ -1.0
+ } else {
+ 1.0
+ }
}
}
}
@@ -79,6 +86,16 @@ impl Osc {
}
#[export]
+ fn sine(&mut self, _owner: &Node) {
+ self.waveform = Waveform::Sine
+ }
+
+ #[export]
+ fn square(&mut self, _owner: &Node) {
+ self.waveform = Waveform::Square
+ }
+
+ #[export]
pub fn set_sample_rate(&mut self, _owner: &Node, sample_rate: f32) {
self.sample_rate = sample_rate;
}