User Tools

Site Tools


Sidebar


정해영의 새 블로그, GenoGlobe.kr에 오신 것을 환영합니다!


본 사이트에서 표시되는 시각은 그리니치 평균시(GMT)입니다.


audio

우분투(스튜디오) 16.04에서 음악과 MIDI 작업을 위한 설정

이 문서는 계속 업데이트 중이며 아직 완벽한 상태가 아닙니다.Haeyoung Jeong 2020/08/17 07:10

Ubuntu 18.04.5 LTS로 업그레이드하였습니다. — Haeyoung Jeong 2020/10/18 10:27

컴퓨터 환경은 우분투 스튜디오 16.04를 설치한 컴팩 프리자리오 CQ61-304TU 노트북 컴퓨터이다. 이 글을 작성하면서 기본 개념을 잡기 위하여 다음 사이트를 주로 참고하였다. 개별적인 팁은 이 문서의 마지막 단원을 참조하라.

다음의 영문은 Audacity Tutorial - Recording Computer Playback on Linux 웹문서의 시작 부분에서 발췌한 것이다.

On Linux there are in general two different sound systems that provide drivers to your sound device, OSS and the more recent ALSA. Additionally, advanced sound servers such as PulseAudio and JACK can use ALSA to provide professional audio features such as routing of inputs and outputs, high quality mixing and resampling, aggregation of audio interfaces and (in the case of JACK) very low latencies.

Ted의 가이드에서는 JACK의 작동에 종종 방해가 되므로 PulseAudio를 아예 쓰지 말라고 하지만 그건 바람직하지 않은 것 같다. 왜냐하면 PulseAudio는 알게 모르게 오디오의 재생과 녹음 작업에 깊숙하게 관여하고 있기 때문이다. PulseAudio는 ALSA보다는 좀 더 사용자에 가까운 레벨에서 조절을 담당하므로 좀 더 이해하기 쉽다. ALSA, JACK, 그리고 PulseAudio를 완벽히 이해할 날이 언젠가는 올 것이라 믿는다. 상당히 까다로운 jackdbus(jack_control 명령으로 기동)를 속 시원하게 설명하는 웹문서를 찾기가 의외로 어렵다는 것이 나의 불만이다. 어쩌면 '잘 몰라서 눈에 뜨이지 않는' 것인지도 모른다.

나의 최종 목표는 Rosegarden에서 미디 및 오디오 녹음 작업을 하는 것이다. Rosegarden은 우분투 스튜디오에 기본으로 포함되어 있지도 않고, ARDOUR가 DAW tool로는 더 나은 것 같다. 그러나 Rosegarden은 인터페이스가 간단하며 사용이 매우 편리하고 미디 작업에는 더욱 적합하다. Seq24는 그야말로 최소 수준의 미디 시퀀서일 뿐 DAW를 겸하고 있지 않으므로 오디오 녹음은 하지 못한다.

Rosegarden vs. Ardour

이 글에서 설명한 사항은 우분투 18.04LTS로 자동 업데이트를 한 뒤에도 동일하다. 단, PulseAudio에 대한 의존도가 더 커진 것으로 여겨진다.

2020년 8월 15일 다시 우분투 스튜디오 16.04로 되돌아갔다. 설치된 후에는 자동적으로 PulseAudio가 작동한다. JACK과의 연동을 위하여 PulseAudioJackSink를 사용하는 꽤 복잡한 설정을 쓰기로 최종 결정하였다. 아니, 설정 방법 자체는 전혀 복잡하지 않다. 다만 이것이 뭘 하는 것인지 이해하는 것이 어려울 뿐이다.

설치된 사운드 카드 파악하기

Behringer U-Control UCA200와 Roland Sound Canvas SC-D70을 USB 단자에 꽂은 상태에서 다음의 명령어를 실행한 결과를 살펴보자. aplay와 arecord는 alsa-utils 패키지에 포함된 유틸리티이다. /proc/asound/cards 파일에서 나타나는 번호는 ALSA device name의 일부이다. 실제 ALSA device name은 hw:0과 같은 형태로 쓰인다. 아래의 사례에서는 SCD70이 hw:2로 나타났지만, USB conncect를 뺐다가 다시 꽂거나, 혹은 재부팅을 하면 번호가 바뀔 수 있다. ALSA가 사운드 카드를 가리키는 숫자 및 영문 이름(Intel, CODEC, SCD70…)에 익숙해지도록 하자.

$ 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:1d.0-1, full speed
 2 [SCD70          ]: USB-Audio - SC-D70
                    Roland SC-D70 at usb-0000:00:1a.7-4.4, full speed
$ aplay -l # 각 카드가 갖는 (복수의) 디바이스 정보를 보임 
  **** PLAYBACK 하드웨어 장치 목록 ****
0 카드: Intel [HDA Intel], 0 장치: 92HD75B2X5 Analog [92HD75B2X5 Analog]
  하위장치: 1/1
  하위장치 #0: subdevice #0
0 카드: Intel [HDA Intel], 3 장치: HDMI 0 [HDMI 0]
  하위장치: 1/1
  하위장치 #0: subdevice #0
1 카드: CODEC [USB Audio CODEC], 0 장치: USB Audio [USB Audio]
  하위장치: 1/1
  하위장치 #0: subdevice #0
2 카드: SCD70 [SC-D70], 0 장치: USB Audio [USB Audio]
  하위장치: 1/1
  하위장치 #0: subdevice #0
