2021년 2월 14일 일요일

GenoGlobe 로고를 새로 만들다

사용에 제약이 없는 지구 이미지와 내가 만든 그림을 포함하여 대충 만들어서 한동안 쓰던 GenoGlobe 로고는 다음과 같다. 지나치게 복잡한 감이 없지는 않다. GenoGlobe 로고 변천사는 내 위키 사이트에 정리하여 놓았다(링크).



Free Logo Design이라는 사이트가 있어서 새로운 로고를 만들어 보았다. 웹 게시 용도의 저해상도 이미지(200x200 픽셀) 다운로드는 무료이지만 심각한 용도로 쓰려면 돈을 내야 한다. 그러면 그렇지! 세상에 공짜가 어디 있겠는가?


이렇게 한번 만들어진 로고는 유일한 것일까? 이 웹사이트에서 무료 로고를 만들기 위해 접속하는 잠재적 고객들에게 같은 도안을 제시하지는 않을 것으로 믿어 본다. 로고와 테마곡까지 만들었는데 이제 이것으로 무엇을 할 것인가? 나만의 저작물을 만들기 위해 노력해 보자. 그런데 주제는 무엇으로?


2023년 4월 10일 업데이트

혹시 2년 전에 작업해 놓은 결과물이 남아있다면 추가 비용을 내고 고해상도 이미지를 되살릴 수 있을지도 모른다는 생각에 Free Logo Design에 다시 접속해 보았다. 그러나 남은 것은 없었다. 계정을 삭제하고 나왔다.


LibreCAD와 기타 그래픽 편집 도구를 써서 이 로고 이미지를 살려낸 이야기는 '2023년형 GenoGlobe 로고를 새로 만들다'에 기록하였다.


2021년 음력설 연휴 작업 완료 - 6LQ8 SE 앰프와 펄스오디오, 그리고 GenoGlobe 테마곡

코로나19 여파로 가족 모임을 하지 않게 되면서 남는 시간을 보내고자 자잘한 작업 거리를 많이 들고 대전 집에 내려왔다.  게으름으로 늘어지지 않게 연휴를 보내면서 목표했던 작업은 전부 만족할 만한 수준으로 마무리를 하게 되었다.

1. 6LQ8 SE 앰프의 출력 트랜스 교체

알리익스프레스에서 구입한 3와트급 8K:8/4옴 초소형 OPT로 교체를 하고, 볼륨 포텐셔미터의 본체에 전선을 납땜하여 접지에 연결하는 것으로 작업을 마쳤다. 분리된 전원부를 새로운 케이스에 넣고 싶은 욕구를 언제 충족할지는 모르겠다.

2. 펄스오디오(PulseAudio) 이해하기

취미 수준의 음악 작업을 하기 위한 장비로서 리눅스(우분투 스튜디오)를 택한 것이 고난의 시작이었다. 모든 것은 작년 여름 무렵 우연히 롤랜드 사운드캔버스 SC-D70을 갖게 되면서 시작되었다. 이어서 휴대가 간편한 키보드 콘트롤러와 USB 마이크/웹캠을 구입하게 되었다. 딱히 유튜버 노릇을 하겠다고 작정을 한 것은 아니다. 

음악을 만들고 연주하는 일에 정성을 쏟아야 하는데, 컴퓨터를 이용하여 녹음하는 기법을 익히고 이해하는 것에 재미를 느끼게 되었다. 아직도 갈 길은 멀다. 오디오 또는 멀티미디어를 기록하는 다양한 파일 포맷과 이것과 관련된 용어를 이해하는 일, 즉 샘플링 레이트나 비트 레이트 등의 의미를 알아야 한다. 내가 추구하는 것은 아티스트인가 혹은 사운드 엔지니어인가? 전부 다이다.

리눅스에서 녹음을 하는 방법을 다음의 두 위키 문서로 기록해 놓았다. 첫 번째의 글은 나중에 쓰기 시작했지만 더욱 중요하다. 이 두 개의 글은 서로 완벽히 구분되지는 않고 다소 뒤섞인 상태이다. 뿐만 아니라 이 블로그 내에도 적지 않은 글이 체계를 갖추지 못한 상태로 존재한다.

