2021년 2월 26일 금요일

뉴스 모음 - 메디톡스에 대한 식약처의 가혹한 처사 등

[헬스오] 식약처의 '메디톡스 때리기' 도가 지나치다 입력일: 2021-02-25

말해 무엇하리오! 이런 뉴스가 주요 포털 사이트의 뉴스 목록에는 잘 보이지 않는다는 것이 안타까울 뿐이다.

[한겨레] 낚시터 물고기는 왜 갈수록 안잡힐까… 그 궁금증이 풀렸다 입력일: 2021-02-24

두 번째 글에서 인용한 학술논문은 PNAS 3월 2일에 발간 예정인 'The battle between harvest and natural selection creates small and shy fish'이다. 낚시에 의해서 덩치가 크고 활발한 물고기는 도태되고, 작고 소심한 물고기만 남는다. 자연선택의 위대한 힘! 인류가 농경사회를 이루면서 식물에 가한 선택압은 정말 어마어마하다. 가축이나 반려동물 마찬가지이다. 낚시의 대상이 되는 물고기는 우리가 특별히 손을 대지 않는 것으로 여겨지지만, 포획을 통해 활동적이고 큰 물고기를 선택함으로써 반대의 특성을 띤 물고기가 살아남는 것이다. 

강한 것이 살아남는 것이 아니다. 살아남은 것이 강한 놈이다.

[한겨레] 지금 화성 땅엔 한국인 20만명의 이름이 있다 입력일: 2021-02-25

미국이 쏘아보낸 화성 탐사선이 화성 땅에 무사히 착륙한 지 열흘 정도가 지났다. 여기에는 2019년 온라인으로 진행한 화성행 우주선 탑승권 발행 이벤트에 응모했던 지구인 1093만 2295명의 이름이 새겨진 명판이 실려 있다. 나도 당시 이벤트에 응모를 해서 화성행 '보딩패스'를 받은 것을 기념 삼아서 블로그에 글(화성으로 가는 탑승권)을 올렸다가 까맣게 잊고 있었다. 이 우주선이 그 우주선이었구나.... 

내 보딩패스는 여기에서 원본을 확인할 수 있다.

다음 것은 2017년 1월에 발행된 좀 오래 된 기사이다.

[민중의 소리] 현대심리학은 과학으로 포장된 자본주의 인간학

새로 산 책 '부정성 편향 - 어떻게 이용하고 극복할 것인가'를 읽으면서 초반부에 느꼈던 답답함에 찾아보게 된 기사이다. 현대 심리학은 자본에 충성하는 학문적 도구처럼 느껴질 때가 있다. 가끔씩은 이런 비판적인 기사를 읽어 보는 것이 정신 건강에 유익하다. 다행스럽게도 이 책을 끝까지 읽으면서 그런 생각은 다소 수그러들기는 하였으나...

신간 '부정성 편향'


2021년 2월 25일 목요일

오픈샷(OpenShot) 비디오 편집기로 겨우 만든 타이틀 동영상

 
휴... 오늘 겨우 이것 하나를 만들었다. 여러 클립의 끝나는 지점을 딱 맞추는 방법을 몰라서 한참 구글링을 하였다. 로고 이미지는 돈을 내더라도 벡터 이미지를 구입해야 되겠다. 음악은 직접 작곡하고 연주했으니 자부심을 느낄 만도 하다.
 
그런데 타이틀 영상을 무료로 만들어 주는 사이트가 있네! 로고 이미지도 무료로(저해상도에 한하여) 만들었으니 타이틀 영상도 당연히 그렇지 않겠는가?
 
오늘의 작업은 오픈샷의 기능을 익히기 위해서 해 본 것이니 보기에 좀 허름하다 해도 부끄럽지는 않다.

 

2021년 2월 24일 수요일

파이썬으로 구현한 서스테인 페달

이전에 쓴 글 '[우분투의 사운드와 MIDI] 스페이스 바를 서스테인 페달 대용으로 쓰게 만드는 파이썬 프로그램'에서 소개했던 방법을 개선해 보았다. 신호를 보낼 MIDI OUT 포트(즉 음원)를 스크립트 내에 써 넣지 않아도 되게 만든 것이다. FluidSynth를 구동한 뒤 MIDI 키보드 콘트롤러와 연결(aconnect)하고 나서 다음과 같은 bash script("sustain-pedal.sh")를 실행을 하면 된다.