$ aplay -L # 훨씬 긴 목록이 나온다.

aplay -l은 'list all soundcards and digital audio devices'를, aplay -L은 'list all PCMs defined'를 의미한다.

기본 사운드 카드를 설정하기

cat /proc/asound/cards 명령어를 실행하여 기본으로 사용하고 싶은 사운드 카드의 번호를 알아낸 다음, 이를 /etc/asound.conf 파일에 기록한다. 예를 들어 1번 카드를 쓰고 싶다면 다음과 같이 기록한다.

defaults.pcm.card 1
defaults.ctl.card 1

GUI 프로그램인 PulseAudio Volume Control(명령어: pavucontrol)을 실행하면 Contiguration 탭에서 설치된 사운드 카드를 확인할 수 있다. pavucontrol을 실행할 때 ' (pavucontrol:2771): WARNING : Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-rNO2Mq89xl: 연결이 거부됨'이라는 에러가 나온다면, 명령행에서 export NO_AT_BRIDGE=1라고 실행한 뒤 다시 pavucontrol을 실행한다. 에러 메시지는 pavucontrol의 작동과는 별 상관이 없다. 아래 스크린샷에서 두 번째 나오는 PCM2902 Audio Codec이 바로 Behringer USB 오디오 인터페이스이다. USB 사운드 카드를 꽂았지만 여전히 내장 스피커에서 소리가 나는가? pavucontrol의 Playback 탭에서 현재 소리가 나는 application 바로 위의 상자를 클릭한 뒤 나오는 디바이스 목록 중에서 USB 사운드 카드를 선택하라. 아래 스크린샷에서 'PCM2902 Audio Codec 아날로그 스테레오'이 바로 그것이다. PulseAudio JACK Sink를 사용하게 되면 표시되는 것이 약간 달라진다(단, JACK 서버를 실행시켰을 때에 한함). PulseAudio의 설정이 꼬여서 작동 상태가 이상하다면 ~/.config/pulse 디렉토리를 지운 뒤 재부팅하면 default configuation으로 되돌아간다. 시스템 전체에 적용되는 PulseAudio의 설정은 /etc/pulse/default.pa 파일에 있다. 이 파일은 함부로 편집하지 않는 것이 좋다. Default 사운드 카드를 설정하는 다양한 방법에 대해서는 How do you set a default audio output device in Ubuntu 18.04?를 참조하라.

Default 사운드 카드를 설정하는 문제에 지나치게 집착할 필요는 없다고 생각한다. USB 사운드 카드를 기본으로 지정해 놓았지만 연결을 하지 않은 상황이라면 소리가 당연히 나지 않기 때문이다. USB 사운드 카드를 기본으로 하되 꽂혀 있지 않으면 내장 사운드 카드를 구동하게 만드는 설정 방법이 없는 것은 아니다(How to make Alsa pick a preferred sound device automatically?). 그러나 여기에 지나치게 몰두할 필요는 없다. 애플리케이션을 작동시켰는데 원하는 사운드 카드에서 소리가 나지 않는다면 pavucontrol을 실행해서 확인을 해 보면 그만이다. 혹시 JACK이 작동 중인지도 알아보면 더욱 좋다.

간단한 명령어를 써서 오디오 파일을 재생할 수 있다

여기에서는 혼동을 피하기 위해 JACK을 일절 쓰지 않는 방법 위주로 설명하고자 한다. 다음과 같이 명령행에서 입력하는 간단한 유틸리티를 써서 소리 파일을 재생할 수 있다. sox/play/rec은 SoX(Sound eXchange) 패키지를 구성하는 유틸리티이다.

$ sudo apt install sox
$ sox -b 16 -n test.wav rate 44100 channels 2 synth 1 sine 440 gain -1
$ aplay -D hw:0 test.wav
$ play test.wav # 기본 장치를 통한 재생

그러나 PulseAudio 사운드 서버가 이 과정에도 개입한다. 그건 몰랐지? aplay -D hw:#에 디바이스 번호를 넣었더니 '오디오 열기 오류가 발생했습니다: 장치나 자원이 동작 중' 에러가 나온다면 PulseAudio가 개입하고 있다는 뜻이다. 이럴 때에는 “aplay -D pulse test.wav” 명령을 내리면 된다. '-D default'를 공급해도 된다.

# play 실행을 하는 중에 다른 터미널 창에서 다음의 명령을 실행해 보라.
$ pulseaudio --kill # play 명령어가 끝나버린다. pulseaudio --start를 실행한 뒤 다시 play를 해야 한다. 
$ pacmd suspend true # play 명령이 잠시 멈춘다. 되살리려면 pacmd suspend false를 입력한다.

play 명령으로 mp3 파일을 재생하려면 추가 패키지(libsox-fmt-mp3)를 설치해야 한다.

$ sudo apt install libsox-fmt-mp3
$ play music.mp3 # aplay로는 mp3 파일을 재생할 수 없다

명령행에서 음량을 제어하려면 alsamixer를 사용한다.

$ alsamixer

MIDI 파일 재생하기: 외장 모듈 이용

$ aplaymidi -l # or --l (list all possible output ports)
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 20:0    SC-D70                           SC-D70 Part A
 20:1    SC-D70                           SC-D70 Part B
 20:2    SC-D70                           SC-D70 MIDI
$ aplaymidi -p 20:2 cakewalk.mid # 또는 --port 20:2

