發佈日期: 發佈留言

一般桌面程式如何使用到JACK的好處

我們知道Jack 音訊機制有很多好處,在DAW應用程式內部才能做的音訊繞接在整個作業系統裡面直接就可以作了,然而遇到不支援JACK的應用程式怎麼辦呢?本文用簡單的教學來示範。

我們以這個範例來探討:使用 OBS-studio 直播時,要如何「放送」出我們想要播的軟體音源的聲音呢?

首先,OBS-studio 的界面上,在音效混音器裡面,可以看到這樣裡面的我們要留意的是「麥克風/輸入音效1」,由於OBS-studio不用使用jack的,而是使用pulseaudio 或者pipewire

用Catia看JACK導線繞接

ww

在JACK裡面,我們可以看到OBS-studio 可以收到麥克風的音,其實是系統的capture_1/2 接到PulseAudio JACK Source 的左右聲道,然後PulseAudio內部再把聲音送進OBS-studio 。所以,我們如果把它們間的連線斷開

OBS-studio 就收不到麥克風來的訊號了。嘿,這邊我們就可以想到,換句話說,只要我們有軟體的聲音想要轉送給OBS-studio,最後直播時把聲音放送出去的話我們只要能把訊號繞接到 PulseAudio Jack Source ,就可以了,對吧?是的就是如此。

比方說,我們想要直播自己彈琴好了,使用的是Yoshimi 軟體音源

Yoshimi啟動時,你會看到他只有一對聲音訊號送到 實體系統硬體輸出(system),我們拉線接到 PulseAudio JACK Source這樣聲音訊號就送進Pulseaudio JACK Source , 所以在OBS-Studio 就有訊號了,這邊特別要提一下,上圖可以看到yoshimi 到system 的繞接並沒有切掉,這是為了讓我們仍然可以監聽實際Yoshimi 發出的聲音

同樣的,我們就可以聯想到….瀏覽器也是走Pulseaudio對吧?所以在Google meet 之類的,我自己講話的聲音不就也可以??

是的,例如說你想要讓同事或者同學聽到你的聲音像是天使還是恐怖大王的話,你就可以好好大搞特搞囉。例如說這個範例:

首先利用Carla 掛起 Tal reverb 3這個效果器,這麼作是讓效果器插件變成像獨立的程式運作

然後我們就可以在JACK 虛擬導線繞接的前端來進行操作系統硬體實體收音送到 TAL-Reverb-III 再接進 PulseAudio,就完成了 ,這樣一來你使用google meet,他人聽到你講話就是餘音繚繞囉…..

不過你可能會發現「我自己聽不到」啊?

因為你沒有把Tal-Reverb-III 接到 System 自己監聽囉,不過…這裡有一個but…..如果你使用的是筆電自身的麥克風播放的又是筆電的喇叭的話,可是一接上馬上就會開始巨大的迴授(很尖銳的”ㄍㄧ”~~~~~~~)喔,所以請預先戴上能隔音的耳機,OK 你美妙的餘音繞樑的美聲音就可以在耳機裡面聽得一清二楚囉。

順便附上在Qjckctl裡面看到的傳統式繞接圖(Qjckctl 新版現在也預設新的元件式繞接圖了)

(左邊是訊號輸出的端點,右邊是訊號輸入的街口)

最後當然你發現了,JACK打破傳統非音樂專業程式不能「變造」系統麥克風來的聲音的限制,例如說在Windows 上,你想要讓自己在遠端會議蒙面可以,但是要變聲就有點困難了,不買外接硬體就辦不到,然而Linux+JACK下,我們可以輕易的「攔截」麥克風訊號,即時”hack”過,再繞接到一般通訊軟體把聲音送出去,就達成了。

發佈日期: 發佈留言

Musicha 電腦的JACK2—概論與設定初步

關於JACK音訊,它的精髓觀念來自真實硬體音訊串接,萬物皆為裝置

更新時間:4/29/2022 18:19

首先一般的Linux 電腦系統的架構是這個樣子:

