User Tools

Site Tools


audio

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

이 문서는 계속 업데이트 중이며 아직 완벽한 상태가 아닙니다. Ubuntu 18.04 → 16.04 → 18.04.5로 안착하였습니다. — Haeyoung Jeong 2020/10/18 10:27

컴퓨터 환경은 우분투 스튜디오 16.04(현재 18.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는 알게 모르게 오디오의 재생과 녹음 작업에 깊숙하게 관여하고 있어서 결코 피해 다녀서는 안된다는 것이 2021년 1월 현재의 확고한 신념이 되었다. PulseAudio는 ALSA보다는 좀 더 사용자에 가까운 레벨에서 조절을 담당하므로 좀 더 이해하기 쉽다. ALSA, JACK, 그리고 PulseAudio를 완벽히 이해할 날이 언젠가는 올 것이라 믿는다. 상당히 까다로운 jackdbus(jack_control 명령으로 기동)를 속 시원하게 설명하는 웹문서를 찾기가 의외로 어렵다는 것이 나의 불만이다. 어쩌면 '잘 몰라서 눈에 뜨이지 않는' 것인지도 모른다. 여러 개의 소스를 이용하여 녹음 및 미디 작업과 같은 보다 전문적인 업무를 하려면 JACK(jackd or jackd2)을 사용해야 한다. 종종 PulseAudio와 JACK이 서로 충돌을 한다고 여겨지지만, 두 프로그램은 사용 목적이 조금 다르다. How use PulseAudio and JACK? 웹문서에서 두 프로그램의 차이와 이를 같이 사용하는 방법을 확인해 보라.

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

Rosegarden vs. Ardour

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

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

명령행 환경(CLI, command-line interface)

내가 보유한 모든 USB 사운드 카드의 현황은 PulseAudio Card Profiles에서 확인할 수 있다. USB 웹캠도 마이크 기능이 있으니 사운드 카드의 일종으로 보아도 되지만 웹캠의 녹음 기능을 쓸 일은 없으므로 이것은 제외하였다.

Behringer U-Control UCA200와 Roland Sound Canvas SC-D70을 USB 단자에 꽂은 상태에서 다음의 명령어('cat /proc/asound/cards')를 실행한 결과를 살펴보자. /proc/asound/cards 파일에서 나타나는 번호(card ID or card number)는 ALSA device name의 일부이다. 실제 ALSA device name은 hw:0과 같은 형태로 쓰인다. 아래의 사례에서는 SCD70이 hw:2로 나타났지만, USB conncect를 뺐다가 다시 꽂거나, 혹은 재부팅을 하면 번호가 바뀔 수 있다. 번호가 부여되는 규칙은 나도 잘 모르겠다. 2020년 12월 MXL Tempo라는 USB 콘덴서 마이크로폰을 구입하였다. 마이크 구입기스탠드 구입기는 링크를 확인하라. 이것을 추가하여 연결하면 UCA200 오디오 인터페이스와 똑같은 CODEC_1이라는 식별자가 생성된다. 만약 이 문제를 해결하고 싶다면 Alsa OpenSource Org 문서의 '1.4.1 Identify two identical audio devices' 항목을 참고하여 고쳐보자.

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

등록된 각 카드에 대한 고유한 정보는 /proc/asound/cardX(X는 사운드 카드 번호로서 0..7) 디렉토리에 각각 수록된다. 컴퓨터 부팅 직후라면 card0 디렉토리만 존재한다. 'Intel'은 card0의 심볼릭 링크이다. aplay 명령으로도 사운드 카드의 정보를 알 수 있다. aplay와 arecord는 alsa-utils 패키지에 포함된 유틸리티이다.

$ aplay -l # or --list-devices; list all soundcards and digital audio devices 
  **** 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 # or --list-pcms; list all PCMs defined

PulseAudio Volume Control(GUI)을 이용한 사운드 카드의 확인 및 설정 변경

GUI 프로그램인 PulseAudio Volume Control(명령어: pavucontrol)을 실행하면 Configuration 탭에서 설치된 사운드 카드를 확인할 수 있다. 시스템 전체에 적용되는 PulseAudio의 설정은 /etc/pulse/default.pa 파일에 있다. 이 파일은 함부로 편집하지 않는 것이 좋다. 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 오디오 인터페이스이다. 다음의 스크린샷 이미지는 UCA200을 빼내고 MXL Tempo USB 마이크로폰을 연결하였을 때의 상황이다. 이번에는 PCM2912A Audio Codec으로 표시된다. USB 사운드 카드를 꽂았지만 여전히 내장 스피커에서 소리가 나는가? pavucontrol의 Playback 탭에서 현재 소리가 나는 application 바로 위의 상자를 클릭한 뒤 나오는 디바이스 목록 중에서 USB 사운드 카드를 선택하라. 아래 스크린샷에서 'PCM2902 Audio Codec 아날로그 스테레오'이 바로 그것이다. PulseAudio JACK Sink를 사용하게 되면 표시되는 것이 약간 달라진다(단, JACK 서버를 실행시켰을 때에 한함). PulseAudio Volume Control의 Configuration 탭에서 보여지는 모든 사운드 관련 기기(내가 소유한 것)의 프로파일은 여기를 참조하라. PulseAudio 설정을 커스터마이즈하려면 /etc/pulse/default.pa를 직접 편집하는 것보다는 이를 ~/.config/pulse/default.fa로 복사한 뒤 수정하는 것이 안전하다. Default 사운드 카드를 설정하는 다양한 방법에 대해서는 How do you set a default audio output device in Ubuntu 18.04? 또는 How to make Alsa pick a preferred sound device automatically? 애플리케이션을 작동시켰는데 원하는 사운드 카드에서 소리가 나지 않는다면 pavucontrol → Playback 탭에서 애플리케이션의 오디오 출력을 원하는대로 고치면 된다. 바로 직전의 설정 상황(각 애플리케이션에 따른)이 기억되어 이를 따르는 것으로 보인다. 특정 사운드 카드를 default 출력용으로 쓰고 싶다면, pavucontrol → Output Devices 탭에서 원하는 사운드 카드의 자물쇠 옆 버튼('Set as fallback')을 클릭하라. Fallback이란 default와 거의 같은 의미라고 생각하면 좋다.

여러 USB 사운드 카드를 끼웠다 뺐다를 반복하면 기기 번호가 꼬여서 작동이 이상해진다. First in, last out의 순으로 탈착을 하는 것이 가장 무난하다.

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

여기에서는 혼동을 피하기 위해 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 # 기본 장치를 통한 재생

aplay 명령에서는 -D <NAME>로 PCM device를 지정한다. 어떤 PCM이 있는지 알아보려면 앞서 소개한 'aplay -L' 명령을 실행하라.

# 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이 기동한다. -i(--no-shell) 옵션을 주지 않으면 fluidsynth prompt에서 명령을 입력할 수 있고, 재생 후에도 prompt 상태가 된다.

$ 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

FluidSynth를 서버로 작동시키면 다른 응용프로그램(예: aplaymidi)으로 하여금 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 & ALSA 이용)

