2022년 4월 20일 수요일

[우분투의 사운드와 MIDI] JACK에서 두 개 혹은 그 이상의 사운드 카드 이용하기, 과연 그 결말은?

2년 전에 이미 이와 관련한 글을 블로그에 작성해 두었다가 음악 작업에서 거리가 멀어지면서 거의 잊고 있었다. 최근 들어서 다시 이 문제를 파고들다 보니 과거에 이해했던 것이 결코 완벽하지 않았다. 총정리를 하는 셈 치고 제대로 알아보고자 한다. 제목에서 말한 사운드 카드란 내장 사운드 카드, PCI(-E) 사운드 카드, USB 사운드 카드(혹은 오디오 인터페이스) 및 USB 마이크로폰 등 사운드 입출력을 담당하는 모든 주변기기를 뜻한다.

PulseAudio는 컴퓨터에 장착된 모든 사운드 관련 기기와 애플리케이션을 능수능란하게(프로페셔널한 녹음 작업은 제외) 제어한다. 반면 프로 오디오용 소프트웨어 개념의 JACK은 그렇지 않다. jackd 또는 jackdbus(qjackctl 또는 jack_control 사용)으로 JACK을 사용할 때에는 특정 사운드 카드 하나를 지정하게 된다. 만약 추가로 장착한 장비에서도 입출력이 이루어지게 만들려면 설정을 매만져야 한다.나의 경우는 별도로 꽂은 USB 장비에서 녹음 입력을 받고 싶었다.

오늘은 컴팩 CQ61 노트북 컴퓨터에서 연습을 해 보았다. Behringer UCA200 USB 오디오 인터페이스를 연결해 놓은 상태에서 각 사운드 카드에 어떤 식별자가 부여되었는지 알아보자.

$ cat /proc/asound/cards
 0 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0xd4500000 irq 27
 1 [CODEC          ]: USB-Audio - USB Audio CODEC
                      Burr-Brown from TI USB Audio CODEC at usb-0000:00:1a.7-4.4, full speed

내장 사운드 카드의 식별자는 Intel, UCA200은 CODEC이다. 아래 그림은 PulseAudio 볼륨 조절의 설정 탭을 보인 것이다. 위에 나타난 PCM2902가 바로 'CODEC'에 해당한다. UCA200으로는 입력을 받고 내장 오디오는 출력을 담당하게 만든 것이다.


이러한 나의 의도가 제대로 반영되었는지 다른 명령어(pactl)를 사용하여 default sink와 source를 확인해 보자.

$ pacmd list-sources | grep -e 'index:' -e device.string -e 'name:' 
  * index: 0
	name: <alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo>
		device.string = "front:1"
    index: 1
	name: <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor>
		device.string = "0"
$ pacmd list-sinks | grep -e 'index:' -e device.string -e 'name:' 
  * index: 0
	name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
		device.string = "front:0"

UCA200이 default sink이므로, arecord 명령을 실행하면서 특별히 디바이스를 지정하지 않으면 여기에 연결된 신호가 녹음된다. '-d 60'은 60초 동안 녹음하라는 뜻이다.

$ arecord -f cd -d 60 test_one_minute.wav

만약 유튜브 재생음을 녹음하고 싶다면 arecord를 실행한 상태에서 PulseAudio 볼륨 조절의 녹음 탭을 열고 다음과 같이 'Monitor of 내장 오디오 아날로그 스테레오'를 선택한다.

PulseAudio 볼륨 조절은 바로 이전 실행 상태를 기억한다. 이것이 편리할 때도 있고 그렇지 않을 때도 있다. 마이크로 녹음을 하는데 전혀 소리가 기록되지 않았다면, 혹시 PulseAuio 볼륨 조절의 녹음 탭에서 'Monitor of ABC'가 선택된 상태 그대로인지 확인해 보라. 아직도 흔히 겪는 실수이다. 'pacmd list-soruces' 명령에서 여전히 USB 오디오 인터페이스가 default로 표시된다 하여도 PulseAudio 볼륨 조절의 녹음 설정이 우선한다. 그런 면에서 source를 명령행에서 자유자재로 선택할 수 있는 parec 명령이 더욱 사용하기에 편리하다고 볼 수도 있다.

더 간단하게는 명령행에서 parec 명령어를 이용하여 내장 사운드 카드의 모니터 출력에 해당하는 디바이스를 직접 지정해 버리는 것이다. pulse-recorder.bash라는 스크립트를 이용하는 방법도 있다. 커널 모듈인 snd-aloop를 이용하는 기법도 있다고 하는데 너무 복잡해서 이해하기 어렵다. 여기까지는 일단 워밍업 단계라고 생각하자. 지금까지 내 블로그나 위치에서도 한 두 차례 다루었었다.

그러면 내장 사운드 카드(Intel)를 JACK으로 구동해 본다. 사용한 명령어는 jackd(내가 만든 audio.qsynth 스크립트 사용)이다. JACK이 PulseAudio의 모든 기능을 앗아갔기 때문에 일반 애플리케이션에서 소리가 전혀 나지 않는다. QjackCtl의 화면을 보자.

소리를 되찾고 싶다면 PulseAudio Jack Sink/Source 모듈을 로드하면 된다(링크).  jack_control을 이용할 경우 이 모듈을 자동으로 올리는 것 같다. 모듈이 적재된 상태는 다음과 같이 나타난다.

