2020년 9월 25일 금요일

통계를 제대로 이해하기 - 코로나19 진단 키트의 성능과 관련한 유용한 글 소개

여러번 던지면 1부터 6까지의 모든 면이 정확히 같은 빈도로 나오도록 만들어진 공정하고도 '완벽한' 주사위가 있다고 가정하자. 이것을 20번 던졌을 때 1은 몇 번이 나올까? 이것을 따지는 학문은 확률이다. 반대로 각 면이 나오는 빈도를 알지 못한다고 가정하고(이를 모수[母數] 또는 parameter라 한다) 20회를 던졌더니 6이 세 번 나왔다고 가정하자. 이 관찰 결과를 바탕으로 6이 나올 빈도를 따지는 것이 통계다.

이렇듯 확률과 통계는 동전의 앞뒷면처럼 밀접한 관계가 있고, 학생 시절에도 하나의 큰 단원으로 취급하는 경우가 많다. 하지만 오늘은 주로 통계(학)에 관한 이야기를 해 보려고 한다. 통계학자와 수학자는 서로를 다른 분야에 종사하는 사람으로 취급한다는 말을 자주 들었다.

그리고 아주 잘 알려진 이런 말이 있다.

세상에는 세 가지 거짓말이 있다. 거짓말, 새빨간 거짓말, 그리고 통계.

통계라는 것이 국가적 정책의 시행을 위한 필요성을 뒷받침하거나, 시행 후 효과가 있음을 증명하는데 워낙 널리 쓰이다보니 이런 말이 생겨난 것 같다. 통계학(statistics)의 어원도 국가(states)에 학문을 뜻하는 어미(-tics)가 붙은 것이 아니던가? 말 그대로 국가를 관리하고, 인구의 생명을 담당하는데 고안된 학문이라는 듯이다(푸코읽기(2): 생체권력(biopower)을 참조하였음). 대한민국 정부에도 기획재정부의 외청인 통계청이라는 중앙행정기관이 있다.

뿐만 아니라 어떤 물건을 팔아야 하는데 효과가 있음을 보이려 해도 실험 결과의 통계학적 해석이 필요하다. 여기에 국가적 통제수단이 연결되면 그야말로 엄청난 권력이 휘둘러지고 그 물결을 잘 타는 자에게는 막대한 경제적 이득이 돌아간다. 새로운 의약품을 판매하려면 국가기관의 허가를 받아야 하고, 그러기 위해서는 전임상 및 임상 시험을 거쳐야 한다. 그 수치를 해석하고 판단을 내리는데 통계학이 필요하다.

숫자 자체는 거짓말을 하지 않는데, 그 숫자를 이용하려는 사람의 (숨은) 의도를 일반인이 쉽게 가려내기가 참으로 어렵다는 것이 문제이다. 2020년 들어서 수도권 집값이 얼마나 올랐을까? 기초 자료를 어떻게 모으느냐에 따라서 얼마든지 입맛에 맞는 결론을 내릴 수 있음을 우리는 이미 잘 알고 있다. 2020년에 서울대학교에 입학한 신입생 중에 서울 강남 출신이 많은 것과, 서울 강남으로 이사를 가서 공부를 하면 서울대학교를 잘 가는 것은 전혀 별개의 문제이다. 이러한 조사 결과를 입맛게 맞게 이용하는 신문 기사가 얼마나 많은가! 밑줄 친 부분이 만약 사실이라면, 그리고 이를 사실로 믿고 사람들이 강남으로 유입이 된다면 그만큼 사회가 공정하지 못하다는 뜻도 된다.

브런치에 소개된 글 하나를 먼저 가벼운 마음으로 읽어보자.

통계의 거짓말(게스트 보스바흐 외)

2019년 말, 중국 후베이성 우한시에서 SARS-CoV-2 감염증(COVID-19) 환자가 처음 발생한지 아직 만 1년이 되지 않았다. 그러나 이 감염증은 전세계를 강타하여 많은 사람들을 고통스럽게 하고 있으며, 지금까지 당연하다고 여겼던 생활 관습을 완전히 바꾸어 놓았다. 비교적 관리가 잘 되고 있다는 한국에서 만들어진 진단 키트도 인기리에 외국에 팔려 나가고 있는데, 최근 랩지노믹스라는 국내 회사의 키트가 가짜 양성이 많다면서 논란이 일고 있다. 

코로나 진단키트 美서 사용중지 논란...랩지노믹스 "키트 성능 문제 없다"

이 문제를 제대로 이해하려면 조금 어렵더라도 대상을 양성과 음성 두 가지로 판정하는 시스템의 평가 방법에 관한 공부를 해야 한다. 나도 2017년에 민감도와 특이도(sensitivity and specificity)라는 글을 블로그에 올린 적이 있었다. 간단히 설명하자면 민감도는 병에 걸린 사람이 양성 판정을 받을 확률이고, 특이도는 건강한 사람이 음성 판정을 받을 확률이다. 그리고 정밀도(precision, 또는 양성예측도positive predictive value)은 양성으로 판정된 사람 중에서 진짜 병에 걸린 사람의 비율이고, 재현율(recall)은 진짜 병에 걸린 사람 중에서 양성으로 판정된 사람의 비율이다. 재현율은 민감도를 일컫는 다른 표현이다.

일반인이 읽는 매체에 다음과 같은 글이 실리게 될 정도니 코로나19가 매우 실용적인 공부 - 확률과 통계의 매우 중요한 개념 - 를 시켜주고 있는 셈이다. 

[경향신문] 전문가의 세계 - 이종필의 과학자의 발상법(8) 코로나19 감염자를 양성으로 판정할 확률, 양성으로 판정됐을 때 실제 감염됐을 확률... 비슷한 이 두 문장, 완전 다르다

종이와 연필을 들고 찬찬히 계산을 해 나가면서 이 기고문을 읽어보자. 나처럼 정성적인 사고에 젖어있는 편향적인(?) 자연과학자의 시각을 바로잡는데 도움이 될 것이다.

2020년 9월 22일 화요일

또 건반이! M-AUDIO Keystation 88es

아내와 함께 저녁을 먹고 동네 한 바퀴를 거닌 뒤 집에 올라가려는데 쓰레기 버리는 곳에 뭔가 익숙한 물체가 보였다. M-AUDIO의 MIDI 마스터 키보드였다. 햇볕을 많이 받아서 흰 건반이 누렇게 변색이 되었지만 특별히 파손된 곳은 없어 보였다. 지난 여름에 구입한 iCON iKeyboard 5Nano보다는 건반의 수가 많으니 쓸모가 있겠다 싶어서 일단 들고 왔다. 건반이 길어서 생각만큼 아주 가볍지는 않았다.

물걸레로 먼지를 닦아내고 USB 케이블로 노트북 컴퓨터(우분투)에 연결하였다. 음원은 컴퓨터를 경유하여 롤랜드 SC-D70을 연결하였고, aconnect 명령어를 입력하여 컴퓨터에서 잘 인식이 되었는지를 확인해 보았다.

그런데 88es라는 표시가 화면에 나타났다. 엉? 88 건반이었단 말인가? 그렇다! M-AUDIO Keystation 88es였던 것이다. 76 건반이 아닐까 생각하고 들고 왔는데 88 건반이었다. 모든 건반을 하나씩 다 눌러 보았다. 소리가 나지 않거나 벨로서티가 튀는 건반은 없었다. 타건감도 소프트 건반치고는 적당히 묵직하고 쫀득한 것이 나쁘지 않았다. 제조사 웹사이트를 통해 찾아보니 M-AUDIO Keystation 시리즈는 49-61-88 제품이 나오지만 76 건반은 없었다. 현재 M-AUDIO에서 생산되는 88 건반 제품은 검정색의 Keystation 88 MK3이다. M-AUDIO의 모든 키보드 콘트롤러 목록을 보려면 여기를 방문해 보라.




