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으로 연결한 뒤에 가능하다.


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