CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

Rustで7連符と9連符を鳴らすプログラム

2023-03-07 21:52:19 | Rust
では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連符を生成



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。