외관이 이 정도의 상태로 낡은 건반이지만 접촉이 안되는 키는 없었다. 얼마 쓰지 않고 소리가 나지 않는 키의 수가 점점 늘어났던 나의 Fatar SL-990 건반이 생각이 났다. 대전 사무소에 팽개쳐 놓고 수리를 하겠다고 rubber contact까지 구입해 놓았지만 3년 가까이 아직 손을 대지 않고 있는데(관련 글 링크) 이런 시점에 비록 단종된 모델이지만 88 건반을 새로 얻게 되다니!

다음으로는 MIDI 케이블을 이용하여 음원 모듈에 직접 연결을 해 보았다. USB 케이블로 컴퓨터에 연결을 할 때에는 자동으로 전원이 공급되지만, MIDI 케이블을 쓸 때에는 직류 9V 어댑터를 꽂아야 한다. 마침 갖고 있는 어댑터는 6V와 12V가 전부이다. USB 케이블을 휴대폰 어댑터에 꽂으면 전원이 공급될 것으로 생각하여 테스트를 해 보니 당연히 잘 작동한다. 


88 건반에 피아노 모듈! 잘 어울리는 조합이 아닐 수 없다. 진공관 앰프 세 대에 건반 두 대를 갖춘 비좁은 방구석 스튜디오의 공간 재배치를 고민할 시점이 되었다.

2020년 9월 20일 일요일

미디라이프 반주기 ML-20의 활용 방안을 알아본다

우연히 구한 MIDI 장비의 활용 방안을 벌써 3개월째 궁리하고 있다. 롤랜드 SC-D70은 노트북 컴퓨터에 연결하여 오디오 인터페이스 및 사운드 모듈로서 아주 잘 활용하고 있다. 그러나 국산 반주기인 ML-20은 마땅한 활용 방안을 아직 찾지 못하였다. 내가 라이브 연주를 다녀야 하는 연주인이 아니므로 이 장비를 반주기 자체로 사용할 이유는 전혀 없다. 현재로서는 반주기로 쓰는 것도 불가능하다. 제조사인 미디 라이프(주)는 이미 문을 닫았고, 이를 구동할 프로그램을 지금 구하는 것도 어렵다. 프로그램을 구한다 해도 실행 가능한 운영체제와 병렬포트가 갖추어진 구식 컴퓨터를 일부러 맞추어야 한다. DOS나 윈도우 9x에서만 돌아가는 고전 게임에 대한 추억을 가진 사람은 레트로 PC를 일부러 꾸미기도 하겠지만,.

 
2016년 네이버 중고나라 카페에  올라왔던 미디라이프 반주기(노트북 컴퓨터 포함)의 판매 글을 보면 작동 프로그램 화면이 어떠했는 지를 짐작할 수 있다. 이 기기에 대한 정보를 인터넷에서 찾기는 여간 어려운 것이 아니다.
반주기에 포함된 음원 보드만을 빼내서 전원, MIDI IN 신호 및 오디오 출력 선을 연결하면 간이 MIDI 음원으로 사용할 수 있지 않을까? MIDI IN 단자에서 신호를 뽑아내는 회로를 꾸미기는 쉽다.
 


네이버 도스박물관 카페(일명 도박동)에서는 중고 노래방 기계에서 빼낸 음원 보드를 이용한 MIDI 재생 성공 사례에 관한 글이 간간이 보인다. 나의 것과 동일한 신시사이저 칩인DREAM SAM9073을 사용한 금영 노래방 기계의 보드에 달린 10핀 커넥터의 연결 방법은 다음과 같다. 내 음원보드의 웨이브 ROM은 GMS963200-B로서 금영 기기의 것과는 다르다.
 
  1. VCC
  2. GND
  3. GND
  4. RESET
  5. MIDI
  6. +12V
  7. A-GND
  8. A-RIGHT
  9. A-GND
  10. A-LEFT
내 반주기에 들어있는 음원 보드 역시 10핀 커넥터가 달린 상태이고 아날로그 출력은 한쪽에 몰려 있다. PCB를 만든 회사는 다르지만 커넥터 핀 배열은 동일할지도 모른다 생각하고 예전에 찍은 사진을 자세히 살펴보았다.
 

오른쪽 아래의 밝은 노란색 칩이 옵토커플러에 해당한다. 여기에 납땜된 갈색(옅은 빨간색?) 케이블이 MIDI 신호일 것이다. 그런데 이 케이블은 10핀 커넥터의 왼쪽 두 번째 핀에 연결된다. 핀 배열이 아예 다르다는 뜻이다.  하네스 케이블을 뽑으면 PCB에 설명이 인쇄되어 있을까? 그렇지 않다면 멀티미터와 오실로스코프로 찍어서 조사를 해 봐야 한다. 이것이 2020년 4분기를 위한 취미 프로젝트가 될 것이다.

반주기 본체에 AC 파워 소켓과 DC 9V 입력 단자가 같이 있는 이유를 잘 모르겠다. 영상 신호까지 내보내려면 9V 어댑터로는 전력이 부족할지도 모르겠다.

음원 보드를 찍은 사진을 확대하여 보자. 정사각형의 DREAM SAM9703 신시사이저 칩이 보인다. 왼쪽 아래의 GMS963200-B는 PCM 방식의 사운드 샘플을 저장한 ROM이다. 오른쪽 위의 작은 칩은 SAM9703이 만들어낸 디지털 음성 신호를 아날로그로 전환하는 칩이다. 이 음원을 SC-88이라고 광고한다면 이는 분명히 과대 광고에 해당할 것이다.


SAM9703의 데이터 시트에서 추출한 연결 개념도를 보자. 소리의 질을 가장 크게 좌우하는 것은 어느 부품일까? 결국은 CODEC(digital-to-analog converter)일까? 아니면 웨이브 롬?


2020년 9월 28일 업데이트

ML-20 반주기에 장착된 이 음원보드의 입출력 단자 정보를 알아내어 외장 사운드 모듈로 재활용하는 것을 2020년 4분기의 취미 프로젝트로 결정하였다. 이른바 DREAM 프로젝트의 시작을 선언한다. 성공 가능성은 불투명하다.

 


2020년 9월 19일 토요일

[독서 기록] 초격차, 경제

중고 서적을 파는 알라딘 매장에 가면 출간된 지 1-2년 이내의 책을 모은 서가가 있다. 신간에 가까운 책을 사기 위해 이곳을 둘러보다가 유난히 같은 종류의 책이 많이 꽂힌 것을 발견한다. 왜 이렇게 한꺼번에 많이 중고 시장에 나왔을까? 혹시 무리하게 시장에 너무 많은 양이 풀렸다가 중고 책방에 다시 모인 것은 아닐까? 별로 소장할 가치가 없다는 생각에 되도록 빨리 읽은 다음 깨끗한 상태일 때 되팔려고 한 것은 아니었을까? 예를 들어서 기성 정치인 또는 정치에 입문하려는 사람이 선거일을 앞두고 출판 기념회 및 후원회 성격의 행사를 갖는 일이 많다. 이런 자리에서 팔렸거나 혹은 뿌려진 책이 계속 소장할 만한 책으로 여겨져서 누군가의 책장에 계속 꽂혀 있기를 기대하기는 어렵다.

나는 책을 사면 구입한 날짜와 이름을 꼭 쓰는 편이다. 중요한 곳에 줄을 치기도 한다. 그런데 중고서점에서 깨끗한 책을 보게 되면, 나중에 되팔게 될 것을 감안하여 되도록 깨끗하게 보는 것이 더 현명한 것일지도 모르겠다는 생각을 하게 된다.

