多重振幅淡入淡出在 ecasound 上如何工作?

eno*_*rev 4 audio command-line fadeout fadein

我想在特定的时间代码淡入和淡出曲目。例如,我想要一个音频文件,并且:

Start it at 100% Volume 
Fade it to 20%  at 2 seconds
Fade it to 100% at 4 seconds
Fade it to 20%  at 6 seconds
Fade it to 100% at 8 seconds
Fade it to 20%  at 10 seconds
Fade it to 100% at 12 seconds
Fade it to 0 at 14 seconds
Run Code Online (Sandbox Code Playgroud)

我一直在使用 ecasound 生成的恒定音调进行测试,以便我可以在 Audacity 中打开生成的文件并直观地查看结果。据我所知,增加振幅是相对的,而减少振幅则不是。似乎如果我将幅度淡入淡出,它会影响整个音轨的相对音量,而不仅仅是在我设置淡入淡出的特定时间,这就是我迷失的地方。

命令示例

# generate the tone
ecasound -i tone,sine,880,20 -o:tone.wav

# Just the test to see that i can fade start it at 100 and fade it to 20.
ecasound -a:1 -i tone.wav -ea:100 -kl2:1,100,20,2,1 -a:all -o:test_1.mp3

# Fade it out and in
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,100,20,2,1 \
         -ea:100 -kl2:1,20,100,4,1 \
         -a:all -o:test_2.mp3

# Fade it out and in with a peak of 500
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,100,20,2,1 \
         -ea:100 -kl2:1,20,500,4,1 \
         -a:all -o:test_3.mp3

# Fade it out from 500, out, and then back to 500
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,500,20,2,1 \
         -ea:100 -kl2:1,20,500,4,1 \
         -a:all -o:test_4.mp3

# Fade it out from 500, out to a low of 10, and then back to 500
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,500,10,2,1 \
         -ea:100 -kl2:1,10,500,4,1 \
         -a:all -o:test_5.mp3

# Fade it out from 1000, out to a low of 10, and then back to 1000
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,1000,10,2,1 \
         -ea:100 -kl2:1,10,1000,4,1 \
         -a:all -o:test_6.mp3

# The eventual result I'm looking for
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,500,20,2,1 \
         -ea:100 -kl2:1,20,500,4,1 \
         -ea:100 -kl2:1,500,20,6,1 \
         -ea:100 -kl2:1,20,500,8,1 \
         -ea:100 -kl2:1,500,20,10,1 \
         -ea:100 -kl2:1,20,500,12,1 \
         -ea:100 -kl2:1,500,0,14,4 \ 
         -a:all -o:test_7.mp3
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

从这些结果中我能看出的最好信息是,整个轨道的幅度与所有衰落效果的低点和峰值之间的差异有关。我不确定这个结果是否符合预期,但它非常令人困惑。

此外,在最后一个结果(图像中倒数第二个)中,淡入淡出不再需要整整一秒。为了找出原因,我关闭了最后的淡入淡出到零,并且持续时间恢复正常。这似乎不像预期的行为。

# "Fixing" the fade durations
ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,500,20,2,1 \
         -ea:100 -kl2:1,20,500,4,1 \
         -ea:100 -kl2:1,500,20,6,1 \
         -ea:100 -kl2:1,20,500,8,1 \
         -ea:100 -kl2:1,500,20,10,1 \
         -ea:100 -kl2:1,20,500,12,1 \
         -a:all -o:test_8.mp3
Run Code Online (Sandbox Code Playgroud)

作为旁注,我还尝试将每行的 -ea 值更改为“当前”幅度。这没有任何区别(无论我将 -ea 设置为什么)

我从 git (2.8.1+dev) 安装了最新版本。我在 2.7.0 上也遇到了同样的问题,这就是我升级并最终发现自己在这里的原因。

我这样做错了吗?

eno*_*rev 5

-kl2

经过几个小时的绞尽脑汁,我终于想明白了。每个淡入淡出的“From”幅度需要为 100。如果要增加幅度,则“To”幅度为maximum / from * to

所以如果你想从 20 增加到 100,那就是100 / 20 * 100500。如果您想达到 120:100 / 20 * 120600. 我认为这对某人来说是完全有道理的,但我完全被难住了。

工作示例(中间有一个稍高的底部范围来演示):

ecasound -a:1 -i tone.wav \
         -ea:100 -kl2:1,100,20,2,1 \
         -ea:100 -kl2:1,100,500,4,1 \
         -ea:100 -kl2:1,100,40,6,1 \
         -ea:100 -kl2:1,100,250,8,1 \
         -ea:100 -kl2:1,100,20,10,1 \
         -ea:100 -kl2:1,100,500,12,1 \
         -ea:100 -kl2:1,100,0,14,1 \
         -a:all -o:test_7.mp3
Run Code Online (Sandbox Code Playgroud)

和输出: 在此输入图像描述

请记住,这些幅度仍然是相对的。如果你从 45% 到 90%: 100 / 45 * 90 = 200,然后现在如果你下降到当前幅度的 20%,它实际上是 18% (.20 * 90),所以回到 100 将是100 / 18 * 100 = 555.56

-klg

正当我弄清楚这一点并来这里发帖时,我收到了来自 ecasound 邮件列表的回复。它不是对 kl2 问题的直接答案,而是提供了另一种更容易理解的答案,即参数klg

-klg:fx-param,low-value,high-value,point_count,pos1,value1,...,posN,valueN 通用线性包络。该控制器源可用于将自定义包络映射到链运算符参数。包络点数在“point_count”中指定。每个包络点由一个位置和一个匹配值组成。对的数量必须与“point_count”匹配(即“N==point_count”)。“posX”参数以秒为单位(从流开始算起)。包络点指定为“[0,1]”范围内的浮点值。在包络值映射到运算符参数之前,它们会映射到“[low-value,high-value]”的目标范围。例如,值“0”将把操作参数设置为“低值”,值“1”将把它设置为“高值”。对于初始段“[0,pos1]”,包络将输出“value1”值(例如“low-value”)。

这是执行我需要使用的命令,klg而不是kl2

ecasound -a:1 -i:tone.wav -ea:100 \
-klg:1,0,100,14,2,1,3,0.20,4,0.20,5,1,6,1,7,0.40,8,0.40,9,1,10,1,11,0.20,12,0.20,13,1,14,1,15,0 \
-o:test.mp3
Run Code Online (Sandbox Code Playgroud)

输出与图像上的第二条轨道完全相同。

由此产生的命令行肯定有点难以阅读和调试,但实际上可能更容易动态生成。无论如何,我现在有两个工作选择来解决这个问题。

最后,这是我如何计算出 klg 命令坐标的注释。星号是 klg 参数中列出的“点”,顶部的数字是秒:

     0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2
     1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1.0  --*     *-*     *-*     *-*   
 ~      \   /   \._./   \   /   \
0.2      *-*             *-*     \
0.0                              *----------
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人至少节省我因抓头而失去的头发。