2005年8月13日 (土曜日)

11:13:13 # Life 昨日はFSIJセミナーでした. 来月あたりにCodeFestをスリランカでやります,との話しがでましたが, スリランカ外相、自宅で暗殺されるというニュースが今日でていました.

日本も日本で総選挙になるといろいろとバタバタするので,来月のDebian勉強会開催も予断を許しません. コードばかり書いていればよいわけではなく,平和で政治が安定していないと安心して コードも書けなくなるのが現実ですなぁ.

11:59:25 # Life zynaddsubfxとecasoundを利用して録音してみる. できるんじゃないかなぁ,と思っていたがコマンドラインを考えるのが面倒なので放置していた案について, 検証してみる. hydrogenでドラムトラックをすでに録音している場合に, ドラムにあわせてオルガンがなる,というケースをつくってみる. jackは相互接続用に限定して,alsa経由で音を出すようにする.

$ jackd -d dummy
$ zynaddsubfx
$ jack_lsp
dummy_pcm:capture_1
dummy_pcm:capture_2
dummy_pcm:playback_1
dummy_pcm:playback_2
ZynAddSubFX:out_1
ZynAddSubFX:out_2

# zynaddsubfxから音を出す試験
$ ecasound -i jack_auto,ZynAddSubFX -o alsahw,0,0,0

# drum track dr3.wav の伴奏で,オルガン録音試験.
$ ecasound -a:1 -i dr3.wav -ea:50 \
	  -a:2,rec -i jack_auto,ZynAddSubFX \
	  -a:1,2 -o alsahw,0,0,0 \
	  -a:rec -o orgue1.wav

# とりあえずモニタしてみる.
$ ecasound -a:1 -i dr3.wav \
	  -a:2 -i orgue1.wav \
	  -a:1,2 -o alsahw,0,0,0

	

jackとalsaを別に利用すると,プロセス間の調停がうまくいかないため, zynaddsubfxでCPU処理が重い状況になると, ecasound が十分速くスケジュールされてくれないため, おとがとぎれとぎれになる. 仕方がないので,jackを利用してそこらへんを調整してもらうことにする.

$ jackd -d alsa -r 44100
$ zynaddsubfx

# jackのポート一覧を見る.
$ jack_lsp
alsa_pcm:capture_1
alsa_pcm:capture_2
alsa_pcm:playback_1
alsa_pcm:playback_2
alsa_pcm:playback_3
alsa_pcm:playback_4
alsa_pcm:playback_5
alsa_pcm:playback_6
ZynAddSubFX:out_1
ZynAddSubFX:out_2

# zynaddsubfxからeca経由でjackのalsaデバイスに音を出す試験
# eca経由でなくてよいのなら,jack_connectで,Zynaddsubfxのポートをalsa_pcmに接続すればよい.
$ ecasound -i jack_auto,ZynAddSubFX -o jack_alsa
ctrl-cで停止

# drum track dr3.wav に伴奏してもらい,同時に演奏する試験
$ ecasound -a:1 -i dr3.wav -ea:50 \
	  -a:2,rec -i jack_auto,ZynAddSubFX \
	  -a:1,2 -o jack_alsa \
	  -a:rec -o orgue1.wav
ctrl-cで停止

# とりあえずモニタしてみる.
$ ecasound -a:1 -i dr3.wav \
	  -a:2 -i orgue1.wav \
	  -a:1,2 -o jack_alsa
ctrl-cで停止

# ba録音
$ ecasound -a:1 -i dr3.wav -ea:50 \
	  -a:2 -i orgue1.wav \
	  -a:rec -i alsahw,2,0,0\
	  -a:1,2 -o alsahw,0,0,0 \
	  -a:rec -o bass2.wav 

# baモニタ
$ ecasound -a:1 -i dr3.wav -ea:50 \
	  -a:2 -i orgue1.wav \
	  -a:3 -i bass2.wav \
	  -a:1,2,3 -o alsahw,0,0,0 

# gt録音
$ ecasound -a:1 -i dr3.wav -ea:50 \
	  -a:2 -i orgue1.wav \
	  -a:3 -i bass2.wav -ea:150 \
	  -a:1,2,3 -o alsahw,0,0,0 \
 	  -a:rec -i alsahw,2,0,0 -o gt1.wav

# gtモニタ
$ ecasound -a:1 -i dr3.wav -ea:50 \
	  -a:2 -i orgue1.wav \
	  -a:3 -i bass2.wav -ea:150 \
	  -a:4 -i gt1.wav \
	  -a:1,2,3,4 -o alsahw,0,0,0 \

# mix down and finalize
$ ecasound -a:1 -i dr3.wav -ea:50  \
	  -a:2 -i orgue1.wav -epp:80 \
	  -a:3 -i bass2.wav -epp:40 -ea:150 \
	  -a:4 -epp:20 -i gt4.wav -ea:120   \
	  -a:1,2,3,4 -o mix20050814.wav

$ ecanormalize mix20050814.wav
$ ecasound -i mix20050814.wav  -o mix20050814-1.wav -eca -ete
	

ここまではjack経由で録音できることがわかった. jackdは複数のサウンドカードをサポートしていなくて,さらにUSBサウンドもサポートしていないはずなので, 録音にwavioを利用するのはecasound/alsa経由で頑張ることになる. まぁ,それはいつもやっているので動くことは分かっているのでよし. なんだかんだでecasoundとzynaddsubfxでソフトシンセが使える,ということが重要. これで出張先でもなんでもlinuxマシンさえあればなんとかなる状況になりましたな.

18:35:19 # Life missing sentinel in function call. execl(getenv("SHELL")?:"/bin/sh", getenv("SHELL")?:"/bin/sh"); としたら,gcc4.0の警告が出た. 最後のNULLを書き忘れていたからのようだ. execl(getenv("SHELL")?:"/bin/sh", getenv("SHELL")?:"/bin/sh",NULL); このような可変数の変数を持つCの関数でのエラーを検出するのは結構難しいはず.

21:13:56 # Life cowdancer をリリースしました. こちらにdebパッケージはおいています. ユーザランドだけでcopy-on-writeファイルシステムの操作性を実現しています. 紹介ページはこちら. cp -al(ハードリンクを利用するため,ディスクアクセスがすくなくてすむので高速)でコピーしたツリーがcp -a(実際にファイルをすべてコピーするので遅い) でコピーしたかのように利用できます. パリのルーブル美術館で思い付いたネタなのですが,結局リリースするのに2週間近くかかってしまいました. これを利用することで,pbuilderをかなり高速化することができるはずです.

Junichi Uekawa

$Id: dancer-diary.el,v 1.89 2005/05/12 11:19:14 dancer Exp $