#!/usr/bin/env bash

script=$(readlink -f "$0")
path=$(dirname "$script")

OIFS=$IFS; IFS=$'\n'
array=($(sendmidi list)); IFS=$OIFS

i=0
for var in "${array[@]}"
do
    echo "[$i] ${var}"
    i=`expr $i + 1`
done
echo -n "Select MIDI OUT device: "
read -r input
midi_out=${array[$input]}
python ${path}/sustain-pedal.py ${midi_out}

이 스크립트는 이전에 만든 sustain-pedal.py이라는 파이썬 스크립트를 부른다. 이는 pygame이라는 모듈이 필요하다. 아래에서 보인 이 파이썬 스크립트는 또 sendmidi라는 프로그램를 내부에서 실행하므로 이를 설치해 두어야 한다. 명령행 인수를 받을 수 있도록 조금 수정을 가했다. 내부에서 sendmidi를 실행하는 명령어 문자열도 약간 세련되어 보이게 고쳤다.

import pygame
import time
import os
import sys

pygame.init()
d = pygame.display.set_mode((800,600))
d.fill((255,255,255))

sendmidi = "/home/hyjeong/bin/sendmidi";
pedal_on = "%s dev %s cc 64 127"%(sendmidi, sys.argv[1]);
pedal_off = "%s dev %s cc 64 0"%(sendmidi, sys.argv[1]);

done = False
while not done:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      done = True
    if event.type == pygame.KEYDOWN:
      print("Got keydown event: " + str(event))
      os.system(pedal_on)
    if event.type == pygame.KEYUP:
      print("Got keyup event: " + str(event))
      os.system(pedal_off)

pygame.quit()
quit()

그러면 일종의 wrapper script인 sustain-pedal.sh을 실행해 보자.

$ sustain-pedal.sh 
[0] Midi Through Port-0
[1] iCON iKeyboard 5 Nano V1.06 MID
[2] Synth input port (3627:0)
Select MIDI OUT device: 2
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html

번호를 입력하여 MIDI 신호를 보낼 synthesizer를 지정하면 곧바로 커다란 창이 뜬다. 마우스 포인터는 그 안에 위치할 것이다. 그 다음에는 보통의 서스테인 페달을 밟듯이 아무 키나 누르면 된다. 한번에 여러 키를 누르면 제각각 페달 신호를 보내면서 상태가 꼬이기 쉬우니 발가락으로 요령껏 스페이스바를 눌렀다 떼었다 하는 것이 좋을 것이다. 마우스 포인터가 검정 창 안에 있으므로 키보드를 조작하는 것으로는 실행 중인 다른 프로그램을 건드리지는 않는다.

 



 
그다지 아름답지는 않지만 이런 방식으로...

리눅스에서는 눌렀던 키를 릴리즈하는 이벤트를 프로그램으로 구현하는 것이 어려움을 설명한 글의 링크가 서두에 소개한 이전 글에 들어 있다. 그래서 게임 개발에 쓰이는 파이썬 모듈을 활용한 것이다. 게임에서는 눌렀던 키를 릴리즈하는 동작을 인식하는 것이 대단히 중요할 테니까.

예전 방법에서는 sendmidi 명령을 다음과 같이 주어야 하는 것이 너무나 귀찮았다.

sendmidi dev 'SC-D70 Part A' cc 64 127

이것은 사운드캔버스 SC-D70이 연결되었을 때의 방법이다. 다른 오디오 인터페이스를 쓰려면 파라미터를 바꾸어야 한다. 소스 코드를 매번 바꾸어야 한다는 뜻이다. 그래서 오늘 '개발(?)'한 방법에서는 wrapper script를 통해 'sendmidi list'를 먼저 실행하여 MIDI 출력 포트 목록을 화면에 번호와 함께 나오게 한 다음, 번호를 입력하여 원하는 것을 지정하게 만들었다. Here document를 써서 파이썬 코드를 bash 내에 넣어버릴 수도 있는데, 그러한 경우 인수 또는 변수를 내부에서 전달하는 방법까지는 아직 잘 모르겠다. 이는 다음을 위한 숙제로 남겨 두자.