어찌 되었든 중고서점에 같은 책이 여러 권 꽂혀있는 것을 보면 저 책들은 깊이 있게 읽을 책이 아닐지도 모른다는 생각이 드는 것은 사실이다. 삼성전자 회장까지 한 사람이라면, 그가 몸담았던 조직 안에서 기꺼이 그 책을 읽으려는 움직임도 있겠지만 선택의 여지 없이 그 책을 사야 하는 사람도 있었을 것이다. 어쩌면 이러한 생각은 편견일 수도 있다. 저자 소개를 보면, 이 책('초격차')을 쓴 사람이 삼성전자를 이끌면서 인텔을 제치고 세계 반도체 1위 기업에 오른 것은 2017년이었고, 이 책이 발간된 것은 그가 회장직을 물러난 다음인 2018년이었기 때문이다. 즉 현직에 있으면서 영향을 크게 미칠 시기를 비켜나서 책을 낸 것이다. 그럼에도 불구하고  9월 10일에 초판 1쇄를 찍었는데 불과 보름 만에 36쇄를 찍은 것을 보면 말 많은 사람들이 이 책을 사서 보았다는 뜻이 된다.

그러한 의구심을 갖고서 지난 토요일 책 두 권을 구입하였다. 그러나 그것은 기우였다.

  • 넘볼 수 없는 차이를 만드는 격《초격차》| 전 삼성전자 회장 권오현 지음
  • 경제로 보는 우리 시대의 키워드《경제e》| EBS 지식채널e 지음

현상 유지 정도로는 불충분하고, 남들이 따라올 수 없을 정도로 앞서가지 않으면 기업의 생존 자체가 불투명하다는 최소한 기업 활동에서는 참으로 여겨지는 것 같다. '초격차'라는 제목만 놓고 보면 이를 이루기 위해서 '월화수목금금금' 생활을 하라는 건지 벌써 가슴이 답답해지려는 느낌이 들 것이다. 그러나 이 책을 읽어보면 실제로 그런 압박감을 주지는 않는다. 리더, 조직, 전략, 그리고 인재의 네 단원으로 구성된 이 책은

소위 워라밸의 가치를 존중하게 되면서 개인의 생활도 이렇게 밀어붙여야만 한다는 빡빡한 이야기를 하고 싶지는 않다. '초격차'라는 제목만 놓고 보면 '월화수목금금금' 생활을 하라는 건지 벌써 가슴이 답답해지려는 느낌이 들 것이다. 그러나 실제로는 그렇게 압박적인 느낌을 주는 책은 아니다. 리더, 조직, 전략, 그리고 인재의 네 단원으로 구성된 이 책은 저자의 경험에서 체득한 경영의 원리를 담담하고도 부드러운 문제로 써 내려가고 있다. 일반 사원(연구원)으로 입사하여 약 30년을 거치면서 국내 정상급 기업의 최고 책임자가 되어 그 조직을 세계 최고 수준으로 만들어 나가는 과정에는 얼마나 비밀스런 요령이나 책략이 숨어 있었을까? 그렇지는 않다. 결정과 지시는 일방적인 상식에 근거하라는 것이 그의 주장이다(290쪽).

형식적으로는 네 개의 주제로 되어 있지만 가장 중요한 것은 리더에 관한 것이었다(최소한 나에게는 그렇게 읽혔다). 나머지 세 주제, 즉 조직을 구성하고 전략을 수립하며 인재를 잘 키우고 적재적소에 배치하는 것은 결국 리더의 일이기 때문이다. 유능한 리더는 미래를 대비해야 한다. 즉, 그가 물러났을 경우 조직의 역량이 와해된다면 안된다는 뜻이다. 자기를 대신할 수 있는 후배를 양성하는 것(그에게 왕좌를 물려주겠다는 것은 아니며, 그럴 수도 없고 그래서도 안된다)도 리더의 일인 것이다. 그러나 많은 리더는 어떠한가? 자기가 자리에서 물러났을 때에는 조직이 잘 굴러가지 않게 자기에 대한 의존성을 재임 기간 중 더 많이 구축하려는 것이 인지상정 아니었던가? 마치 재선을 지상목표로 여기는 정치인들처럼.

저자가 생각하는 인재('인력'이라고 하는 것이 나을 것이다)의 유형은 다음의 네 가지이다. 아래로 갈수록 조직에 위험함은 말할 나위도 없다. 3-4 유형은 인재라고 할 수도 없겠다.

  1. 선제적이고 적극적인 사람
  2. 개선 의지가 있고, 반응하는 사람
  3. 소극적이고 무기력한 사람
  4. 방어적이고 방해하는 사람

만약 조직이 생존의 위기에 놓인 상태라면 3이나 4 유형의 인력은 어떻게 해야 하는가. 269쪽에서는 이 책의 전체에 걸쳐서 가장 심각하고도 단호한, 어찌 보면 잔인한 내용이 나온다. 그 사람을 재교육(repair)할 것인지, 제거(remove)할 것인지, 아니면 교체(replace)할 것인지를 결정해야 한다는 것이다. 저자 자신도 사람을 부품으로 간주하는 것 같아서 이런 이론을 공공연하게 사용하지는 않는다고 하였다.

《초격차》라는 제목은 썩 어울리지 않는다고 생각한다. 마치 '무엇이 삼성을 글로벌 기업으로 만들었나?'의 해답을 주기 위해 쓴 책처럼 보이기 때문이다. 무노조 경영, 관리의 삼성, 미래전략실... 삼성의 성공을 이끈 요인으로서 만약 이런 부정적 이미지가 자꾸 떠오른다면 그건 불행한 일이지만 삼성이 자초한 일이기도 하다. 조직의 리더로서 갖추어야 할 전략과 추진 방법에 관한 지침서로서, 삼성이라는 편견을 거두고 읽는다면 매우 좋은 책이라고 평가하겠다.

그리고 삼성이 반도체로 세상을 평정하게 된 그 시발점에는 강기동 박사라는 분이 있었음을 기억해야 할 것이다.

라디오 땜질하는 이분, 한국 반도체의 뿌리입니다 (여기에서 라디오란 방송용 라디오 수신기가 아니라 통신용 무전기를 뜻한다)

한국 반도체 산업의 산증인 강기동 박사, 자서전 출간

2020년 9월 16일 수요일

신종 코로나바이러스(SARS-CoV-2)가 인위적으로 만들어졌을 가능성이 크다는 논문이 공개되다

홍콩 출신 옌리멍(Li-Meng Yan) 박사가 Zenodo라는 오픈 엑세스 저장소에 드디어 신종 코로나바이러스의 기원에 관한 논문을 올렸다. 게재일은 2020년 9월 14일이다. 몇 시간 전 발표된 뉴스를 보고 알았으니 그렇게 빨리 알게 된 것도 아니다.

Unusual Features of the SARS-CoV-2 Genome Suggesting Sophisticated Laboratory Modification Rather Than Natural Evolution and Delineation of Its Probable Synthetic Route 

DOI

신종코로나바이러스의 유별난 유전체 구조는 자연적인 진화가 아니라 실험실에서 이 바이러스를 만들었음을 제안하고 있으며, 약 6개월이 걸릴 것으로 추정되는 바이러스 제조 과정도 제시하고 있다. 

특히 스파이크 단백질에 존재하는 독특한 furin-cleavage site는 자연계에 존재하는 이 계통의 코로나바이러스에는 없는 것인데, rare codon이 연관되어 있다는 것은 이 바이러스가 자연적으로 진화하여 만들어진 것이 아니라 실험실에서 만들어졌을 가능성이 매우 높다는 것이다. 모체가 될 수 있는 박쥐 코로나바이러스 ZC45의 유전체에는 없는 두 개의 제한효소 절단부위(EcoRI & BstEII)가 있어서 수용체 결합 부위(receptor-binding motif, RBM)을 편리하게 교체할 수 있는 형태로 되어 있다는 것이다.

