fundsp 0.12.0

Audio processing and synthesis library.
Documentation
#![allow(clippy::precedence)]

use criterion::{black_box, criterion_group, criterion_main, Criterion};
use fundsp::hacker32::*;

fn wavetable_bench(_dummy: usize) -> Wave32 {
    Wave32::render(44100.0, 1.0, &mut (saw_hz(110.0)))
}

fn envelope_bench(_dummy: usize) -> Wave32 {
    Wave32::render(
        44100.0,
        1.0,
        &mut (noise() * envelope(|t| exp(-t) * sin_hz(1.0, t))),
    )
}

fn oversample_bench(_dummy: usize) -> Wave32 {
    Wave32::render(44100.0, 1.0, &mut (noise() >> oversample(pass())))
}

fn chorus_bench(_dummy: usize) -> Wave32 {
    Wave32::render(44100.0, 1.0, &mut (noise() >> chorus(0, 0.015, 0.005, 0.5)))
}

fn equalizer_bench(_dummy: usize) -> Wave32 {
    Wave32::render(
        44100.0,
        1.0,
        &mut (noise()
            >> pipe::<U10, _, _>(|i| bell_hz(1000.0 + 1000.0 * i as f32, 1.0, db_amp(3.0)))),
    )
}

fn reverb_bench(_dummy: usize) -> Wave32 {
    Wave32::render(
        44100.0,
        1.0,
        &mut (noise()
            >> split()
            >> fdn::<U32, _>(stack::<U32, _, _>(|i| {
                delay(0.005 + 0.002 * i as f32) >> fir((0.22, 0.44, 0.22))
            }))
            >> join()),
    )
}

fn limiter_bench(_dummy: usize) -> Wave32 {
    Wave32::render(44100.0, 1.0, &mut (noise() >> limiter((0.1, 1.0))))
}

fn phaser_bench(_dummy: usize) -> Wave32 {
    Wave32::render(
        44100.0,
        1.0,
        &mut (noise() >> phaser(0.5, |t| sin_hz(0.1, t) * 0.5 + 0.5)),
    )
}

fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("wavetable", |b| b.iter(|| wavetable_bench(black_box(0))));
    c.bench_function("envelope", |b| b.iter(|| envelope_bench(black_box(0))));
    c.bench_function("oversample", |b| b.iter(|| oversample_bench(black_box(0))));
    c.bench_function("chorus", |b| b.iter(|| chorus_bench(black_box(0))));
    c.bench_function("equalizer", |b| b.iter(|| equalizer_bench(black_box(0))));
    c.bench_function("reverb", |b| b.iter(|| reverb_bench(black_box(0))));
    c.bench_function("limiter", |b| b.iter(|| limiter_bench(black_box(0))));
    c.bench_function("phaser", |b| b.iter(|| phaser_bench(black_box(0))));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);