뒤에서 설명할 JACK을 쓰지 않는 조건이라면 녹음은 비교적 쉬운 편이다. SC-D70가 수용하는 입력이 여러 가지이므로 REC SOURCE 버튼을 반복해 눌러서 원하는 입력을 택해야 한다. 컴퓨터에서 발생하는 소리(USB 케이블로 전달)는 항상 모니터링이 되지만 들린다고 해서 곧 녹음이 되는 것은 아니다. 다음 그림을 정확히 이해하여 input source를 바르게 설정해야 한다. 또한 전면패널 오른쪽에 위치한 Volume 노브로 조절되는 것은 헤드폰과 OUTPUT 1임을 이해하라(녹음 레벨이 아니다!). 원본 그림은 SC-D70 Owner's Manual 22쪽을 참조하기 바란다. SC-D70의 내부 믹서 구조 Audacity에서는 인터페이스 호스트를 ALSA, 녹음 디바이스를 SC-D70: USB Audio (hw:1,0)으로 선택하고 기본 샘플 주파수를 48 kHz로 한다. 내가 보유한 다른 USB 오디오 장비를 써서 audacity에서 녹음을 하려면 JACK을 써야만 잘 되는 것 같다.

문제점 발견! 2021년 1월 21일 현재 ALSA를 사용해서는 Audacity 녹음이 되지 않는다. 오직 JACK을 기동해야만 한다. 분명히 ALSA driver만으로 녹음을 했었던 것으로 기억하는데 왜 이러는 거지?

Qsynth를 키보드로 직접 연주해 보자