두꺼운 종이나 나뭇조각을 이용하여 밟았을 때 스페이스 바만 눌리게 하는 도구를 만들어도 되겠다.


2021년 2월 23일 화요일

리눅스에서 펄스오디오를 이용한 녹음 방법(명령행 - arecord)을 유튜브 동영상으로 올리다

특별히 대본을 마련하지 않고 리눅스 데스크탑을 조작해 가면서 녹화(Kazam 사용)를 한다는 것이 생각보다 어려웠다. 말이 꼬이는 것은 물론이요, 터미널 창에 입력할 명령어가 생각나지 않는다거나, 녹음 중에 방문을 벌컥 열고 들어오는 식구들의 생활 소음에 의해 중단하고 다시 하기를 반복하였다. 

영어로 녹화나 녹음은 전부 recording(동사인 경우 강세는 2음절이므로 [리코-딩])이다. 우리말로 '기록'이라 표현을 해도 사실 상관은 없지만 왠지 기계장치를 이용하여 전자 매체에 기록한다는 느낌이 별로 들지 않는다. 이러한 인식은 잘못된 것이 맞다. 왜냐하면 record라는 낱말은 음성이나 영상을 기록하는 기계 장치가 개발되기 전부터 있었던 것이 틀림없으니! 무선 통신이 나오기 전, 안테나(antenna)의 본래 뜻은 '더듬이'가 아니었던가...

녹화 후 편집을 하는 방법은 아직 익숙하지 않으니 되도록이면 '원 테이크'로 끝내려고 많은 노력을 하였다. 그러다보니 최종 기록물은 이틀이 지나서야 겨우 만들어졌다. 소리가 너무 작게 녹음되어 이를 키우는 것도 일이었다. Audacity에서 오디오 파일을 뽑은 뒤 음량을 올리고, 노이즈를 제거하고... 이렇게 해서 타이틀이나 자막 설명도 하나 없는 20분 27초짜리 동영상이 세상에 태어났다.

조절을 두 차례나 거쳤지만 음량은 여전히 부족하다. 일단 유튜브에 올리고 나면 URL이 고정되므로 수정한 동영상을 나중에 교체할 수가 없다. 기존 것을 삭제하고 다시 올리는 것이 유일한 방법이다. 유튜브 내에서 이미 올린 동영상을 수정할 수 있는 범위에는 한계가 있다. 따라서 되도록이면 완성도가 높게 만들어서 마지막이라 생각하고 업로드하는 것이 최선이다.

Audio Recording from Ubuntu Command Line - How to use PulseAudio Loopback and Null Sink (Korean)


몇 명이나 조회했는지는 아직 중요한 일이 아니다. 이를 준비하는 과정에서 내가 배운 것이 더 많았으니까. 과연 내 목소리가 정보 전달에 효율적인 '음색'과 발성 습관을 갖고 있는가? 전문 아나운서가 될 것은 아니니 목소리라는 형식보다는 전달하려는 내용에 더 충실하고자 노력하는 것이 옮겠지만, 기왕이면 보기 좋은 그릇에 담긴 음식이 환영을 받는다는 것은 너무나 당연하다.

OpenShot Video Editor를 빨리 익혀서 타이틀도 좀 제대로 달고 여러 미디어 클립을 이어서 편집하는 방법도 익혀야 하는데 진도가 도무지 나가지 않는다. 지켜야 할 마감일이 있는 것도 아니니 즐긴다는 기분으로 하면 어떠하랴? '프로페셔널 스튜던트'가 되면 좀 어떠한가?

오늘 점심시간에 들른 서점의 신간 코너에서 찍음

유튜브에는 입문자를 위한 OpenShot tutorial이 무척 많이 올라와 있다. 그 중에서 초보자를 위한 짧은 것 하나(예: OpenShot Video Editor - Tutorial for Beginners in 10 Minutes!)를 반복해서 보면 웬만한 기초는 터득할 수 있을 것이다. 텍스트로 만들어지는 타이틀은 실제로는 벡터 그래픽 편집기인 Inkscape를 경유하여 만들어진다.





2021년 2월 18일 목요일

Kazam을 이용한 데스크탑 녹화 연습