상당히 설득력이 있다. 찬찬히 읽어보기 위해 논문을 인쇄해 놓았다. 정말 군사 실험실에서 만들어진 것이 실수로 유출되어 전세계를 괴롭히고 있는 것이 사실이라면? 그 천문학적 피해에 대한 책임을 어떻게 질 것인가?

여기까지 쓰고 나서 BRIC에는 어떤 의견이 있는지 들어가 보았다. 별로 이슈가 되지 못하고 있었다. PDF 파일을 받아서 5분 읽어보고 시간 낭비였었다는 글을 남긴 이도 있었다. 그럼 인쇄까지 한 나는 종이만 낭비한 것일까? 다만 '매드 사이언티스트'라는 별명으로 알려진  과학자이자 저술가 및 컨설턴트인 남궁석 박사가 쓴 글이 링크되어 있어서 이를 소개한다.

바이러스를 인위적으로 뜯어고쳐 인위적으로 SARS-CoV-2를 만드는 것은 가능한가? 

비속어가 좀 많아서 읽기에 썩 편하지는 않다.  결론은 'X나 어렵고 그럴 목적도 없다'로 내려졌다. 사실 Yan 박사의 주장이 사실이기를 바라는 사람이 무척 많을 것이다. 사실인 것, 사실이라고 믿는 것, 그리고 사실이라고 믿고 싶은 것은 조금씩 다른 상황이다. 이 주장이 사실이면 드디어 비난할 대상이 생기고, 특정 국가를 불량 국가로 만들려는 노력에 큰 힘을 실어주게 된다. 

바이러스학 전문가가 아니라서 이것을 세포에서 배양하거나 알지도 못하는 실험동물 숙주를 찾아내는 것이 얼마나 어려운지는 잘 모른다. 하지만 배양을 반복해서 저 정도의 차이를 이끌어 내느니 차라리 핵산을 화학합성하면 되지 않을까? 미국 JCVI에서 화학적으로 합성한 핵산을 이용하여 JCVI-syn1.0이라는 'synthetic cell'을 만들어 낸 것이 벌써 10년 전이니 말이다.

또한 Yan은 SARS-CoV-2와 가장 유전체 염기서열이 가까운 RaTG13(GenBank NM996532.1) 은 실제로 존재하는 지 매우 의심스럽다고 하였다. SARS-CoV-2의 기원을 분석하려는 이들에게 혼동을 주기 위해 가짜로 만든 서열을 등록했을 것이라는 이야기이다. 지나친 음모론인가...

Peer-reviewed journal에 실리지 않은 논문은 꼭 수준이 떨어지거나 엉터리 주장을 하기 위한 것은 아니다. 동료 심사를 거치는 일반 저널에는 투고된 논문이 최종적으로 공개되기까지 너무 시간이 많이 걸리기 때문이다. bioRxiv에는 일반 논문에 투고한 원고를 같이 올려서 공개함과 동시에 인용 가능한 DOI 번호를 먼저 확보할 수 있다. 이는 중복 투고로 간주되지 않는다. Zenodo라는 새로운 공개 저장소를 알게 되었고, 같은 세부 분야는 아니지만 세상 돌아가는 일과 관련한 학술적인 정보를 접할 수 있어서 흥미로왔다.

2020년 9월 17일 업데이트

국외 매체에는 이 논문에 대하여 회의적인 시각이 많은 것 같다.

그렇지만 자기 주장을 트위터에 올린지 불과 이틀만에 차단을 당한 것은 매우 석연치 않다. 

Chinese Whistleblower Li-Meng Yan Gets Twitter Ban After Publishing 'Man-Made COVID-19' Report —Finds Support from US Army Doctor

친절한 Torsten Seeman의 새로운 프로그램, Shovill assembler

호주(오스트레일)는 나에게 무엇을 주었나... 지난 주말에는 맛있는 빵을 주기도 하였다. 사진에서 소개한 빵집 멜버니안 베이크하우스는 호주인 남편이 열심히 빵을 만들고 한국인 아내가 손님을 맞는다. 고기가 들어간 파이는 인기가 있어서 일인당 네 개까지만 구입할 수 있다. TV 방송에 나온 뒤 꽤 유명해졌다고 한다.




오스트레일'려'라고 쓴 것은, 청소년 시절에 매우 흥미롭게 읽었던 전파과학사의 현대과학신서 《우리가 처음은 아니다 - 고대 과학의 수수께끼(1977년 초판 발행)》의 저자인 A. 토머스의 소개에 나온 표현 때문이었다. '오스트레일 사람으로 널리 여행을 했고...'라는 글귀가 아직도 생각이 난다. 나는 고대에 뭔가 대단한 수준의 과학기술이 있었을 수도 있다는 낭만적인 상상을 하는 사람이다. 그레이엄 핸콕의 《신의 지문》도 아주 흥미롭게 읽었다. 두꺼운 얼음 더미 밑에 깔린 남극의 땅에 뭔가 놀라운 유적이 남아 있을지도 모른다. 신석기 시대에 만들어진 괴베클리 테페 유적을 보아도 호기심이 막 자극되지 않는가? 농업이란 개념조차 없던 시절, 도대체 어떻게 사람들을 끌어모아서 이런 거대 유적을 만들었단 말인가? 우리가 배운 바로는 농경사회가 되면서 잉여 농산물이 생기고, 비로소 사람들을 부릴 수 있는 권력 및 계급이 생겼다고 했는데 말이다. 나에게 임금을 줄만큼 부유하거나, 말을 듣지 않으면 잡아다 가둘 수 있는 권력자가 있지도 않은 시절에 사람들이 그저 자발적으로 모여서 심심풀이로 이런 시설을 만들었단 말인가? 그렇게 주장하는 사람이 있기는 하다.

호주 사람인 Torsten Seeman(GitHub)은 그가 개발한 Prokka만으로도 이미 유전체 및 생명정보 학계에 크게 기여를 했다. snippy도 그러하다. 그런데 SPAdes를 핵심으로 하는 small genome용 일루미나 read 전용 assembler인 Shovill이라는 것을 또 만들어냈다. 그러보 보니 UniCycler, Bandage, Filtlong 및 Porchop 등을 개발한 Ryan Wick(GitHub)도 호주 사람이다. 이 프로그램들은 논문으로 출판하기 위해 그렇게 애를 쓰지는 않는 것 같다. 그러나 나를 비롯하여 전세계의 많은 연구자들이 이미 즐겨 사용하고 있지 않은가? 대단히 미안하지만 호주가 생명정보학의 강국이라고는 별로 생각하지 않았았던 것은 사실이다. 하지만 이 프로그램들이 얼마나 실용적인지는 애써 강조할 필요가 없다. 

그러면 호주 곁의 뉴질랜드는? 시드니와 웰링턴 사이의 거리는 약 2,299 km나 된다. 서울에서 마닐라까지의 거리와 비슷하다니, 호주 곁이라고 하면 안 되겠다(링크). 뉴질랜드는 우리에게 R을 주었다! 그리고 R의 역사를 ggplot 개발 전후로 나눌 수 있을 정도로 데이터 분석 및 시각화 도구로 유명한 ggplot의 개발자, Hadley Wickham도 호주인이다.

한국이 IT 강국이라고 하는데, 휴대폰 제조와 게임 서비스 말고 학술적으로 인류에게 기여하고 있는 것이 무엇인지 아무리 생각을 해도 모르겠다.

