【问题标题】:SoX: Can I generate simultaneous sounds?SoX:我可以同时生成声音吗?
【发布时间】:2018-03-02 16:41:09
【问题描述】:

我使用 SoX 来生成这种声音:

$ play -n synth 1 pluck E3 repeat 2

我设法在一个新的终端选项卡中同时播放另一个模式,比如$ play -n synth 1.5 pluck C3 repeat 2 in。有没有办法在同一个 bash 脚本中同时播放两种模式?

【问题讨论】:

  • 您应该始终能够使用& 同时启动多个程序。但是您确定bash 是最适合该任务的工具吗?我的意思是,即使像 Chuck 这样精心设计的语言和像 Alda 这样的包使用起来仍然有些麻烦,我不认为 bash 可以与那些竞争......你肯定looked through this list
  • @AndreyTyukin 是的,我确信我想为这个项目使用尽可能简单的声音发生器。我考虑过使用beep,但它的级别太低了。当您建议使用& 时,您的意思是play -n synth 4 pluck 200 & play -n synth 4 pluck 100 吗?因为不幸的是它不能同时播放这两种声音。
  • 你在那里缺少分号,它不应该分隔命令,而是附加到命令中。查看& 中使用的the last example 21-3 "Running parallel processes in subshells" here。但我不确定play 命令对此有何反应:可能会证明play 仅将命令排入单个本地服务器实例,并且不能并行工作。
  • @AndreyTyukin 我指的是你的第一句话“你在那里缺少分号,它不应该分隔命令,而是附加到命令中”。这是不正确的:没有缺少分号,& 可以像 rooofl 那样用于分隔命令,而 `&' 实际上将前面的命令置于后台,有效地与下一个命令并行启动。
  • @xhienne (sleep 2 ; echo "right") & (sleep 1; echo "you are")

标签: bash sox


【解决方案1】:

这将完成您所需要的,在左声道播放 E3,在右声道播放 C3:

$ play -n synth 1 pluck E3 pluck C3 repeat 2

如果您想在两个通道上播放两个音符,请添加通道效果:

$ play -n synth 1 pluck E3 pluck C3 repeat 2 channels 1

摘自 SoX 手册,synth 效果在 http://sox.sourceforge.net/sox.html

...多个合成器效果可以级联以产生更复杂的波形;...

【讨论】:

    【解决方案2】:

    为了解决您在同一终端中同时运行两个 play 命令的具体问题,以下是当您将两个命令与 & 绑定时发生的情况的解释和解决方法:

    $ play -n synth 1 pluck E3 & play -n synth 1 pluck E3
    [1] 15682
    
    (snipped information about audio file)
    
    In:0.00% 00:00:01.02 [00:00:00.00] Out:48.0k [      |      ] Hd:0.0 Clip:0
    Done.
    
    [1]+  Stopped                 play -n synth 1 pluck E3
    $ fg
    play -n synth 1 pluck E3
    In:0.00% 00:00:01.02 [00:00:00.00] Out:48.0k [      |      ] Hd:0.0 Clip:0  
    Done.
    

    看到[1]+ Stopped 行了吗?这意味着您的第一个 play 进程已进入睡眠状态。这就是为什么我必须运行 fg 来唤醒它并将它带到前台的原因。

    为什么停止了?因为第一个play 命令试图向终端读取或写入某些内容,这仅允许前台进程(第二个play 命令)。作为后台进程,它接收到 SIGTTIN 或 SIGTTOU 信号,迫使其停止。

    如何解决这个问题?通过阻止后台play 向终端读写任何内容:

    play -n synth 1 pluck E3 < /dev/null > /dev/null 2>&1 & { sleep 0.5; play -n synth 1 pluck E3; }
    

    --no-show-progress (-q) 和 -V0 选项似乎足够了,尽管我不能保证这在所有情况下都有效,与上述命令相反:

    play -q -V0 -n synth 1 pluck E3 & { sleep 0.5; play -n synth 1 pluck E3; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多