caw

Crates.iocaw
lib.rscaw
version0.9.0
created_at2024-05-20 15:20:10.295747+00
updated_at2025-05-15 13:34:49.052455+00
descriptionA framework for building software-defined modular synthesizers
homepagehttps://github.com/gridbugs/caw.git
repositoryhttps://github.com/gridbugs/caw.git
max_upload_size
id1245811
size87,952
Stephen Sherratt (gridbugs)

documentation

https://docs.rs/caw

README

CAW Logo

caw

Version Documentation test dependency status

CAW is a framework for building synthesizers as Rust programs.

Here's a simple example that plays a 60Hz saw wave:

# Cargo.toml

[dependencies]
caw = { version = "0.4", features = ["interactive"] }
use caw::prelude::*;

fn main() {
    // Open a window that can play and visualize an audio signal.
    let window = Window::builder().build();

    // Describe the audio signal.
    let sig = oscillator(Saw, 60.0).build();

    // Play the audio signal, visualizing its waveform in the window.
    window.play_mono(sig, Default::default());
}

Filters can be applied to audio signals to build up more complex sounds. In this next example the mouse position within the window controls a low-pass filter cutoff and resonance.

use caw::prelude::*;

fn main() {
    // Open a window that can play and visualize an audio signal.
    let window = Window::builder().build();


    // Describe the audio signal.
    let input = window.input();
    let sig = oscillator(Saw, 60.0).build().filter(
        low_pass::default(input.mouse.x_01() * 20_000.0)
            .resonance(input.mouse.y_01()),
    );

    // Play the audio signal, visualizing its waveform in the window.
    window.play_mono(sig, Default::default()).unwrap();
}

It's possible to treat your computer keyboard as a musical keyboard in a few more lines of code.

use caw::prelude::*;

fn main() {
    // Open a window that can play and visualize an audio signal.
    let window = Window::builder().build();

    // Describe the audio signal.
    let input = window.input();
    let MonoVoice {
        note,
        key_down_gate,
        ..
    } = input.keyboard.opinionated_key_events(Note::B2).mono_voice();
    let env = adsr_linear_01(key_down_gate).attack_s(0.1).build();
    let sig = oscillator(Saw, note.freq_hz()).build().filter(
        low_pass::default(env * input.mouse.x_01() * 20_000.0)
            .resonance(input.mouse.y_01()),
    )
    .filter(chorus())
    .filter(reverb::default());

    // Play the audio signal, visualizing its waveform in the window.
    window.play_mono(sig, Default::default()).unwrap();
}

There's a bunch of effects that can be chained onto signals. Here we'll add a chorus and reverb effect.

See the examples in the caw and caw_interactive crates for more complex examples.

Commit count: 0

cargo fmt