[우분투의 사운드와 MIDI] Rosegarden에서 NanoPiano의 뱅크 선택

Rosegarden의 사용법에도 어느덧 익숙해져서 어제는 15개 MIDI 트랙을 총 세 개의 음원에 배분하여 연주를 해 보았다. 세 개의 음원이란 하드웨어 사운드 모듈로서 Roland SoundCanvas SC-D70과 Alesis NanoPiano, 그리고 나머지 하나는 FluidSynth이다.

각 악기의 음색('프로그램')을 미디 시퀀서에서 제대로 제어하려면 0-127번까지의 번호에 프로그램을 할당한 파일이 필요하다. 과거 Cakewalk의 ins file(instrument definition file)라 불리던 것이 바로 그것이다. Rosegarden에서는 rgd라는 XML 형식의 device definition 파일을 사용한다. 다음 문서를 참고하면 악기 매뉴얼을 참고하여 텍스트 파일을 작성한 다음 text2rgd.py라는 파이썬 스크립트를 실행하여 rgd 파일을 만들 수 있다.

mini-HOWTO: Creating the Instrument and Program definitions for Rosegarden 

유명한 악기는 Rosegarden에 내장이 되어 있지만 SC-D70과 NanoPiano는 그렇지 않았다. 웹 검색을 해서 Calkwalk용 ins 파일을 구한 다음 ins2rgd.pl 펄 스크립트로 처리하여 rgd 파일을 만들었다.

NanoPiano는 16 x 16 = 256개의 음색을 갖고 있다. 프로그램 번호의 범위는 최대 128까지이므로 두 개의 뱅크로 나뉘어 있는데, rosegarden 안에서 뱅크 2번에 속하는 악기로 바꾸어도 소리가 변하지 않았다. 이건 도대체 왜 이런가? NanoPiano의 매뉴얼을 확인해 보면 앞부분 128개의 악기는 뱅크번호 0 또는 1, 나머지 128개는 뱅크번호 2라고 한다. Rosegarden에서 불러들인 뱅크 정보(rgd 파일)에서는 MSB = 0으로 두고 LSB를 바꾸는 것으로 두 개의 뱅크를 나누어 놓았다. 혹시 MSB의 숫자를 올려야 하는 것은 아닐까? NanoPiano 매뉴얼에는 이를 명확하게 설명하지 않았다.

테스트를 위해 2번 뱅크의 MSB 설정을 2로 하였다. 그랬더니 비로소 모듈 쪽에서 제대로 응답을 하여 바뀐 소리가 나기 시작하였다. SC-D70에서는 CC 32(bank select LSB)가 sound map을 선택하기 위해 쓰인다. NanoPiano는 CC 32의 의미가 없는 것 같다.

sendmidi 명령어로 다른 뱅크의 음색을 이용하려면 다음과 같이 하면 된다.

$ sendmidi device 'SC-D70 MIDI' CC 00 1 PC 0 # 'True Stereo'
$ sendmidi device 'SC-D70 MIDI' CC 00 2 PC 127 # DarkLounge

하드웨어 음원을 쓸 때에는 기기 전면의 노브나 버튼을 직접 이용하여 조작을 하는 즐거움이 있다. 그러나 알레시스의 나노 시리즈와 같이 정보 표시용 창이 전혀 없는 악기는 지금 설정된 악기의 카테고리만 볼 수 있을 뿐, 구체적인 프로그램명은 모른다. 그러나 미디 시퀀서를 연결하여 설정을 바꾸게 하니 프로그램명을 보고서 대략적으로 어떤 소리가 날지 감을 잡을 수가 있다는 장점이 있다.

[리눅스와 bash] 파일 목록의 배열 만들기

