728x90
728x170
■ WavWriter 구조체의 write_sample 메소드를 사용해 동요 WAV 파일을 생성하는 방법을 보여준다.
▶ Cargo.toml
[package]
name = "test_project"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
hound = "3.4.0"
▶ src/main.rs
use std::f32::consts;
use std::fs;
use std::io;
use hound;
const SAMPLE_RATE : f32 = 44100.0;
const BPM : f32 = 122.0; // 템포
#[allow(unused_variables)]
fn main()
{
let wav_spec : hound::WavSpec = hound::WavSpec
{
channels : 1,
sample_rate : SAMPLE_RATE as u32,
bits_per_sample : 16,
sample_format : hound::SampleFormat::Int
};
let mut wav_writer : hound::WavWriter<io::BufWriter<fs::File>> = hound::WavWriter::create("d:/melody.wav", wav_spec).unwrap();
// 음정
let c4 : f32 = 261.626; // 도
let d4 : f32 = 293.665; // 레
let e4 : f32 = 329.628; // 미
let f4 : f32 = 349.228; // 파
let g4 : f32 = 391.995; // 솔
let a4 : f32 = 440.000; // 라
let b4 : f32 = 493.883; // 시
let c5 : f32 = 523.251; // 도
// 음 길이
let l4 : u32 = ((60.0 / BPM) * SAMPLE_RATE) as u32;
let l2 : u32 = l4 * 2;
write_tone(&mut wav_writer, g4, l4); // 솔
write_tone(&mut wav_writer, g4, l4); // 솔
write_tone(&mut wav_writer, a4, l4); // 라
write_tone(&mut wav_writer, a4, l4); // 라
write_tone(&mut wav_writer, g4, l4); // 솔
write_tone(&mut wav_writer, g4, l4); // 솔
write_tone(&mut wav_writer, e4, l2); // 미
write_tone(&mut wav_writer, g4, l4); // 솔
write_tone(&mut wav_writer, g4, l4); // 솔
write_tone(&mut wav_writer, e4, l4); // 미
write_tone(&mut wav_writer, e4, l4); // 미
write_tone(&mut wav_writer, d4, l2); // 레
}
fn write_tone<W>(wav_writer : &mut hound::WavWriter<W>, tone : f32, length : u32) where W : io::Write + io::Seek
{
for t in 0..length
{
let a : f32 = t as f32 / SAMPLE_RATE;
let v : f32 = (a * tone * 2.0 * consts::PI).sin();
wav_writer.write_sample((v * i16::MAX as f32) as i16).unwrap();
}
}
728x90
그리드형(광고전용)