펄스오디오의 설계 개념은 생각보다 매우 까다롭고 그다지 친절하지도 않다. 그러나 이번 연휴 동안 null sink의 개념을 어렵게 깨달으면서 갈피를 잡기 어려웠던 펄스오디오의 핵심 기능 하나를 이해하게 된 것 같다. Victor Gaydov의 방대한 글 'PulseAudio under the hood'에서 key abstractions 항목을 찬찬히 읽어볼 것을 권한다. 다음 그림은 몇 달 동안 펄스오디오와 씨름을 하면서 내가 만들어 낸 source-sink diagram이다.

정해영이 만든 펄스오디오(PulseAudio)의 소스-싱크 다이어그램(source-sink diagram)

다음의 mp3 파일은 오늘 실시간 연주하여 녹음한 것이다. 앞으로 유튜브에 동영상을 올리게 되면 도입 부분에 넣을 GenoGlobe 테마곡이라고나 할까?

하는 김에 여기까지 왔다. GenoGlobe 로고도 새로 만들고 녹음한 곡은 유튜브에 공개하였다.


 

2021년 2월 11일 목요일

6LQ8 싱글 앰프의 출력 트랜스 교체

알리 익스프레스에서 초소형 3W급 싱글 앰프용 출력 트랜스를 구입하였다(제품 링크). 눕힌 상태로 PCB에 꽂혀서 납땜이 된 형태이다. 국내 업체인 소리전자나 DHT 트랜스에서 판매되는 출력 트랜스 중 가장 작은 것이 57 코어(가장 긴 쪽의 mm 길이)를 쓰는 것인데, 이것은 41 코어에 지나지 않는다.

제품 설명: Z9 iron core 5.5K 8K 10K 12K 16K: 4Ω8Ω single-ended output transformer, 2W and 3W, primary current: 25mA, inductance: about 120H
아래 소개한 사진에서 같이 보인 것(HT-601)은 일반 전원용 트랜스의 코어를 전부 뽑아서 갭을 사이에 두고 다시 꽂아서 만든 것. 3년 전, 진공관 앰프용 출력 트랜스를 처음으로 구입하려니 생각보다 비싸다는 두려움에 실험이나 해 보려는 목적으로 만들었었다(제이앨범 링크 - 말할 수 없이 긴 댓글!). 당시에는 코어를 빼느라 칼도 다 망가지고 손가락도 무척 아팠었다.

1차 권선의 인덕턴스는 64 H. 적당한 수준인 것인지? '저역 특성을 좋게 하려면 1차 권선의 인덕턴스가 높아야 하고, 고역 특성을 좋게 하려면 누설 자속과 분포 용량을 줄여야 한다(출처).' 이를 동시에 달성하는 것은 쉽지 않을 것이다.


기존의 트랜스를 탈거하고 배선을 새로 하였다. 분당 생활을 정리하면서 공구를 전부 대전에 가져다 놓았던 터라 설 연휴를 보내기 위해 대전 집에 내려와서 정말 오랜만에 납땜을 하였다.


트랜스가 작아서 저음이 사라진 코맹맹이 소리가 나지 않을까 걱정을 했는데 그렇지는 않다. 물론 같은 음원을 6LQ8 푸시풀 앰프에 연결하면 더욱 단단한 저음이 난다. 이건 당연한 이야기. 휴대폰으로 녹음을 해 보았다.

사실 개조한 전원 트랜스를 오디오용으로 쓰려니 항상 음질에 대한 불신(!)이 있었다. 측정을 통해 객관적인 평가를 해야 되지만 그럴 능력은 없다. 

"오디오용 트랜스포머가 아니니 소리가 좋을 리가 있나." 

이러한 생각은 확증 편향에 가깝다. 측정을 못할 상황이라면 블라인드 테스트를 해서 정말 교체한 트랜스포머가 더 우수하다는 결론을 내리는 것이 옳다. 그러나 테스트를 위한 환경을 만들기는 너무 귀찮다. 바꿨으니 좋아졌다고 믿는 것이 정신 건강에 이롭다.

가벼운 마음으로 듣기 위한 가벼운 앰프를 만들고 싶었다. 개조의 목적은 얼추 달성한 것 같다.