MIDI 파일 재생하기: 사운드 폰트 이용

FluidSynth가 설치된 상태라면 사운드 폰트를 이용하여 MIDI 파일을 직접 재생할 수 있다. FluidR3_GM.sf2는 용량이 142MB나 되는 매우 양질의 GM 사운드 폰트이다. 마스터 키보드를 연결해서 직접 실시간 연주를 할 수 있음은 물론이다. Standalone mode로 FluidSynth를 실행해 보자. -a alsa[–audio-driver=alsa] 옵션을 지정하지 않으면 JACK이 기동한다.

$ fluidsynth --audio-driver=alsa /usr/share/sounds/sf2/FluidR3_GM.sf2 flourish.mid
> ...음악 재생...
> quit
cheers!
$
# 다른 스타일로 실행해 보자. -m alsa_seq[--midi-driver=alsa_seq]은 지정하지 않아도 된다.
$ fluidsynth -a alsa -m alsa_seq -l -i /usr/share/sounds/sf2/FluidR3_GM.sf2 passport.mid

-i(--no-shell) 옵션을 주지 않으면 fluidsynth prompt에서 명령을 입력할 수 있고, 재생 후에도 prompt 상태가 된다. FluidSynth를 서버로 작동시키면 다른 응용프로그램으로 하여금 MIDI 데이터를 FluidServer로 전송하게 만들 수 있다.

$ fluidsynth --server --audio-driver=alsa /usr/share/sounds/sf2/FluidR3_GM.sf2
$ aplaymidi -l
  Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 24:0    iCON iKeyboard 5 Nano V1.06      iCON iKeyboard 5 Nano V1.06 MID
128:0    FLUID Synth (5439)               Synth input port (5439:0)
$ aplaymidi -p 128:0 flourish.mid

언제부터인가 -o audio.alsa.device=hw:0 옵션을 추가하면 소리가 나지 않는다. 왜 그런지 잘 모르겠다. FluidSynth를 서버 모드로 작동시켰으니 키보드와 FluidSynth를 연결하여 직접 연주를 해 보자.

$ aconnect -i
client 0: 'System' [type=커널]
    0 'Timer           '
    1 'Announce        '
client 14: 'Midi Through' [type=커널]
    0 'Midi Through Port-0'
client 24: 'iCON iKeyboard 5 Nano V1.06' [type=커널,card=2]
    0 'iCON iKeyboard 5 Nano V1.06 MID'
    $ aconnect -o
client 14: 'Midi Through' [type=커널]
    0 'Midi Through Port-0'
client 24: 'iCON iKeyboard 5 Nano V1.06' [type=커널,card=2]
    0 'iCON iKeyboard 5 Nano V1.06 MID'
client 128: 'FLUID Synth (5439)' [type=사용자,pid=5439]
    0 'Synth input port (5439:0)'
$ aconnect 24:0 128:0  # 각 포트에 속한 디바이스가 하나뿐이므로 ':0'는 없어도 된다.

FluidSynth prompt에서 사운드폰트를 추가적으로 로드하는 것은 가능하다. 각 채널에 할당된 프로그램을 확인하고 이를 바꾸어서 연주해 보자.

> fonts
ID  Name
 1  /usr/share/sounds/sf2/FluidR3_GM.sf2
> inst 1 # font ID를 입력한다. 프로그램 전체 목록을 보여준다(번호는 0부터 시작).
000-000 Yamaha Grand Piano
000-001 Bright Yamaha Grand
...
008-004 Detuned EP 1
008-005 Detuned EP 2
...
128-048 Orchestra Kit
> channels # 각 채널에 할당된 프로그램을 보여준다. 채널 번호는 01부터 시작한다.
chan 0, Yamaha Grand Piano
chan 1, Yamaha Grand Piano
...
chan 15, Yamaha Grand Piano
> prog 0 3 # 0번 채널의 프로그램을 3번('Honky Tonk')으로 바꾼다.
> channels
chan 0, Honky Tonk
...
> select 0 1 8 4 # 다른 뱅크에 속하는 프로그램으로 바꾼다(chan sfont bank prog)
> channels
chan 0, Detuned EP 1
...
chan 15, Yamaha Grand Piano

FluidSynth prompt에서 입력 가능한 명령어를 알고 싶다면 'help'를 입력하라.

SC-D70으로 녹음을 하려면(audacity 이용)

뒤에서 설명할 JACK을 쓰지 않는 조건이라면 녹음은 비교적 쉬운 편이다. SC-D70가 수용하는 입력이 여러 가지이므로 REC SOURCE 버튼을 반복해 눌러서 원하는 입력을 택해야 한다. 컴퓨터에서 발생하는 소리(USB 케이블로 전달)는 항상 모니터링이 되지만 들린다고 해서 곧 녹음이 되는 것은 아니다. 다음 그림을 정확히 이해하도록 한다. SC-D70의 내부 믹서 구조 Adacity에서는 인터페이스 호스트를 ALSA, 녹음 디바이스를 SC-D70: USB Audio (hwL1,0)으로 선택하고 기본 샘플 주파수를 48 kHz로 한다.

Software synth를 키보드로 직접 연주해 보자

FluidSynth를 써도 안될 것은 없지만, 이번에는 좀 더 간편한 콘트롤을 하기 위해 명령행에서 Qsynth(A fluidsynth Qt GUI Interface)를 실행한다. 직전의 Qsynth 실행에서 변경한 설정 사항은 ~/.config/rncbc.org/Qsynth.conf에 기록되며, 명령행 옵션으로 지정되지 않은 것은 설정 파일의 것을 불러온다.

