是否有用于Linux的立体声(左右声道分离)音源?您可以在其中设置每个通道的音量和音调/音高,并且最好还设置波形(正弦波,方波,锯齿波,...)并反转一个通道(相对于另一个通道)。
如果没有,有什么好的地方开始构想吗?我想最简单的办法就是改编现有的程序,例如合成器……但是,如果工作不佳,是否有任何库(例如SDL?)可以用作此类程序的基础?
是否有用于Linux的立体声(左右声道分离)音源?您可以在其中设置每个通道的音量和音调/音高,并且最好还设置波形(正弦波,方波,锯齿波,...)并反转一个通道(相对于另一个通道)。
如果没有,有什么好的地方开始构想吗?我想最简单的办法就是改编现有的程序,例如合成器……但是,如果工作不佳,是否有任何库(例如SDL?)可以用作此类程序的基础?
Answers:
听起来您在寻找Audacity,它是一个跨平台的开源音频编辑器。它的功能之一是允许您生成音调。这是一个多轨音频编辑器,因此您可以轻松创建立体声。
在Generate
菜单下,您可以创建任意频率,幅度和长度的正弦波,锯齿波和方波音调,而无需录制或需要其他输入文件。
您可能会看一下speaker-test
,这是我在alsa-utils软件包中找到的(在Arch机器上)。
speaker-test -c2 -t sine
从xterm运行,给了我440 Hz正弦波,每次大约6秒,左右扬声器交替出现。在xterm中,它提供了一些有关它认为正在使用的扬声器的信息。
根据手册页,它可以产生任意频率的正弦波和粉红噪声。
speaker-test -c2 -t sine -f 440
通过提供频率参数,可以补充您的示例。感谢你。
该siggen
程序应该可以解决问题。
它具有两个具有独立信号的通道,并且它们之间具有相位。每个通道可以执行以下信号类型:
您可以像这样在立体声模式下运行它:
$ siggen -2
由于/dev/dsp
在大多数现代Linux发行版中已弃用,因此您可能需要安装兼容性库。在基于Debian的发行版上,安装alsa-oss
软件包并按以下方式运行:
$ aoss siggen -2
您也可以尝试使用PulseAudio OSS包装机:
$ padsp siggen -2
ffmpeg
ffmpeg可以照常做。
创建一个5秒的单声道1000Hz正弦out.wav
声音文件:
sudo apt-get install ffmpeg
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" out.wav
立体声代替:
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -ac 2 out.wav
该文件将作为2倍大,而且ffprobe
会说,它有2 channels
代替1 channel
。
播放音频5秒钟而不创建文件:
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp
一直玩到生气为止:
ffplay -f lavfi -i "sine=frequency=1000" -nodisp
说明文件:
sunder的其他部分音频源除了还介绍了其他有用的声音生成算法sine
,例如:
参考书目:
已在Ubuntu 18.04,ffmpeg 3.4.6中测试。
没有额外库的最少C音频生成示例
只是为了好玩:https : //stackoverflow.com/questions/732699/how-is-audio-represented-with-numbers-in-computers/36510894#36510894
该saugns程序也能做到这一点。(目前,它是一种命令行音频生成器,支持8种波形和FM / PM / AM调制技术。)
要生成两个立体声分隔的100 Hz波,一个为正弦波,一个为三角形波,以及一个振幅倒置的波形,可以将以下脚本粘贴到文件中并在程序中运行(如所示./saugns filename
):
Osin f100 a0.5 t2 P0
Otri f100 a(-0.5) t2 P1
该t
s指定时间(秒)。
的P
s为每语音平移(0.0 =左,1.0 =右)。P
将来的版本可能会更改为其他版本;README文件描述了当前语法。
编辑:我确实是该程序的开发人员。
同样,翻转幅度的另一种方法(对于某些波类型,例如sin
但不是saw
),是使用小写字母设置相位p
。相加p0.5
相位设置为波周期的50%(负一半)。此外,由于没有命名的余弦类型,p0.25
因此可以将正弦转换为余弦(或p0.75
表示负余弦)。
您可以使用SoX轻松合成音调。有一些绊脚石,但我最终能够弄清楚。
我在将SoX与PulseAudio接口时遇到麻烦,因此我只能将sox
原始数据传输到paplay
。
管道很繁琐,所以我创建了一个脚本:
$ cat sox-paplay
#!/bin/bash
: ${HZ:=44100}
: ${NCHAN:=6}
: ${SINK:=mysink}
sox -c $NCHAN -n -t raw -r $HZ -L -b 16 - "$@" | paplay --no-remix --no-remap --raw -v -p --rate $HZ -d $SINK --channels $NCHAN
例如
sox-paplay synth sine 1000 gain -5 remix -m 0 0 1 0 0 0
该remix
效果仅用于将结果发送到特定通道。它功能更强大,但我们仅在此处使用基本功能。在此示例中,我们有一个六声道设备,并且正在向第三声道发送声音。
我最初创建了一个包装PulseAudio设备的ALSA设备,但后来发现无法使用ALSA控制通道映射,因此根据我的自定义通道映射与ALSA默认设置的不同,随机通道被混合在一起。这就是为什么我--no-remix --no-remap
在paplay
上面;我只希望sox命令的原始通道排序。
我希望Linux上的音频内容能提供更好的文档和错误报告。
您可能对我最近发布的答案感兴趣,该答案显示了如何从命令行设置PulseAudio均衡器。