其實這跟Windows 甚至 Mac 電腦的音訊機制架構沒有差很遠,因為都是「通用電腦」的設計。
各個應用軟體是各自跟Pulseaudio 連接——各軟體可以同時各自跟pulseaudio連接,pulseaudio會加以混音,然後藉由作業系統的核心Linux 的ALSA驅動,透過真實的硬體麥克風收音(record)以及透過喇叭播放(play)出聲音

但是我們的電腦算是「特種電腦」有特別的音效架構,是這個樣子:

先解說理由,因為音樂的各種製作(音樂領域,「作」音樂泛指從現場演奏到幕後混音等等)很多情境需要即時或者說低聲音延遲(從手指對演奏鍵盤觸鍵,到最終耳朵聽到播放出的樂音之反應時間)的反應回饋,以及傳統 DAW軟體內才有的音訊繞接(routing )等等諸多機能,Linux世界提出的方案,是透過JACK2 音訊系統搭配低延遲系的特製 Linux核心,變成特化的電腦作業系統。

這樣特化過的Linux 電腦,能作的事情從簡單的編曲混音到多演奏者LIVE 演奏+直播,到土砲自製錄音室,甚至一直到演唱會用的後台「即時處理機箱群」,都能辦到。可能是一台電腦,也可能是四五台電腦透過網路線,用net-jack機制結合成「一個系統」,退可守,進可攻,這是通用的電腦作業系統辦不到的。

進入正題,請看上圖,簡單說,不管哪個途徑的midi演奏訊號、audio(音訊)都被整合進JACK2。

這裡要特別要區分一下兩大類程式,如上圖一般的通用程式,是像我們常使用的mate桌面的事件通知音效(例如你按音量調整時聽到的叮鈴鈴聲音),透過瀏覽器看youtube 、 Netflix ,用mplayer、xine看DVD或藍光,或者用Steam玩電腦遊戲,使用OBS 直播等等,大部分的通用應用程式都是是使用pulseaudio 機制。

另一類則是「JACK 應用程式」,當然主要就是專業音樂程式,例如Ardour、 Zynaddsubfx、Qsynth、Helm、Hydrogen 等等。當然在Linux上,我們如果新發現一個專業音樂程式,我們一定很關心:它支援JACK嗎?

一開始的心理建設:
在JACK的接線盤世界裡,看到的每個軟、硬體,請把它們都當成是真實世界的
一個「裝置」來看待

在音訊方面:

  • 一般應用程式是接pulseaudio,程式之間的音訊不能互相連接,我們系統是透過pulseaudio 轉接器把一般音樂程式的聲音轉進 jack音訊系統。這樣平常使用很方便,不過在進行低延遲收音的時候,pulseaudio 有可能會對系統低延遲產生一點負面影響,在超低延遲收音時,視情況可以暫時關閉pulseaudio橋接器。(你也不希望收音到一半突然「叮咚」 XD )
  • 更舊時代(超過10年以上的設計)的程式是直接使用ALSA的,會造成搶音效硬體的獨占問題,為了保留相容性,我們電腦上的配置,這樣的程式會自動接到ALSA 音訊橋接器,然後轉接進入到JACK2
  • JACK應用程式的話當然就是出現在JACK「接線盤」裡面(以後我們會專篇介紹到)。主要都是專業音樂程式,不過也有少數多媒體程式也使用JACK。然後這些程式啟動時,有可能不會自動連接,也有可能自動連接到系統輸出入(System capture playback /System capture),而且不同的 JACK應用程式間的音訊可以彼此串連,可以是串接不同的獨立效果器,可以是從一個DAW軟體的某一音軌,透過JACK接到另一個DAW軟體的另外一軌,讓不同DAW之間截長補短等等,更進一步有些JACK 應用程式支援”JACK transport” (主要都是DAW 系軟體),這會讓不同的音樂軟體在播放/錄製聲音時同步,你可以想像類似Logic 、Reason、Pro Tools同步連動那樣(甚至是跨機兩台電腦上),有點像是那樣的感覺,而不需要在一個DAW內做完事情,匯出檔案,過帶到另外一個DAW繼續做事。