$ grep Driver ~/.config/rncbc.org/Qsynth.conf
AudioDriver=jack
MidiDriver=alsa_seq

만약 설정 파일에 AudioDriver=jack라 기록되어 있고 명령행에서 -a jack(또는 --audio-driver=jack)를 지정하지 않았다면 Qsynth 실행 시 자동으로 jack 데몬이 실행되고 종료와 더불어 끝난다. 이때에는 ~/.jackdrc 파일의 설정 파일을 참조하게 된다. 뒤어서 설명할 QjackCtl에서 .jackdrc 파일을 자꾸 고쳐쓰는 것이 성가실 때도 있을 것이다. 이 섹션에서는 아직 JACK 서버에 대한 본격적인 설명을 하지 않았으므로, alsa를 audio driver로 쓰는 방법만을 예로 들고자 한다.

$ qsynth -m alsa_seq -a alsa
# 사운드폰트를 로드했는지 확인한다.
$ aplaymidi -p 128:0 song.mid

물론 aplaymidi를 쓰지 않고 Qsynth의 인수로 MIDI 파일을 직접 제공하여 재생하는 것도 가능하다.

$ qsynth -m alsa_seq flourish.mid

가상 키보드인 vmpk를 실행하고 Edit→Connection→Output MIDI Connection을 FLUID Synth로 설정하고 키보드를 클릭하여 소리를 들어 본다. vmpk는 명령행에서 실행하거나 또는 패널의 프로그램→Audio Production→MIDI Utilities에서 선택해도 된다.

$ vmpk

이번에는 Yamaha DX7 modeling software synthesizer인 Hexter를 실행해 본다. 이것은 Qsynth처럼 명령행에서 실행할 수 있는 것이 아니며, 패널의 프로그램→Audio Production→Instruments에서 선택하여 실행해야 한다. Hexter는 JACK을 통하여 구동된다. Hexter를 실행했다 하여도 VMPK에서 연결가능한 MIDI 출력쪽에 보이지 않을 것이다. 이제 명령행에서 aconnect(ALSA sequencer connection manager)를 사용하여 키보드와 악기를 원하는대로 연결할 수 있다.

$ aconnect -x # 기존의 연결을 끊는다.
$ aconnect -i
client 0: 'System' [type=커널]
    0 'Timer           '
    1 'Announce        '
client 14: 'Midi Through' [type=커널]
    0 'Midi Through Port-0'
client 129: 'VMPK Output' [type=사용자,pid=2789]
    0 'VMPK Output     '