파이어폭스를 열고 유튜브를 접속해 보면 소리가 내장 사운드 카드를 통해 소리가 나기 시작한다. 파이어폭스라는 애플리케이션은 PulseAudio으로만 오디오 출력을 보낼 수 있고 JACK에 대해서는 전혀 알지 못하므로 JACK 서버가 기동한 뒤에는 전혀 소리를 내지 못한다. 물론 우분투 스튜디오는 다수의 JACK-aware application을 포함한다. 그러나 이 모듈을 실행하게 되면 파이어폭스가 오디오 출력을 보내는 기본 출구인 PulseAudio (JACK) Sink가 비로소 system으로 연결되므로 우리는 소리를 들을 수 있는 것이다. JACK이 소리에 관련한 모든 것을 시스템을 장악한 상태에서는 위 그림에서 보이는 system을 통해서만 녹음용 신호를 넣거나(capture) 혹은 출력(playback)을 할 수 있다.

QjackCtl의 Connections  화면을 보고 있노라면 그림(마이크와 스피커)과 단어 사이의 연결이 과연 맞는 것인가 하는 의문이 들 수도 있다. 너무 과도하게 의심을 품지 말라. 현 상태가 옳다. 중간에 나타난 선이 진짜 오디오 케이블이라 생각하면 쉽다.

PulseAudio JACK Sink/Source 모듈을 적재한 상태에서는 일반 오디오 애플리케이션의 경우 JACK 기동 전과 다를 바 없이 그대로 실행하면 된다. 그리고 연결 상태가 QjackCtl의 Connections  창에 나타나지도 않는다. 예를 들어 FluidSynth를 ALSA 드라이버로 구동하여 MIDI 파일을 재생해 보라. 

$ fluidsynth -a alsa ~/sf2/FluidR3_GM.sf2 passport.mid 

뒤에서 묵묵히 돌아가고 있는 JACK의 존재를 전혀 느끼지 못할 것이다. 그리고 FluidSynth의 재생음을 녹음하기 위해 arecord를 실행한 상태에서 PulseAudio 볼륨 조절의 녹음 탭을 열어 보자. JACK 실행 전에는 2개였던 선택 항목(Monitor of '출력용 기본 사운드 카드' 및 USB 장치의 입력)이 4개로 늘어났을 것이다. 새로 늘어난 것은 다음과 같이 JACK과 관련한 것 2개이다.

  1. Monitor of 내장 오디오 아날로그 스테레오
  2. PCM2902 Audio Codec 아날로그 스테레오
  3. Monitor of Jack sink (PulseAudio JACK Sink)
  4. Jack source (PulseAudio JACK Source)

FluidSynth의 출력을 녹음하려는 것이므로 1번을 선택해야 한다. 3번을 선택해도 될 것만 같은 생각이 들지만, 실제로 해 보면 녹음이 되지 않는다. 3번과 4번은 JACK-aware application을 위한 것이지, arecord가 감당할 수 있는 출입구가 아닌 것 같다.

이번에는 JACK을 오디오 드라이버로 이용하여 FluidSynth를 실행해 보았다. '-a jack' 옵션을 특별히 주지 않아도 된다.

$  fluidsynth -l ~/sf2/FluidR3_GM.sf2 passport.mid 

QjackCtl의 Connections 창에서는 왼쪽에 fluidsynth가 나타났다.


그러나 소리가 들리지 않는다. 왜 그럴까? JACK이 사운드 시스템을 제어하는 동안에는 오른쪽 system(playback)으로 무엇인가 입력이 되어야 소리가 나기 때문이다. 따라서 다음 그림과 같이 fluidsynth와 system(playback)을 이어 주여야 소리를 들을 수 있다.

사실 매번 이렇게 연결하기는 상당히 귀찮다. FluidSynth는 JACK-aware application이므로 명령행에서 '--connect-jack-outputs' 옵션을 주면 자동으로 system 출력에 연결된다.

$ fluidsynth --connect-jack-outputs ~/sf2/FluidR3_GM.sf2 passport.mid 

자, 그러면 오늘의 제목으로 돌아가 보자. 두 개 이상의 사운드 카드를 JACK 환경에서 이용하고자 한다. 컴퓨터 자체의 소리, 즉 application의 출력은 내장 사운드 카드가 담당하되(JACK 구동 시 지정) USB 기기를 통한 아날로그 입력(외부 장비 또는 마이크)을 활용하고 싶은 상황이다. PulseAudio와는 달리 JACK은 아직 다른 사운드 기기가 연결되었다는 것을 알지 못한다. USB 기기로 입력되는 소리를 아무 application을 구동하지 않고 직접 듣고 싶다면

이제 명령행에서 다음과 같이 alsa_in을 실행해 본다.

... 그런데 ...

여기까지 글을 작성하고 이제 모든 것을 완벽하게 다 이해했노라고 자부심을 갖고 있었는데...


포기! 더 이상은 못 해먹겠다!

내가 아는 것은 제대로 아는 것이 아니었다. 어제 알았던 것이 오늘 재현되지 않으면 무슨 소용이 있겠는가? 녹음이 되다 말다를 반복하고 재생음도 마찬가지이다. Audacity에서는 JACK이 인식되는 것 같더니 또 어떤 상황에서는 되질 않는다. 차라리 Windows 환경에서 기능이 풍부한 DAW 프로그램을 설치하여 빨리 익숙해지는 것이 나을 것 같았다. 음악 본연의 작업을 하지 못하고 설정 작업에 이렇게 많은 시간을 들이다니 이만저만한 시간 낭비가 아니다.

그래서 선택한 소프트웨어는 tracktion의 WAVEFORM FREE였다. Cakewalk by BandLab은 아주 예전에 Cakewalk을 썼던 경험 때문에 비교적 익숙하게 시작할 수 있겠지만, 근무지에서는 인증서 문제로 설치가 완결되지 않았다.

그래서 오늘부터 시작한다! 



댓글 없음: