읽는데 8 분 정도 걸려요
2021년 11월 4일 오후 9:55에 작성됨.

우리가 뭔가 재생하기 위해 오디오 장비를 조작할 때 제일 먼저 전원을 키고 다음에는 음량을 조절한다. 모두가 콘서트에서 음악을 들을 때처럼 각 음반마다 적절한 음량으로 조절하면 좋겠지마는 절대 다수의 환경에서는 키우든 줄이든 필연적으로 음량을 조절하게 된다. 그래서 음량을 조절하는 것은 오디오 장비에서 “일단 켜지는” 것 다음으로 중요하다.

음량을 조절하는 방식을 나누는 기준은 크게 두 가지이다. 깎느냐 키우느냐이다. 깎는 방식으로 음량을 조절하는 것을 우리는 볼륨이라고 부르고, 키우는 방식으로 음량을 조절하는 방식을 우리는 게인이라고 부른다. 이번에는 이 두 가지를 모두 이야기해 볼 것이다.

예전에 PC-Fi를 하는 사람들 사이에서 윈도우 볼륨을 몇 퍼센트로 해야 하는가? 라는 논쟁이 있었다. 100%로 해야 한다는 의견, 50%로 해야 한다는 의견, 그냥 신경 쓸 필요 없다는 의견 등 여러 의견들이 있었는데 이런 논쟁이 늘 그렇듯이 결론을 짓지 못하고 끝났다. 그리고 지금은 신경 쓸 필요 없다는 의견이 대세가 된 것 같지만, 내가 이 블로그에서 항상 그렇듯이 우리는 “왜” 그런지에 대해서 생각해보자.

맨 처음에 볼륨은 깎는 방식으로 조절한다고 말했는데, 과연 “어디에서부터” 깎는가? 가 이 논쟁의 핵심이다. 윈도우 볼륨을 50%로 해야 한다는 의견은 50%를 기준점으로 잡고 그 위는 (예전에 돌았던 안드로이드 스피커 부스터처럼) 억지로 키워놓아서 조절한다는 말일 것이고, 100%로 해야 한다는 사람은 100% 지점부터 깎아나간다고 생각했기에 그런 말을 했을 것이다. (물론 실제 이야기는 좀 더 복잡하긴 했다.) 그렇다면 명확하게 볼륨의 정의를 다시 하자. 볼륨은 “들어온 데이터와 나가는 데이터를 시간에 있어 일정하게 감소시키는 장치”로 정의할 수 있다. 볼륨을 거치기 전후 데이터가 주파수 영역에서 다르거나, 시간에 따라 감소되는 양이 달라지면 우리는 이걸 볼륨이 아니라 다른 걸로 불러야 한다.

그럼 우리는 “얼마나” 깎느냐의 단위를 정리할 때 시작점은 0이 되고, – 방향으로 증가하게 될 거라는 것을 추측할 수 있다. 그래서 명확한 의미로서의 볼륨은 마이너스 단위로 정리되고, 점점 커질수록 소리는 작아지게 된다. 자연에서는 일단 매우 작은 신호도 존재할 수는 있기 때문에 아무 신호도 없는 상태를 정의하는 것은 현실적으로 불가능하고, 최대한 소리를 줄여놓은 상태, 그러니까 볼륨 노브를 맨 왼쪽으로 돌린 상태를 편의상 -∞로 정의하게 된다. (물론 배경 소음이나 인간의 역치를 근거로 한 단위도 존재할 수 있다. SPL은 임상적으로 인간이 들을 수 있는 가장 작은 소리를 0으로 정의한다.) 정리하자면 가장 볼륨이 큰 상태는 0, 가장 볼륨이 작은 상태는 -∞이 된다. 일단 볼륨이 동작하게 되면 볼륨을 거치기 전에 비해 거친 후는 무조건 소리가 같거나 작아진다는 뜻이다. 그럼 위의 퍼센트 볼륨의 경우에는 “0”으로 했을 때를 100%, “-∞”으로 했을 때를 0%로 설정한 것이다. 앞으로 이렇게 생각하면 쉽게 이해할 수 있다.