$ aconnect -o
client 14: 'Midi Through' [type=커널]
    0 'Midi Through Port-0'(
client 130: 'VMPK Input' [type=사용자,pid=2789]
    0 'VMPK Input      '
client 131: 'FLUID Synth (2554)' [type=사용자,pid=2554]
    0 'Synth input port (2554:0)'
client 132: 'hexter DX7 emulation (v1.0.2)' [type=사용자,pid=2607]
    0 'hexter DX7 emulation (v1.0.2)'
$ aconnect 129:0 132:0 #원하는 MIDI sender(키보드)와 receiver(악기)를 연결한다.

만약 컴퓨터에 하드웨어 키보드를 연결하였다면 aconnect -i 명령을 실행했을 때 나타날 것이다. 그러면 aconnect 명령으로 원하는 악기와 연결하여 연주하면 된다. 만약 이 과정이 번거롭게 느껴진다면, 그것은 JACK을 사용할 때가 되었다는 것이다.

설치된 모든 software synthesizer가 Hexter처럼 단독 실행이 가능한 것은 아니다. JACK이 없으면 안되는 것도 있다.

사운드 카드 선택, 음량 제어 등 기본적 제어는 PulseAudio 사운드 서버에서 하는 것이 편리하다

웹브라우저에서 유튜브를 접속하여 동영상을 재생해 보라. 내장된 스피커에서 소리가 흘러나올 것이다. 별도로 연결한 USB 오디오 인터페이스로 소리가 나오게 하거나 음량을 바꾸고 싶다면 GUI 도구인 PulseAudio Volume Control을 이용한다. alsamixer와는 다른 수준의 조절이 가능하다.

$ pavucontrol

PulseAudio 사운드 서버를 제어하는 명령행 프로그램인 pactl를 사용하여 음량을 조절할 수도 있다.

$ pactl -- set-sink-volume 0 +10%
$ pactl -- set-sink-volume 0 80%

음악을 재생하고 있는데 원하는 디바이스에서 소리가 나오지 않는다면, PulseAudio Volume Control의 Playback 탭 → ALSA plugpin [application name]에서 원하는 것으로 선택한다. 나의 경우에는 '내장 아날로그 스테레오'와 'PCM2902 Audio Codec 아날로그 스테레오'의 두 가지가 있다. PulseAudio JACK Sink를 사용하게 되면 표시되는 것이 약간 달라진다.

JACK, a low-latency audio server

여러 개의 소스를 이용하여 녹음 및 미디 작업과 같은 보다 전문적인 업무를 하려면 JACK(jackd or jackd2)을 사용해야 한다. 우분투 16.04에 설치된 jackd(2)의 버전은 1.9.11이다. 버전 번호가 1 미만인 것이 JACK1, 2 미만인 것이 JACK2이다. period는 128 프레임이 적당하다. 기본 수치인 1028로 설정하면 딜레이를 확연하게 느낄 수 있다(46.4 milliseconds with 2 buffers)

$ jackd --version
jackdmp 1.9.11
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2014 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
no message buffer overruns
no message buffer overruns
no message buffer overruns
jackdmp version 1.9.11 tmpdir /dev/shm protocol 8

다음은 아주 간단한 명령행 사례이다. JACK_PLAY_CONNECT_TO 환경변수는 jack-play 명령을 쓸 때 이외에는 필요한 것 같지 않다. JACK 서버를 이런 방식으로 쓸 일은 사실 거의 없을 것이다.

$ jackd -d alsa --device hw:0 --rate 44100 --period 128
$ export JACK_PLAY_CONNECT_TO=system:playback_%d
$ jack-play test.wav

JACK을 오디오 드라이버로 하여 FluidSynth를 구동하려면 다음의 명령을 입력한다.

$ fluidsynth --server --audio-driver=jack --connect-jack-outputs /usr/share/sounds/sf2/FluidR3_GM.sf2

그러고 나서 aplaymidi -p <port>를 이용하여 MIDI 파일을 재생할 수 있다. 포트 번호는 aplaymidi -l 명령으로 확인한다.

audio script

Ted의 가이드에서는 JACK 서버를 구동하고 사운드폰트 신시사이저인 FluidSynth를 로드하는 스크립트인 audio를 소개하였다. 시작하려면 audio start, 종료하려면 audio stop을 실행한다. 나는 이것을 살짝 변형한 스크립트를 만들었다. FluidSynth만으로는 악기 변경이 어려우니(불가능하지는 않음; FluidSynth shell에서 하면 된다) Qt GUI 인터페이스를 갖춘 Qsynth를 로드하게 하였다.

#!/bin/bash

# Script to launch audio servers for music-making.
# from Ted's Linux MIDI Guide (http://tedfelix.com/linux/linux-midi.html)
# modified by Haeyoung Jeong

DEVICE=CODEC
case $1 in

  start )
    echo Starting JACK using ${DEVICE}...

    # Start JACK
    # As of Ubuntu 12.10, a period of 128 is needed for good fluidsynth
    # timing.  (jackd 1.9.9, fluidsynth 1.1.5)
    # If you aren't running pulseaudio, you can remove the pasuspender line.
    pasuspender -- \
        jackd -d alsa --device hw:${DEVICE} --rate 44100 --period 128 \
            &>/tmp/jackd.out &

    sleep .5

    echo Starting Qsynth...

    # Start Qsynth
    qsynth -m alsa_seq -a jack \
        --connect-jack-outputs --reverb=0 --chorus=0 --gain=0.8 \
        /usr/share/sounds/sf2/FluidR3_GM.sf2 \
        &>/tmp/qsynth.out &

    sleep 1

    if pgrep -l jackd && pgrep -l qsynth
    then
      echo Audio servers running.
    else
      echo There was a problem starting the audio servers.
    fi


    echo You may start qjackctl.
    echo Please run 'a2jmidid -e' if you have hardware MIDI devices connected.

    ;;

  stop )
    killall qsynth
    killall jackd
    echo Audio servers stopped.
    ;;

  * )
    echo Please specify start or stop...
    ;;
esac

이를 이용하여 기본적인 개념과 작동 원리를 이해했다면 실제 작업에서는 GUI 도구인 QjackCtl과 Qsynth를 쓰는 것이 더욱 편리할 것이다. 사실 QjackCtl을 통한 JACK 설정을 완벽히 이해하려면 그렇게 만만한 일이 아니다. 그리고 모든 오디오 애플리케이션이 JACK을 필요로 하는 것도 아니다. 그러나 진지한(?) 작업을 하려면 JACK은 필수라 해도 과언이 아니다.

다음을 실행하는 스크립트(post_jack)를 JACK Setup → Options → Scripting에서 Execute script on Shutdown에 지정하여 JACK 서버에 이어서 실행되게 만든다. 그러면 PulseAudio의 출력이 JACK으로 들어가게 된다. 이것이 바로 PulseAudioJackSink이다. 이를 가능하게 하려면 pulseaudio-module-jack가 설치되어 있어야 한다.

pactl load-module module-jack-sink channels=2
pactl load-module module-jack-source channels=2
pacmd set-default-sink jack_out

그런데 최근 아주 놀라운 정보를 알아내었다. /etc/pulse/default.pa에 다음 사항이 선언되어 있으면 별도의 후처리 스크립트조차 필요가 없다!링크

### Automatically connect sink and source if JACK server is present
.ifexists module-ackdbus-detect.so
.nofail
load-module module-jackdbus-detect channels=2
.fail
.endif

JACK basic setting 이해하기

Buffer size(frames/period라고도 부름)

작은 값일수록 monitoring latency가 줄어든다. 그러나 낮게 잡으면 CPU를 많이 쓰게 된다. 보통 64-256 사이의 값을 쓰게 될 것이다ㅑ.

Sample rate

높을수록 좋다. 44.1kHz는 CD 수준의 음질이다. 48kHz를 쓰려면 오디오 장비가 이를 지원하는지 확인해 보라. 지나치게 높으면 CPU 사용량이 높아지고, xrun(pops and clicks)을 초래할 것이다.

Periods/buffer

USB 장비는 3으로 하면 더욱 안정적인 low latency를 얻을 것이다. 그 밖의 장비는 2를 써라.

a2jmidid는 필요한가? 그렇다!

ARDOUR의 매뉴얼의 JACK MIDI Configuration 문서에 의하면, JACK은 기본적으로 MIDI 포트를 검출하지 못하므로 native MIDI frameworks와 (e.g. CoreMIDI or ALSA) and JACK MIDI를 연결할 방편을 마련해야 한다고 한다. 그 방법은 현재 사용하는 JACK의 버전에 따라 달라진다고 하는데 아직 완벽하게 이해하지 못했다. Arch Linux의 JACK Audio Connection Kit - MIDI 항목(대단히 중요한 설명이 많으니 잘 읽어보기 바람)에 의하면 jack2의 경우 a2jmidid를 쓰는게 필수적이나, jack(1)에서는 그럴 필요가 없는 것 같다. a2jmidid(JACK MIDI daemon for ALSA MIDI)는 ALSA sequencer port에 대하여 JACK MIDI port를 하나씩 자동으로 연결하는 데몬이다. 시스템에 JACK1이 설치된 상태라면 QjackCtl의 Setup에서는 다음과 같이 설정한다. 그런데 근본적으로 JACK2가 쓰이고 있기 때문에 이 설명은 별로 의미가 없다.

  • Setting→Parameters→MIDI Driver: seq (Connect→MIDI tab에 MIDI device가 보이게 된다)
    • Settings→Advanced에서 Server Prefix: /usr/bin/jackd에 -X alsa_midi를 덧붙이는 것이 바로 위에서 설정한 것과 같은 효과를 갖는가? 잘 모르겠다.
  • Misc→ Enable ALSA Sequencer support에 체크 (Connect→ALSA tab에 MIDI device가 보이게 된다)

만약 a2jmidid를 쓰려면, 바로 위에서 소개한 두 가지의 설정을 반대로 한다. 즉, MIDI Driver는 none으로 하고, Enable ALSA Sequencer support의 체크는 해제한다. 이는 JACK 내부에서 ALSA sequence support를 못하게 만드는 것이다. 그 다음에 명령행에서 다음을 입력한다. 그런데 실제로 테스트를 해 보면 설정 자체는 건드리지 않고 단지 a2jmidid 명령을 내리는 것만으로 다 되는 것 같다.

$ a2jmidid -e # 'a2midid --export-hw' 명령과 같다.

또는 JACK Setup→Options→Scripting→Execute script after Startup에 이 명령어를 넣어도 된다. JACK2에서는 반드시 a2jmidid를 써야 하지만, JACK1에서는 선택의 폭이 오히려 넓은 것 같다. 어찌보면 JACK1에서는 기본 기능으로 되던 연결이 JACK2에서는 지원되지 않아서 a2jmidid를 써여 하는 것처럼 보인다. 왜 그런 것일까? 'legacy' ALSA MIDI 만을 이용하는 application에 대한 지원을 더 이상 하지 않는 것으로 이해하면 좋을 것이다.

QjackCtl의 문제점 해결

부팅 후 메뉴에서 QjackCtl을 첫 실행하면 화면이 나타나지만 잠시 뒤 멈추어 버린다. 강제 종료를 하고 다시 QjackCtl을 실행하면 잘 된다. 종료 후 다시 실행을 하면 또 안되고, 그 다음에 다시 실행하면 되는 기현상이 발생하였다(참고-우분투 스튜디오 16.04를 재설치한 뒤에는 괜찮으므로 나중에 이 부분은 편집 요망). QjackCtl의 메시지에 의하면 JACk dbus server의 어떤 문제 같았다. Arch Linux의 JACK configuration 설명 문서에서 다음과 같은 스크립트를 만들어서 로그인 시에 실행하는 방법이 가장 무난함을 알게 되었다. 이 스크립트는 start_jack이라고 부르자. QjackCtl의 Setup→Misc에서는 Stop JACK audio server on application exit의 체크 상태를 해제하여 Connect와 상태 확인용으로만 쓰는 것이 안전하다.

#!/bin/bash

jack_control start
jack_control ds alsa
jack_control dps device hw:CODEC
jack_control dps rate 48000
jack_control dps nperiods 2
jack_control dps period 128
sleep 10
a2jmidid -e &
sleep 10
qjackctl &

start_jack은 PulseAudio가 제어하는 사운드 카드와는 따로 노는 것 같다.

그 외에도 꽤 복잡한 이론이 숨어있다. JACK2를 쓰는 경우 실제로 서버를 실행하는 명령은 jackd가 아니고 jack_control이라는 것이다. jackd 명령은 단지 하위 호환성을 위한 것이며, ~/.jackdrc 파일은 쓰기만 될 뿐 이것을 QjackCtl이 다시 읽어서 설정을 되살리는 그런 용도는 절대로 아니라는 등 한번에 감당하기 많은 정보를 알게 되어서 머릿속이 너무나 복잡하다. 이 스크립트를 실행해 놓은 다음 키보드를 연결하여 Qsynth를 연주하려면 어떻게 하는 것이 가장 좋은가? 연습문제로 남긴다. 참고로 JACK이 실행되지 않은 상태에서 Qsynth를 실행하면 JACK이 이 파일에 기록된 설정을 읽어서 실행된다고 한다.

D-Bus 없이 JACK을 쓰려면 JACK can live without D-BUS를 참조하라.

