diff options
author | Grant Shangreaux <grant@unabridgedsoftware.com> | 2021-10-29 19:44:06 -0500 |
---|---|---|
committer | Grant Shangreaux <grant@unabridgedsoftware.com> | 2021-10-29 19:44:06 -0500 |
commit | 21e720bb89e494cc89e99169e13fff9bf0dbdc6f (patch) | |
tree | 29b1d4448ddf742129942b92ffcd294900bd0a22 | |
parent | 5da87bc8e3242da739a4b958563cf804a341bb8b (diff) |
Add: pack an Array<Vector2<f32>> of samples and push_buffer
- add a method to set the sample rate of the sine wave
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | klangfarb/Main.tscn | 2 | ||||
-rw-r--r-- | klangfarb/main.gd | 24 | ||||
-rw-r--r-- | klangfarbrs/src/lib.rs | 19 |
4 files changed, 25 insertions, 23 deletions
@@ -7,3 +7,6 @@ build: refresh_lib: build cp $(LIB_PATH) klangfarb + +release: + cd klangfarbrs && cargo build --release diff --git a/klangfarb/Main.tscn b/klangfarb/Main.tscn index da55d83..95d51f7 100644 --- a/klangfarb/Main.tscn +++ b/klangfarb/Main.tscn @@ -6,5 +6,5 @@ [node name="Audio" type="AudioStreamPlayer"] stream = SubResource( 1 ) -volume_db = -27.262 +volume_db = -7.38 script = ExtResource( 2 ) diff --git a/klangfarb/main.gd b/klangfarb/main.gd index 568af36..82f8ce9 100644 --- a/klangfarb/main.gd +++ b/klangfarb/main.gd @@ -2,29 +2,21 @@ extends AudioStreamPlayer var playback: AudioStreamPlayback = null var SineWave = preload("res://SineWave.gdns") -var buffer = SineWave.new() -var duration = 3 -var samples = buffer.frames(440.0, 44100.0, duration) -var sample_count = samples.size() -var current_count = 0 +var wave = SineWave.new() +var freq = 440.0 func _fill_buffer() -> void: var to_fill = playback.get_frames_available() - - while to_fill > 0 && current_count != sample_count: - var sample_index = current_count - playback.push_frame(Vector2.ONE * samples[sample_index]) # Audio frames are stereo. - to_fill -= 1 - current_count += 1 + print(to_fill) + if to_fill > 0: + playback.push_buffer(wave.frames(freq, to_fill)) func _process(_delta): - if current_count < sample_count: - _fill_buffer() - else: - self.stop() + _fill_buffer() func _ready() -> void: - self.stream.mix_rate = 44100.0 + self.stream.mix_rate = freq * 256 + wave.set_sample_rate(freq * 256) playback = self.get_stream_playback() _fill_buffer() self.play() diff --git a/klangfarbrs/src/lib.rs b/klangfarbrs/src/lib.rs index 1489667..0628e34 100644 --- a/klangfarbrs/src/lib.rs +++ b/klangfarbrs/src/lib.rs @@ -5,12 +5,14 @@ use std::f32::consts::TAU; #[derive(NativeClass)] #[inherit(Node)] -pub struct SineWave {} +pub struct SineWave { + sample_rate: f32 +} #[methods] impl SineWave { fn new(_owner: &Node) -> Self { - SineWave {} + SineWave { sample_rate: 44100.0 } } #[export] @@ -19,12 +21,17 @@ impl SineWave { } #[export] - pub fn frames(&self, _owner: &Node, frequency: f32, sample_rate: f32, duration: i32) -> TypedArray<f32> { + fn set_sample_rate(&mut self, _owner: &Node, sample_rate: f32) { + self.sample_rate = sample_rate; + } + + #[export] + pub fn frames(&self, _owner: &Node, frequency: f32, duration: i32) -> TypedArray<Vector2> { let mut frames = TypedArray::new(); - let calculated_duration = sample_rate * duration as f32; - for i in 0..calculated_duration as i32 { - frames.push((TAU * frequency * i as f32/sample_rate).sin()); + for i in 0..duration as i32 { + let sample = (TAU * frequency * i as f32/self.sample_rate).sin(); + frames.push(Vector2::new(sample, sample)); } return frames |