그럼 게인이란 무엇일까? 우리가 앰프를 통해 소리를 원래 음량보다 키울 때 “얼마나” 키울지를 조절하는 것이 게인이다. 그래서 원래 신호와 같은 상태는 0, 원래 신호보다 커질 때는 무한정 키울 수 있다. (물론 이것도 현실적으로는 한계가 존재한다.) 하지만 불행히도 우리가 오디오 엔지니어가 아닌 이상 게인을 다루는 일은 생각보다 많지 않다. 볼륨은 마음대로 돌려도 이론적으로라면 음질 손실이 일어나지 않아야 하지만 게인을 잘못 조절하면 하술할 클리핑 문제에 엮이기 때문이다. 다만 일부 파워앰프나 헤드폰 앰프들이 사전에 선택한 게인 중 몇 가지를 조절하는 선택지를 제공한다. 정리하자면 게인 컨트롤은 얼마나 “증폭할지를” 정하는 과정이라는 것이다.

그럼 볼륨에 대한 정의를 내렸으니 현실적으로 이걸 어떻게 조절할지를 생각해 보자, 전통적으로 전자 회로에서 신호의 크기를 줄이기 위해서는 저항이 사용된다. 가장 간단한 볼륨 조절기는 볼륨 노브를 돌리면 특정한 저항과 연결되어 신호의 크기를 단계적으로 조절하게 하는 것이다. 맨 오른쪽으로 돌리면 아무 것도 연결되지 않은 채 신호가 흐르게 하고, 맨 왼쪽으로 돌리면 말도 안 되게 큰 저항을 끼워놓아서 0과 -∞ 을 구현하는 것이다. 이것을 어테뉴에이터 방식이라고 한다. 다른 방식은 일정한 크기의 전기 저항을 가진 물질을 놓은 다음 전극의 위치를 바꿔가며 전기 신호가 이 물질을 얼마나 통과하게 할지를 조절할 수 있다. 이것을 포텐셔미터 방식이라고 한다. 우리가 사용하는 대부분의 볼륨은 포텐셔미터 방식으로 만든다. 어테뉴에이터 방식은 볼륨 조절 단수가 늘면 늘수록 사용되는 부품 수가 많아지고 복잡하나 안정적으로 조절할 수 있고, 포텐셔미터 방식은 저렴하게 만들 수 있으나 물리적인 접점의 움직임으로 조절되기 때문에 내구성과 안정성이 낮다. (볼륨 노브 세게 돌리면 고장난다!)

여기까지가 아날로그 신호를 직접 거치는 방식으로 볼륨을 조절하는 것이고, 우리는 이걸 “아날로그 볼륨”이라고 부른다. 아날로그 볼륨을 동작시킨다는 것은 어떠한 방식으로든 아날로그 신호로 만들어야 한다는 의미이기도 하다.

물론 꼭 볼륨 노브를 물리적으로 돌려야 할 필요성이 없기 때문에 특정한 신호를 받아서 어테뉴에이터나 포텐셔미터를 조절하게 만들 수도 있고, 이걸 반도체 회로로 구성해서 안정적으로 만들어놓은 칩들도 존재한다. 이런 것들은 수동소자들보다 저렴한 값으로 훨씬 정밀하게 동작시킬 수 있기 때문에 요즘 많이 선택되는 방식이다. 이런 방식을 사용할 때는 볼륨 노브는 그저 신호를 전달하는 도구일 뿐이고, 요구되는 정밀도가 낮아지기 때문에 훨씬 싸게 적용할 수 있다. (무한정 돌아가는 볼륨노브일 경우 이런 방식을 채택한 것이다.)

이런 식으로 구분된 단계를 통해 조절하는 것을 “디지털 볼륨” 이라고 한다. 볼륨 1단 2단 식으로 조정한다면 디지털 볼륨을 통해 아날로그 볼륨을 조절하는 식이다. 여기까지의 방식을 하드웨어 차원에서 볼륨을 조작한다는 뜻에서 “하드웨어 볼륨”이라고 한다.