Difference between jackd and jackdbus 문서도 상당히 유용하다.

PulseAudio와 JACK을 같이 사용하면서 나타나는 문제 해결 방법은 How use PulseAudio and JACK?을 참조하라.

MIDI를 위한 설정(Rosegarden)

Rosegarden은 MIDI 통신을 위해서는 ALSA driver를, 오디오를 위해서는 JACK을 사용한다. 만약 JACK 서버를 사용하지 않는다면 synth plugin을 쓸 수 없게 되고, 오디오 세그면트의 녹음이나 재생을 하지 못한다. flourish.mid를 예제로 택하여 간단한 작업을 해 본다.

Qsynth를 이용한 단순한 재생

  1. QjackCtl을 구동한다.
  2. Qsynth를 구동한다. 설치 후 첫 실행이라면 Setup → Soundfonts에서 /usr/share/sound/sf2/FluidR3_GM.sf2를 로드한다. Setup → MIDI → MIDI Driver가 jack인지 확인한다. alsa_seq이면 JACK을 경유하지 않고 Qsynth를 사용할 수 있다.
  3. Rosegarden을 실행하고 rosegarden.mid를 임포트한다.
  4. Studio → Manage MIDI Devices에서 Available outputs 중 129:0 Synth input port를 MIDI Playback device로 연결한다.
  5. 재생 버튼을 클릭하여 음악을 감상한다.

특정 트랙을 다른 VST PlugIn으로 바꾸기

  1. 3번 트랙의 Piano에 마우스 포인터를 대고 오른쪽 버튼을 눌러서 나오는 메뉴 중 두번째의 Synth plugin을 선택해서 나오는 목록 중 적당한 번호를 고른다.
  2. 왼쪽 Special Parameters 패널의 Instrumental Parameters에서 <no synth>를 클릭한다.
  3. Plugin을 클릭하여 (none)을 hexter DX7 emulation으로 바꾼다.
  4. 아래에 새로 나타나는 창에서 Program 곁의 <none selected>를 E.GRAND 1로 바꾼다.
  5. 재생 버튼을 클릭하여 바뀐 음색의 음악을 감상한다.

오디오 트랙을 생성하여 녹음하기

  1. 오디오 트랙은 17번부터이다.
  2. 트랙에 마우스 포인터를 대고 오른쪽 버튼을 눌러서 나오는 메뉴 중 세번째의 Audio을 선택해서 나오는 목록 중 적당한 번호를 고른다.
  3. QjackCtl에서 Connect를 클릭한다.
  4. Audio 패널에서 왼쪽의 qsynth와 오른쪽의 rosegarden을 연결한다.
  5. [알아볼 사항] 일부 혹은 전체 트랙인 VST plugin이면 connect를 어떻게 해야 하는가?

ARDOUR

