目前,我已经创建了一个简单的脚本,该脚本使用 synusoids 生成几个蜂鸣声,然后将它们连接起来,以获得更复杂的声音。我使用 bash 脚本来做到这一点,因为我无法理解如何简单地使用 sox 来做到这一点...我的 play 脚本类似于
count=0
while [ 1 ]
do
play -n synth 1 sine C
play -n synth 0.2 sine E
play -n synth 0.2 sine C
play -n synth 0.2 sine E
if [ $count -eq 5 ]
then
sleep 1
count=0
fi
count=$(($count+1))
done
Run Code Online (Sandbox Code Playgroud)
这产生了类似意大利救护车的东西。当然,这不是目的,但想法是......我怎样才能用一个命令产生几个连续的正弦而不需要不同的命令?
有一种方法可以做到这一点,尽管它在文档中不是很清楚或可发现,尽管有相反的说法。我在手册页中查找其他内容时偶然发现了这个方法。您可以使用“:”字符来分隔效果链,如下所示:
play -n synth 1 sin C : synth .5 sin D
Run Code Online (Sandbox Code Playgroud)
它以两种不同的长度在正弦波形上播放 C、D。您还可以为每个音符创建单独的效果链:
play -n synth .5 sin C3 : synth 1 tri D3 chorus .7 .5 20 1 1 2 -t : synth 2 pl E3
Run Code Online (Sandbox Code Playgroud)
这将使用不同长度的音符、波形和效果来演奏 C3 D3 和 E3。
显然你也可以使用换行符,但那是在你使用 --effects-file 选项的情况下,这就是我发现 ':' 字符的方式。这在手册页的“多重效果链”中进行了描述,大约占了相当长的手册页的 25%。
另一种将音符组合成单个样本的方法是使用延迟和混音效果,如下所示:
play -n synth 1 pl C pl D pl E delay 0 1 2 remix -
Run Code Online (Sandbox Code Playgroud)
但问题是音符的长度都相同。
当您需要可变长度的音符并且周围有无声空格(例如摩尔斯电码)时,您可以使用以下命令:
不保存临时文件:
play -n synth 0.3 sin E6 : trim 0.0 .1 : synth 0.1 sin E6 : trim 0.0 .1 : synth 0.3 sin E6;
Run Code Online (Sandbox Code Playgroud)
保存临时文件时:
sox -n morse_text.ogg synth 0.1 sin E6 : trim 0.0 .1 : synth 0.3 sin E6 : trim 0.0 .1 : synth 0.1 sin E6;
play morse_text.ogg;
Run Code Online (Sandbox Code Playgroud)
更快的解决方案是使用共享内存中的临时文件(如果您的系统可以的话):
/dev/shm/morse_text.ogg
Run Code Online (Sandbox Code Playgroud)