notes
配列に音符の高さ、長さ、タイミングを指定しています。notes
ベクターで指定されています。notes
配列に音符の高さ、長さ、タイミングを指定しています。piano_notes.wav
というファイル名で保存されます。このようにして、Pianoの音を生成することができます。B♭の音を生成するには、Aの音から半音上げた周波数を計算する必要があります。具体的には、Aの周波数に1.0595を乗算することで、B♭の周波数を計算できます。
以下は、B♭の音を生成するために、Aの周波数を基に計算したプログラム例です。
extern crate hound; use std::f32::consts::PI; use std::i16; fn main() { // 生成する音のパラメータを設定 let sample_rate = 44100; let duration_ms = 1000; let a_frequency = 440.0; // A4 // B♭の周波数を計算する let b_flat_frequency = a_frequency * 1.0595; // 音声データを格納するベクターを作成 let num_samples = (sample_rate as f32 / 1000.0 * duration_ms as f32) as usize; let mut samples: Vec<i16> = Vec::with_capacity(num_samples); // 音声データを生成 for i in 0..num_samples { let t = i as f32 / sample_rate as f32; let a_sample = (t * a_frequency * 2.0 * PI).sin(); let b_flat_sample = (t * b_flat_frequency * 2.0 * PI).sin(); let sample = (a_sample + b_flat_sample) / 2.0; 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("output.wav", spec).unwrap(); for sample in samples { writer.write_sample(sample).unwrap(); } writer.finalize().unwrap(); }
D#の音を生成するには、C#と同様に周波数を計算する式を少し変更する必要があります。例えば、D#の周波数は、C#の周波数に対して、1.0595を再び乗算したものになります。
以下は、D#の音を生成するために、C#の周波数を基に計算したプログラム例です。
extern crate hound; use std::f32::consts::PI; use std::i16; fn main() { // 生成する音のパラメータを設定 let sample_rate = 44100; let duration_ms = 1000; let c_sharp_frequency = 277.18; // C#4 // D#の周波数を計算する let d_sharp_frequency = c_sharp_frequency * 1.0595; // 音声データを格納するベクターを作成 let num_samples = (sample_rate as f32 / 1000.0 * duration_ms as f32) as usize; let mut samples: Vec<i16> = Vec::with_capacity(num_samples); // 音声データを生成 for i in 0..num_samples { let t = i as f32 / sample_rate as f32; let c_sharp_sample = (t * c_sharp_frequency * 2.0 * PI).sin(); let d_sharp_sample = (t * d_sharp_frequency * 2.0 * PI).sin(); let sample = (c_sharp_sample + d_sharp_sample) / 2.0; 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("output.wav", spec).unwrap(); for sample in samples { writer.write_sample(sample).unwrap(); } writer.finalize().unwrap(); }
シャープの音を生成するには、周波数を計算する式を少し変更する必要があります。例えば、C#の周波数は、Cの周波数に対して、1.0595を乗算したものになります。
以下は、C#の音を生成するために、Cの周波数に1.0595を乗算するプログラム例です。
extern crate hound; use std::f32::consts::PI; use std::i16; fn main() { // 生成する音のパラメータを設定 let sample_rate = 44100; let duration_ms = 1000; let c_frequency = 261.63; // C4 // C#の周波数を計算する let c_sharp_frequency = c_frequency * 1.0595; // 音声データを格納するベクターを作成 let num_samples = (sample_rate as f32 / 1000.0 * duration_ms as f32) as usize; let mut samples: Vec<i16> = Vec::with_capacity(num_samples); // 音声データを生成 for i in 0..num_samples { let t = i as f32 / sample_rate as f32; let c_sample = (t * c_frequency * 2.0 * PI).sin(); let c_sharp_sample = (t * c_sharp_frequency * 2.0 * PI).sin(); let sample = (c_sample + c_sharp_sample) / 2.0; 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("output.wav", spec).unwrap(); for sample in samples { writer.write_sample(sample).unwrap(); } writer.finalize().unwrap(); }
Houndライブラリを使用して、Rust言語でC#の音を鳴らすプログラムの例は次のとおりです。
extern crate hound;
use std::f32::consts::PI;
use std::i16;
fn main() {
let sample_rate = 44100;
let frequency = 440.0;
let amplitude = i16::MAX as f32;
let duration = 1.0;
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("sine.wav", spec).unwrap();
for t in (0..(sample_rate as f32 * duration) as usize).map(|x| x as f32 / sample_rate as f32) {
let sample = (t * frequency * 2.0 * PI).sin();
let amplitude_sample = (sample * amplitude) as i16;
writer.write_sample(amplitude_sample).unwrap();
}
}
このプログラムは、指定された周波数(この場合は440Hz)と振幅でサイン波を生成し、それをWAVファイルに書き込みます。このWAVファイルを再生することで、C#の音が鳴ります。