그럼 디지털 데이터를 조절하는 방식으로도 볼륨을 조절할 수 있지 않을까? 예를 들어 16비트 PCM 형식을 가지고 있는 CD는 -32768부터 +32767까지의 정수 값으로 데이터를 저장한다. 그러면 신호가 마이너스일 경우에는 16384만큼 더해 주고, 신호가 플러스일 때는 16384만큼 빼 주면 소리의 크기가 절반이 되지 않을까? 라는 생각에서 나온 것이 “소프트웨어 볼륨”이다. 그렇다면 16383의 데이터를 가진 경우 볼륨 50%를 적용하면 -1이 되어야 하지 않을까? 라는 의문을 가지게 되지만 이렇게 되면 신호가 원치 않는 방향으로 손상되게 되니 위에서 말한 볼륨의 정의를 만족하지 않는다. 따라서 50% 설정의 소프트웨어 볼륨 에서는 -16384부터 +16383까지의 데이터는 0으로 처리된다. 바꿔 말하면 원래 이 정도의 크기를 가지고 있는 데이터가 손실된다는 것이다. (물론 다른 방법으로도 소프트웨어 볼륨을 구현할 수 있다. 이를테면 볼륨이 50%라면 절반으로 나눈 다음 소수점을 반올림 처리하면 비슷한 결과를 얻을 수 있다!)

그럼 다시 맨 처음 이야기로 돌아가자. 소프트웨어 볼륨을 50%로 설정하게 되면 이에 해당되는 데이터들이 날아가게 된다. 그리고 앰프를 거쳐서 CD의 다이나믹 레인지보다 큰 100db로 재생을 했다고 하면 이건 완전히 문제가 된다. 96db의 다이나믹 레인지를 가진 신호가 90db의 다이나믹 레인지를 가진 신호로 변하는 것이다. 또한 대부분의 볼륨은 청감적 한계를 보정하기 위해 로그스케일을 사용하므로 당연히 50%로 세팅하면 다이나믹 레인지는 90db보다 더 줄어든다. 그리고 이 정도까지 영향을 받으면 많은 경우에서 청감 가능하다. (라우드니스 워라는 현상으로 인해 이것을 부정적으로 보는 사람들도 있지만 말이다.)

당연히 이런 눈에 보이는 음질손실은 없는 것이 좋기 때문에 아날로그 볼륨을 최대한 사용하는 것이 유리하다. (아날로그 볼륨으로 절반을 깎으면 1인 신호는 0.5가 될 뿐이니까) 그래서 오디오 장비 개발자들은 볼륨 값을 데이터로 전달한 다음 조절은 기기에서 알아서 하라는 선택지를 고르게 된다.

물론 원론적으로 모든 기기에 저런 조절 방식이 지원된다는 것을 장담할 수 없기 때문에 디폴트는 소프트웨어 볼륨이 된다. 그래서 예전의 윈도우는 자체적으로 소프트웨어 볼륨만 지원했기 때문에 볼륨 조절 시 위의 과정을 거친 음질 손실이 있었고, 그러므로 맨 처음의 윈도우 볼륨 이야기의 정답은 “100%” 이다. (물론 수많은 버그스러운 문제를 제외한다면 말이다.)

그럼 요즘의 윈도우는 어떻게 볼륨을 조절하는가? 대충 이 글을 보면 윈도우에서는 IAudioEndpointVolume이라는 API가 있다. (읽을 필요는 없다.) 이것을 통해 볼륨을 조절하게 되는데 그러면 윈도우에서는 연결된 기기가 하드웨어적으로 볼륨을 조절하는 방법이 있을 경우에는 소프트웨어 볼륨을 사용하지 않고 볼륨 값과 원본 데이터를 전달하고, 하드웨어 볼륨 컨트롤을 지원하지 않으면 소프트웨어 볼륨을 사용하게 된다. 대충 이 API는 WASAPI와 함께 도입되었으니 우리가 주로 쓰는 윈도우 10은 당연히 이 방식을 채용한다.