ps. 有的JACK應用程式雖然會自動連接到系統音訊的輸出入,雖然方便不過也不一定是好事,例如軟體電吉他綜合效果器—Rakarrack會自動接你的”system capture”,如果你沒有接外接音效界面時,這個”system capture”就是你筆電的收音麥克風了,如果你上次使用完沒有按其「Fx on」按鈕關閉Fx,這一次啟動,就會直接是” Fx on”的狀態,然後從你筆電的mic到喇叭間就會瞬間產生超巨大迴授嚇到一堆人 XD (緊急解法,趕快本能性把一個耳機插入耳機孔,或者記得趕快按那個按鈕)

另外在midi方面:

  • JACK midi:多半新一代的JACK應用軟體會走JACK midi,然後midi訊號也可以串連,例如可以一個實體MIDI鍵盤控制複數的軟體音源器+硬體音源器,當然,也可以是兩個MIDI鍵盤連接到同一個軟體音源器(例如說你要用兩個25鍵的小鍵盤,設在不同的八度,組合成一個 50鍵的MIDI鍵盤)
  • alsa midi:比較舊式的軟體會走alsa midi,然後音訊卻是走 JACK音訊。相容性的關係,我們一樣有alsa midi的橋接器轉接進JACK機制裡面。理論上JACK midi的延遲會比alsa midi低一些些,如果一個軟體可以設定走JACK midi或者alsa midi,建議是jack midi為佳

說到這裡,是不是開始感覺到JACK的神奇呢?以前在Windows、 Mac上,想要用理論上電腦可以辦到的該有機能,但是被既有套裝軟體限制住了,現在似乎可以自行達成? 😛

JACK管理前端

在我們Musicha電腦的預設MATE桌面上的右下角(圖中框起來的地方),我們把管理JACK 的幾個重要前端程式都整理在此。

這次我們要先講Cadence 。 Cadence跟Qjckctl 都可以設定、啟動、停止JACK2 音訊系統,不過我們Musicha電腦的規劃就只有使用Qjckctl 的「JACK接線盤」機制,就不特別講使用 Qjckctl 如何啟動/停止JACK2。

Cadence可以說是 KXStudio (整理各種音樂製作軟體與環境的大包裝之團隊)最重要的軟體。在System分頁,我們大致上可以分4個地方(圖上有標示的1 2 3 4 )來看

