#node #processor #sample #dsp

nightly rawdio

An Audio Engine, inspired by the Web Audio API

9 releases (breaking)

0.8.0 May 15, 2023
0.7.0 May 10, 2023
0.6.0 Apr 27, 2023
0.5.0 Apr 21, 2023
0.1.0 Apr 17, 2023

#359 in Audio

MIT license

6.5K SLoC

Rust Audio Engine



This is an audio engine, inspired by the Web Audio API.

Oscillator Example

More examples can be found here

  1. Create an engine

    use rawdio::{create_engine, Level, Oscillator, Node};
    let sample_rate = 44_100;
    let (mut context, mut process) = create_engine(sample_rate);
  2. Create an oscillator

    let frequency = 440.0;
    let output_channel_count = 2;
    let mut oscillator = Oscillator::sine(context.as_ref(), frequency, output_channel_count);
  3. Set the gain on the oscillator

    let level = Level::from_db(-3.0);
        .set_value_at_time(level.as_gain(), Timestamp::zero());
  4. Connect to output

  5. Start the context

  6. Run the process to get samples. This will vary depending on whether you wish to run the engine in realtime (e.g. using CPAL) or offline (e.g. to a file). The engine doesn't make any assumptions, and will simply wait to be asked to process.

    All audio buffers are assumed to be non-interleaved. So if the audio that comes from your soundcard is interleaved, it will need to be de-interleaved first.

    let input_buffer = /*create an input buffer*/
    let output_buffer = /*create an audio buffer*/
    process.process (&mut output_buffer);

To run an example

cargo run --example [example_name] [example_args]

To run the tests

cargo test

To run the benchmarks

cargo bench

Where do the buffers come from?

The engine won't make any assumptions about how it is going to be run. This means that it can be run in real-time, for example using CPAL. Or, it could be run offline, for example processing audio from files using hound. There are examples of both of these in the /examples directory.

Bear in mind that audio is expected to be de-interleaved. Most soundcards and audio files will be interleaved, so it will need to be converted first.


~103K SLoC