이번에는 좀 더 간편한 콘트롤을 하기 위해 명령행에서 Qsynth(A fluidsynth Qt GUI Interface)를 실행한다. FluidSynth와 다른 점은 default audio driver가 ALSA가 아닌 JACK이라는 것이다. 직전의 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로 쓰는 방법만을 예로 들고자 한다. '-a alsa' 옵션을 주지 않으면 JACK에 의존한다. 그러나 결국은 JACK을 쓰게 될 것이다.

$ 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

우분투 16.04에 설치된 jackd(2)의 버전은 1.9.11이다. 버전 번호가 1 미만인 것이 JACK1, 2 미만인 것이 JACK2이다. period는 128 프레임이 적당하다. 기본 수치인 1028로 설정하면 딜레이를 확연하게 느낄 수 있다(46.4 milliseconds with 2 buffers). JACK2를 기동하는 방법은 jackd 명령어를 이용하거나, 또는 뒤에서 소개한 D-Bus 기반의 jack_control 명령어를 이용할 수 있다. 후자가 더 나은 방법이라고 한다.

$ 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-tools 패키지를 설치해야 함)을 쓸 때 이외에는 필요한 것 같지 않다. 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 명령으로 확인한다.

Ted's audio script

Ted의 가이드에서는 JACK 서버를 구동하고 사운드폰트 신시사이저인 FluidSynth를 로드하는 스크립트인 audio를 소개하였다. 이 스크립트의 원작자는 Ted Felix인데 내 실정에 맞게 조금 변경하였다. 시작하려면 audio start, 종료하려면 audio stop을 실행한다. ${DEVICE} 변수는 장착된 USB 오디오 장비에 맞게 수정해야 한다(예: CODEC 또는 SCD70). FluidSynth만으로는 악기 변경이 어려우니(불가능하지는 않음; FluidSynth shell에서 하면 된다) Qt GUI 인터페이스를 갖춘 본 스크립트 내에서 Qsynth를 로드하게 하였다. 공부할 것이 많으니 소스를 잘 들여다보거나 실제 테스트해 보라. 프로세스가 실행 중인지를 점검하는 방법을 한 스크립트 안에서 서로 다르게 구현해 놓았다. 보기에는 좀 지저분하지만 공부를 위한 목적으로는 나쁘지 않다.

스크립트의 원본과 나의 수정본은 audio script 페이지를 참조하기 바란다. 원래 여기에 실었었는데 너무 길어서 다른 페이지로 보냈다.

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

Firefox에서 유튜브 동영상을 재생하면서 audio 스크립트를 실행해 보라. 재생이 멈추고 더 이상 Firefox application의 소리가 나지 않을 것이다. 이는 PulseAudio가 관장하던 오디오 신호를 JACK이 전부 가져가 버렸기 때문이다. 스크립트 앞부분의 'pasuspender' 명령이 바로 그 역할을 한 것이다. JACK을 실행하면서도 다른 application의 소리를 잘 활용하고 싶다면, PulseAudio의 출력을 JACK으로 보내도록 고치면 된다. 이것이 바로 PulseAudioJackSink이다. 이를 위해서는 다음을 실행하는 스크립트(post_jack)를 JACK Setup → Options → Scripting에서 Execute script on Shutdown에 지정하여 JACK 서버에 이어서 실행되게 만든다. 혹은 스크립트를 직접 실행하거나 명령행에서 입력해도 된다. 이를 실행하면 PulseAudio의 출력이 JACK으로 들어가게 된다. 이를 가능하게 하려면 pulseaudio-module-jack 패키지가 설치되어 있어야 한다(Ubuntu Bionic의 패키지 내용물).

$ cat ~/bin/post_jack
pactl load-module module-jack-sink channels=2
pactl load-module module-jack-source channels=2
pacmd set-default-sink jack_out

이 방법은 WalkThrough_User_PulseOnJack 웹문서의 'B: with JACK1'를 참조하였다. 실제로 내 노트북 컴퓨터에 설치된 것은 JACK2이다. 그러나 Qjackctl을 쓰지 않고 JACK을 기동하려면 이 섹션을 적절히 응용하면 된다. PulseAudio와 JACK을 같이 사용하는 모든 방법에 대해서는 JACK 공식 사이트의 How us PulseAudio and JACK?을 꼼꼼하게 읽어보자.

최근 아주 놀라운 정보를 알아내었다. /etc/pulse/default.pa에 다음 사항이 선언되어 있으면 별도의 후처리 스크립트조차 필요가 없다!링크. pulseaudio 1:11.1-1ubuntu7.11 버전을 설치했다면 이미 default.pa에 존재한다.

