コマンドラインオーディオ - 同時再生と録音のためのパイプ

コマンドラインオーディオ - 同時再生と録音のためのパイプ

サウンドデータを生成し、それを変換してWAV形式に保存しようとしています。ほぼ完成しましたが、生成されたサウンドを聞きたいです。その間それは「記録」されています。

このコマンドはデータを生成して再生するだけです。

perl -e 'for ($c=0; $c<4*44100; $c++) {
             $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
         } ' |
aplay -t raw -c 1 -r 44100 -f FLOAT_LE

(サウンドの再生が停止した後に Ctrl + C を押すと、aplayセグメントフォールトが発生する可能性があります)

soxと を使用するmplayerと、問題なく録音できますが、同時に音が聞こえません。

perl -e 'for ($c=0; $c<4*44100; $c++) {
             $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
         } ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw - \
    -c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
mplayer - -cache 8092 -endpos 3 -vo null -ao pcm:waveheader:file=test.wav

ここで、play test.wav(はパッケージplayからのものでありsoxalsa'sではありませんaplay) は、ファイルに対して「期間: 00:00:03.00」と表示されることに注意してくださいtest.wav。また、このプロセスはリアルタイムよりも高速に実行されるようです。つまり、(明らかに) 3 秒未満で完了します。

teeストリームをディスクにキャプチャする不正行為を試みることで、

perl -e 'for ($c=0; $c<4*44100; $c++) {
             $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
         } ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw - \
    -c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
tee test.wav |
aplay

ここでは、生成されたサウンドを聞くことができ、test.wav再生も可能になりますが、play test.wav「期間: 不明」と報告されます。

そこで質問したいのですが、上記の「ワンライナー」コマンドのように、サウンドの生成、再生、録音の両方を行うことは可能ですか?同時に- しかし、それなしインストールする必要がありますjackか?

PS: 関連リンク:

答え1

tee(1)を使ってストリームを多重化することができます。例:

perl -e 'for ($c=0; $c<4*44100; $c++) {
  $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
}' | tee >(sox -c1 -r44100 -t f32 - test.wav) \
         >(sox -c1 -r44100 -t f32 - -d) > /dev/null

また、ほとんどのトーンとスイープを生成できるsoxsのシンセエフェクトにも興味があるかもしれません。

sox -n -r 44100 test.wav synth 4 sine 100:1000

関連情報