JACK Audio Connection Kit

JACK Audio Connection Kitについて

JACK Audio Connection Kit (JACK)を参照。

JACKデーモンとその起動

端末からのJACKデーモンの起動

JACKデーモンのコマンド名はjackdで、設定をコマンド行オプションで指定して起動する。

詳しくはjackdを参照。

QjackCtlによるJACKデーモンの起動

JACKデーモンjackdをGUIから起動し、そのオプション指定を行ったり各種操作を行ったりするQjackCtlというツールがある。

システムトレイに常駐して制御できるので便利。JACKを頻繁に使う場合は自動起動するようにするとよい。ほとんどのディストリでパッケージが用意されている。

デーモンの設定はSetupボタンか同名のシステムトレイメニュー項目から開くダイアログのSettingsタブで行う。設定はプリセットとして複数個保持できる。

QjackCtlによるJACK Audio Connection Kitのデーモン設定例

ALSAのhwプラグインを用いた設定例(推奨)

[注記]メモ

この設定はオーディオ制作用途に適しているが、他のサウンドシステムと干渉する場合もあるため、必要なときだけデーモンを動かすのがよい。ALSAやPulseAudioではプラグインによりJACKのサウンドシステムへ音を出すようにすることもできる。

表25 ALSAのhwプラグインを用いた設定例(一部項目)

項目名
Driveralsa
Realtimeチェック
Priority場合によっては0でもOKだが、音飛びがするなら更に上げる(最大89)
Unlock Memoryチェック(好みでOK)
Soft Modeチェックなし
Sample Rate好みでOK(44100や48000など・既定値48000)
Interface既定値
AudioDuplex
Input Devicehw:[サウンドカード番号]
Output Devicehw:[サウンドカード番号]
MIDI Driverseq

[注記]メモ

サウンドカードが1枚(サウンドカード番号は0)の場合、デバイス名部分は既定値/無指定でもよい(hw:0になる)。

ALSAのdmix,dsnoopプラグインを用いた設定例

[注意]注意

この設定は処理の遅延や音切れが発生することがあるため、オーディオ制作用途には向かないが、他のサウンドシステムとの干渉が少ないため、オーディオ再生用途では使いやすい。

表26 ALSAのdmix,dsnoopプラグインを用いた設定例(一部項目)

項目名
Driveralsa
Realtimeチェック
Priority場合によっては0でもOKだが、音飛びがするなら更に上げる(最大89)
Unlock Memoryチェック(好みでOK)
Soft Modeチェック
Sample Rate好みでOK(44100や48000など・既定値48000)
Interface既定値
AudioDuplex
Input Devicedsnoop
Output Devicedmix
MIDI Driverseq

この設定でデーモンを動かす場合、以下の記述を別途行う。

[追記]ファイル名: ~/.asoundrc

defaults.ctl.card [サウンドカード番号]
defaults.pcm.card [サウンドカード番号]
ctl.dmix
{
  type hw
  card [サウンドカード番号]
}
ctl.dsnoop
{
  type hw
  card [サウンドカード番号]
}

[注意]注意

サウンドカードが複数枚ある場合の上記設定の動作については未確認。

JACK Audio Connection Kitの音飛びとその対策

JACK Audio Connection Kitの音飛びについて

多くのディストリの初期設定状態ではJACKデーモン(jackd)は頻繁に音飛びを起こしてしまう。JACK対応のオーディオプレーヤでJACKへ出力しているだけでも頻繁に音飛びする。

JACKには音飛び(xrun)を検知する仕組みがあり、GUIのQjackCtlを使用している場合システムトレイアイコンの背景が赤くなり、Statusウィンドウでは音飛びの統計(前回の音飛び時刻含む)が参照できる。

端末からデーモンを直接実行した場合には

**** alsa_pcm: xrun of at least xx.xxx msecs

のように表示されるが、JACK 2ではデーモンに--sync(-S)オプションを付けないと表示されない。

JACK Audio Connection Kitの音飛びに対処するための設定

音飛びはJACKデーモンのリアルタイム優先度(やプロセス優先度)を上げることで対処できるが、標準では権限がなく上げられないため、実行するユーザ(あるいはその所属グループ)に対して制限を緩和する設定が必要。リアルタイム(RT)カーネルも推奨。[16]Ubuntuではlinux-lowlatencyのカーネルをインストールしてこれを起動することで音飛びは(genericのカーネルと比べて)大きく改善される。

JACKを用いる場合、リアルタイム優先度,nice値,メモリロックについては制限の緩和をする設定をしておくことが推奨される(特にリアルタイム優先度は重要)。変更は次回ログイン後に有効となる。

例38 リアルタイム優先度,nice値,メモリロックの設定例(オーディオ制作用途向け)

[追記]ファイル名: /etc/security/limits.conf

# ユーザ名部分は「@audio」のようなグループ名指定も可
# 許可する最大のリアルタイム優先度値 99まで指定可
[ユーザ名]      -       rtprio           50
# 許可する最小のnice値 -20まで指定可
[ユーザ名]      -       nice             -5
# 許可するメモリロック範囲[KB] unlimitedで無制限
[ユーザ名]      -       memlock          unlimited

