CyberChaos(さいばかおす)

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

Rustで二つの旋律を鳴らすプログラム

2023-03-07 22:20:30 | Rust
二つの旋律を鳴らすプログラムは?

二つの旋律を同時に鳴らすプログラムを作成するには、各音声データのサンプル値を合算する必要があります。以下は、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]; // フルートの音色 let bassoon = vec![1.0, 0.6, 0.3, 0.1]; // バスーンの音色 // 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 bassoon.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 mixed_samples: Vec<i16> = a_samples.iter().zip(c_sharp_samples.iter()).map(|(&a, &b)| { let mixed = a as i32 + b as i32; if mixed > i16::MAX as i32 { i16::MAX } else if mixed < i16::MIN as i32 { i16::MIN } else { mixed as i16 } }).collect(); // 音声ファイルに書き出す 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("mixed_notes.wav



最新の画像もっと見る

コメントを投稿

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