그럼 윈도우는 어떻게 기기가 하드웨어 볼륨 컨트롤을 지원하는지 아는가? 에 대해서는 USB 표준같은 것에 나와 있으니 이 정보를 참조한다. 대충 USB 장치 설명자에 하드웨어 볼륨 컨트롤 지원 여부와 몇 가지 정보들을 함께 넣어놓는다. (대충 HDMI나 사운드 카드들도 이런 걸 컨트롤할 수 있고, 소프트웨어적으로는 드라이버와 프로토콜로 구현할 수 있다.)

윈도우가 아닌 리눅스나 Mac도 비슷한 방법으로 볼륨을 조절한다. 리눅스의 경우에는 내가 예전에 써놓은 글을 보면 되고, Mac도 비슷한 API가 있다. 안드로이드는 특정한 방법으로 우회하지 않고(부두 사운드와 같은 수많은 구현이 있다), 블루투스를 사용하지 않는 이상 소프트웨어 볼륨을 사용하기 때문에 여러 가지 방법을 알아보는 것이 좋다. (물론 OS가 하드웨어 볼륨 컨트롤을 사용한다고 해도 받는 장치의 DSP에서 소프트웨어 볼륨으로 한번 더 자르면 의미가 없다.)

그럼 마지막 화제인 클리핑 이야기를 하자. 우리가 볼륨을 조절할 때 최대치까지 볼륨을 올려서 볼륨을 “0”으로 만들었다고 하자. 그럼 이게 실제로는 얼마만큼의 크기를 가리키는가? 일단 각각의 부품 단은 모르는 이야기지만 장치단에서는 -0.447V부터 0.447V까지의 전압으로 나타난다. (이것을 라인 레벨이라고 한다.) 위의 CD의 예에서 +32767이란 신호를 넣는다면 이것은 아날로그 0.447V의 전압으로 표현된다는 것이다. 만약에 볼륨으로 절반을 줄였다면 -0.2235V부터 0.2235V까지의 전압으로 나타날 것이다. 이걸 원하는 크기까지 키우기 위해서 앰프에서 게인을 조절하게 되는 것이다. 하지만 소자별로 물리적으로 한계가 있기 때문에 물리적인 한계보다 더 키우게 되면 안정적으로 동작할 수 없기 때문에 신호가 크게 찌그러지게 된다. 이것이 소프트 클리핑이다. 우리가 쉽게 소프트 클리핑을 구경할 수 있는 사레는 기타 앰프이다. 기타 앰프는 일부러 소프트 클리핑을 일으켜서 원하는 소리를 만들게 된다.

그럼 디지털 신호에서 게인과 같은 처리를 한다고 가정해 보자, +32767에서 +16384를 하게 되면 49151이란 신호가 존재해야 하는데, 위에 말한 경우에는 +32767을 존재하는 신호는 존재할 수 없다. 그래서 +32767을 초과하는 신호를 모두 +32767으로 쓰게 되는데, 이것이 바로 하드 클리핑이다. 파형상으로는 한계를 초과한 부분이 일자로 잘려나가는 식으로 보이게 된다. 물론 이 결과물은 고주파 노이즈 성분으로 가청할 수 있다.

물론 정상적인 설계를 한 컨슈머 오디오 기기에서 클리핑을 구경하는 것은 불가능에 가깝다. 하지만 볼륨의 정의와 이런 클리핑 문제를 생각한다면 왜 우리가 음량을 조절할 때 게인이 아니라 볼륨을 사용하는지 쉽게 이해가 될 것이다.

여튼 이런저런 식으로 볼륨을 조절하게 된다. 따라서 하이파이를 추구하는 사람이라면 자기가 사용하는 기기가 어떤 방식으로 볼륨을 조절하는지 알아보는 것도 즐거운 일이 될 것이다. 어태껏 이상한 세팅으로 음악을 듣고 있었을지도 모르는 것 아니겠는가.