모양은 이렇지만 이 사진에는 진공관 앰프 세 대가 있다. 아, 허름해...
50 VA급 전원 트랜스(220V:220V 절연트랜스)를 이용하여 독립적인 전원부를 만든 뒤 커넥터를 달아서 6LQ8 싱글과 푸시풀 앰프에 번갈아 연결하여 쓰고 있다. 아마도 이는 푸시풀 진공관 앰프를 구동할 수 있는 거의 최소한도 용량의 전원 트랜스일 것이다. 그것은 6LQ8이라는 비 오디오용 복합관 차체가 낼 수 있는 출력이 작아서 가능하다. 6BM8 4알로 푸시풀 앰프를 만든다면 50 VA 전원 트랜스로는 어림도 없을 것이다. 히터를 별도의 전원장치에서 공급한다면 이야기는 약간 달라질 수도 있겠지만 말이다. 이렇게 작은 용량의 전원부로도 음량이 부족하다는 생각은 별로 들지 않는다. 전원부의 케이스를 좀 더 튼튼한 것으로 바꾸고(현재는 다이소 플라스틱 수납함), 좌우 밸런스가 좋지 않은 푸시풀 앰프의 볼륨 포텐셔미터를 약간 좋은 등급의 것으로 바꾸는 것이 올해의 오디오 DIY 목표이다.






2021년 2월 8일 월요일

[우분투의 사운드와 MIDI] PulseAudiuo를 쓰면 특정 애플리케이션의 재생음만을 녹음할 수 있다

메트로놈 앱과 FluidSynth를 같이 실행한 상태에서 컴퓨터에 연결한 MIDI 키보드 콘트롤러를 이용하여 나의 연주를 녹음하려고 한다. 나는 워낙 박자치라서(자꾸 빨라짐) 메트로놈이 꼭 필요하다. FluidSynth의 소리만 녹음하려면 어떻게 해야 할까? JACK + Audacity라면 그다지 어렵지 않을 것이다. 그러나 나는 명령행에서 직접 녹음을 하고 싶다.

