diff options
author | Jacob Lee <jacob@unabridgedsoftware.com> | 2021-10-27 22:46:58 -0400 |
---|---|---|
committer | Jacob Lee <jacob@unabridgedsoftware.com> | 2021-10-27 22:46:58 -0400 |
commit | ffacb1c96b02507f1bdd612bd71b6bcc7d114505 (patch) | |
tree | b79a7b9f4a9afe4f1a9cf4d3e2f0d853bf14f5d9 | |
parent | 7bd9dd418ac6215094feb87087fcb59499c3aa69 (diff) |
Clean up
-rw-r--r-- | klangfarb/Main.tscn | 1 | ||||
-rwxr-xr-x | klangfarb/libklangfarbrs.so | bin | 20371304 -> 20147240 bytes | |||
-rw-r--r-- | klangfarb/main.gd | 12 | ||||
-rw-r--r-- | klangfarbrs/src/ignore | 147 | ||||
-rw-r--r-- | klangfarbrs/src/lib.rs | 32 |
5 files changed, 17 insertions, 175 deletions
diff --git a/klangfarb/Main.tscn b/klangfarb/Main.tscn index 1a32577..da55d83 100644 --- a/klangfarb/Main.tscn +++ b/klangfarb/Main.tscn @@ -6,4 +6,5 @@ [node name="Audio" type="AudioStreamPlayer"] stream = SubResource( 1 ) +volume_db = -27.262 script = ExtResource( 2 ) diff --git a/klangfarb/libklangfarbrs.so b/klangfarb/libklangfarbrs.so Binary files differindex c7b448a..280cd61 100755 --- a/klangfarb/libklangfarbrs.so +++ b/klangfarb/libklangfarbrs.so diff --git a/klangfarb/main.gd b/klangfarb/main.gd index d88d431..806850d 100644 --- a/klangfarb/main.gd +++ b/klangfarb/main.gd @@ -3,23 +3,17 @@ var playback: AudioStreamPlayback = null var MonoBuffer = preload("res://MonoBuffer.gdns") var buffer = MonoBuffer.new() -var samples = buffer.frames +var duration = 3 +var samples = buffer.frames(440.0, 44100.0, duration) var sample_count = samples.size() var current_count = 0 -#func _create_generator() -> void: -# stream = AudioStreamGenerator.new() -# stream.mix_rate = 44100.0 # Setting mix rate is only possible before play(). -# playback = get_stream_playback() - 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. -# _phase = fmod(_phase + frequency() / GDawConfig.sample_rate, 1.0) -# _update_state() to_fill -= 1 current_count += 1 @@ -34,5 +28,3 @@ func _ready() -> void: playback = self.get_stream_playback() _fill_buffer() self.play() -# _update_envelope() - diff --git a/klangfarbrs/src/ignore b/klangfarbrs/src/ignore deleted file mode 100644 index 6c52a4b..0000000 --- a/klangfarbrs/src/ignore +++ /dev/null @@ -1,147 +0,0 @@ - -pub mod test { - use cpal; - use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; - use dasp::{Sample}; - use dasp_signal::{self as signal, Signal}; - use std::sync::mpsc; - - pub fn test() -> Result<(), anyhow::Error> { - let host = cpal::default_host(); - let device = host - .default_output_device() - .expect("failed to find a default output device"); - let config = device.default_output_config()?; - - match config.sample_format() { - cpal::SampleFormat::F32 => run::<f32>(&device, &config.into())?, - cpal::SampleFormat::I16 => run::<i16>(&device, &config.into())?, - cpal::SampleFormat::U16 => run::<u16>(&device, &config.into())?, - } - - Ok(()) - } - - fn run<T>(device: &cpal::Device, config: &cpal::StreamConfig) -> Result<(), anyhow::Error> - where - T: cpal::Sample, - { - // Create a signal chain to play back 1 second of each oscillator at A4. - let base_freq = 440.0; - let multipliers = [0.8, 1.0, 1.2, 1.7, 2.9, 4.5, 8.8, 1.9, 3.6]; - let freqs = multipliers.map(|m| signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * m)); - let _sines = freqs.map(|f| f.clone().sine()); - - // Shitty naive implementation until Rust clicks. - let hz_0 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 0.8); - let hz_1 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 1.0); - let hz_2 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 1.2); - let hz_3 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 1.7); - let hz_4 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 2.9); - let hz_5 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 4.5); - let hz_6 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 8.8); - let hz_7 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 1.9); - let hz_8 = signal::rate(config.sample_rate.0 as f64).const_hz(base_freq * 3.6); - - let sine_0 = hz_0.clone().sine().scale_amp(0.03); - let sine_1 = hz_1.clone().sine(); - let sine_2 = hz_2.clone().sine().scale_amp(0.8); - let sine_3 = hz_3.clone().sine().scale_amp(0.004); - let sine_4 = hz_4.clone().sine().scale_amp(0.03); - let sine_5 = hz_5.clone().sine().scale_amp(0.02); - let sine_6 = hz_6.clone().sine().scale_amp(0.001); - let sine_7 = hz_7.clone().sine().scale_amp(0.006); - let sine_8 = hz_8.clone().sine().scale_amp(0.05); - - - // let hz = signal::rate(config.sample_rate.0 as f64).const_hz(440.0); - let one_sec = config.sample_rate.0 as usize; - - // let mut sin_a = hz - // .clone() - // .sine(); - - // let mut sin_b = hz_b - // .clone() - // .sine(); - - let mut synth = sine_0 - .add_amp(sine_1) - .add_amp(sine_2) - .add_amp(sine_3) - .add_amp(sine_4) - .add_amp(sine_5) - .add_amp(sine_6) - .add_amp(sine_7) - .add_amp(sine_8) - .take(one_sec) - .map(|s| s.to_sample::<f32>() * 0.2); - - // let mut synth = sines[0] - // .add_amp(sines[1]) - // .add_amp(sines[2]) - // .add_amp(sines[3]) - // .add_amp(sines[4]) - // .add_amp(sines[5]) - // .add_amp(sines[6]) - // .add_amp(sines[7]) - // .add_amp(sines[8]) - // .take(one_sec) - // .map(|s| s.to_sample::<f32>() * 0.2); - // let mut synth = sin_a.add_amp(sin_b).take(one_sec).map(|s| s.to_sample::<f32>() * 0.2); - // let mut synth = hz - // .clone() - // .sine() - // .take(one_sec) - // .chain(hz.clone().saw().take(one_sec)) - // .chain(hz.clone().square().take(one_sec)) - // .chain(hz.clone().noise_simplex().take(one_sec)) - // .chain(signal::noise(0).take(one_sec)) - // .map(|s| s.to_sample::<f32>() * 0.2); - - // A channel for indicating when playback has completed. - let (complete_tx, complete_rx) = mpsc::sync_channel(1); - - // Create and run the stream. - let err_fn = |err| eprintln!("an error occurred on stream: {}", err); - let channels = config.channels as usize; - let stream = device.build_output_stream( - config, - move |data: &mut [T], _: &cpal::OutputCallbackInfo| { - write_data(data, channels, &complete_tx, &mut synth) - }, - err_fn, - )?; - stream.play()?; - - // Wait for playback to complete. - complete_rx.recv().unwrap(); - stream.pause()?; - - Ok(()) - } - - fn write_data<T>( - output: &mut [T], - channels: usize, - complete_tx: &mpsc::SyncSender<()>, - signal: &mut dyn Iterator<Item = f32>, - ) where - T: cpal::Sample, - { - for frame in output.chunks_mut(channels) { - let sample = match signal.next() { - None => { - complete_tx.try_send(()).ok(); - 0.0 - } - Some(sample) => sample, - }; - let value: T = cpal::Sample::from::<f32>(&sample); - for sample in frame.iter_mut() { - *sample = value; - } - } - } - -} diff --git a/klangfarbrs/src/lib.rs b/klangfarbrs/src/lib.rs index 9638690..fd67e21 100644 --- a/klangfarbrs/src/lib.rs +++ b/klangfarbrs/src/lib.rs @@ -4,34 +4,30 @@ use gdnative::core_types::TypedArray; #[derive(NativeClass)] #[inherit(Node)] -pub struct MonoBuffer { - #[property] - frames: TypedArray<f32> -} - -pub fn fill_frames() -> TypedArray<f32> { - let frequency = 440.0; - let sample_rate = 44100.0; - let duration = sample_rate * 3.0; - let mut frames = TypedArray::new(); - - for i in 0..duration as i32 { - frames.push(f32::sin(std::f32::consts::TAU * frequency * i as f32/sample_rate)); - } - - return frames -} +pub struct MonoBuffer {} #[methods] impl MonoBuffer { fn new(_owner: &Node) -> Self { - MonoBuffer { frames: fill_frames() } + MonoBuffer {} } #[export] fn _ready(&self, _owner: &Node) { godot_print!("Whatever, connected.") } + + #[export] + pub fn frames(&self, _owner: &Node, frequency: f32, sample_rate: f32, duration: i32) -> TypedArray<f32> { + let mut frames = TypedArray::new(); + let calculated_duration = sample_rate * duration as f32; + + for i in 0..calculated_duration as i32 { + frames.push(f32::sin(std::f32::consts::TAU * frequency * i as f32/sample_rate)); + } + + return frames + } } // Function that registers all exposed classes to Godot |