适用于 Linux 的命令行多轨音频循环器?

适用于 Linux 的命令行多轨音频循环器?

给定一些音频文件(例如,* .wav),我希望通过命令行方式将这些文件混合为具有单独卷的音轨,并定义全局循环点,以便音频混合无缝循环。

有人可以建议其他替代方案吗?

提前致谢,
干杯!


实际上,使用melt下面的文件几乎可以实现“命令行循环器” - 问题是:循环并不是真正无缝的(有可听见的咔嗒声);我看不出混合两个以上通道的方法;尽管-audio-track | -hide-video在命令行上添加了开关,但仍然显示空白屏幕。(关于循环的更多内容请参见melt此处:回复:[Mlt-devel] 生产者循环

必须使用此命令才能melt以“循环”模式调用:

melt eof=loop loop.mlt

... 而loop.mlt文件(调用音频文件test.wavtest2.wav)是这样的(循环播放时总共会有 70 帧长):

<mlt>
  <producer id="producer0">
    <property name="aspect_ratio">0.000000</property>
    <property name="resource">test.wav</property>
    <property name="audio_index">0</property>
    <property name="video_index">-1</property>
    <property name="global_feed">1</property>
  </producer>
  <producer id="producer1">
    <property name="aspect_ratio">0.000000</property>
    <property name="resource">test2.wav</property>
    <property name="audio_index">0</property>
    <property name="video_index">-1</property>
    <property name="global_feed">1</property>
  </producer>
  <playlist id="playlist0">
    <entry producer="producer0" in="0" out="30"/>
    <blank length="10"/>
    <entry producer="producer0" in="0" out="30"/>
  </playlist>
  <playlist id="playlist1">
    <blank length="30"/>
    <entry producer="producer1" in="0" out="10"/>
  </playlist>
  <tractor id="tractor0" title="loop.mlt" global_feed="1" in="0" out="71">
    <multitrack id="multitrack0">
      <track producer="playlist0" hide="video"/>
      <track producer="playlist1" hide="video"/>
    </multitrack>
    <transition id="transition1" in="0" out="71">
      <property name="a_track">0</property>
      <property name="b_track">1</property>
      <property name="mlt_service">mix</property>
      <property name="start">0.5</property>
      <property name="end">0.5</property>
      <property name="combine">1</property>
      <property name="always_active">1</property>
    </transition>
  </tractor>
</mlt>

答案1

好吧,我想我找到了 Linux 命令行多轨音频循环器的解决方案 - 那就是使用ChucK => 强定时、即时音频编程语言脚本。

首先,ChucK可以通过 Debian/Ubuntu 安装sudo apt-get install chuck。但是,安装后,尝试在终端中输入chuck,然后TAB输入以下内容:

$ chuck
chuck       chuck.alsa  chuck.oss

...也就是说 - 请注意 ChucK可执行文件;每个文件用于单独的 Linux 音频后端 - 请注意,默认的可执行文件chuck实际上是指 JACK(其他可执行文件显然是指 ALSA 和 OSS)。

由于大多数典型的 Linux 用户(包括我自己)实际上并没有jack安装 - 运行chuck可执行文件可能会导致失望,因为它不会产生声音(假设jack系统中不存在声音);例如,参见:

您可能想要运行并查看不同后端的报告内容 -如果 JACK 不存在且正在运行,chuck --probe则会出现投诉,但应该通过:chuckchuck.alsa

$ chuck --probe
[chuck]: (via rtaudio): no devices found for compiled audio APIs!
[chuck]:
# .....
$ chuck.alsa --probe
[chuck]: found 4 device(s) ...
[chuck]: ------( chuck -- dac1 )---------------
[chuck]: device name = "hw:SB,0"
[chuck]: probe [success] ...
[chuck]: # output channels = 6
[chuck]: # input channels  = 2
[chuck]: # duplex Channels = 2
# .....

那么,对于大多数用户来说,运行chuck.alsa应该可以解决问题 - 但请注意,这可能会直接占用音频设备(看起来似乎没有chuck意识到pulseaudio) - 然后您将无法同时运行其他音频生成程序(如vlc),也无法将两个应用程序的声音混合在一起(另一个应用程序基本上保持静音)。

 

但注意到这一点后,我们现在可以继续ChucK执行循环脚本。

其中一个很棒的事情ChucK是,我们可以定义一个脚本来处理一个声音的播放和循环 - 然后调用该脚本的多个实例在平行下- 有效创建多轨音频循环器!

经过一些示例的调整后ChucK,请参阅:

...我设法编写了自己的脚本 - 主要基于以下示例:缓存文件价值评估- 我称之为loopsndbuf.ck

// sound file
// initialize empty string variable for filename
"" => string filename;

// set a default filename to be loaded
"/path/to/freesound.org/100391__dobroide__20100627-creek.wav" => filename;

// if arguments are passed to the script,
// use the first argument as filename instead
if( me.args() ) me.arg(0) => filename;

0.5 => float myvolume;
if( me.args() ) if (me.arg(1) != "") Std.atof(me.arg(1)) => myvolume;

<<< "myvolume: " + myvolume >>>;

SndBuf buf;

filename => buf.read;
myvolume => buf.gain;
1.0 => buf.rate;


// time loop
Impulse i => dac;
while( true )
{
    int pos;

    repeat( buf.samples() )
    {
        buf.valueAt( pos ) => i.next;
        pos++;
        1::samp => now;
    }
}

更多评论请参见在线版本

保存了这个脚本后,我们现在可以用chuck解释器调用它:

chuck.alsa loopsndbuf.ck

... 它将开始按默认设置加载声音并循环播放。或者,我们可以用参数调用脚本 - 请注意,将参数与脚本分隔开的字符chuck是冒号 ( :):

chuck.alsa loopsndbuf.ck:/path/to/freesound.org/23222__erdie__thunderstorm2.wav:0.4

...或者,最后,我们可以调用loopsndbuf.ck脚本的多个实例,这些实例chuck将并行运行。为此,我宁愿将所有内容放在 bash 脚本中,我们称之为loopchuck.sh

set -x
PTH="/path/to/freesound.org"

chuck.alsa \
loopsndbuf.ck:$PTH/15528__ch0cchi__domestic-cat-purr.wav:1.0 \
loopsndbuf.ck:$PTH/100391__dobroide__20100627-creek.wav:0.05 \
loopsndbuf.ck:$PTH/23222__erdie__thunderstorm2.wav:0.4 \
loopsndbuf.ck:$PTH/2519__rhumphries__rbh-rain-01.wav:0.4 \
loopsndbuf.ck:$PTH/18766__reinsamba__chimney-fire.wav:0.4 \
loopsndbuf.ck:$PTH/53380__eric5335__meadow-ambience.wav:0.4

运行这个脚本基本上应该加载脚本的单独实例,每个实例都有自己的文件和音量 -chuck然后首先将所有音频加载到内存中,将类似这样的内容吐到标准输出:

$ ./loopchuck.sh
++ PTH=/path/to/freesound.org
++ chuck.alsa loopsndbuf.ck:/path/to ....
"myvolume: 1.0000" : (string)
"myvolume: 0.0500" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)

