JACK Audio Connection Kit
関連記事
インストール
JACK を動かすには、/etc/security/limits.d/99-audio.conf
で ulimit を高く定義 (音声をリアルタイム処理するのに必須) できるようにユーザーを audio
グループに追加する必要があります。
JACK の実装は2つあります。違いについては この比較 を見て下さい。簡単に説明すると、Jack 1 と Jack 2 はどちらも同じプロトコルの実装です。Jack 1 でコンパイルされたプログラムは特に修正を加えなくても Jack 2 で動作します (逆もしかり)。
JACK2
JACK2 はマルチプロセッサハードウェア向けに書きなおされています。jack2 パッケージでインストールしてください。環境が64ビットで JACK が必要な32ビットのアプリケーションを動かす必要がある場合は、multilib リポジトリから lib32-jack2 もインストールしてください。jack_controll コマンド を使用するには、python-dbus パッケージもインストールします。
JACK
また、jack パッケージでインストールできる、旧式の JACK も存在します。環境が64ビットで JACK が必要な32ビットのアプリケーションを動かす必要がある場合は、multilib リポジトリから lib32-jack もインストールしてください。
GUI
- Cadence — オーディオプロダクション向けの便利なツールのセット。システムチェックや JACK の管理、他のツールの呼び出しなどの設定を行います。
- Patchage — JACK と ALSA ベースのオーディオ・MIDI 環境向けのモジュール式パッチベイ。
- PatchMatrix — マトリックス方式の JACK パッチベイ。
- QjackCtl — JACK サウンドサーバーデーモンを制御するシンプルな Qt アプリケーション。
基本設定
概要
ハードウェアやアプリケーションの適切な設定は様々な要因によって決まります。JACK を使用する場合、サウンドカードと CPU が遅延に強い影響を与えます。
メインライン Linux カーネルはリアルタイムスケジューリングをサポートしているため、カーネルにパッチを適用することは必ずしも必須ではありません。linux-rtAUR パッケージは遅延をさらに少なくするためのパッチが複数適用されています。
シェルを使った設定の例
JACK2 は 実行可能ファイル jacked から直接起動することも、D-Busベースの jack_control バイナリで制御することもできます。 jack_control を使用すると、シェルスクリプトを介して、JACK2 を簡単に起動および設定できます。Jack_control を使用するには、python-dbus パッケージをインストールする必要があることに注意してください。
シェルスクリプトを作成して X のログイン時に起動するように出来ます:
start_jack.sh
#!/bin/bash jack_control start jack_control ds alsa jack_control dps device hw:HD2 jack_control dps rate 48000 jack_control dps nperiods 2 jack_control dps period 64 sleep 10 a2jmidid -e & sleep 10 qjackctl &
これにより、他のプログラムが利用できる動作中のJACKインスタンスを開始します。各行の詳細は次のとおりです。最適な設定を探す際には、D-Bus を使わないバージョンの JACK2 で QJackCtl の GUI を使って色々と試すと良いでしょう。
シェルを使った設定の例の概要
jack_control start
JACK を起動します (起動していない場合)。
jack_control ds alsa
ALSA ドライバーを使うように JACK を設定します。
jack_control dps device hw:HD2
HD2 という名前の ALSA 対応のサウンドカードを使うように JACK を設定します。cat /proc/asound/cards
で名前を見つけることができます。ALSA チュートリアルやデフォルト設定ではカードの番号を使っていますが、外部 MIDI デバイスを使うときに混乱のもとになるので、名前を使うほうが楽です。
jack_control dps rate 48000
48000 khz サンプリングを使うように JACK を設定します。このハードではこれで上手く動きます。カードによっては 44100 だったり、もっと高い数値を使ったりします。数値を上げれば上げるだけ、レイテンシが少なくなりますが、カードや CPU を良い物にする必要があり、ソフトウェアもサポートしている必要があります。
jack_control dps nperiods 2
2周期を使うように JACK を設定します。マザーボード, PCI, PCI-X などでは2が適切で USB には3が適切です。
jack_control dps period 64
1フレームあたり64周期を使うように JACK を設定します。低いほうが遅延が少なくなりますが、このスクリプトの設定では 2.67 ms の遅延になり、ある程度低いわりにはこの例で使うハードウェアにあまり負担をかけません。USB サウンドシステムを使う場合は32にすると良いでしょう。リアルタイムシンセサイズや FX には 3-4 ms 以下なら問題ありません。人間が認識できる限界は 5ms です。CPU に負担をかけずに 1 ms の遅延を処理できる高級なハードウェアもありますが、必ずしも必須とは限りません。QjackCtl は負担を知らせてくれます。負担がない(クライアントが動いていない)とき、最大でも 3-5% の CPU 使用量で、xruns がないと出来ない場合は (赤い数字はシステムが要求に答えられていないことを示しています)、ハードウェアを良くする必要があります。
sleep 10
利用できるようになるまで待って下さい。
a2jmidid -e &
ALSA-to-JACK MIDI ブリッジを起動します。JACK ではなく ALSA を使って MIDI 入力を受け取るアプリケーションのミキシングに使えます。
sleep 10
利用できるようになるまで待って下さい。
qjackctl &
QjackCtl をロードします。システムトレイに GUI の設定が表示されます。D-Bus によって起動した JACK セッションをスムーズに拾うはずです。手動で起動した JACK アプリケーション間のパッチベイ・接続を管理します。パッチベイは手動の GUI を使って設定しますが、パッチベイの設定済み接続は QjackCtl によってアプリが起動したときに自動で作成されます。
GUI を使った設定の例
以下は GUI を使って JACK を設定・管理する例です:
- python2-dbus をインストールしてください。
- qjackctl をインストールして、ブート時に起動するように GUI のウィンドウ・デスクトップシステムを設定してください。
- QjackCtl が以下のようになっているか確認してください:
- D-Bus インターフェイスを使用する
- ブート時に起動する
- 設定をデフォルトの場所に保存する
- アプリケーションの起動時に JACK オーディオサーバーを起動する
- システムトレイアイコンを有効にする
- システムトレイに最小化された状態で起動する
- 再起動してください。
- ログインした後、システムトレイに QjackCtl が表示されるはずです。左クリックしてください。
- QjackCtl GUI で遅延を少なくするように設定を行ってください。遅延に影響を与えるのは Frame Size, Frame Buffer, Bitrate の設定です。フレームサイズを大きくしたり、フレームバッファを少なくしたり、ビットレートの設定を高くすれば遅延が小さくなりますが、サウンドカードや CPU の負担が大きくなります。ライブ音声生成や何らかのフィルタを通すときは遅延を 5ms 以下に抑える必要があります。そうしないとプレイヤーと聞こえてくる音の遅延がはっきりとわかるくらいになっていまいます。
ALSA を使って再生する
ジャックの実行中に alsa プログラムを再生できるようにするには、 alsa-plugins} を使用して alsa のジャックプラグインをインストールする必要があります。
単純な2チャンネル設定の場合は、/etc/asound.conf (システム全体の設定) を編集 (または作成) して有効にし、以下の行を追加します。
# convert alsa API over jack API # use it with # % aplay foo.wav # use this as default pcm.!default { type plug slave.pcm "jack" hint.description "Jack Audio" }
出力/入力チャネルの数が異なる場合、または最初の2つのチャネルがオーディオのルーティング先ではない場合は、 /etc/alsa/conf.d/50-jack.conf
に用意されている定義済みの jack pcm ソースを使用することはできません。
# the first jack port goes to an output we do not use and there are no recording devices pcm.!jack { type jack playback_ports { 0 system:playback_2 1 system:playback_3 } } pcm.!default { type plug slave.pcm "jack" hint.description "Jack Audio" }
パソコンなどを再起動する必要はありません。 alsa の設定ファイルを編集して、 jack を起動して下さい。
user として起動することを忘れないでください。ユーザーX として jackd-d alsa
で起動した場合、ユーザーYに対しては機能しません。
ALSA ループバックデバイス (より複雑ですが、おそらくより堅牢) を使用する別のアプローチは、 この記事 で説明されています。
gstreamer
gstreamer で JACK を使うには gst-plugins-good パッケージが必要です。JACK のサポートを追加するプラグインが含まれています。
適当な GNOME アプリケーションの設定マネージャを使用してください (gconf2, gconf-editor, gstreamer-properties など)。
以下のパラメータの値を:
/system/gstreamer/0.12/audio/default/musicaudiosink /system/gstreamer/0.12/audio/default/audiosink
以下のように変更してください:
jackaudiosink buffer-time=2000000
バッファ時間の値はあまり重要ではありませんが、高い値にすることで音が割れにくくなります。
参照: http://jackaudio.org/faq/gstreamer_via_jack.html
PulseAudio
pulseaudio をインストールしたままにしたい場合 (gnome-settings-daemon など他のパッケージによって必要なときなど)、PulseAudio が X と一緒に自動で起動して JACK を乗っ取ってしまうのを防ぐ必要があります。
/etc/pulse/client.conf
を編集して "autospawn" をアンコメントして "no" に設定してください:
;autospawn = yes autospawn = no
JACK と PulseAudio 両方で再生したい場合、次を参照: PulseAudio/サンプル#PulseAudio と JACK
Firewire
ALSA が firewire デバイスを触らないように、firewire に関連するカーネルモジュールは全てブラックリスト化してください。また、PulseAudio も firewire が使えなくなります。以下のファイルを作成:
/etc/modprobe.d/alsa-no-jack.conf
blacklist snd-fireworks blacklist snd-bebob blacklist snd-oxfw blacklist snd-dice blacklist snd-firewire-digi00x blacklist snd-firewire-tascam blacklist snd-firewire-lib blacklist snd-firewire-transceiver blacklist snd-fireface blacklist snd-firewire-motu
モジュールのリストは Alsa Firewire Improve Repository に書かれているのが最新です。
ロードした firewire モジュールをアンロードするか再起動してください。
ネットワーク / リモートオーディオ
JACK は、ネットワーク経由で マスター マシンにオーディオデータを送信するように設定できます。このマシンは、オーディオを物理デバイスに出力します。これは、追加のケーブルやハードウェアミキサーを必要とせずに、多数の スレーブ コンピューターからのオーディオをミキシングし、オーディオパスを可能な限りデジタルに保つ場合に便利です (デジタル入力を備えたハードウェアミキサーは非常に稀です)
構成は非常に単純ですが、マルチキャスト・トラフィックをサポートするネットワーク (つまり、管理対象ネットワークスイッチで IGMP スヌーピングを有効にする必要があります) が必要で、プロトコルはバージョン間で相互運用できないため、すべてのマシンで同じ JACK メジャー・バージョン (JACK1 または JACK2) が実行されている必要があります。JACK2 の場合は、netmanager
モジュールをロードする必要があります。
master$ jack_load netmanager -i -c
-i-c
オプションは、着信接続をデフォルトのオーディオデバイスに自動的にマッピングするようにネットマネージャに指示します。これがないと、各着信接続を各接続に手動でマッピングする必要があります。代わりに -i-h
を使用して、使用可能なすべてのオプションを表示できます。ただし、オプションは jackd
サーバ出力に出力されるため、 jack_load
コマンドでは何も表示されません。
クライアントでは、JACK をネットワーク・モードで起動する必要があります。
slave$ jackd -d net
2台のマシンが接続され、マスター上に新しいオーディオソースが表示されます。
master$ jack_lsp system:playback_1 system:playback_2 remotehost:from_slave_1 remotehost:from_slave_2
上記のように -c
オプションを jack_load
に渡すと、リモートシステムはオーディオを再生できるようになります。
MIDI
JACK は1つのサウンドカードと、(USB などで接続された) 任意の数の MIDI デバイスを扱うことができます。 JACK を起動して、MIDI キーボードやシンセサイザーやその他のピュア MIDI デバイスを使用したい場合、適当なサウンドカードを使って JACK を起動する必要があります (PCM 音源を入出力するサウンドカード)。 そうすればすぐに、MIDI デバイスを接続して QjackCtl (qjackctl) などで接続ボタンをクリックすれば、(ドライバーによって) JACK-MIDI か ALSA-MIDI の下にデバイスが表示されます。
JACK-MIDI の場合、QjackCtl の Setup > Settings で MIDI Driver を seq または raw に設定してください。これで MIDI デバイスが MIDI タブに表示されるはずです。また、Setup > Display > Enable client/port aliases と Enable client/port aliases editing (rename) を有効にすれば、クライアントの名前を (共通の "midi_capture_1" という名前から意味のある名前に) 変更することができます
ALSA-MIDI の場合、QjackCtl の Setup > Misc で Enable ALSA Sequencer support をオンにしてください。これで QjackCtl の Connect ウィンドウに ALSA タブが追加され MIDI コントローラーがそこに表示されます。
ALSA-MIDI を JACK-MIDI にブリッジするには、a2jmidid (a2jmidid) を使って下さい。次のコマンドは全ての ALSA MIDI ポートを JACK MIDI ポートに伝えます:
$ a2jmidid -e
QjackCtl では MIDI タブに "a2j" クライアントとして表示されます。
QjackCtl の Setup > Options > Execute script after Startup に追加することで a2jmidid を自動で起動させることが可能です: /usr/bin/a2jmidid -e &
- Q: JACK-MIDI と ALSA-MIDI の違いは何ですか?
- A: 前者は MIDI イベント処理のタイミングとサンプルの正確性が良くなっています。後者を置き換えることもできますが、今のところ共存しています。
M-Audio MIDI キーボードをインストールするには、ファームウェアパッケージ midisport-firmwareAUR が必要になります。また、snd_usb_audio モジュールを使えるようにしてください。 個別の USB MIDI デバイスに関する情報は http://alsa.opensrc.org/USBMidiDevices を見て下さい。
トラブルシューティング
起動時に "Cannot lock down memory area (Cannot allocate memory)" というメッセージが表示される
リアルタイムプロセス管理#PAM の設定を見て下さい。そしてユーザーが audio
グループに属していることを確認してください。
jack2-dbus と qjackctl のエラー
(jack2-dbus パッケージをインストールしていて) qjackctl の start ボタンを押すと "Cannot allocate memory" や "Cannot connect to server socket err = No such file or directory" などのエラーが発生する場合 ~/.jackdrc
, ~/.config/jack/conf.xml
, ~/.config/rncbc.org/QjackCtl.conf
を削除してください。jackdbus を終了し、初めから再起動してください。
(Thanks to nedko)
以下も試して下さい:
$ fuser /dev/snd/*
PID で確認するには:
$ ps ax | grep [PID here]
上記のコマンドで衝突しているプログラムが表示されることがあります。
ログに "ALSA: cannot set channel count to 1 for capture" エラー
ALSA の入出力チャンネルを 1 から 2 に変更してください。
クラックノイズ・ポップノイズが音に混じる
あなたの JACK の設定を処理するには CPU やサウンドカードの能力が不足しています。ノイズが止むまでビットレートやフレームサイズを下げるか、フレーム間隔を少しずつ上げてみてください。
特定のアプリケーションの問題
VLC - JACK を起動した後に音が鳴らない
VLC を起動して以下のメニューオプションを変更してください:
- ツール > 設定
- 設定の表示: 全て
- オーディオ > 出力モジュール > オーディオ出力モジュール: JACK オーディオ出力
- オーディオ > 出力モジュール > JACK: 書き込み可能なクライアントに自動的に接続 (有効にする)