현재 디렉토리에 a1, a2, a3...a10이라는 파일이 있다고 가정하자. 파일 이름을 배열로 전환하여 각각에 대해 원하는 작업을 하고 싶다면? 구글을 뒤져서 방법을 찾아 보았다. 여기에 소개는 하지만 완벽하게 그 원리를 이해한 것은 아니다. 'VAR=$(command)'에 익숙해진 것도 비교적 최근의 일이다. 예전에는 오로지 backtick 또는 backquote라 불리는 특수문자(`)를 이용하여 명령어를 둘러싸는 이른바 command substitution만 사용했었으니까.

내가 바이블처럼 참조하는 Mark G. Sobel의 A Practical Guide to the UNIX System 제3판(1995년 9월 26일 구입)에도 shell에서 파일 목록을 배열로 전환하여 다루는 방법은 나오지 않는다. 다음의 자료를 참고하면 bash에서 배열을 다루는데 익숙해 지리라 믿는다.

The Ultimate Bash Array Tutorial with 15 Examples

[Linux Documentation Project - Advance Bash-Scripting Guide] Chapter 27. Arrays

$ ls a*
a01  a02  a03  a04  a05  a06  a07  a08  a09  a10
$ var=$(ls a*)
$ echo $var
a01 a02 a03 a04 a05 a06 a07 a08 a09 a10
$ arr=(a*) # 괄호로 둘러싸야 배열 형태로 반환된다.
# 'arr=($(ls a*))'라고 하면 넌센스일까?
$ echo $arr # 왜 이것이 'echo ${arr[0]}와 결과가 같은지 잘 모르겠다.
a01
$ echo ${arr[1]} # 인덱스는 0부터 시작한다.
a02
$ echo ${#arr[@]} # 배열의 크기
10
$ i=4
$ echo ${arr[4]}
a05
$ echo ${arr[$i]}
a05
$ echo ${arr[i]}
a05

# 각 원소에 대하여 반복하기
$ for f in "${arr[@]}"
> do
> echo "$f"
> done
a01
a02
a03
a04
a05
a06
a07
a08
a09
a10

# 인덱스를 변수로 뽑아서 반복해 보자. 좀 더 난해하다.
$ for i in ${!arr[*]}
> do
> echo $i ${arr[i]}
> done
0 a01
1 a02
2 a03
3 a04
4 a05
5 a06
6 a07
7 a08
8 a09
9 a10

# 다음 명령을 이해할 수 있는가?
$ echo ${!arr[*]}
0 1 2 3 4 5 6 7 8 9
$ echo ${arr[*]}
a01 a02 a03 a04 a05 a06 a07 a08 a09 a10
$ echo ${arr[@]} # '*' 대신 '@'를 넣어도 작동한다.
a01 a02 a03 a04 a05 a06 a07 a08 a09 a10

Bash에서 구사할 수 있는 스크립트 작성 테크닉의 5% 정도는 활용하고 있는 것일까?

2020년 9월 9일 수요일

[리눅스의 사운드와 MIDI] JACK에 대해서 더 알게 된 것

 jack_control이나 QjackCtl을 이용하여 JACK 서버를 기동하면 PulseAudio Jack Sink가 자동으로 작동한다. 이때 항상 jackdbus가 백그라운드에서 돌아간다. 그러나 명령행에서 직접 jack을 입력하여 실행시키거나, Qsynth처럼 애플리케이션에서 ~/.jackdrc 파일을 참조하여 JACK 서버를 작동시키는 경우에는 PulseAudio Jack Sink가 자동으로 돌지 않는다.

유튜브를 재생하다가 PulseAudio Jack Sink를 작동하게 만들었더니 음량이 눈에 뜨이게 줄어들었다. 

Audacity에서 JACK을 이용한 녹음을 할지라도 JACK의 connection 화면을 직접 조작할 필요는 없다. 심지어 audacity는 그 화면에 나타나지도 않는다. 그러나 녹음 및 재생을 할 때에만 audacity로 연결되는 포트가 나타났다가 사라진다.

2020년 9월 7일 월요일

[독서 기록] 인간 무리, 왜 무리지어 사는가

  • 지은이 마크 모팻(Mark W. Moffett)
  • 옮긴이 김성훈
  • 원제 The Human Swarm: How our societies arise, thrive and fall 

8월 21일자 경향신문에 신간이 소개된 것([책과 삶]인간은 어떻게 거대 사회를 유지했나)을 보고 흥미를 느끼고 있었다. 마침 8월 24일 월요일 아침에 광화문 근처에서 회의가 열리게 되어 일부러 훨씬 일찍 광화문역에 도착한 다음, 커피 한 잔을 들고 30여분을 기다린 끝에 교보문고 매장이 9시 30분에 문을 열자마자 구입을 했다. 




코로나19가 전지구적으로 번지면서 인류는 지금까지는 다른 방식의 삶을 완전히 받아들여야 하는가를 고민하게 되었고, 매우 우려스러운 일이지만 코로나19를 퍼뜨린 책임이 있을 것으로 여겨지는 집단은 철저히 배척되기에 이르렀다. 특히 서구 사회에서 동양인에 대한 혐오가 다시 나타나고 있음은 심히 우려스럽다. 그렇다고 하여 우리 사회가 포용적이기는 한가? 타 인종에 대한 한국 사회의 배타성은 최근 샘 오취리의 SNS 논란을 예로 들지 않아도 너무나 명백하다.

인류는 어떻게 하여 이렇게 큰 집단을 이루어 살게 되었는가? 거대한 사회를 이루어 사는 개미는 서로를 개별적인 개체로 식별하지 못하면서도 어떻게 안정적이고도 역동적인 고도 사회를 유지하는가? 외부자에 대한 배척은 종종 내부 결속용으로 악용되어지고 있는데, 그 근저에 깔린 심리적 기제는 무엇일까? 이런 문제에 대한 호기심이 이 책을 빨리 사서 읽어보게 만든 원동력이 되었다.


활력 넘치는 사회, 혹은 정서적으로 안정된 사람이 되려면 같으면서도 달라야 한다(390쪽).

갈등이 전혀 없이 구성원의 생각이 전부 같고, 겉으로 드러나는 표식에도 차이가 없는 인간 사회는 결코 존재할 수 없다. 유성 생식이라는 생물학적 원리는 결국 섞임을 전제로 하는 것이 아니겠는가? 과학이 더욱 발달하여 자기 자신과 똑같은 유전자를 지닌 2세(이것은 클론이므로 2세라고 부르는 것도 어불성설이다)를 만드는 일이 유행이 되지만 않는다면 말이다. 그리고 모험심이나 호기심에 의한 것이든, 혹은 생존에 의한 것이든(이제는 전쟁이 아니라 기후 변동에 의해 현 주거지에서는 도저히 살 수가 없어서 딴 곳으로 이동하는 난민이 생겨나는 시대이며, 팬데믹도 난민을 만들 수 있다) 끊임없이 이동하려는 인간의 속성도 결국은 외부성(foreignness)을 만드는 요인이 된다. 이를 생각하다 보면 2017년에 읽은 책(독서 기록 - 이주하는 인간, 호모 미그란스)을 다시 떠올리게 된다.

침팬지는 모두를 알아야 한다. 개미는 아무도 알 필요가 없다. 인간은 그냥 몇 명만 알면 된다. 그리고 이것이 그 모든 차이를 만들어냈다(102쪽).

저자는 다른 생물체의 무리 생활과 인류의 과거 역사를 들여다봄으로써 어떻게 하여 현재의 인류가 서로를 다 알지 못해도 지금처럼 큰 집단을 이루게 되었는지를 논하고 있다. 아는 개미를 제외하고는 대단히 이례적인 현상이다. 또한 '우리'가 아닌 외부 집단에 대한 인식이 내부 구성원을 단결하게 만드는 매우 자연적인 방법인 동시에, 일부 사회 리더는 이를 교묘하게 역이용하기도 하였다.

외부성은 사회 내에 다양성을 가져다주는 매우 근본적인 방법이기도 하다. 이 책의 결론에서는 이렇게 말하고 있다.

다양성은 사회적 과제를 제시함과 동시에 다양한 재능과 관점에 의해 추친되는 창조적 교환, 혁신, 문제 해결을 가져온다(585쪽).

우리는 우리가 몸담고 있는 '국가'라는 사회가 제3차 세계대전이 일어나지 않는 한 영원히 지속될 것으로 생각한다. 그러나 사회는 불만을 제거하지 않고, 단순히 그 불만을 외부자들로 향하게 한다(586쪽). 이는 대단히 불행한 시나리오를 가져오게 될 것이다. 환경에 대한 것이든 혹은 같은 인류 집단에 대한 것이든, 호모 사피엔스는 각각의 변화에 대한 손상을 최대한 줄이는 방법을 아는 유일한 생명체이다(같은 쪽).

나는 지금 일하고 있는 파견 근무지에서는 분명히 외부자이다. 그리고 계약 기간이 끝나 다시 원 직장으로 돌아가게 되면 또 일정 기간 동안은 외부자나 다름없는 적응 기간을 다시 거쳐야 할 것이다. 외부자로서 생활한다는 것은 적당한 긴장감과 만족감을 동시에 가져다주는 좋은 기회가 된다. 이러한 상황을 잘 활용하여 내가 몸담고 있었던 두 곳의 '사회'에 전부 도움이 될 수 있도록 해야 될 것이다.


2020년 9월 3일 목요일

[우분투의 사운드와 MIDI] 스페이스 바를 서스테인 페달 대용으로 쓰게 만드는 파이썬 프로그램

마스터 키보드는 있는데 서스테인 페달은 미처 구입하지 못하였다. 별로 비싼 물건도 아니라서 구입을 망설일 필요도 없고, 심지어 55 TS 플러그와 스위치 및 케이블만 있으면 만들 수도 있는 물건이다. 하지만 키보드(건반이 아니라 컴퓨터의 자판)을 이용하여 특정 키를 누르면 CC 64 127 신호를 보내고, 키를 놓으면 CC 64 0 신호를 보내게 할 수는 없을까? SendMIDI라는 프로그램을 알아냈으니 MIDI 사운드 모듈로 서스테인 페달 신호를 보내는 것은 아주 쉽다. 퇴근 후 방구석에서 이 문제를 해결해 보기로 하였다.

어떤 작업을 지속하다가 키 입력이 들어오면 중단하는 bash 예제는 무궁무진하게 많다. 이를 잘 응용하면 쉽게 될 것이라 생각을 했다. 그런데 키를 누르고 떼는 순간에만 신호를 한 번씩 보내게 하는 방법은 영 찾기가 어려웠다. 심지어 이런 웹사이트까지 있었다.

Why is it so hard to detect keyup event on Linux?

전문 프로그래머가 아니니 여기에 실린 내용을 전부 이해하기는 어려웠지만, 그럴 만한 역사적 배경이 있었다. 심지어 명령행에서 이런 기능을 가능하게 하는 파이썬 스크립트를 실행하려면 관리자 권한을 써야 한다는 것은 충격이었다. 게다가 다른 창을 활성화시켜도 키 입력/릴리즈 감지가 일어난다. 키 입력 감지는 일반 유저 누구나 가능한데, 키 릴리즈 감지에는 관리자 권한이 필요하다니! X window 환경에서는 관리자 권한이 없이도 이를 구현할 수 있다고 하였다.

파이썬을 잘 모르니(남이 만든 프로그램을 맨날 쓰기만 했었지...) 이 웹사이트에 소개된 예제를 어렵사리 수정하여 sendmidi 커맨드를 넣어 테스트를 해 보았다. 스페이스 바를 누르고 있으면 CC 64 127, 즉 서스테인 페달 on 메시지가 계속 전송되는 것이 보였다. 그러다가 키에서 손을 떼면 CC 64 0 메시지가 한 번 전송된다. 결과만 놓고 본다면 귀에 들리는 소리는 차이가 없지만 만약 이를 시퀀서 프로그램으로 기록한다면 얼마나 지저분한 MIDI 파일이 되겠는가? Note on, note on, note on, note off 메시지를 통해서 음표 하나를 치는 것과 다를 바가 없다. 도무지 나의 저급한 파이썬 지식으로는 해결할 방법이 없었다.

에이, 하지 말까...

이 웹사이트의 중간쯤에 PyGame 패키지를 이용하는 짤막한 스크립트가 나와 있었다. 게임이라는 단어 때문에 나하고는 하나도 상관이 없는 방법이라고 생각하다가 그냥 테스트나 해 볼 생각으로 코드를 복사한 뒤 키 릴리즈 이벤트가 일어났다는 메시지를 화면에 뿌리는 줄을 수정하여 sendmidi 커맨드를 넣었다. 다음은 스크립트의 전문이다. 특별히 스페이스 바에 대해서만 작동하게 만들지는 않았다. 어떻게 고쳐야 하는 지를 모르니까. 파이썬을 이용한 MIDI programming에 대해 좀 더 지식이 있다면 sendmidi라는 외부 프로그램을 경유하지 않고도 CC 메시지를 보낼 수 있었을 것이다.

import pygame
import time
import os

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

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("/home/hyjeong/bin/sendmidi dev 'SC-D70 Part A' cc 64 127")
    if event.type == pygame.KEYUP:
      print("Got keyup event: " + str(event))
      os.system("/home/hyjeong/bin/sendmidi dev 'SC-D70 Part A' cc 64 0")

pygame.quit()
quit()

일반 유저 권한으로 이를 실행시키면 아무 것도 표시되지 않는 창이 하나 뜬다. 이 상태에서 키를 눌렀다. 컴퓨터에 연결된 SC-D70의 MIDI 신호 표시창에 정확히 한 번 불이 들어왔다 꺼진다. 키를 놓았더니 마찬가지로 또 한 번만 불이 들어왔나 꺼진다. 마스터 키보드를 연주하면서 발로(!) 컴퓨터의 키를 눌렀다 떼었다를 해 보았다. 실제로 서스테인 페달을 밟는 것과 똑같은 효과가 나타나는 것이었다. 야, 이게 되는구나! 너무나 신기하고 즐거워서 껄껄 웃고 말았다.

연구 업무(본업)를 위해서도 파이썬 프로그래밍을 익힐 생각을 하지 않고 있었는데(나는 Perl/shell 프로그래머라고 스스로 생각하고 있었으므로) , 아무래도 취미 때문에 일을 벌려야 되겠다. 이러다가 SC-D70의 음색을 변경하는 GUI 프로그램을 만들게 되는 것은 아닌지 모르겠다.



[우분투의 사운드와 MIDI] sendmidi 명령어를 이용하여 SC-D70의 프로그램 변경

MIDI sound module에서 프로그램이라 함은 개별적인 악기의 소리를 말한다. 프로그램 1번은 피아노, 17번은 오르간, 33번은 어쿠스틱 베이스 등으로 이어지면서 128번은 총소리로 끝난다. 그러면 겨우 128종류의 소리밖에 내지 못하는가? 그렇지는 않다. CC 00 ## 명령(bank change MSB)으로 variation number(##)를 입력하여 동일 프로그램 계열에 속하는 다른 종류의 악기 소리로 바꿀 수가 있다.

만약 내가 음악을 만드는 작업 중이라면 시퀀서 프로그램에서 각 채널에 대한 악기 설정을 다루면 그만이다. 하지만 마스터 건반을 연결하여 그냥 뚱땅거리며 소일을 하고 싶을 때는 이렇게까지 하기가 너무 귀찮다. 이러한 소리 변경 작업을 SC-D70의 전면 버튼으로 하려면 상당히 번거롭다. 숫자 버튼이 있는 것이 아니라 +/-로 수치를 바꾸어야 하고, program/variation 번호를 입력하는 모드로 전환하는 방식도 그러하다. 물론 컴퓨터 키보드 수준의 조작 버튼이 있다면 금상첨화겠으나 덩치가 커지고 제작비도 많이 들 것이 뻔하며 시간이 오래 지날수록 버튼의 접촉이 나빠질 것이다. Korg X2의 버튼도 몇 개는 아주 세게 누르지 않으면 입력이 되지 않는다.

Rosegarden을 열어놓고 SC-D70의 음색을 바꿀 수도 있다. 하지만 터미널 창에서 CC 00 및 PC(program change) 명령을 날릴 방법은 없을까? alsa-utils의 amidi에서 SysEx를 송수신할 수 있듯이. 개별적인 MIDI message를 보내거나 받게 해 주는 명령행 방식의 프로그램이 있을 것으로 생각하고 검색을 해 보았다.

역시 그런 프로그램은 존재하였다. 음악 앱 프로그래머인 Geert Bevin이 개발한 SendMIDI가 바로 그것이다. 리눅스나 맥에 설치하여 컴퓨터에 연결된 MIDI 장비로 메시지를 보낼 수 있다. 장비가 보내는 신호는 ReceiveMIDI라는 별도의 프로그램으로 수신할 수도 있다. 생명정보학 프로그램을 입수하기 위하 뻔질나게 들락거리는 GitHub에서 음악 작업을 위한 소프트웨어를 입수하게 될 줄은 꿈에도 몰랐다. 업무와 취미의 묘한 접점이라니... 이것은 모두 음악 취미를 위한 컴퓨터의 OS를 우분투로 결정했기에 가능한 일이었다.

다음 스크린 캡쳐는 SC-D70의 음색을 00 00(piano)에서 26 00(piano+choir1)로 바꾸고 소리를 내는 과정을 보이고 있다. 뒤에 위치한 숫자가 프로그램 번호인데, 사용자 매뉴얼에는 1-128의 범위로 나와 있지만 MIDI 장비로 보낼 때에는 0-127의 범위로 바꾸어야 한다. SC-D70은 SC-8820의 map을 사용하므로 이를 그대로 따르면 된다.

SendMIDI의 실행 사례.

CC는 Control Change의 약자라는 사람도 있고, Continuous Controller의 약자라는 사람도 있다. CC 번호의 의미를 잘 설명한 웹사이트가 있어서 소개해 둔다. PDF 파일로도 제공하고 있어서 인쇄하여 활용하기에도 좋다.

MIDI Continuous Controllers List

sendmidi를 잘 활용하면 스페이스 바를 누르는 것으로 댐퍼 페달의 작동을 대신하는 스크립트를 만들 수도 있겠다. 음... 그러면 노트북 컴퓨터를 바닥에 내려놓고 발가락으로 스페이스 바를 누르면 되겠구나.

2020년 9월 2일 수요일

[SED] 간단한 sed의 활용법

부끄러운 고백이지만 항상 sed를 대충 사용해 왔었다. 어제 Eric Pement의 sed1line.txt에 고무되어 나 자신의 이해를 돕기 위한 간단한 자료를 만들어 보았다. 복잡한 치환 등의 기능은 담지 않았다. '처음부터 패턴이 있는 줄까지만 출력하려면 어떻게 해야 되는가?' 등의 질문에 대한 답은 될 것이다. vi 명령어로 텍스트 파일을 열어서 경계가 되는 줄까지 이동하여 dG 명령을 날려도 되지만, 파일을 일일이 열지 않고도 좀 더 세련된 방법으로 처리를 하고 싶었다.

이 페이지에 작성한 사례를 더욱 확충해 나갈 생각은 없다. 만약 그러한 순간이 온다면 sed1line.txt를 참조하면 될 일이다.

$ cat file
one
two
three
four
five

$ sed 'p' file
one
one
two
two
three
three
four
four
five
five

# -n 옵션이 필요한 이유
$ sed -n 'p' file
one
two
three
four
five

# 라인 범위를 지정하여 출력
$ sed -n '1,3p' file
one
two
three
$ sed -n '2,$p' file
two
three
four
five

# 특정 패턴이 있는 라인을 출력
$ sed -n '/four/p' file
four
$ sed -n '/^f/p' file
four
five
$ sed '/four/!d' file
four

# 첫 줄부터 패턴이 있는 줄까지 출력
$ sed '/four/q' file  
one
two
three
four

# 첫 줄부터 패턴이 있는 줄의 직전까지 출력
$ sed -n '/four/q;p' file
one
two
three

# 패턴이 있는 줄만 빼고 출력
$ sed '/two/d' file
one
three
four
five

# 패턴이 있는 줄부터 끝까지 출력
$ sed -n '/three/,$p' file
three
four
five

# 패턴이 있는 줄의 다음부터 끝까지 출력
$ sed '1,/three/d' file
four
five

2020년 9월 1일 화요일

[우분투의 사운드와 MIDI] Alesis NanoPiano의 데모곡 녹음

컴퓨터를 이용하여 자주 녹음을 해 봐야 장비 및 프로그램 사용법에도 익숙해지고 실수도 줄일 수 있다. JACK의 사용 여부에 따라서 오디오 신호를 소프트웨어적으로 연결하는 방법도 달라진다.
  • 음원: Alesis NanoPiano(64 voice stereo piano module)
  • 오디오 인터페이스: Roland SC-D70, REC SOURCE = INPUT
  • 녹음 프로그램: Audacity(48 kHz), 오디오 호스트: ALSA,  Recording device: Pulse
  • JACK은 사용하지 않음



연주되는 곡은 쇼팽의 왈츠 2번(op. 64)이다.  구글 드라이브에 올린 mp3 파일을 블로그에서 단순히 재생하는 것은 재미가 없어서 동영상을 만들어 유튜브에 올리기로 했다. 유튜브 프리미엄을 다시 구독하기로 한 기념이랄까... 사진 몇 장을 가지고 3분이 조금 넘는 음악 파일의 길이를 채우기가 쉽지는 않았다. 동영상 제작은 휴대폰 앱을 사용하였다. VivaVideo 무료 버전이라서 해상도를 높일 수 없는 것이 흠이다. 다 만들어 올리고 보니 나노피아노 위에 붙은 먼지가 보인다. 해상도가 더 높지 않은 것이 다행이다. 촬영 기구(즉 스마트폰)를 이용하여 직접 동영상을 만드는 장점은 분명히 있겠지만, 화면이 작아서 조작성이 나쁜 것이 문제다.


우분투 스튜디오에 동영상 제작용 도구가 포함이 되어 있는 것으로 아는데, 음악 관련 프로그램만 먼저 깔아 놓았더니 나중에 다른 도구를 깔기가 불편하다. 패키지 이름을 아는 것이 없으니...공식 웹사이트를 방문해 보았다. 

https://ubuntustudio.org/tour/video/

OpenShot이라는 비디오 에디터 소프트웨어가 있어서 일단 설치를 해 두었다. 파이썬으로 작성된 프로그램이다. 사용법을 익혀 두어야 되겠다.

[SED] 특정 패턴이 존재하는 라인부터 출력하지 않으려면?

GFF 파일은 워낙 다양한 변종('사투리'라고 볼 수도 있음)이 존재해서 이용하기 전에 포맷을 꼼꼼하게 점검해야 한다. bp_genbank2gff3.pl을 사용하여 GenBank 파일로부터 생성한 GFF 파일은 내부에 염기서열 정보를 갖고 있다. Pan genome 분석 도구인 roary를 돌리려면 이러한 형태의 GFF가 필요하지만 bedtools로 쓰기에는 적합하지 않다.

염기서열 정보가 포함된 GFF에서 이를 떼어내려면 어떻게 하면 좋을까? 파일을 라인 단위로 훑다가 '##FASTA'라는 라인을 만나게 되면 여기서부터 파일의 끝까지는 무시하게 만들려면 어떻게 할까?

여기서 잠깐! GenBank 파일이 복수의 서열을 포함하고 있으면 어떻게 하나? Draft assembly이거나, 혹은 플라스미드를 포함하는 박테리아의 RefSeq assembly(GCF_어쩌고저쩌고..)가 이러한 경우에 해당한다. 전혀 걱정할 것이 없다. GenBank 파일에서는 '//'을 구분자로 분리된 각 레코드가 서열 정보를 개별적으로 갖고 있지만, 이를 bp_genbank2gff3.pl로 처리하면 서열이 몇 개나 존재하든지 관계없이 모든 염기서열은 GFF 파일의 뒷부분에 모이기 때문이다.

그러면 다시 본론으로 돌아가서 '##FASTA'로 시작하는 라인부터 끝부분까지를 제거하는 방법을 알아보자. 웹 검색을 전혀 하지 않고 머릿속에 들어있는 지식만 가지고 해결하려면 Perl로 몇 줄 쓰면 된다. 하지만 쉘에서 돌아가는 일반 유틸리티를 이용하여 한 줄의 명령으로 가능할 것 같다.

이런 해결 방안이 있다. bp_genbank2gff3.pl에서 -r[--noinfer] 옵션은 박테리아 유전체 정보에서는 별로 중요하지 않은 exon/mRNA subfeature를 추론하지 말라는 뜻이다. 결과를 표준 출력으로 내보낸 뒤(-o -), sed stream editor를 돌리면 된다. 그런데 뭐가 이렇게 간단한가?

$ bp_genbank2gff3.pl -r input.gbk -o - | sed -n '/^##FASTA/q;p' > output.gff

원리를 설명하고 싶은데, 그게 쉽지가 않다. 원리를 완벽하게 이해하지 않고 쓰는 것은 약간 위험하지만, 내가 Perl을 처음 공부할 때도 그렇지 않았던가? 비록 지저분한 코드라 하더라도 일단 작동하는 코드를 만들어라. 주석을 달고 개선하는 것은 그 다음이다. 일단 -n 옵션의 의미부터 알아보자. sed의 기본 동작은 입력 파일을 줄 단위로 일단 출력해 놓은 다음, 명령에 따라 행동을 하는 것이다. -n은 명시적으로 인쇄를 하라는 명령을 제공해야한 인쇄를 하라는 뜻이다. sed 'p' file을 입력해 보라. 모든 줄이 두번씩 인쇄될 것이다. sed를 cat처럼 이용하려면 sed -n 'p' file이라고 실행해야 한다. 마찬가지로 sed를 grep처럼 사용하려면 sed -n '/PATTERN/ p' file이라고 입력해야 한다.

만약 어떤 패턴이 매치된 라인의 다음 줄부터 마지막까지를 인쇄하고 싶다면 이것도 sed로 해결할 수 있다. Eric's sed one-liner의 제4부 Selective Printing of Certain Lines에 그 해답이 있다. 나머지 파트도 숙독해 보면 놀라운 sed의 능력을 알게 될 것이다. sed와 awk의 기능을 살펴보다가 늘 '왜 내가 이런 기능을 Perl로 짜려고 했던 것이지?'하는 결론을 내리고는 한다. Eric Pement의 웹사이트에 마련된 sed, awk 및 Perl 정보가 많은 영감을 줄 것 같다.  그가 정리한 sed one-liner 사례 모음인 sed1line.txt를 보고 있노라면 경이롭기까지 하다.

오늘의 글을 끝맺는 한 마디.
Don't reinvent the wheel.