RecordMyDesktop이라는 화면 녹화용 프로그램을 잠시 써 보았었다. 녹화된 화면을 재생할 때 움직이는 창이 마치 계단처럼 깨져 나오는 현상이 있었다. 다른 프로그램을 쓰면 혹시 개선되지 않을까 생각이 들어서 Kazam이라는 것을 설치해 보았다. 훨씬 양호하다!

MXL Tempo USB 마이크로폰을 연결하여 혼자 중얼거리면서 화면(1366x768라는 기괴한 해상도... 관련글)을 녹화해 보았다. 총 길이는 4분 26초이고 mp4 파일로서 25.4 MB. KBS Classic FM을 켜 놓은 상태에서 녹음을 했더니 유튜브 재생음과 더불어 배경음악이 이중으로 깔린다.

구글 드라이브 사용량은 업로드 전 63.8 MB였는데 업로드 후 줄지 않은 것으로 보아 이를 잡아먹지는 않은 것 같다. 파일의 해상도와 길이가 일정 기준 이하이면 구글 드라이브를 차지하지 않는 것으로 보인다. Gretchen Siegchrist라는 사람이 2020년 1월에 올린 글 Blogger: Using Video on Your Blog에는 구글 블로그(블로거)에 올릴 수 있는 동영상에 관한 정보를 설명하였다.

  • 포맷: mp4, wmv, mov 등 
  • 가로나 세로 어느 하나라도 2,048 픽셀을 넘지 않고 재생 시간이 15분 이내라면 구글의 무료 저장 용량(15 GB)에 합산되지 않음
  • HD(high-definition) video의 용량을 줄이려면 1280x720의 화면비를 지킬 것
흔히 말하는 HD는 1280x720(16:9)으로서 720p라고도 부른다. 화소의 수는 100만에 약간 못미친다. 'p'는 순차주사방식, 즉 progressive scan을 의미한다. 


동영상의 파급 효과는 유튜브가 더 크겠지만 아직 준비가 부족한 상태라서 당분간은 블로그에만 올려 보고자 한다. 얼굴이 나오지 않으니 녹화할 때의 부담감이 훨씬 덜하다^^ 

리눅스에서 펄스오디오를 쓰는 요령에 대한 국어 자료(텍스트, 동영상 전부)가 상당히 부족하다는 것을 알게 되었다. 만약  내가 유튜브에 올릴 동영상을 진지하게 만들게 된다면 이것이 첫 번째 주제가 되지 않을까?

2021년 2월 15일 월요일

돈만 내면 뭐든지 관리해 주는 시대 - 'AI 초학습' 이야기

요즘 TV를 켜면 너무 많이 나와서 짜증을 불러 일으키는 광고가 있으니 바로 커블밀크T이다. 국민 정신을 개조라도 하려는 듯, 엄청난 마케팅 비용을 쏟아붓고 있음을 느낄 수 있다. 커블은 마치 모든 의자에는 자기네 제품이 하나씩 올라가 있어야 한다고 세뇌를 하는 것 같다. 아이들 의자, 부모님 의자를 거쳐 이제는 사무용 의자까지 목표로 삼은 모양이다.

설 연휴 기간 동안 JTBC 교육특집 투모로우 클라스에서는 'AI 시대 초학습이 온다'는 제목의 방송을 하였다.

프로그램이 시작되기 전 나오는 안내문에서는 간접 광고가 포함되어 있다고 하였다. 그래서 출연자 앞에 특정 기업의 음료수라도 놓여 있을 것으로 생각을 하였다. 그런데 그런 수준이 아니었다. 발표자로 나온 교수가 시작 부분에서부터 신산업 관점에서의 비대면 학습을 지나치게 강조하는가 싶더니, 결국 프로그램의 주요 내용은 요즘 TV에서 줄기차게 광고를 하는 '밀크T'를 홍보하기 위한 프로그램이나 다를 바가 없는 것이었다. 방송 중간을 끊고 나오는 광고 역시 밀크T였다.

