簡體   English   中英

用獵犬創造聲音

[英]Create sound on sound with the hound

你如何制作一個文件,例如:“ out.wav ”,並在其中添加“ 1.wav10次,但沒有延遲。 即,將聲音疊加到另一個聲音上,即使前一個聲音還沒有播放完。 正如我現在嘗試做的大約一個半小時,我得到的只是一個一個地播放(即:首先聲音完全播放)

最簡單的代碼:

use hound::{WavReader, WavWriter};

fn main() {
    let mut reader = WavReader::open("1.wav").unwrap();
    let spec = reader.spec();
    let mut writer = WavWriter::create("output.wav", spec).unwrap();

    for _ in 0..10 {
        for sample in reader.samples::<i16>() {
            writer.write_sample(sample.unwrap()).unwrap();
        }

        reader.seek(0).unwrap();
    }
}

您必須以某種方式讀取和混合您想要同時播放的多種聲音。

這是一個示例,播放 10 次相同的聲音,每次延遲一半的聲音長度,通過簡單地對同時播放的兩個片段進行平均來混合。

use hound::{WavReader, WavWriter};

fn main() {
    let mut reader = WavReader::open("1.wav").unwrap();
    let mut reader2 = WavReader::open("1.wav").unwrap();
    let mut writer = WavWriter::create("output.wav", spec).unwrap();
    let l = reader.len();
    reader.seek(l/2).unwrap();
    for i in 0..l*10 {
        if i % (l/2) == 0 {
            reader.seek(0).unwrap();
            let tmp = reader;
            reader = reader2;
            reader2 = tmp;
        }
        let s1 = reader.samples::<i16>().next().unwrap().unwrap();
        let s2 = reader2.samples::<i16>().next().unwrap().unwrap();
        let sample = s1/2 + s2/2;
        writer.write_sample(sample).unwrap();
    }
}

這絕對可以清理很多(即將樣本存儲在Vec中一次,然后從那里讀取)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM