오늘의 관심사: Loudness normalizer?
on
누군가가 앰프로 음악을 들을 때 노래/음악의 종류와 상관없이 같은 크기의 음량으로 들을 수 있는 방법이 있으면 좋을텐데, 그런 물건이 나오면 좋겠다고 어떻게 하면 되겠냐고 물어보았다.
나의 대답은 ‘글쎄 그게 오디오 마스터링에서 하는 작업이 아니겠느냐’ 했던 기억이 난다.
그런데 오디오 마스터링을 할 때 하는 일은 일종의 short-time-averaged-power-measurement를 가지고 운용하는 adaptive (or automatic) gain control이 되는 것이다. 즉, 짧은 구간동안 신호의 출력을 계산해서 이게 목표치에 도달하게끔 이득을 계산해서 그것을 출력에 적용하는 것이다. 어쨌든 목표는 사람의 귀에 들어오는 평균적인 음량의 크기 (평균 음압)가 균일하게 얻어지게 하자는 것이다.
이 ‘짧은 구간’이 얼마나 짧으냐가 사실 중요한 문제가 된다. 너무 짧으면 음악의 다이내믹, 음량의 크고 작음에 의해서 감정 표현을 하게 되는데, 이게 전부 사라지게 된다. 좀 많이 과장해서 피아니시모로 연주하고 있는 것인지 아니면 포르티시모로 연주하고 있는 것인지 차이가 없게 들리게 된다는 것이다. 또 이게 너무 길게 되면 실제로 이런 자동이득장치가 동작하고 있는지 아닌지 잘 구분이 안될 수도 있다. 또 어느 주파수 구간을 평균 전력 계산을 하는데 포함을 시켜야 하는가에 대한 문제도 있게 되는 것이다.
결국, 이것을 기계적으로 할 수 없기에 마스터링 엔지니어도 있고 하는 것이 아닐까? 사실 5-60년대 음악을 듣다보면 이 당시에는 지금처럼 좋은 컴프레서/리미터가 없었기 때문에 (테이프 레코더가 이 일을 했다) 사실 같은 볼륨이라도 너무 작게 들리고, 반대로 90년대 이후의 음악들은 엔지니어들끼리 레벨 높이기 경쟁이라도 붙은 양 미친 듯이 레벨을 올렸기 (=엄청나게 컴프레스했기) 때문에 매우 크게 들린다. 사실 이 차이만이라도 극복하길 원한다면 level maximizer를 둘 수 밖에 없다고 본다.
그러면 어떻게 해야 하는가?
- circular sample buffer (시평균 구간에 비례하게 됨)
- power level moving average/filtered power level measurement
- target level
- variable gain amplifier (=multiplier)
- peak detector + suppressor
이 두가지면 된다. 오디오 신호를 가로채서 파워 측정하고 음량 결정하기만 하면된다. 측정 구간을 얼마로 할지는 사용자가 설정하는 것으로 하면 좋지만, 그냥 sweet spot하날 정해서 고정하는 것이 control이 밖에 붙지 않게 되니까 좋다. 내 경험으로 raspberry pi2 정도면 Jack을 써서 floating point로 real time audio 처리를, 특히나 이것처럼 간단한 처리는 충분히 가능하다.
중요한 것은 어차피 최종 볼륨은 어차피 사운드 프로세서의 마지막 단에서 컨트롤하게 되어있으니까, 사실 이 장치에서 target level은 있으나 마나한 값이 된다. 즉, 이 장치는 그냥 level maximizer (loudness maximizer)가 되는 것이다. target level은 0 dBFS로 생각할 수도 있지만 약간의 headroom을 두어서 peak를 smooth할 수 있는 여지를 두는 게 맞을 듯 하고 power의 시평균을 구하는 구간은 대략적으로 음량이 꽉 들어찬 최근 음악을 플레이했을 때 음량의 변화가 별로 없는 정도로 선택하면 80년 이전의 과거 음악에도 무난하게 동작할 수 있을 것이라고 본다.
그!런!데! 우리가 adaptive limiter라든가 compressor를 가져다 대면 같은 음원도 다르게 들리는 경우를 많이 경험했기에, 이 기능도 그러한 효과를 가져올 것이라고 본다.