밀크T가 도대체 뭘까? T라는 알파벳이 들어 있어서 처음에는 SK텔레콤에서 만든 교육 서비스라고 생각을 했었다. 알고 보니 교과서를 만드는 천재교육(이 기업 이름은 교육이 당면한 목표를 잘 반영하고 있는가? 고등학교 때 해법수학 참고서를 만들던 그 회사이다)이 SK텔레콤과 제휴해서 만든 학습 관리 서비스가 밀크T이다. 회비를 납부하면 교재와 태블릿이 제공되고, 이를 이용하여 학습 관리를 받는 것이다. 전담 교사가 꼼꼼하게 매니저 혹은 코디네이터 역할을 한다. 그런데 나무위키에서 밀크T를 검색해 보고는 실소를 금할 수 없었다. 밀크T용으로 제공되는 태블릿은 일반적인 인터넷 이용이 되지 않도록 펌웨어 혹은 소프트웨어 수준에서 차단이 되어 있는데, 이를 뚫는 방법에 대한 설명이 나무위키에 매우 상세하게 나오고 있었다. 

투모로우 클라스에서는 구체적으로 회사 명을 밝히지는 않았지만(물론 방송을 보고 나면 다 알 수 있는) AI를 이용하여 학습용 소프트웨어 및 콘텐츠를 개발하는 부서를 소개하였다. 기업이 이렇게 알아서 잘 준비를 하고 있다는 느낌을 주기에 충분하였다. 코로나 팬데믹 시대에 전통적인 대면 교육이 어려우니 새로운 기술이 그 빈틈을 채우기 위해 노력하고 새로운 소비('산업'이라고 해 주자)를 창출하는 것은 피할 수 없다고 하자. 하지만 이것이 자발적이고 창의적인 학습 습관을 기르는 데에는 얼마나 도움이 될까? 기술과 플랫폼을 갖고 있는 교육테크 기업의 '소비자'가 되어 버린다면 능동적인 학습을 하기가 오히려 어렵다고 생각한다. 만들어진 프로그램 안에서 얼굴을 들이대고 터치만 할 뿐이다.

코세라(Coursera) 등 대규모 온라인 교육(MOOC, Massive Open Online Course)가 지식의 저변 확대에 크게 기여한 점은 인정한다. 여기에서는 인터넷이라는 기술을 전통적인 교육 전달의 방법에서 한 매개체로 매우 잘 활용하고 있다. 평가나 피드백 등이 중요한 어학 교육이라면 현재 나온 기술을 조금 더 활용하는 것은 좋은 일이라 생각한다. 그러나 세상을 바라보는 훈련을 해 나가는 어린 아이들에게 태블릿을 쥐어주고 학습 관리를 받게 만드는 것이 과연 옳은 일인지는 잘 판단이 서지 않는다.

이미 요즘 아이들은 사전을 잘 찾지 못하고 글씨도 잘 쓰지 않는다. 방송에 소개된 그 회사에서는 아이들이 쓴 손글씨를 인식하여 디지털화하는데 첨단 AI 기법을 쓰고 있었다. 이를 자랑삼아 이야기할 수는 있겠지만, 이러한 기술이 완전히 뿌리를 내린다면 정갈한 글씨를 쓰기 위한 노력을 누가 할 것인가? 다소 딱딱한 음식을 공들여 씹고, 손가락을 놀려서 글씨를 쓰거나 악기를 익히고... 이런 노력 자체가 뇌의 발달을 비롯하여 교육 및 인간 관계 형성에 얼마나 중요한지를 망각해서는 안 된다. 이제 아이들이 도서관에 가서 지식을 찾는 방법은 이미 모른다고 해도 과언이 아닐 것이다. 아마 기술 옹호론자들은 이렇게 말할지도 모른다. 책을 뒤적이고 손으로 글씨를 쓰는 전통적인 방법은 이제 다 버려야 한다고. 손글씨를 익히기 전에 키보드나 태블릿으로 글씨를 입력하는 방법을 먼저 배워야 한다고. 아무리 악필이라 해도 AI가 다 인식을 해 주고, 말로 녹음을 해도 텍스트로 정확하게 전환이 되니 무슨 상관이냐고.

공유 경제 시대는 제대로 뿌리내리지 못하였고, 이제는 구독(subscription) 경제 시대라고 한다. 월정액만 내면 뭐든지 할 수 있는 시대가 되었다. 자동차도 소유할 필요가 없고, 알아서 비만 관리도 해 주고, 아이들의 학습 관리도 해 준다. 관심과 노력을 돈과 바꾸는 시대이다. 얼마나 편리한가? 그렇다면 그렇게 하여 남는 시간에 뭘 하겠다는 것인가? 더욱 가치 있는 일을 할 수나 있을까? 결국 남는 시간에는 스마트폰이나 문지르고 주식 시황판만 들락거릴 것이 뻔하지 않은가?