지금까지는 펄스오디오의 module-null-sink와 module-loopback을 이용하는 방법을 공부해 왔다. 하지만 오늘 실현하고 싶은 것은 성격이 약간 다르다. 검색을 통해 알아낸 것은 move-sink-input이라는 모듈과 parec 명령어이다. 더욱 깊숙하게 들어간다면 oggenc 또는 lame도 알아야 한다. Ogg는 멀티미디어 컨테이너 포맷으로서 특허권으로 보호되지 않는 오픈 표준 파일 형식이라 한다. MP3와 비교하자면 용량 대비 음질이 좋고, 라이센스 비용(MP3 재생기 제조사의 경우)이 들지 않는다고 한다. 리눅스 매뉴얼에 의하면:

  • oggenc reads audio data in either raw, WAV, or AIFF format and encodes it into an Ogg Vorbis stream.
  • LAME is a program which can be used to create compressed audio files. (Lame ain't an MP3 encoder 음?).

이 과정을 편리하게 실행해 주는 스크립트인 pulse-recorder.bash라는 것이 있다. 뒤에서 좀 더 자세히 다루도록 하겠다.

USB 오디오 인터페이스를 연결한 상태라면 메트로놈 소리는 컴퓨터의 내장 스피커로, FluidSynth의 소리는 USB 오디오 인터페이스로 보내면 될 것만 같다. 과연 그럴까?

PulseAudio Volume Control의 Playback 탭에서 Orange Metronome의 소리를 '내장 오디오 아날로그 스테레오'로 나오게 하면 될 것만 같다. 그러나 '딱' 소리가 나는 순간에만 Playback 탭에 메트로놈 앱이 살짝 나오고 사라진다. 도저히 현실적으로 이를 클릭하여 바꾸지를 못한다.

Audacity의 생성(G) 메뉴에서 'Rhythm Track...'을 생성하여 넣은 뒤 재생을 개시하면 PulseAudio Volume Control의 Playback 탭에서 지속적으로 표시되므로 출력 방향을 바꿀 수는 있다.

보다 근본적인 해결책은 PulseAudio에서 제공한다. 이미 누군가에 의해 pulse-recorder.bash라는 스크립트가 나와 있다. 작동 과정을 살펴보면 녹음을 하려는 애플리케이션을 null sink로 보내고, 그것의 모니터 출력을 loopback으로 보내어 녹음을 하는 것이다. 이 글의 도입부에서 굵은 글씨로 표현한 것들이 이 스크립트에서 쓰인다. 다음은 실행 사례이다. 약간의 오해가 있어서 ogg 파일로 녹음하도록 스크립트를 수정했던 것에 대한 실행 화면을 기록하였다. 

hyjeong@CQ61:~/bin$ pulse-recorder.bash 
    index: 2021
		application.name = "ALSA plug-in [fluidsynth]"
		module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [fluidsynth]"
Choose recording index: 2021
temp.ogg file already exist, replace (y/n)? y
Encoding standard input to 
         "temp.ogg" 
at approximate bitrate 192 kbps (VBR encoding enabled)
	Encoding [ 0m11s so far] / # Ctrl+C를 눌러 종료
hyjeong@CQ61:~/bin$

이 스크립트를 사용하면 Orange Metronome의 index를 확인할 수 있다(application.name = "libao[ogg123]"). 녹음을 하는 명령줄은 다음과 같은데, 만들어진 mp3 파일은 aplay에서 제대로 재생이 되지 않았다. 아, 될 턱이 없지. mp3 파일은 aplay가 아니라 play 유틸리티로 재생할 수 있다.

$ parec --format=s16le -d record-n-play.monitor | lame -r -q 3 --lowpass 17 --abr 192 - "temp.mp3"

다음과 같이 ogg 파일로 녹음해도 된다. Ogg 파일을 재생할 수 없는 상황이라면 SoX를 사용하여 ogg를 mp3로 전환할 수 있다('sox file.ogg file.mp3'). 오디오 파일 기록과 전환에 관한 유틸리티, 그리고 pulse-recorder.bash 원본 스크립트가 제대로 이해하려면 공부가 필요하다. 도대체 이 많은 옵션 및 파라미터의 기능을 언제 다 찾아본단 말인가? 배움은 더디고, 찾아볼 것은 많다...

$ parec -d record-n-play.monitor | oggenc -b 192 -o temp.ogg --raw -

명령어를 직접 입력하여 이 기능을 따라하고 싶다면 다음 사이트를 참조한다. 많은 공부가 되는 웹사이트이다.

[Ask Ubuntu] Record a program's output with PulseAudio

parec 명령어를 직접 쓸 일은 많지 않으나, PulseAudio의 기능을 익히는 데는 좋은 재료가 된다. 다음의 사이트도 검토해 보자.

[Ask Ubuntu] How can I record the audio output using sox?

2021년 2월 7일 일요일

[우분투의 사운드와 MIDI] Qsynth 구동용 스크립트 'run_qsynth'

사운드폰트가 설치된 디렉토리의 목록을 보여주고, 번호를 선택하면 이를 로드하여 Qsynth를 실행하는 간단한 스크립트를 만들어 보았다. 매우 지저분하기 이를 데 없는 스크립트이다. 변수명에 일관성도 없고, 변수의 값을 나타내기 위해 큰따옴표나 중괄호로 둘러싸는 방법도 제멋대로이다.

#!/usr/bin/env bash

option="-a jack --connect-jack-outputs"
if [ "$1" = "alsa" ]; then
    option="-a alsa"
    echo
    echo "ALSA audio driver will be used (default: JACK)"
fi

OIFS=$IFS; IFS=$'\n'
array=($(find $HOME/sf2 -type f)); IFS=$OIFS

echo
echo "Soundfonts installed in $HOME/sf2: "
i=0
for var in "${array[@]}"
do
    echo "  [$i]:  $(basename ${var})"
    i=`expr $i + 1`
done
echo
echo -n "Select sf2 index number: "
read -r input
CMD="qsynth -m alsa_seq $option --reverb=0 --chorus=0 --gain=0.8 ${array[$input]}"
$CMD &>/tmp/qsynth.out &
echo "$CMD &>/tmp/qsynth.out &"

어떻게 해서든 에러 없이 실행만 잘 되면 되는 것 아니겠는가? 실행 사례는 다음과 같다. 명령행 인수 'alsa'를 주지 않으면 -a jack --connect-jack-outputs' 옵션이 qsynth 명령어에 제공된다.

$ run_qsynth alsa

ALSA audio driver will be used (default: JACK)
Soundfonts installed in /home/hyjeong/sf2: 
  [0]:  FluidR3_GM.sf2
  [1]:  Chateau_Grand-v1.8.sf2
  [2]:  Nice-Keys-Ultimate-V2.3.sf2
  [3]:  Essential_Pianos-bs16i-v1.0.sf2

Select sf2 index number: 3
qsynth -m alsa_seq -a alsa --reverb=0 --chorus=0 --gain=0.8 /home/hyjeong/sf2/Essential_Pianos-bs16i-v1.0.sf2 &>/tmp/qsynth.out &

JACK audio server 구동에 쓰이던 audio.qsynth 스크립트도 개정 작업을 진행 중이다. 이전 버전에서는 항상 Qsynth가 실행되게 하였지만, 개정판에서는 3초 이내에 Esc 키를 눌렀을 때 Qsynth를 실행하지 않게 만든 것이다. run_qsynth 스크립트를 만들게 된 것도 이런 이유에서다.

2021년 2월8일 업데이트

Qt GUI를 쓰지 않고 FluidSynth를 그대로 실행하는 것이 음질 면에서는 더 낫다. 컨트롤하기에는 약간 불편함이 있지만, 아무래도 시스템 자원을 덜 사용하기에 그런 것 같다. FluidSynth 명령행 환경에 익숙해지는 것은 그렇게 어려운 일도 아니다.

2021년 2월 3일 수요일

[독서 기록] 새뮤엘 헌팅턴 『문명의 충돌』

꽤 오래 전에 도서관에서 빌려서 읽었던 것으로 기억한다. 2016년에 2판이 나왔다고 되어 있는데, 저자는 개정판을 낸 일이 없으니 아마도 추천사가 추가되었거나 번역이 조금 바뀌지 않았나 싶다. 역사학자 김기협이 쓴 추천사의 날짜는 2016년이고, 그 다음에 나오는 브레진스키의 글도 2011년이다. 지난주에 다 읽었지만 기록이 늦었다. 원저가 나온 것이 1996년이니 그 후 약 25년이 지난 지금까지의 변화도 저자의 시각과 잘 맞는지를 살피면서 보는 것도 좋을 것이다.

우리나라를 별도의 문명권으로 취급하지 않았다고 하여 서운해 할 필요는 없다. 위키백과에 의하면 현존하는 국가의 수는 200개가 넘는다. 저마다 독자적인 문화와 가치를 갖겠지만 그런 방식으로는 한 권의 책에 주장하는 바를 담기 어렵다.

서구, 보다 구체적으로는 미국에게 일본이 어떠한 의미를 갖는지를 우리는 잘 모르는 것 같다. 임진왜란부터 일제 강점기에 이르기까지 일본은 우리에게 어떤 의미였는가? 세계대전을 일으킨 전범국으로서 비난을 받은 것도 잠시, 이제 일본은 미국에게 가장 중요한 동아시아 국가가 되고 말았다. 패전 이후 맥아더를 매개로 하여 일본이 미국을 어떻게 받아들였는지를 모르면 이를 이해하기 어렵다. 

이 책을 읽으면서 중국의 부상을 어떻게 받아들여야 하는지가 가장 큰 숙제로 남았다. 트럼프에 정책 기조 중 바이든 정부에도 이어지는 것은 대중 정책인 것으로 여겨진다. 서구의 보편적인 가치, 즉 자유민주주의, 시장경제, 인권 등을 받아들여야 동반자로서 대우를 하겠다는 것인데, 이게 쉽지가 않다. 보편주의는 서구가 내어 놓은 허구라는 것이 저자의 생각이다.

시간이 흐르면 세상은 더욱 합리적인 곳으로 '발전'할 것만 같지만, 그 발전은 매우 느리며 때로는 후회하기도 한다. '변화'한다는 것이 진리일 뿐이다.  코로나 시국에도 생명과 같은 대면 예배를 고집하는 일부 교회를 보라. 냉전이 끝나고 더 이상의 이념 분쟁은 없을 것으로 기대하였지만, 종교나 문화를 배경으로 하는 해묵은 갈등이 그 사이를 채우고 있는 것과 같다.

구 유고슬라비아 땅에서 벌어진 복잡한 '단층선 전쟁'에 대해서도 이 책을 통해 어느 정도는 이해할 수 있었다.

504쪽을 인용해 본다.

첫째, 서구 문명은 지금까지 존재해온 다른 모든 문명들과 너무도 달라서 그 자체가 하나의 유형, 새로운 종이라고 할 수 있는가?

둘째, 서구의 범지구적 팽창은 다른 모든 문명들이 발전할 수 있는 가능성을 차단하는가?

다른 문명에 살았던 과거인들도 이와 생각을 했지만 그 생각은 틀렸다. 그러면 어떻게 해야 하는가? 서구인의 입장에서 쓴 해결책은 521-522쪽에 나온다. 중국을 바로 곁에 두고 있는 우리에게는 상당히 불편한 해결책이지만. 가장 보편타당은 가치는 '국익' 하나라고 보는 것이 타당할지도 모르겠다.

문명 전쟁의 가능성은 상존한다. 저자는 이를 방지하려면 다른 문명의 내부 분쟁에 개입하지 말 것을 강조하였다. 가까운 예로써 2021년 2월 1일 미얀마 군부가 아웅산 수치 국가고문을 구금하고 쿠데타를 일으켰다. 국제 사회는 이에 대해서 목소리를 내거나 제제조치를 취해야 하는가? 참 어려운 일이다.

2021년 2월 2일 화요일

[우분투의 사운드와 MIDI] PulseAudio 루프백(loopback)의 활용

  1. USB 마이크를 이용하여 내 목소리를 녹음하고 있다. 마이크에는 모니터링용 3.5 mm 스테레오 단자가 있어서 헤드폰을 연결할 수 있으나 녹음 중인 내 목소리는 들을 수가 없다. 
  2. USB 마이크를 이용하여 내 목소리를 녹음하고 있다. 유튜브에서 흘러나오는 음악을 배경으로 깔고 싶다면 어떻게 해야 하는가? 단, 음원에 대한 저작권 문제는 없다고 가정한다. 
  3. Behringer UCA200 오디오 인터페이스에 Alesis NanoPiano를 연결하여 녹음을 하면서 실시간으로 모니터링을 하고 싶다. 하지만 UCA200과 NanoPiano에는 헤드폰 출력 단자가 없다.
이러한 상황에서 PulseAudio의 module-loopback이 안성맞춤이다. 앞서 소개한 alsa_in과 alsa_out도 유사한 기능을 해 주지만, JACK client이기 때문에 반드시 JACK을 기동한 상태에서만 쓸 수 있다. 명령행 인터페이스(CLI)에서 arecord 명령을 사용하여 녹음하는 방법을 익히면서 실제로 이렇게 녹음을 할 일은 없을 것이라 생각했는데, 그게 그렇지가 않다. PulseAudio의 기능을 조금씩 익혀 나가면서 이를 CLI에서 잘 구사하면 리눅스의 사운드 재생과 녹음에 대한 기본 지식을 이해함은 물론 실무적으로도 매우 쓸모있는 기능을 익히게 된다.

PulseAudio에서는 매우 다양한 모듈을 로드하여 쓸 수 있다. 모듈을 로드하려면 'pactl load-module <module name> <parameters>' 명령어를 실행하면 된다. 현재 로드된 모듈이 어떤 것이 있는지를 확인하려면 'pacmd list-modules'를 입력한다. module-loopback이라는 모듈은 어느 소스의 오디오를 싱크로 되돌려 보내는 기능을 한다. 상세한 설명 및 파라미터 목록은 여기를 클릭해 보라.

2번 상황으로 돌아가 보자. 마이크에 대고 말을 하면서 녹음을 하다가 유튜브로 완전히 소스를 전환하고 싶다면, PulseAudio Volume Control에서 'Monitor of ...'를 선택하면 된다. 이렇게 하면 마이크에 대고 아무리 소리를 질러도 녹음이 되지 않는다. 그러나 내가 원하는 것은 유튜브에서 재생되는 음악을 배경으로 하여 나의 음성이 동시에 녹음되는 것이다. 

module-loopback을 로드하기에 앞서서 sink에 해당하는 오디오 기기를 결정해야 한다. 내 컴퓨터에는 어떤 sink가 있는가? 역시 CLI에서 확인해 보자. 내장 사운드 카드에 헤드폰을 연결한 상태에서 USB 마이크만 꽂았다.

$ pacmd list-sinks | grep -e 'name:' -e 'index:'
  * index: 0
	name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
    index: 1
	name: <alsa_output.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-stereo>

별표로 시작하는 0번 인덱스 기기 바로 현재의 default sink이다.

$ pactl load-module module-loopback sink=alsa_output.pci-0000_00_1b.0.analog-stereo
24

일단 24번이라는 모듈 번호를 기억해 두라. 나중에 모듈을 내릴 때 필요하다. 실은 이 번호를 기억하지 못해도 'pacmd list-modules' 명령으로 알 수 있다. 웹브라우저를 작동시켜서 유튜브 동영상 재생을 시작한 다음, 명령행에서 녹음 명령(arecord)을 내린다.

$ arecord -f cd -d 300 test.mp3

300초, 즉 5분 동안 녹음을 하므로 PulseAudio Volume Control에서 설정을 조절할 시간은 충분히 있다. 먼저 Input Devices 탭에서 'Monitor of 내장 오디오 아날로그 스테레오'와 'PCM2912A Audio Codec 아날로그 모노'(USB 마이크 종류에 따라 표시가 다를 것임)의 입력이 전부 활성화되어 있는지, 신호 입력에 따라 레벨이 움직이고 있는지를 확인한다. 전자는 컴퓨터 내부에서 발생하는 소리, 즉 유튜브 소리를 입력하게 하는 매우 중요한 요소이다.

그 다음으로는 PulseAudio Volume Control의 Recording 탭을 선택하여 다음과 같이 되어 있는지 확인한다. arecord 명령을 실행하지 않았다면 위의 것만 보일 것이다.

상단의 'Loopback to 내장 오디오'에는 무엇을 선택하여야 할까? 고를 수 있는 것은 다음 중 하나이다.

 

정답은 두 번째인 'PCM2912A Audio Codec 아날로그 모노'이다. 이렇게 연결하면 마이크로 입력되는 음성이 default sink로 선언한 내장 오디오로 들어가게 된다. 녹음 프로그램인 arecord의 실행 여부와 상관없이 마이크에 대고 말한 것이 음성이 내장 오디오(헤드폰)를 통해 나올 것이다. 

module-loopback을 로드할 때 아예 source를 지정해도 된다. 'pacmd list-source' 명령어를 이용하여 source의 정확한 명칭을 알아낸 뒤 'pactl load-module' 명령에서 'source=NAME' 처럼 파라미터로 제공한다. 아래 사례에서는 sink가 정확히 작동하는 것을 알고 있기에 따로 지정하지 않았다.

$ pacmd list-sources | grep -e 'name:' -e 'index:'
    index: 0
	name: <alsa_output.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-stereo.monitor>
  * index: 1
	name: <alsa_input.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-mono>
    index: 2
	name: <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor>
    index: 3
	name: <alsa_input.pci-0000_00_1b.0.analog-stereo>
$ pactl load-module module-loopback source=alsa_input.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-mono
22

하단의 'ALSA plugin [aplay]: Alsa Capture from'을 연결하기 위해 선택 사항도 이와 동일한 네 가지이다. 2번과 3번을 고르면 마이크 음성 입력을 잘 받아들여 녹음이 된다. 그러나 유튜브에서 재생하는 음악 소리를 같이 녹음하려면 3번의 'Monitor of 내장 오디오 아날로그 스테레오'를 선택해야 한다.

눈치가 빠른 사람은 녹음 중에 조금 부자연스러운 것을 느꼈을 것이다. 스피커에서 나오는 내 음성이 조금 뒤늦게 나온다는 것을. 이는 module-loopback을 로드할 때 'latency_msec=5' 정도의 파라미터를 주면 된다. 기본값은 200(단위는 msec)이니 평균적인 청력을 지닌 사람이라면 레이턴시를 느낄 수 있다. 파라미터를 바꾸어서 모듈을 다시 로드하려면 'pulseaudio -k' 명령을 입력하여 PulseAudio를 완전히 재시작하거나, 다음의 명령을 입력하여 방금 올렸던 모듈을 내린 다음 다시 pactl load-module 명령어를 원하는 파라미터와 함께 실행한다. 24라는 모듈 번호는 실제 상황에 맞게 입력해야 한다.

$ pactl unload-module 24

이상과 같이 PulseAudio의 루프백 기능을 쓰면 어렵지 않게 두 개(혹은 그 이상?)의 오디오 디바이스를 연결할 수 있게 된다. 좀 더 고급 기능을 맛보려면 가상 싱크(혹은 소스)를 사용하면 된다는데 아직 그 필요성을 느끼지 못하고 있다. 다음의 웹사이트를 숙독하면 많은 발전이 있을 것이다!

Emma Joe Anderson - PulseAudio Loopback

여기에서 설명하는 주요 개념만 간략하게 소개해 보겠다. 보편적으로 쓰이는 정의와는 약간 다를 수도 있다. 디바이스는 마이크, 스피커, 헤드폰과 같은 물리적 오디오 장치이다(USB 오디오 인터페이스는 디바이스가 아니다. 흠...). Virtual sink는 virtual device이다. PulseAudio는 근본적으로 디바이스(non-device)와 디바이스를 정확히 1:1로만 연결한다. 두 개의 디바이스를 연결하려면 virtual sink가 필요하고, 두 개의 디바이스를 연결하려면 loopback을 써야 한다. 루프백은 정확히 하나씩의 입력과 출력을 갖지만, 디바이스는 원하는 수만큼의 루프백을 가질 수 있다.

주요 개념을 이해할 수는 있는데 Anderson의 웹사이트에서 그래프를 그려 설명하는 방식은 아직 어렵다. Virtual device가 필요한 상황은 무엇이 있을까?  좀 더 쉬운 사례를 찾아야 할 듯.

출처: Emma J. Anderson, PulseAudio Loopback. 뭔 말인지 아직 잘 모르겠다. Dig는 구글 행아웃에서 돌아가는 애플리케이션인 모양이다. V1-V3은 virtual sink이다. 


업데이트 - 쉬운 일을 어렵게 하기?

StackOverflow 사이트에 게시된 질문과 답 중에 이런 것이 있다.


내가 하고 싶은 일과 다를 것이 없다. 유튜브에서 나오는 소리와 마이크로 입력되는 소리를 한꺼번에 녹음하려는 것. 그리고 녹음되는 소리를 직접 듣고 싶은 것. 다른 점이 있다면 Audacity를 쓰느냐 혹은 명령행에서 arecord를 쓰느냐의 차이 뿐이다. 그런데 이 웹사이트에 올라온 답변에서는 virtual sink를 사용한 상당히 복잡한 방법을 쓰도록 하였다.


인용한 그림에서 빨간색 선은 loopback, 네모는 virtual sink이다. module-null-sink 2개와 module-loopback 3개를 로드하는 것은 그렇다 치더라도, PulseAudio Volume Control에서 서로를 정확히 연결하는 방법이 너무 복잡하다. 이 과정을 이해할 수 있다면 PulseAudio로 못할 것이 없겠네! 답변을 제시한 Dodgyrabbit이 남겨놓은 참고 사이트를 소개한다. 전부 한 번씩은 방문한 적이 있던 곳이다.

차라리 Ask Ubuntu의 Re-directing applications to virtual sinks가 조금 더 이해하기 쉽다. 안, 어쩌면 StackExchange의 How to create a virtual audio output and route it in Ubuntu-based distro가 virtual sink 및 loopback을 이해하기에 더 좋은 자료라고 생각된다. 질문자가 요구하는 사항은 이러하다.

  • 게임을 하는 화면 및 사운드를 OBS로 녹화한다.
  • 게임을 하는 동시에 음성 채팅을 하는데, 이 소리는 OBS로 녹화되지 않게 하고 싶다.
OBS는 특정 디바이스로 들어오는 소리를 전부 다 녹음을 할 뿐이지, 특정 애플리케이션의 오디오만을 택하지는 못한다. game_sink라는 virtual sink를 만들고(module-null-sink), 이것의 모니터 출력(game_sink.monitor)를 헤드폰으로 루프백하는 것이 핵심이다. 음... 이건 좀 이해가 갈 것 같다.