ではフルートの音を鳴らすプログラムは?
フルートの音を生成するためには、各音に対応する周波数と音量のエンベロープを知る必要があります。以下は、Rustのhoundライブラリを使用して、特定の周波数でフルートの音を生成する例です。
extern crate hound;
use std::f32::consts::PI;
use std::i16;
fn main() {
// 生成する音のパラメータを設定
let sample_rate = 44100;
let duration = 1.0;
let a_frequency = 440.0; // A4の周波数
let c_sharp_frequency = a_frequency * 2.0f32.powf(4.0 / 12.0); // C#5の周波数
let flute = vec![1.0, 0.8, 0.6, 0.4, 0.2]; // フルートの音色
// A4の音を生成する
let mut a_samples: Vec<i16> = Vec::new();
for i in 0..(sample_rate as f32 * duration) as usize {
let t = i as f32 / sample_rate as f32;
let mut sample = 0.0;
for (j, &weight) in flute.iter().enumerate() {
let frequency = a_frequency * (j as f32 + 1.0);
sample += weight * (t * frequency * 2.0 * PI).sin();
}
a_samples.push((sample * i16::MAX as f32) as i16);
}
// C#5の音を生成する
let mut c_sharp_samples: Vec<i16> = Vec::new();
for i in 0..(sample_rate as f32 * duration) as usize {
let t = i as f32 / sample_rate as f32;
let mut sample = 0.0;
for (j, &weight) in flute.iter().enumerate() {
let frequency = c_sharp_frequency * (j as f32 + 1.0);
sample += weight * (t * frequency * 2.0 * PI).sin();
}
c_sharp_samples.push((sample * i16::MAX as f32) as i16);
}
// 音声ファイルに書き出す
let spec = hound::WavSpec {
channels: 1,
sample_rate: sample_rate,
bits_per_sample: 16,
sample_format: hound::SampleFormat::Int,
};
let mut writer = hound::WavWriter::create("flute_notes.wav", spec).unwrap();
for sample in a_samples.iter().chain(c_sharp_samples.iter()) {
writer.write_sample(*sample).unwrap();
}
writer.finalize().unwrap();
}