기술은 스마트해지는데 사람은 그렇지 않다.

2021년 2월 14일 일요일

GenoGlobe 로고를 새로 만들다

사용에 제약이 없는 지구 이미지와 내가 만든 그림을 포함하여 대충 만들어서 한동안 쓰던 GenoGlobe 로고는 다음과 같다. 지나치게 복잡한 감이 없지는 않다.

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


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




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)를 헤드폰으로 루프백하는 것이 핵심이다. 음... 이건 좀 이해가 갈 것 같다.

 

2021년 1월 25일 월요일

[우분투의 사운드와 MIDI] USB 기기를 새로 꽂을 때 입출력이 자동 전환되는 것이 싫다면

컴퓨터에 가장 나중에 꽂은 USB 사운드카드로 입출력이 자동 전환되는 것은 사용자를 위한 매우 자연스러운 배려라고 할 수 있다. 하지만 때로는 이러한 기능이 불편할 수도 있다. USB 포트에 새로운 기기를 꽂더라도 이미 꽂혀 있는 장비로 계속 소리가 나게 만들고 싶다면, PulseAudio의 설정 파일을 고치면 된다.

안전을 위해 /etc/pulse/default.pa를 ~/.config/pulse/default.pa로 복사하고 다음 라인을 전부 코멘트 처리하여 무력화한다. module-switch-on-connect를 쓰지 않게 하는 것이다.

### Use hot-plugged devices like Bluetooth or USB automatically (LP: #1702794)
#.ifexists module-switch-on-connect.so
#load-module module-switch-on-connect
#.endif

PulseAudio를 재시작하기 위해 'pulseaudio -k'를 실행한다. PulseAudio는 기본적으로 계속 새로 실행되도록 설정이 되어 있으므로, 이 명령을 통해 프로세스를 죽여도 설정 파일에 오류가 없다면 다시 작동한다. 또한 PulseAudio는 사용자 레벨에서 작동하는 서비스라서, 설정을 바꾼다고 해서 재부팅을 할 필요가 없다. 로그인을 다시 하거나, 'pulseaudio -k'를 실행하는 것으로 충분하다. 여기까지 실행했다면 음악 재생 중에 두 번째 USB 사운드카드를 꽂아도 음성 출력은 기존에 연결된 장비에서 계속 흘러나올 것이다.

module-switch-on-connect을 다시 로드하고 싶다면 명령행에서 다음을 실행한다. PulseAudio를 재시작할 필요가 없다.

$ pactl load-module module-switch-on-connect
27

빈 줄을 포함하여 default.pa의 길이는 151줄이나 된다. 언젠가는 그 기능을 전부 이해하고 활용하는 것이 가능할까?

2021년 1월 23일 토요일

[우분투의 사운드와 MIDI] USB 마이크로 들어온 신호를 다른 USB 오디오 인터페이스로 보내기

다음은 2020년 1월 24일 현재의 장비 연결도이다(원본 링크). Alesis NanoPiano는 평소에는 잘 연결하지 않는다. 이렇게까지 하면 설치 작업이 너무 귀찮아지기 때문이다. NanoPiano는 키보드 콘트롤러와 오디오 앰프만을 연결하여 그냥 가볍게 연주할 때에나 가끔 사용한다.

 

JACK을 이용하여 USB 오디오 인터페이스에서 약간 심각한 수준의 음악 작업을 가능하게 만드는 나의 스크립트 audio.qsynth는 계속 시행착오를 거쳐서 꽤 쓸모가 있는 것으로 발전하였다. 내가 쓰는 글에서는 오디오 인터페이스와 사운드 카드를 특별히 구별하지 않는다.

이 스크립트에서는 오디오 인터페이스가 연결·인식된 상태인지 확인하여 jackd를 실행하고, 이어서 Qsynth를 실행한다. 필요하다면 qjackctl와 pavucontrol을 나중에 실행하면 된다. 외부 MIDI 기기, 즉 keyboard controller나 sound module을 연결하여 사용하려면 'a2jmidid -e' 명령을 실행한다. a2jmidid 또는 a2j 명령을 사용하지 않더라도 aconnect를 써서 원하는 MIDI 장비를 서로 연결할 수 있다.