리눅스용 DAW 소프트웨어인 ARDOUR에서는 MIDI를 ALSA를 직접 제어한다. 만약 JACK을 꼭 써야 한다면 다음의 방법을 따른다(https://manual.ardour.org/setting-up-your-system/setting-up-midi/midi-on-linux/링크.

실습 혹은 연습문제

MIDI 키보드와 음원 및 오디오 인터페이스(USB)를 연결하고 노트북 컴퓨터의 전원을 넣었다. 오디오 인터페이스의 아날로그 입력 단자에는 적당한 신호원을 연결해 놓는다. 위에서 익힌 바를 되새기면서 다음과 같은 작업을 원할 때 어떻게 해야 하는지 알아보자. 너무나 당연한 이야기지만 녹음을 원한다면 소스가 무엇인지를 명확하게 파악해야 한다.

  1. USB 포트에 연결한 기기들이 어떤 이름으로 인식되었는가? ALSA에서 인식하는 디바이스 번호는 어떠한가? 각 디바이스에 지난번 부팅때와 같은 번호가 부여되었는가? Default sound card는 무엇인가?
    • comment…
  2. PulseAudio Volume Control을 실행하여 원하는 디바이스에서 소리가 출력되도록 만들어라.
  3. ALSA 오디오 드라이버를 이용하여 명령행에서 Qsynth를 구동하여라. 사운드폰트는 ~/sf2에 있는 것을 적당히 선택한다. 키보드 콘트롤러는 어떻게 연결해야 하는가? 프로그램(악기 종류) 변경은 어떻게 하는가? 내장 스피커에서 소리가 나게 하려면 어떻게 해야 하는가?[-o audio.alsa.device=hw:#]
  4. Qsynth를 구동한 상태에서 유튜브 동영상을 실행해 보라. 소리가 잘 나는가? 내장 스피커로 소리가 나게 하려면 어떻게 해야 하는가?
  5. Audacity를 실행하고 host는 ALSA로 설정한다. 원하는 소스를 녹음하려면 audacity의 설정을 어떻게 해야 하는가? PulseAudio volume control도 살펴보아야 하는가?
  6. Software synth의 음질이 마음에 들지 않아서 JACK을 오디오 드라이버로 사용하여 Qsynth를 구동하기로 하였다. ~/.jackdrc에서 -dhw: 설정이 원하는 사운드 디바이스에 맞게 되어 있는지 확인하라. Sampling rate는 사운드 디바이스가 지원하는 수준과 맞는가? SC-D70은 전면 버튼을 통하여 sampling rate를 설정한다(전원 투입시의 버튼 상태). Qsynth 명령을 어떻게 주어야 하는가? Qsynth를 일단 끈 다음 JACK 서버를 실행한 뒤에 다시 Qsynth를 실행하려면? Qsynth를 실행하면 갑자기 유튜브의 소리가 나지 않을 것이다. 어떻게 해야 유튜브 소리가 날 것인가?
  7. 지난번 Qsynth를 실행할 때 JACK 서버를 사용한 것이 마지막이었다고 가정하자. jackdbus가 백그라운드에서 돌지 않은 상태에서 Qsynth를 실행하면 JACK 서버가 저절로 작동되는가?
  8. 이 상태에서 audacity를 실행한다. 유튜브 동영상을 녹음하려면? 키보드로 실시간 연주하는 Qsynth의 소리를 녹음하려면? 메트로놈 프로그램의 이름은 무엇인가? 녹음을 한 소리가 중간에 끊어져 들린다면 어떻게 최적화를 해야 하겠는가?
  9. SC-D70을 키보드 콘트롤러로 연주할 수 있게 만들어 보라. Qsynth로 MIDI 신호가 가지 않게 하려면 어떻게 해야 하는가? SC-D70의 소리를 audacity에서 녹음하려면 어떻게 해야 하는가? 유튜브의 재생음과 별도로 녹음하는게 가능한가?
  10. NanoPiano의 출력을 SC-D70의 입력 단자에 연결한다. MIDI 키보드로 NanoPiano를 컨트롤하게 만들어 보라. NanoPiano의 소리를 audacity에서 녹음하려면 어떻게 해야 하는가?
  11. 웹브라우저를 제외한 모든 프로그램을 종료한다. 유튜브의 재생음은 어떻게 되었는가? JACK 서버는 왜 여전히 돌아가는가? 백그라운드의 jackdbus 프로세스는 어떻게 하면 종료할 수 있는가?
  12. QjackCtl에서 START를 클릭하여 JACK 서버를 실행한다. MIDI controller로 SC-D70을 연주하게 만들어 보라. 다시 Audacity를 실행하여 SC-D70의 소리를 녹음하라. 이번에는 소리가 끊기지 않는다면 그 이유는 무엇일까?
  13. PulseAudio를 잠시 중단하고 JACK 서버를 실행하는 방법을 알아보라. 그 상태에서 지금까지 설명한 녹음(Qsynth, SC-D70 내장 음원, NanoPiano)를 하려면 어떻게 해야 하는가?

결론

리눅스에서 오디오 및 미디 작업을 하기 위한 환경 조성의 키는 결국 JACK이 쥐고 있다고 해도 과언이 아니다. JACK 서버를 기동하는 방법은 다음에 나열한 세 가지의 방법이 전부 가능하다. 내장 사운드카드(노트북 내장 스피커)를 PulseAudio의 기본 사운드 카드로 설정한 상태에서 유튜브 동영상을 재생한 다음, 다음을 각각 실행해 보았다. 각 테스트 사이에는 재부팅을 하였다. 동시에 Qsynth까지 실행한 뒤 Rosegarden이 정상 작동됨을 확인한다.

  1. audio script: 유튜브는 동작을 멈춘다. 스크립트 내에서 'pasuspender -- jackd'를 통하여 JACK 서버를 실행하기 때문에 그럴 것이다. audio stop을 해서 작동을 정지해야 유튜브에서 다시 음악이 재생된다. 실행 종료 뒤 ps aux | grep jack을 입력해 보면 남은 프로세스는 없다.
  2. jack_control script + Qsynth: 유튜브는 여전히 내장 사운드 카드로 재생된다. jack_control stop을 하면 '/usr/bin/jackdbus auto'는 남는다. jack_control exit까지 실행하면 남는 프로세스는 없다.
  3. QjackCtl + post_jack script + Qsynth: 유튜브는 여전히 내장 사운드 카드로 재생된다. pavucontrol을 실행하여 Playback 탭에서 Firefox의 출력을 Jack sink(PulseAUdio JACK Sink)로 바꾸면 소리는 USB 사운드 카드를 통하여 재생된다. 그런데 위에서도 이미 언급하였지만 /etc/pulse/default.pa 파일의 설정 상태에 따라서 post_jack 스크립트가 아예 필요하지 않을 수도 있다. QjackCtl을 종료하면 유튜브 출력은 자동으로 내장 스피커에서 나온다. jack_dbus auto 프로세스는 아직 살아 있다. QjacCtl의 Setup에서는 특별히 손을 댄 것이 없다. 'a2jmidid -e'를 실행하여 연결된 하드웨어 MIDI 장비를 이용하려면 'Enable ALSA Sequencer support'에 체크를 하지 말아야 할 것이다.

(1,2) 스트립트를 실행하여 JACK을 기동한 뒤 QjackCtl을 나중에 실행하여 연결 작업을 해도 된다. 외부 MIDI 기기를 연결하여 사용하려면 JACK이 실행된 상태에서 'a2jmidid -e'를 실행한다. PulseAudioJackSink를 사용하려면 JACK 서버에 이어서 post_jack 스크립트를 실행하라.

Qsynth에서 각기 다른 사운드폰트를 로드한 FluidSynth 인스턴스를 여럿 생성하여 사용하려면 여기를 참조한다.

Troubleshooting or other useful sites

나머지 링크는 설명과 함께 정리해야 한다.

audio.txt · Last modified: 2020/10/22 10:50 by hyjeong