Ubuntuのパッケージjack2はDebconfによるパッケージの設定でチェックを入れるだけで下のようなリアルタイム優先度やメモリロックの権限の設定が書き込まれ、ユーザをaudioグループのメンバにするだけで高いリアルタイム優先度が指定可能となる。nice値については管理者権限で下のファイルを編集してコメントを解除することで高い優先度で動作するようにできる。

[引用]ファイル名: /etc/security/limits.d/audio.conf より

@audio   -  rtprio     95
@audio   -  memlock    unlimited
#@audio   -  nice      -19

JACKデーモンのリアルタイム優先度をオプションで指定するには--realtime-priority [優先度値](-P [優先度値])を指定する。既定値は0(/etc/security/limits.confrtprioは10以上の許可が必要)。[17]優先度値は/etc/security/limits.confrtprioの値から10引いた値まで指定可。[18]

QjackCtlからデーモンを起動する場合はデーモンのプリセットの設定でRealtimeにチェックを入れてPriorityに優先度値を入れたものでデーモンを開始する。

実際に指定するリアルタイム優先度値については既定値の0でも、例としてAudaciousでの再生では十分で、音飛びはほぼ改善される(必要があれば高くしてもよい)。

[ヒント]ヒント

サウンドカードの入力とHDMI音声の出力を同時に使用するように指定した場合などに音飛びするのはフレーム/ピリオド(--period/-pオプション)やピリオド/バッファー(--nperiods/-nオプション)の値を上げることで改善できることがある。ただしデーモンの遅延時間は長くなる。

JACK Audio Connection Kitのポートについて

JACKアプリケーションにはポートという概念があり、出力用と入力用の2種類がある。JACKアプリケーションはいずれかのポートを最低1つ持ち、このポートを接続して、その種類によって音声データを別のJACKアプリケーションに渡すか、逆に別のJACKアプリケーションから受け取ることができる。[19]

オーディオのポートはチャンネル単位で扱われる(2ch/ステレオなら2ポート)。形式は[プログラム名(もしくはsystem)]:[ポート名]

オーディオのポートと別にMIDIのポートが存在し、JACK MIDI対応のアプリケーションでのみ利用できる。概念としてはオーディオのポートと同様で、ALSAサウンドシステムのMIDIポートも仕組みはこれと似ている。

表27 JACKアプリケーションのポートについて

名前説明オス/メスで例えるとQjackCtlのConnectionsダイアログ上の位置
出力(output)ポートアプリケーションから音声データが出力される場所オスオーディオ編集アプリケーションやJACK対応プレーヤなどからの出力,オーディオフィルタツール(例:JACK Rack)からの出力,別サウンドシステムからプラグインを経由してJACKのサウンドシステムへ入力されたもの,サウンドカードのキャプチャ(ライン入力など)
入力(input)ポートアプリケーションが音声データを受け取る場所メスJACK向けの(アプリケーション間で使える)録音/キャプチャアプリケーション,オーディオフィルタツールへの入力,別サウンドシステムへのプラグインを経由した出力,サウンドカードへの出力(playback)

JACK Audio Connection Kitのシステムポート

JACKデーモンを動かすとそのバックエンドのサウンドシステム(例:ALSA)との間のデータの入出力を行うための以下のポートが作られる。JACKアプリケーションからの音を実際にサウンドカードで鳴らすためにはsystem:playback_[チャンネル番号]のポートへデータを出すことになる。

MIDIをサポートするバックエンドを用いてMIDIありでデーモンを動かすとバックエンドのサウンドシステムのMIDIポートを扱うことができるようになる。ALSAでは--midi-driver(-X)オプションでseqrawが選択でき、ALSAのMIDIポートがそのままJACK MIDIポートとして使えるようになる。

表28 JACKアプリケーションのシステムポートについて

ポート種類QjackCtlのConnectionsダイアログ上の位置説明
system:capture_[チャンネル番号]オーディオ出力(output)ポートバックエンドのオーディオシステムにおけるキャプチャされた音声(ライン入力など)
system:playback_[チャンネル番号]入力(input)ポートバックエンドのオーディオシステムにおけるサウンドカードへの出力(playback)
system:midi_capture_[番号]MIDI出力(output)ポートバックエンドのオーディオシステムにおける出力ポート(MIDIキーボードからの信号など)
system:midi_playback_[番号]入力(input)ポートバックエンドのオーディオシステムにおける入力ポート(MIDIシンセサイザへの信号など)

JACK Audio Connection Kitのポートの接続

  • オーディオ編集アプリケーションやJACK対応プレーヤなどでは自動的にサウンドカードへの再生のポート(system:playback)に接続されることが多いが、アプリケーションによっては設定によりポートを自動的には接続しないようにできる場合(例:Audacious)もある

  • 録音,キャプチャを行うアプリケーションでは、録音したいJACKアプリケーションのポートを指定すると自動的に接続される場合(例:recordMyDesktop)と手動でポートを接続する必要のある場合(例:JACK TimeMachine)とがある

  • コマンドではjack_connectで接続,jack_disconnectで切断することができる

  • QjackCtlではConnectionsダイアログで左右のポートをそれぞれ選択して下のボタンから接続(Connect)もしくは切断(個別:Disconnect 全て:Disconnect All)を行うことができる