JACK伺服器的核心使用,就是SSP——
Stop、Start、PulseAudio橋接器重啟
三部曲

  1. JACK實體,其實叫做一個”server”(伺服器) ,這個伺服器啟動以後,就獨占了音效硬體。當我們在調整各種設定完以後,想要讓新設定生效,就會需要關閉(Stop)然後start(啟動),或者Force Restart(強制重啟動,但是建議平常不要直接用這個)。簡單說,初期你最常需要用到的就是Start Stop Configure這三個按鈕。這邊要特別注意,前面提到JACK 是走「類似實體硬體器材」的思維,所以要Stop或者Force Restart時,一定要先關閉所有的JACK應用程式,再關閉JACK這個「機器」,不然會造成你的音樂專案出現麻煩的問題,甚至有些JACK應用軟體如Ardour 發現JACK死掉了,就會自動接管ALSA而獨占之(然後你就無法重啟 JACK了),所以為了避免混亂,在你的工作流程的第一步,就要確定JACK的設定。
  2. 在操作JACK伺服器的啟動關閉或設定改來改去前
    • 要留意你開機的Linux Kernel是不是low latency(低延遲)、RT(realtime 即時),另外我們筆電比較新的機種都改配Liquorix 的特別調校低延遲核心,由於它的名稱內沒有”lowlatency”,Cadence會誤判,別擔心,Liquorix 可以正常使用JACK2。
    • 如果你開機的核心是generic(通用)或者(mx)等等,就是一般的核心,那就表示無法進行穩定的低延遲音訊作業,block latency在20ms以下是會破音的,建議調到 20ms以上。
    • CPU scaling governor(CPU頻率調整管理)雖然沒顯示,但是請在MATE桌面右下角有個CPU頻率跳動的那個小applet 按一下,那邊可以調整,作音樂時最好是用Performance 或者Ondemand 模式
  3. JACK伺服器重啟以後,系統預設不會自動帶起Pulseaudio 橋接器的(一般桌面系統音訊、一般程式都會變啞巴),所以記得去按Pulseaudio 分頁,重啟Pulseaudio 橋接器,一般的軟體與桌面音訊就會恢復。這個快速檢驗方法就是按Fn+F5/6 調整音量,聽提示音有沒有出現
  4. 這個區塊有JACK server當前的最新狀態:
    • Server status:現在JACK伺服器是啟動的嗎?
    • 有realtime嗎:其實realtime跟lowlatency幾乎同義,當然realtime是比lowlatency更「精實」一點
    • DSP Loading:數位音訊訊號處理的負載程度,如果是使用內建音效晶片的話,這個數值是綜合CPU、RAM存取速度、內建音效晶片的綜合運算覆載,當你跑越多的軟體音源或是越低延遲,負載就會越重
    • Xrun:來不及「算音」,發生破音的次數。這個數值如果是在啟動某軟體或者系統開機的過程中,增加幾個Xruns 算是正常的。但如果是在音樂軟體運作的過程中,Xrun快速累加(你應該也會聽到聲音怪怪的),這時要考慮降載,例如減少使用的軟體音源機、效果器,或者把當前專案進度儲存,關閉所有JACK應用軟體,然後停止JACK伺服器,把buffer 調大(latency也變大)再重啟JACK伺服器,繼續作業
    • Buffer size:這就是前述的buffer(音效運算的緩衝區),緩衝區越小,延遲越低,反之越大
    • Sampling rate:取樣頻率,一般來說普通的專案,例如以軟 /硬體midi音源為主的專案,48000hz算很夠用,如果需要處理高規格的真實收音,才需要到96000以及以上的取樣頻率
    • Block Latency:電腦系統內的粗估延遲(實際上會再多一點)’server synchronous’ mode

JACK伺服器的設定

我的音效界面是幾輸出幾輸入?

容許的最低延遲極限是多少?

buffer 越小,延遲越低,越是考驗硬體能耐

一開始我們已經題到了設定的大方向,就是音效界面/內建音效接面的輸出入有幾道(音訊硬體世界的觀念,一道或說一軌,就是一個mono 單音,立體聲 stereo= mono 1 、mono 2) 以及最低延遲極限。在Cadence的System分頁按下configure,會彈出一個對話窗,Engine分頁可暫時不管,只要記得裡面的Advanced – Server Synchronous Mode ,這個選項對於降低音訊latency 有相當幫助(但是某些狀況可能會讓使用舊式ALSA音訊的軟體發生崩潰),我們預設不開,留給大家自己測試看看。

