サイン波を作って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(())
}
実行して作られるファイルがこちら
いいなと思ったら応援しよう!
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!