Sample-Generator mit Rust

Dieser Audiogenerator ist ein einfaches Rust-Programm, das entwickelt wurde, um Audiodateien zu erstellen und abzuspielen. Das Programm bietet die Möglichkeit, benutzerdefinierte Töne mit verschiedenen Frequenzen und Dauern zu generieren. Es verwendet die Bibliotheken hound für das Lesen und Schreiben von WAV-Dateien und rodio für das Abspielen von Audiodaten.

Der Audiogenerator erzeugt Audiodaten mithilfe von Sinuswellen. Sinuswellen sind grundlegende Bausteine von Audio- und Klangsynthese und können verwendet werden, um Töne mit verschiedenen Frequenzen zu erzeugen.

Cargo.toml

[package]
name = "audiogenerator"
version = "0.1.0"
edition = "2021"
description = "Audiogenerator zur Erzeugung und Wiedergabe von Audiodateien"

[dependencies]
hound = "3.4.0"           # WAV-Dateien lesen und schreiben
rodio = "0.17"            # Audiodaten abspielen

main.rs

// main.rs

// Importiere das Modul "toolz" aus der Datei "toolz.rs"
mod toolz;

fn main() {
    // Definiere die Frequenz des erzeugten Tons (440 Hz)
    let frequency = 440.0; // Hz

    // Definiere die Dauer des erzeugten Tons (2 Sekunden)
    let duration = 2; // Sekunden

    // Definiere den Dateinamen für die erzeugte Audiodatei
    let filename = "output.wav"; // Dateiname

    // Rufe die Funktion "generate_audio" aus dem Modul "toolz" auf,
    // um die Audiodatei zu erstellen
    toolz::generate_audio(filename, frequency, duration);

    // Gib eine Meldung aus, um anzuzeigen, dass die Audiodatei erstellt wurde
    println!("Audiodatei wurde erstellt: {}", filename);

    // Rufe die Funktion "play_audio" aus dem Modul "toolz" auf,
    // um die Audiodatei abzuspielen
    toolz::play_audio(filename);
}

toolz.rs

// toolz.rs

// Importiere die notwendigen Bibliotheken und Module
use rodio::Sink;                   // Importiere die Sink-Struktur aus der "rodio"-Bibliothek
use std::fs::File;                 // Importiere die File-Struktur aus der Standardbibliothek
use std::io::BufReader;            // Importiere die BufReader-Struktur aus der Standardbibliothek
use hound::{WavSpec, SampleFormat, WavWriter}; // Importiere die notwendigen Teile der "hound"-Bibliothek
use std::i16;                      // Importiere die i16-Datentyp aus der Standardbibliothek
use std::f32::consts::PI;          // Importiere die PI-Konstante aus der Standardbibliothek

// Definiere eine Funktion, um eine Audiodatei zu erstellen
pub fn generate_audio(filename: &str, frequency: f32, duration: u32) {
    // Definiere die Spezifikationen für die WAV-Datei (Mono, 16-Bit, 44.1 kHz)
    let spec = WavSpec {
        channels: 1,                            // Ein Audiokanal (Mono)
        sample_rate: 44100,                     // Abtastrate von 44.1 kHz
        bits_per_sample: 16,                    // Jedes Sample ist 16-Bit
        sample_format: SampleFormat::Int,       // Das Sampleformat ist als Ganzzahl (Integer) angegeben
    };

    // Erstelle einen Writer, um die WAV-Datei zu schreiben
    let mut writer = WavWriter::create(filename, spec).unwrap();

    // Berechne die maximale Amplitude für den gegebenen 16-Bit-Sample-Format
    let amplitude = i16::MAX as f32;

    // Generiere Audiodaten für die gewünschte Dauer
    for t in (0..spec.sample_rate * duration).map(|x| x as f32 / spec.sample_rate as f32) {
        // Berechne den Sinuswert für die gegebene Frequenz und Zeit
        let sample = (amplitude * (2.0 * PI * frequency * t).sin()) as i16;
        
        // Schreibe das Sample in die WAV-Datei
        writer.write_sample(sample).unwrap();
    }

    // Finalisiere die WAV-Datei, um sie abzuschließen
    writer.finalize().unwrap();
}

// Definiere eine Funktion, um eine Audiodatei abzuspielen
pub fn play_audio(filename: &str) {
    // Lade die Audiodatei
    let file = File::open(filename).unwrap();
    let source = rodio::Decoder::new(BufReader::new(file)).unwrap();

    // Initialisiere den Audioplayer
    let (_stream, stream_handle) = rodio::OutputStream::try_default().unwrap();
    let sink = Sink::try_new(&stream_handle).unwrap();

    // Spiele die Audiodatei ab
    sink.append(source);
    sink.sleep_until_end();
}