### Automatically connect sink and source if JACK server is present
.ifexists module-jackdbus-detect.so
.nofail
load-module module-jackdbus-detect channels=2
.fail
.endif
# 맨 끝에서 default sink를 선언한다.
set-default-sink jack-out

문제는 20201년 1월 20일 현재 이것이 잘 먹히지 않는다는 것. jack_control을 이용한 제어가 전혀 되지 않는다. 따라서 audio + post_jack(스크립트명은 PulseAudioJackSink라고도 해 놓았음)을 쓰는 방법으로 전환한 상태이다.

PulseAudio 설정 파일에서 'jack-out'이라고 간단하게 적는 것에도 상당한 수준의 이론이 숨겨져 있지만 실용적으로는 더 깊게 들어가지 않아도 좋다. 설정을 바꾸었으므로 다음과 같이 입력하여 PulseAudio를 재실행한다.

$ pulseaudio --check # 아무 것도 나오지 않으면(exit code 0) 실행 중이라는 뜻이다.
$ pulseaudio -k # 작동 중지가 아니라 재시작하는 것으로 알고 있음
$ pulseaudio -D # 데몬 재시작하기. 혹은 재로그인한다.

JACK basic setting 이해하기

레이턴시란 실시간 오디오 프로세싱에서 일어나는 시간 지연을 뜻한다. 건반으로 가상악기를 연주하면서 실시간 녹음을 하는데 실제 입력보다 소리가 늦게 들리면 상당히 짜증이 난다. 설정을 잘 조정해야 레이턴시도 적고 잡음도 줄어든다. Buffer size, sample rate, 그리고 period/buffer를 컴퓨터 환경에 맞도록 최적화하는 것이 중요하다.

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

Buffer size란 컴퓨터가 오디오 신호를 처리할 때 허용되는 시간의 길이이다(시간을 실제 단위로 하지는 않는다). 작은 값일수록 monitoring latency가 줄어든다. 그러나 낮게 잡으면 CPU를 많이 쓰게 되고 'glitchy audio' 혹은 'drop-out'을 유발한다. 보통 64-256 사이의 값을 쓰게 될 것이다. 'jackd [-p|–period] ###' 또는 'jack_control dps period ###'로 설정한다. Default 값은 1024이다.

Sample rate

다음과 같은 단순 공식(Nyquist theorem)에 따르면 높을수록 좋다.

Sample rate ÷ 2 = maximum frequency that can be correctly captured

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

Periods/buffer(=nperiod)

USB 장비는 3으로 하면 더욱 안정적인 low latency를 얻을 것이다. 그 밖의 장비(motherboard, PCI, PCI-X 등)는 default 값인 2를 써라. 'jackd [-n|–nperiod] ###' 또는 'jack_control dps nperiod ###'로 설정한다.

Frames/Period 256 & Periods/Buffer: 2 results in 23.2 msec latency which is pretty good for a usb 2.0 sound board.

jackd 명령어 매뉴얼을 그대로 소개한다.

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에 대한 지원을 더 이상 하지 않는 것으로 이해하면 좋을 것이다.

D-Bus를 이용한 JACK 사용(jack_control 명령어) 문제점을 해결

이 섹션은 수정이 필요함 D-Bus 없이 JACK을 쓰려면 JACK can live without D-BUS를 참조하라.

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

JACK을 깔끔하게 종료하는 법

  1. JACK을 사용하는 애플리케이션을 먼저 종료한다.
  2. QJackCtl에서 Stop 버튼을 클릭한다.
  3. 명령행에서 'killall -9 jackdbus'를 실행한다. 이것이 QjackCtl에서 Quit를 클릭하는 것보다 나은 것 같다.

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/링크.

녹음하는 요령

A. 명령행에서 녹음하기

이것은 그냥 해 보았다는 것에 의미를 둔다. 명령행에서 녹음을 할 일이 과연 있겠는가?

우분투 명령행에서 USB 마이크로폰으로 녹음하기

B. 데스크탑을 동영상으로 녹화

recordMyDesktop은 컴퓨터 화면을 그대로 녹화하는 프로그램이다. GUI tool인 gtk-recordmydesktop을 사용하면 녹화할 영역을 지정하거나 영상/음성의 질을 조절할 수 있다. JACK을 쓰지 않는 상태에서 SC-D70을 사용하여 유튜브가 실행되는 화면을 녹화하는데 성공하였다. 그러나 화면을 움직이니 깨지는 현상을 확인하였다.