接下來我們要提到在driver(驅動程式)分頁的設定關鍵四步驟(圖上有標示的1 2 3 4 ):

  1. Driver:沒有意外,就是用ALSA——使用本機或者接在本機的實體音效硬體,這個不用改,不過切記,如果你按了其他分頁但沒有真的要使用,在按右下角的OK按鈕離開前,記得按回ALSA,讓ALSA分頁顯示出來(不然會變成選擇其他驅動),再按”OK”完成設定。其他驅動也順便解說一下:
    • Dummy:空裝置,有時候你想要把你的電腦變成一個網路電台伺服機,例如用做youtube上的長時間音樂直播頻道(類似 Lofi Girl那樣)——喇叭不需要真的發出聲音,一切的聲音都是電腦內部的運算,那你就可以選擇這個模式
    • loopback:迴環,這個是謎樣的驅動….聲音送出去就自動回來的裝置??有空的時候你可以研究看看它能幹麻喔 😛
    • NET/NETONE:這就是跟netjack有關係,讓兩台以上的電腦透過網路(最好是在內網+用網路線連接),以netJACK就可以合成為「一體」,而且音訊一樣保持低延遲、可以 JACK transport 同步。軟體音源、效果系就可以分散在不同電腦上運算,由一台主控機調用。這個議題以後我們會另外專文講解。
  2. 你的硬體裝置要用哪一個?這邊…
    1. 我們預設是Duplex Mode(雙工模式),意思是你可以專用一個音效硬體只輸入(input device),而另一個音效硬體作為輸出裝置(output device)。比方說現在很流行 USB麥克風,其實就是一個沒有輸出孔但整合了麥克風的USB音效界面或者說是「USB音效卡」,它本體無法發出聲音,所以我們就可以把input device設成它,然後Output device設成筆電內建的音效晶片ALC293 Analog(類比輸出)
    2. 筆電內建晶片除了類比輸出外,還有HDMI 系列,那個要留意 HDMI 0 、1、 2 等等,是指你的HDMI埠、mini-DP埠、Thunderbolt3或4等(是的,實際處理上是變成HDMI訊號),這個我們筆電每一型的對應編號略有差異
    3. channels:這個「頻道」其實就是指你的音效硬體有幾軌輸入或者幾輸出(一軌是指一個mono 單音,想成電吉他導線就對啦),這就要留意看你的音效界面硬體的規格書,他有幾軌輸入、輸出呢?數字要正確喔。
  3. 這個區塊就是控制低延遲的程度buffer 越小,延遲越低,越是考驗硬體能耐(DSP loading)
    • Sample Rate:音訊的取樣頻率,基本上作音樂導向,會是特定倍數,也就是48000 96000 192000 ,選擇什麼,JACK伺服器啟動以後,所有的音樂軟體就會真的以這個為基礎進行「聲響運算」。選擇的方向跟你音樂產出(包含演奏出)的品質有關,如何決定呢? 取樣頻率需要高於一段樂音之最高頻率的兩倍時,才能把那個頻率還原出來人耳可以聽到的聲音頻率極限是20Khz也就是20000hz(其實這個頻段只有一些「空氣感」了),兩倍就是40000hz,也就是說48000hz的選擇可以完全收錄。不過為什麼會有96000以上的選擇?因為後來發現在真實世界的收音上,在20Khz以上的頻率,還有更多的…嗯「空氣感」或說「環境感」,有收到音的話會有更多的莫名的「感覺」。說回來,簡單說,這跟實體收音的專案比較有關係,如果你是純虛擬樂器的專案或者你沒有要錄什麼山谷的環境音、百人天籟大合唱、XX幾重奏之類的,是不太需要考慮96000以上
    • Buffer size、 Period/Buffers:這兩個參數與與取樣頻率會一起決定JACK的latency為多少
      • Buffer size:緩衝區大小,意思是1秒能處理幾「格」(buffer= frames/ period),特別要注意的,buffer size這個欄位其實可以自己輸入數字,不一定只能選固定的128 256那些喔
      • Period/Buffers:這是「一個緩衝區分配到多少處理時間」?
    • JACK 音訊的理論latency 公式跟 Engine分頁有無勾選Synchronous Mode而有不同
      • 有勾,也就是同步模式:Buffer size*Period/Buffers /取樣頻率(khz)=延遲幾ms(1000ms = 1秒)
      • 沒有勾,也就是非同步模式:Buffer size*(Period/Buffers +1 ) /取樣頻率(khz)=延遲幾ms (這是JACK2特有狀況,參考
    • dithering mode:高取樣頻率的數位音訊資料在降轉成低取樣頻率,例如96000hz轉換成48000時,直接轉換會在數位「邊緣」的地方發生「裁切」,造成不必要的失真不自然的情況,會需要在轉換完加入抖動( dithering),就是以某個演算法加入亂數的雜訊重塑數位「邊緣」,這樣經過數位-類比轉換時,我們-耳朵才能聽到自然的聲音。這裡可以選不同的模式,其中Triangular 是最安全沒問題的。
    • “Force 16bit”:這影響「取樣精度」,JACK預設使用32bit,你可以把他改為低一些的16bit 減輕在超低延遲運算時的負荷(LIVE演奏時有幫助)

關於latency, 要完好運作,如果是外接的USB音效界面,計算出來的JACK延遲最好是可以整除的,也就是1ms的倍數。簡單試算一些:

128*3/48=8ms

256 *3 / 48=16ms

192*3/96=6ms

以MZ-530的內建音效晶片Realtec ALC293為例,取樣頻率48000hz 時,JACK穩定低延遲最低可達 144*2/48=6ms (同步模式),如果設 取樣精度設16bit的話會更穩。這邊再提醒一下, Buffer size是可以自己輸入數字的喔

在Linux audio網站上可以找到這一張簡表 可以參考

那這次入門的設定就介紹到這邊囉,期待大家調出最棒的設定,完全發揮電腦的性能。 ^^

發佈日期: 發佈留言

實驗:netjack2實測(聲響艦隊運算)

加法 VS.取代

之前我們一直有提到一件Linux 做音樂的特別優點,就是可以分散運算,一台電腦撐不下的效果器、軟體音源,可以分散到內網的其他電腦去做,這個影片是我們實際測試的結果——成功地在左邊的MZ-530 (插midi鍵盤)上控制右邊的另一台電腦(代號sakurabomb)上的兩個軟體音源,然後發出的聲音是送回MZ-530。

在Mac世界是只有Logic 軟體舊的版本才可以這樣做(要每一台電腦都裝Logic才可以,然後新版的似乎被取消了); Soundgrid 也有類似機能,可以服務Mac與Windows電腦,但並非買Soundgrid 伺服器就好了,還得搭配其專屬介面卡,最便宜的方案也要1600美元,而且也只能用上面的效果器而已,沒有軟體音源可用。

Linux的JACK方案好處就在這裡,不需要特殊的硬體介面卡,甚至不用新電腦,把家裡的舊電腦(甚至是舊手機)改裝成特製化的Linux+jack 系統接上網路,就單單好好跑某一個軟體音源即可。這樣的電腦就當我們筆電的「運算力護衛艦」,我們的世界就不存在因為電腦CPU 不夠力,要換新電腦的事,「旗艦」用習慣可用常常久久。

一兩年買一次新電腦,舊電腦就丟掉多浪費啊,不斷以1換1,為什麼不1+1+1…..>1 呢?

嗯…組出越來越多的「護衛艦」結成「聲響艦隊」才是我們世界的玩法呢。

發佈日期: 發佈留言

如何讓jack2 可以正確透過hdmi輸出聲音呢?

0416/2022 更新

首先初步理解,在JACK2音訊系統角度來看,hdmi 也就像是一個裝置,你可以理解成也是一種「錄音界面」。

所以我們開啟cadence,從driver分頁的ALSA,輸出裝置(Output Device)要選擇我們要的HDMI裝置。

MZ-530筆電你會看到有 HDMI 0 、HDMI 1、HDMI 2…一直到HDMI 4,我們該選那一個呢?

我們要選的裝置是”HDMI 1″,然後到engine分頁重新啟動JACK2 聲響伺服器,就會改成用HDMI 1 做數位音訊輸出囉,如果是TB3或者TB4 (TB是 thunderbolt)孔或者mini-dp孔,那可能是 “HDMI 0” 、”HDMI 2″等

HDMI1 是對應到數位電視的聲音

不過重新啟動以後(pulseaudio等橋接器記得手動重啟喔),你可能發現還是沒有聲音,這樣的狀況是ALSA硬體層聲音被靜音(mute)了。怎麼辦呢?

請啟動終端機,打 ‘alsamixer’ ,就可以直控底層ALSA音訊硬體。

alsamixer的畫面

簡單介紹一下這個界面的操作。 鍵盤的左右鍵可以移動要挑整的項目,如圖中我們移動到S/PDIF 1(跟cadence 裡面稱呼略有不同,但其實就是HDMI 1),然後我們按下熱鍵 ‘m’ ,就可以切換它靜音或者有聲音的狀態,其他的選項也是一樣,這邊順帶一提,如果你覺得戴上耳機時音量超大聲,可以在這邊調整”headphone”輸出不要那麼大,用鍵盤上下鍵來調整其輸出音量(master 是音訊總輸出,但master個別輸出到耳機的,可以這樣再調節一下)。

這樣’unmute’ 以後,你的液晶電視就可以聽到聲音囉,調整完,我們就可以按’esc’鍵結束alsamixer程式,再打’exit’ 退出終端機囉。 ^^