では7連符と9連符はどう書けばいいの?
7連符や9連符を生成するには、基本的には3連符の計算方法を拡張する必要があります。以下は、7連符と9連符を生成するためのサンプルコードです。
extern crate hound;
use std::f32::consts::PI;
use std::i16;
fn main() {
// 生成する音のパラメータを設定
let sample_rate = 44100;
let bpm = 120;
let quarter_note_duration = 60.0 / bpm as f32;
let triplet_duration = quarter_note_duration / 3.0;
let sevenlet_duration = quarter_note_duration / 7.0;
let ninetuplet_duration = quarter_note_duration / 9.0;
let a_frequency = 440.0;
// 3連符を生成する
let mut triplet_samples: Vec<i16> = Vec::new();
for i in 0..(sample_rate as f32 * triplet_duration) as usize {
let t = i as f32 / sample_rate as f32;
let sample = (t * a_frequency * 2.0 * PI).sin();
triplet_samples.push((sample * i16::MAX as f32) as i16);
}
// 7連符を生成する
let mut sevenlet_samples: Vec<i16> = Vec::new();
for i in 0..(sample_rate as f32 * sevenlet_duration) as usize {
let t = i as f32 / sample_rate as f32;
let sample = (t * a_frequency * 2.0 * PI).sin();
sevenlet_samples.push((sample * i16::MAX as f32) as i16);
}
// 9連符を生成する
let mut ninetuplet_samples: Vec<i16> = Vec::new();
for i in 0..(sample_rate as f32 * ninetuplet_duration) as usize {
let t = i as f32 / sample_rate as f32;
let sample = (t * a_frequency * 2.0 * PI).sin();
ninetuplet_samples.push((sample * i16::MAX as f32) as i16);
}
// 3連符を7回、7連符を1回、3連符を1回、9連符を1回繰り返す
let mut samples: Vec<i16> = Vec::new();
for _ in 0..7 {
samples.extend(&triplet_samples);
}
samples.extend(&sevenlet_samples);
samples.extend(&triplet_samples);
samples.extend(&ninetuplet_samples);
// 音声ファイルに書き出す
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("notes.wav", spec).unwrap();
for sample in samples {
writer.write_sample(sample).unwrap();
}
writer.finalize().unwrap();
}
この例では、7連符を生成するために、7分の1の長さの音符を1回、3連符を7回繰り返しています。同様に、9連符を生成