見出し画像

サイン波を作ってwavファイルに書き出してみよう!using Rust

解説はすべてコメントにしたためました。

p2_1.rs

use ch2::wave_write_16bit_mono;

fn main() {
    let sample_rate = 44100;
    let duration = 1.0;
    let freq = 1000.0;

    let length_of_s = (sample_rate as f32 * duration) as usize;
    let mut s = vec![0.0; length_of_s];

    // 波形作成
    for (n, sample) in s.iter_mut().enumerate() {
        *sample = 0.5 * (2.0 * std::f32::consts::PI * n as f32 * freq / sample_rate as f32).sin();
    }

    // 前後にフェードインアウトを入れる
    for n in 0..(sample_rate as f32 * 0.01) as usize {
        let ramp = n as f32 / (sample_rate as f32 * 0.01);
        s[n] *= ramp;
        s[length_of_s - 1 - n] *= ramp;
    }

    // wavファイルに書き込む
    wave_write_16bit_mono(sample_rate, s, "01.wav").expect("Failed to write wave file.");
}

lib.rs

pub fn wave_write_16bit_mono(
    sample_rate: u32,
    data: Vec<f32>,
    file_name: &str,
) -> Result<(), hound::Error> {
    let spec = hound::WavSpec {
        channels: 1,
        sample_rate,
        bits_per_sample: 16,
        sample_format: hound::SampleFormat::Int,
    };
    let mut writer = hound::WavWriter::create(file_name, spec)?;

    for &sample in data.iter() {
        let clamped_sample = sample.clamp(-1.0, 1.0);
        let int_sample = ((clamped_sample + 1.0) / 2.0 * 65535.0).round() as i16;
        writer.write_sample(int_sample)?;
    }

    writer.finalize()?;

    Ok(())
}

実行して作られるファイルがこちら


いいなと思ったら応援しよう!

Puuuii | 伝える技術と心理学で戦うデータエンジニア
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!