USB 마이크와 SC-D70을 동시에 연결하여 데스크탑을 녹화하면서 나의 내레이션을 넣을 수는 없을까? How can I user multiple soundcards with JACK?

참조: https://youtu.be/RSeINGM68A8 ← 헤드셋 입력을 응용프로그램 음성 출력과 같이 녹음하기 위한 루프백 모듈(module-loopback)을 로드하는 방법도 설명함

OBS Studio를 알아보라.

C. 웹캠을 이용한 동영상 촬영(USB 마이크 사용)

cheese 소프트웨어를 이용할 때: 프로그램 내부에서는 오디오 기기 관련 설정을 전혀 건드릴 수가 없다. 바로 직전에 사용한 오디오 입출력 기기가 사용된다. 이를 바꾸려면 pavucontrol의 Playback이나 Recording 탭의 애플리케이션 레벨에서 작동 중에 손을 대야 된다. 녹화된 동영상은 ~/비디오/웹카메라/2021-01-10-152608.webm 형식으로 기록된다.

guvcview 소프트웨어를 이용할 때: 녹화된 동영상은 my_video-1.mkv 형식으로 기록된다. Sample Rate 채널은 프로그램 내부에서 설정 가능하다. Audio API = PORTAUDIO, Input Device = default or pulse로 하면 오디오 입력 장치는 cheese에서처럼 pavucontrol에서 바꿀 수 있다. Audio API = PILSEAUDIO로 하면 guvcview에서 오디오 입력 장치를 고를 수 있으므로 매우 편리하다.

D. Audacity로 녹음하기

USB 마이크 입력 녹음

JACK을 사용하지 않으면 녹음이 원활하게 되지 않는다. jack_control을 기동하는 shell script를 이용하여 JACK을 켠다. Audacity를 실행한 뒤 샘플 레이트는 shell script에서 지정한 것과 동일한 48000 Hz로 맞춘다. 장치 도구바에서 차례로 Jack Audio Connection Kit, system, (모노)녹음, system을 선택한 다음 녹음을 하면 된다. 두 번째와 네 번째 선택창에서는 PulseAudio Jack Sink(또는 Source)를 고를 수도 있는데, 마이크 녹음을 직접 Audacity 내에서 들으려면 이 선택창을 전부 system으로 두어야 함을 이제는 잘 알 것이다.

마이크로폰이라 해도 헤드폰 출력이 갖추어진 USB 오디오 인터페이스임에는 틀림이 없다. 따라서 애플리캐이션에서 재생되는 소리나 Qsynth의 소리를 녹음하는 데에는 문제가 없다. 단지 아날로그 출력은 헤드폰 단자를 통해서만 주어지므로 내장 DAC가 변변치 않다면 앰프를 통해서 듣는 음질은 별로 좋지 않을지도 모른다. 그러나 컴퓨터에서 발생하는 음성 신호의 디지털화에는 별 문제가 없을 것이며, 편집 또는 최종 결과물에 대한 재생은 다른 USB 오디오 인터페이스를 써서 해도 된다. 다음의 녹음 사례는 SC-D70을 사용하는 것을 기본으로 하고 있지만, USB 마이크로폰으로도 안될 이유가 없다(Qsynth 를 녹음하는 것만 제외한다면).

XML Tempo 마이크로폰과 SC-D70을 같이 쓰는 것도 가능할지 모르겠다.

애플리케이션 출력(예: YouTube)의 녹음

우선 다음의 경험을 되살려 보자. SCD-70에서 JACK을 쓰지 않고, 동시에 입력과 출력을 직접 케이블로 연결하지 않고도 애플리케이션 음성 출력을 Audacity로 녹음하는 것이 가능했던가?

[우분투의 사운드와 MIDI] 리눅스에서 UCA200 오디오 인터페이스로 유튜브에서 나는 소리를 녹음하려면

USB 마이크 입력 녹음과 마찬가지로 JACK을 활용하여 Audacity에서 녹음하는 것이 가장 무난하다.

외부 오디오 신호의 녹음

(작성 예정)

Soft synth 실시간 연주의 녹음

(작성 예정)

E. Rosegarden으로 녹음하기

(작성 예정)

실습 혹은 연습문제

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이 쥐고 있다고 해도 과언이 아니다. Qsynth에서 각기 다른 사운드폰트를 로드한 FluidSynth 인스턴스를 여럿 생성하여 사용하려면 여기를 참조한다.

Troubleshooting or other useful sites

audio.txt · Last modified: 2021/01/23 12:01 by hyjeong