例39 システムのキャプチャポート(2ch/ステレオ)をJACK TimeMachineに接続し、後で切断する

(接続)
$ jack_connect system:capture_1 TimeMachine:in_1; jack_connect system:capture_2 TimeMachine:in_2

(切断)
$ jack_disconnect system:capture_1 TimeMachine:in_1; jack_disconnect system:capture_2 TimeMachine:in_2

関連セクション

JACK TimeMachineによる録音

  • JACK Audio Connection Kit専用の録音ソフトウェア

  • 録音ボタンを押すタイミングの10秒[20]前から録音が開始される

  • 録音したい(音を出している)JACKアプリケーションの出力ポートとJACK TimeMachineの入力ポートを手動で接続した後でJACK TimeMachineのボタンを押すと録音開始(ボタンの色が変わる)

  • 録音を開始した後、停止したいタイミングでもう一度ボタンを押すと録音終了(ボタンの色が戻る)

  • 既定の保存ファイル形式はw64形式となり、WAVE形式で書き出したい場合は起動時に-f wavオプションを付ける必要がある

  • 出力ファイル名は録音開始時刻(さかのぼった先の時刻)に合ったtm-[年]-[月]-[日]T[時]:[分]:[秒].[w64もしくはwav]という形式の名前となるが、tm-の部分は-pオプションで変更可

  • -c [チャンネル数]オプションで録音チャンネル数を変更可

jackEQによる音量,簡易イコライザ調整

jackEQは別のJACKアプリケーションなどからの入力に対して

  • 複数の入力(4つまでで本ツール内のチャンネルとして扱われる)を合成

  • 音量レベルを視覚的にリアルタイムで確認

  • 入力ごとの音量の調整と簡易イコライザ(低音/中音/高音ごと)

といった処理を行うことができ、別の録音アプリケーション(例:JACK Timemachine)の録音レベル調整用途としても使える。内部的にはLADSPAプラグインのswh-pluginsを用いている。

jackEQの使用例

  1. Portsメニューのin-c.[jackEQのチャンネル(1-4)]-in-[L(左)もしくはR(右)]を左右チャンネルごとに別のJACKアプリケーションなどの出力ポートを指定して同一のjackEQチャンネルの入力につなげる

  2. 複数の入力を合成したい場合は他のjackEQチャンネルに対して上記作業を行う

  3. Portsメニューのout-a.master-L(左)とout-a.master-R(右)をそれぞれ出力先(サウンドカードへの出力であれば左をsystem:playback_1,右をsystem:playback_2)に接続

  4. jackEQの入力(チャンネル)ごとに中央のスライダーを用いて音量とイコライザ(Treble:高音,Mid:高音と低音の中間の音,Bass:低音のそれぞれのレベル)を調整

  5. Masterでマスターボリューム(全てのチャンネルが合成されたものに対する音量/アプリケーションからの出力音量)を調整

[注記]メモ

JACK TimeMachineの録音レベル調整として用いる場合、出力ポートをサウンドカードの出力とJACK Timemachineの両方に対して指定して接続するとよい(a.master-Lsystem:playback_1TimeMachine:in_1の両方,a.master-Rsystem:playback_2TimeMachine:in_2の両方にそれぞれチェックされている状態)。

関連セクション

JACK Rackによるオーディオのリアルタイムなフィルタ

JACK Rackを用いると、LADSPAプラグインを用いて入力ポートに入ってくるオーディオに対してリアルタイムで効果をかけることができる。

JACK Rackの使い方の流れ

  1. JACK Rackの入力ポートに別のJACKアプリケーション(JACK対応のプレーヤなど)もしくは外部入力の出力ポートを接続

  2. ツールバーの追加ボタンか「Rack」メニューからプラグインを選択するとウィンドウ下部に追加される

  3. Enableボタンを押すとプラグインが有効になり、再度押すと無効になる

  4. スライダーなどのGUI部品を調整するとリアルタイムで設定が反映される

  5. 上下矢印のボタンでプラグインの表示位置の並び替えができ、Xボタンを押すとプラグインが削除される・また、プラグイン名のボタンから別のプラグインを選択して置き換えることも可能

プラグインの設定状態はファイル(gzip圧縮されたXML形式)として「File」メニューから読み書きできる他、LASHのオーディオセッションとして保存/復元することもできる。



[16] 必須ではないが、リアルタイム(RT)カーネルを用いない場合、デスクトップ向けとサーバ向けにカーネルが分かれているディストリなら必ずデスクトップ向けを使用する

[17] リアルタイム指定は標準で有効となり、--no-realtimeで通常のリアルタイム優先度で実行することもできる(が音飛びするためおすすめはできない)

[18] rtprioが99の場合は89が最大

[19] JACK Rackのようなツールは入出力両方のポートを持ち、入力されたデータをフィルタして出力する

[20] -t [長さ]オプションで長さは変更可