USB 마이크로폰과 롤랜드 사운드캔버스 SC-D70을 동시에 컴퓨터에 연결하고 나서 어떻게 하면 음성 녹음을 편하게 할 수 있을까? 다시 말해서 이 마이크로폰이 마치 SC-D70의 입력 단자에 꽂힌 보통의 마이크로폰처럼 쓰는 것이 가능하느냐는 뜻이다. 음성 녹음은 마이크로 하고, 모니터링이나 재생시 나오는 소리는 전부 SC-D70을 통해서 들으며, 컴퓨터에서 나오는 모든 소리(software synth 포함)도 SC-D70에서 하게 만들고 싶은 것이다. USB 마이크로폰은 analog in을 꽂을 단자만 없을 뿐, 컴퓨터에서 나는 소리를 녹음하게 만드는 능력은 다른 오디오 기기와 똑같이 갖고 있다.

Pro-audio/music creation을 위해 설계된 프로그램인 JACK에서는 근본적으로 하나의 컴퓨터에서 하나의 사운드 카드만을 쓰기를 권장한다. 왜냐하면 단일한 sample clock을 기준으로 작동하는 것이 정상적이기 때문이다. 하지만 여러 사운드 카드를 장착하여 서로 조화롭게 사용하는 것이 가능하다. 

How can I use multiple soundcards with JACK?

여기에 나오는 모든 방법을 이해하기는 어려웠지만, 첫 번째 방법에서 소개한 alsa_in/alsa_out이라는 놀라운 유틸리티가 있다. Demonic Sweaters의 다음 동영상("Using multiple audio interfaces with Jack audio connection kit linux")을 참조하면 조금 더 이해하기 쉽다. Demonic Sweaters는 내가 리눅스에서 음악 작업을 위한 초보적인 설정을 하는데 많은 도움이 된 유튜버이다.

USB 마이크로폰에 할당된 하드웨어 번호('cat /proc/ascound/cards'로 확인)가 만약 2번이라 하자. USB 마이크로폰과 SC-D70을 전부 연결한 뒤 JACK을 구동('jackd -d alsa --device hw:SCD70...)한다. 실제로는 audio.qsynth 스크립트를 이용하였고, 그 후에 터미널 창에서 다음을 입력하면 그만이다.

$ alsa_in -d hw:2
WARNING: chennel count does not match (requested 2 got 1)
selected sample format: 16bit
delay = 2488

Audacity를 실행하면 입력 목록에서 alsa_in이 보인다. 이를 선택하여 녹음을 한 뒤 재생하면, SC-D70에서 소리를 들을 수 있다. Qjackctl에서 alsa_in을 system과 연결하면, 다른 애플리케이션을 실행하지 않아도 마이크로 들어온 소리를 헤드폰(SC-D70)으로 들을 수 있다.

그 과정이 Qjackctl의 connect 창에서는 어떻게 보이는지 알아보자. 다음은 audio.qsynth 스크립트를 실행한 직후이다. 


이 상태에서는 Firefox에서 재생하는 유튜브의 소리가 들리지 않는다. 그러면 PulseAudio Jack Sink 기능을 실행해 보자. Qjackctl의 connect에서는 아직 아무것도 건드린 것이 없지만 연결 상태가 달라졌음이 보인다.

이제 유튜브의 소리를 SC-D70을 통해 들을 수 있게 되었다. 이번에는 'alsa_in -d hw:2'를 실행해 본다. Connect 창의 왼편에 alsa_in이라는 것이 보인다. 이는 USB 마이크로폰으로 들어오는 음성 신호를 뜻한다.

여기까지만 해도 Audacity에서는 alsa_in이 입력측에 보이게 되니 마이크 입력을 녹음하는 것이 가능하다. Connect 창에서 alsa_in과 system을 연결한 뒤 마이크에 대고 말을 해 보라. SC-D70에서 소리가 들릴 것이다. arecord 명령으로 마이크 입력을 녹음하려면 alsa_in을 system으로 연결한 뒤에 가능하다.


오늘은 우분투에서 음악 작업을 하기 위한 상당한 수준의 기술 진보(?)를 이루었다. 지식이 부족하여 모호한 상태로 남아 있었던 부분들이 많이 해소되었다.