サウンドデータを生成し、それを変換して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
からのものでありsox
、alsa
'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: 関連リンク:
- Linux オーディオ ファイル形式に関するメモ
- Mplayer はキャッシュ設定なしでは標準入力からストリーミングしません - Dag Olav Prestegarden
- コマンドライン - 16 ビット WAV を生のオーディオに変換する方法 - Stack Overflow
- 古い Nabble - linux-audio-dev - mplayer と sox を使用してパイプ経由でオーディオを録音すると、速度が正しくない場合があります
- ALSA 出力をファイルにリダイレクトする方法 | ソフトウェア ビュー
- ループバックオーディオデバイスを設定できますか? - Unix および Linux - Stack Exchange
答え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