[][src]Crate twang

Library for pure Rust advanced audio synthesis.

Most audio DSP (Digital Signal Processing) libraries have a concept of an audio graph which connects sources to destinations. Twang uses a simplified model: a synthesis tree. Twang doesn't deal with having speakers as a node on a graph, as it's only focus is synthesis. A synthesis tree can do all of the things that an audio graph can do, but it's simpler and much easier to learn.

To start, first you need to construct a synthesizer (Synth). Then you need a type that implements the Sink trait. Audio buffers have a sink method you can use to get a Sink. Once you have those, you can synthesize audio with a closure that has one parameter representing the frequency counter. You can use the frequency counter to generate continuous pitched waveforms.

A3 (220 Hz) Minor Piano Example

This example uses the first ten piano harmonics to generate a sound that sounds like an electric piano. This is an example of additive synthesis, since it uses the Mix trait.

use fon::{mono::Mono64, Audio, Sink};
use twang::{Mix, Synth, Fc, Signal};
 
// Target sample rate set to 48 KHz
const S_RATE: u32 = 48_000;
 
/// First ten harmonic volumes of a piano sample (sounds like electric piano).
const HARMONICS: [f64; 10] = [
    0.700, 0.243, 0.229, 0.095, 0.139, 0.087, 0.288, 0.199, 0.124, 0.090,
];
/// The three pitches in a perfectly tuned A3 minor chord
const PITCHES: [f64; 3] = [220.0, 220.0 * 32.0 / 27.0, 220.0 * 3.0 / 2.0];
/// Volume of the piano
const VOLUME: f64 = 0.1;
 
fn main() {
    fn piano(_: &mut (), fc: Fc) -> Signal {
        PITCHES
            .iter()
            .map(|p| {
                HARMONICS
                    .iter()
                    .enumerate()
                    .map(|(i, v)| {
                        fc.freq(p * (i + 1) as f64).sine().gain(v * VOLUME)
                    })
                    .mix()
            })
            .mix()
    }
 
    // Initialize audio with five seconds of silence.
    let mut audio = Audio::<Mono64>::with_silence(S_RATE, S_RATE as usize * 5);
    // Create the synthesizer.
    let mut synth = Synth::new((), piano);
    // Generate audio samples.
    audio.sink(..).stream(&mut synth);
}

Structs

Fc

Frequency counter.

Pink

Pink Noise Generator using algorithm described in research paper A New Shade of Pink.

Room

Room effect. Use to add reflections to the sound. Reflections can create either echo (> 50 ms delay) or reverb (< 50 ms delay).

Signal

A signed digital audio signal that can be routed through processing components. This differs from Mono64 in that the values are not clamped between -1 and 1.

Synth

A streaming synthesizer. Implements Stream.

White

White Noise Generator using Middle Square Weyl Sequence PRNG.

Traits

Mix

Trait for synthesizing multiple sounds together.