JACK Audio Connection Kit
インストール
JACK を動かすには、/etc/security/limits.conf
で ulimit を高く定義 (音声をリアルタイム処理するのに必須) できるようにユーザーを audio
グループに追加する必要があります。
JACK の実装は2つあります。違いについては この比較 を見て下さい。
JACK2
JACK2 はマルチプロセッサハードウェア向けに書きなおされています。公式リポジトリの jack2 でインストールしてください。環境が64ビットで JACK が必要な32ビットのアプリケーションを動かす必要がある場合は、multilib リポジトリから lib32-jack2 もインストールしてください。
JACK2 D-Bus
D-Bus を使う JACK2 は jack2-dbus でインストールできます。jack2 パッケージと同じものですが、レガシーな "jackd" サーバーは入っていません。
jack_control
ユーティリティを使って操作します。重要なコマンドは以下の通り:
jack_control start - jack サーバーを起動する jack_control stop - jack サーバーを停止する jack_control ds alsa - ドライバー(バックエンド)として alsa を選択する jack_control eps realtime True - エンジンのパラメータを realtime などに設定する jack_control dps period 256 - ドライバーパラメータを 256 に設定する
JACK
また、公式リポジトリの jack でインストールできる、旧式の JACK も存在します。環境が64ビットで JACK が必要な32ビットのアプリケーションを動かす必要がある場合は、multilib リポジトリから lib32-jack もインストールしてください。
GUI
GUI のコントロールアプリケーションが使いたい場合は、公式リポジトリにある qjackctl が広く使われています。
基本設定
概要
Linux Magazine の記事 がとてもよくまとまっています。JACK を正しく設定すれば、手動でコンパイルすることを心配しなくても、ほとんどの JACKのツールはすぐに動作します。
多くのチュートリアルではリアルタイムカーネルを喧伝しています。このカーネルは live synthesis や FX ではとても訳に立ちますが、録音や編集を目的としているのなら必須ではありません。そのような場合は非リアルタイムのレイテンシ 10-40+ ms (古いハードウェアなら 100-500+ ms) を気にする必要がありません。
各種要因にあわせて、ハードウェアやアプリケーションが必要な設定を適切に行なって下さい。
シェルを使った設定の例
JACK docs linking this precise example do merit consideration. But the original author of the example wishes to state that it is for priority access to computation, to RAM, and motherboard nexus hardware, not mostly audio, that he uses schedtool on sound-production processes.
JACK2 の D-Bus 版はとても簡単に始めることができます。以前は、QjackCtl や daemonizer などを使う必要がありました。jack2-dbus を使うことで、シェルスクリプトで簡単に起動・設定が可能です。
シェルスクリプトを作成して X のログイン時に起動するように出来ます:
start_jack.sh
#!/bin/bash jack_control start sudo schedtool -R -p 20 `pidof jackdbus` jack_control eps realtime true 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 /usr/bin/a2jmidid -e & sleep 10 sudo schedtool -R -p 20 `pidof a2jmidid` qjackctl & sleep 10 sudo schedtool -R -p 20 `pidof qjackctl` qmidiroute /home/username/All2MIDI1.qmr & sleep 10 sudo schedtool -R -p 20 `pidof qmidiroute` yoshimi -S & sleep 10 sudo schedtool -R -p 20 `pidof yoshimi`
これで複数のツールが統合され、完全にリアルタイムな JACK の live-synthesis セットアップが立ち上がります。それぞれの行の詳細は下で説明しています。最適な設定を探す際には、D-Bus を使わないバージョンの JACK2 で QJackCtl の GUI を使って色々と試すと良いでしょう。
シェルを使った設定の例の概要
jack_control start
JACK を起動します (起動していない場合)。
sudo schedtool -R -p 20 `pidof jackdbus`
Linux カーネルでリアルタイムモードに JACK を設定します、priority 20 (オプションの範囲は 1-99)。
jack_control eps realtime true
内部設定でリアルタイムモードに 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 がないと出来ない場合は (赤い数字はシステムが要求に答えられていないことを示しています)、ハードウェアを良くする必要があります。マザーボードで USB が良く動作する場合、かなり低いレイテンシで良い音を生成できる安い USB サウンドシステムが多数存在しますが、全てではありません。
sleep 10
利用できるようになるまで待って下さい。
/usr/bin/a2jmidid -e &
ALSA-to-JACK MIDI ブリッジを起動します。JACK ではなく ALSA を使って MIDI 入力を受け取るアプリケーションのミキシングに使えます。
sleep 10
利用できるようになるまで待って下さい。
sudo schedtool -R -p 20 `pidof a2jmidid`
a2jmidid を Linux カーネルのリアルタイムスケジューリングに設定します。
qjackctl &
QjackCtl をロードします。システムトレイに GUI の設定が表示されます。D-Bus によって起動した JACK セッションをスムーズに拾うはずです。手動で起動した JACK アプリケーション間のパッチベイ・接続を管理します。パッチベイは手動の GUI を使って設定しますが、パッチベイの設定済み接続は QjackCtl によってアプリが起動したときに自動で作成されます。
sleep 10
利用できるようになるまで待って下さい。
sudo schedtool -R -p 20 `pidof qjackctl`
qjackctl を Linux カーネルのリアルタイムスケジューリングに設定します。
qmidiroute /home/username/All2MIDI1.qmr &
qmidiroute をロードし、全てのチャンネルの MIDI イベントをチャンネル1に書き換えるカスタム設定ファイルを読み込みます。これは PC をキーボードに接続するときに便利です -- デフォルトのキーボードのチャンネルに関係なく、qmidiroute は信号をチャンネル1のシンセに送信します。多数の同時転移や転調、信号タイプの書き換えなど、qmidiroute は多種多様な複雑で便利な設定をすることが可能です。
sleep 10
利用できるようになるまで待って下さい。
sudo schedtool -R -p 20 `pidof qmidiroute`
qmidiroute を Linux カーネルのリアルタイムスケジューリングに設定します。
yoshimi -S &
Yoshimi シンセサイザーをロードします、保存されているデフォルト状態を使います。
sleep 10
利用できるようになるまで待って下さい。
sudo schedtool -R -p 20 `pidof yoshimi`
Yoshimi を Linux カーネルのリアルタイムスケジューリングに設定します。
ログイン時に上記全てをスクリプトで実行し、QjackCtl パッチベイを正しく設定すれば、PC/ノートパソコンに USB-to-MIDI アダプタを使って (もしくは最近のキーボードにある USB-in MIDI を使って)、MIDI キーボードを繋ぐだけで、演奏することができます。
QJackCtl の大事なところは この記事 でほとんど説明されています。
GUI を使った設定の例
上のシェルを使った例では、たくさんのことを細かく決めて十分に知る必要があります。そうしないと動作しません。GUI を使って設定したい場合は、以下を行なって下さい:
- jack2-dbus をインストールしてください。
/etc/asound.conf
を/etc/asound.conf.ORIGINAL
にコピーして、以下のように置き換えて下さい:
pcm.pulse { type pulse } ctl.pulse { type pulse } pcm.!default { type pulse } ctl.!default { type pulse }
- pulseaudio をインストールしてください。
- pulseaudio-alsa をインストールしてください。
- qjackctl をインストールして、ブート時に起動するように GUI のウィンドウ・デスクトップシステムを設定してください。
- QjackCtl が以下のようになっているか確認してください:
- D-Bus インターフェイスを使用する
- ブート時に起動する
- 設定をデフォルトの場所に保存する
- アプリケーションの起動時に JACK オーディオサーバーを起動する
- システムトレイアイコンを有効にする
- システムトレイに最小化された状態で起動する
- 再起動してください。
- ログインした後、システムトレイに QjackCtl が表示されるはずです。左クリックしてください。
- QjackCtl GUI で設定を行なって下さい。上のシェルスクリプトによる設定に書かれている情報が何らかの役に立つかもしれません。この記事 の情報も有用です。ライブ音声生成や何らかのフィルタを通すときは遅延を 5ms 以下に抑える必要があります。そうしないとプレイヤーと聞こえてくる音の遅延がはっきりとわかるくらいになっていまいます。
- AUR から non-dawAUR をインストールしてください。One of the components of this package is called non-session-manager; it has the function of setting up "sessions": sets of other audio software items which Jack (through the QjackCtl patchbay or not!) will wire together. NSM can handle as many different sessions as you wish to set up; and as a result, it's all GUI, apart from the one rc.local edit in the beginning.
詳細
詳しい情報はプロオーディオのページにあります。
マルチユーザー環境での Jack
So, you have a decent multiuser system as it was designed more than 20 years ago, and now some developers decided that sound is only for a mono-user system... No I can not believe it !
Fortunately some time ago someone convinced the developers to allow jack to run as a system wide daemon. Here is the procedure to follow:
Create a /etc/profile.d/jack.sh
file containing:
export JACK_PROMISCUOUS_SERVER=""
Replace /etc/rc.d/jack-audio-connection-kit
with the following content
#!/bin/bash . /etc/rc.conf . /etc/rc.d/functions # source application-specific settings [ -f /etc/conf.d/jack-audio-connection-kit ] && . /etc/conf.d/jack-audio-connection-kit PID=`pidof -o %PPID /usr/bin/jackd` [ -n "$JACKUSER" ] && HOME="/home/$JACKUSER" [ -z "$JACK_PARAMS" ] && JACK_PARAMS=$(sed 's:/usr/bin/jackd ::' $HOME/.jackdrc) case "$1" in start) stat_busy "Starting JACK" if [ -z "$PID" ]; then if [ -n "$JACKUSER" ]; then su - $JACKUSER -c 'export JACK_PROMISCUOUS_SERVER="" && . /etc/conf.d/jack-audio-connection-kit && umask 0000 && /usr/bin/jackd $JACK_PARAMS &> /dev/null &' else export JACK_PROMISCUOUS_SERVER="" umask 0000 /usr/bin/jackd $JACK_PARAMS &> /dev/null & fi fi if [ ! -z "$PID" -o $? -gt 0 ]; then stat_fail else add_daemon jack stat_done fi ;; stop) stat_busy "Stopping JACK" [ ! -z "$PID" ] && kill $PID &> /dev/null if [ $? -gt 0 ]; then stat_fail else rm_daemon jack stat_done fi ;; restart) $0 stop sleep 1 $0 start ;; *) echo "usage: $0 {sta|stop|restart}" esac exit 0
Where my /etc/conf.d/jack-audio-connection-kit
is
# Configuration for starting JACK at boot # Uncomment this to run as user (recommended) #JACKUSER="root" # Uncomment this to not source ~/.jackdrc JACK_PARAMS="-R -P89 -dalsa -dhw:1 -r48000 -p512 -n3"
ALSA を使って再生する
jack の実行中に Alsa のプログラムが再生できるようにするには alsa の jack プラグインが入っている alsa-plugins をインストールする必要があります。
/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" } } ctl.mixer0 { type hw card 1 } # pcm type jack pcm.jack { type jack playback_ports { 0 system:playback_1 1 system:playback_2 } capture_ports { 0 system:capture_1 1 system:capture_2 } }
コンピュータを再起動する必要はありません。alsa の設定ファイルを編集して、jack を起動すれば、それで問題ありません。
ユーザーとして起動することを覚えておいて下さい。jackd -d alsa
をあるユーザーによって起動した場合、他のユーザーから使うことはできません。
他の方法として、ALSA の loopback デバイスを使う方法 (複雑ですが堅牢になります) が この記事 で説明されています。
gstreamer
例: gconf を使わずにライブストリーミングを視聴する
gst-launch-0.10 playbin2 uri=http://streamer.stackingdwarves.net/bewerungeroom.ogv audio-sink="jackaudiosink"
gconftool-2 を使って jack を利用するように gstreamer を設定する
gconftool-2 --type string --set /system/gstreamer/0.10/audio/default/audiosink "jackaudiosink buffer-time=2000000" gconftool-2 --type string --set /system/gstreamer/0.10/audio/default/musicaudiosink "jackaudiosink buffer-time=2000000" gconftool-2 --type string --set /system/gstreamer/0.10/audio/default/chataudiosink "jackaudiosink buffer-time=2000000"
参照: http://jackaudio.org/gstreamer_via_jack
PulseAudio
pulseaudio をインストールしたままにしたい場合 (gnome-settings-daemon など他のパッケージによって必要なときなど)、PulseAudio が X と一緒に自動で起動して JACK を乗っ取ってしまうのを防ぐ必要があります。
/etc/pulse/client.conf
を編集して "autospawn" をアンコメントして "no" に設定してください:
;autospawn = yes autospawn = no
JACK と PulseAudio 両方で再生したい場合、次を参照: PulseAudio/サンプル#PulseAudio と JACK
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 キーボードをインストールするには、AUR にあるファームウェアパッケージ midisport-firmwareAUR が必要になります。また、snd_usb_audio モジュールを使えるようにしてください。 個別の USB MIDI デバイスに関する情報は http://alsa.opensrc.org/USBMidiDevices を見て下さい。
トラブルシューティング
起動時に "Cannot lock down memory area (Cannot allocate memory)" というメッセージが表示される
Realtime for Users#Add user to audio group を見て下さい。
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)
特定のアプリケーションの問題
VLC - JACK を起動した後に音が鳴らない
VLC を起動して以下のメニューオプションを変更してください:
- ツール > 設定
- 設定の表示: 全て
- オーディオ > 出力モジュール > オーディオ出力モジュール: JACK オーディオ出力
- オーディオ > 出力モジュール > JACK: 書き込み可能なクライアントに自動的に接続 (有効にする)