...然后,它将让所有脚本同时启动 - 然后它将根据文件长度以样本精度单独循环所有声音 - 在结束时分别包装每个文件的循环。换句话说,循环的阶段是独立的(类似于 GUI 程序终结者X默认处理循环) - 那就是确切地我正在寻找的:)!请注意,您可能必须按两次CTRL+C才能完全停止loopchuck.sh脚本。(是的,使用的音频样本来自自由声音网

但请注意,在chuck将所有这些文件加载​​到内存中时,它会使用相当多的 CPU 来重现和混合这些循环 - 因此,如果操作系统必须处理一些繁重的操作(例如 GUI,例如在浏览器中滚动网页时),音频可能会出现下降。为了避免这种情况,我猜jack必须使用设置 - 但随后必须参与 Linux 实时优先级等(这不一定是一个简单的过程)。

 

好吧,我想我现在很高兴——因为这就是我想要的一切(我只是希望我可以将此音频输出与来自vlcYouTube 的音频输出混合在一起firefox-完成,请查看其他答案:);希望它也能帮助其他人,
干杯!

答案2

可能有点晚了,但我在寻找 chuck looper,所以我正在写一个。欢迎任何帮助。https://github.com/rodolfoap/chucklooper 这个想法是模仿 Boss RC-50 LoopStation。我想,用 chuck 做起来并不难。

答案3

好吧,我终于让 Linuxchuck和 PulseAudio 一起工作了——现在转到让 ALSA 程序 (ChucK) 与 Pulseaudio 协同工作?- 另请参阅接受的答案这里...

相关内容