물론 앞의 파트들도 내가 잘 모르는 내용이었지만, 이 파트는 그야말로 아는 내용이 더 적은 수준이었다.
게다가 앞의 파트에서 모르던 것들은 뭐랄까, 좀 세밀한 파일 구조 따위를 몰랐다면, 이 부분은 프로그래밍적인 것과는 별개로 음악에 대한 지식이 모자라서 모른다는 느낌이 들어서 좀 미묘했다.
스스로가 음악에 별로 조예도 관심도 없다는 건 잘 알았지만은... 흐음.
특히 EQ는 그동안 살면서 누가 얘기할 때마다 내가 가장 궁금하면서도 이해하지 못했던 것. 이제야 뭔지는 알았지만 역시 이걸 어떻게 쓰는 건지는 알 수가 없다. 다른 사람 머릿속엔 이게 재생이 되나...? 난 안 될것 같은데... 흐음.
강의에서는 다양한 종류의 sound effect 를 소개하였는데, 개중에 나와 정말 연이 없는, 음악적인 부분에서나 쓰일 법한 부분은 굳이 길게 쓰지 않았다. 내가 이 공부를 하게 된 것은 음원 편집을 위해서인데 그 편집 범위에 음악적인 건 안 들어가니까.
그래도 뭐가 있는지 정돈 써놓을 테니, 필요하게 되면 이름을 보고서 그때 좀더 검색해서 공부하면 되겠다. 뭐 여기 쓰인 것 이외에도 수백가지의(진짜 그렇게 많나...) 이펙트가 있다고 하니 큰 의미는 없겠지만서도.
Audio Effect
오디오 이펙트란, 간단히 말해서 sound 를 수정하는 작업이다.
소리를 개선하기 위해서 (잘 들린다던가, 예쁜 소리가 된다던가 등) 의도적으로 오디오를 수정하는 것이다.
이는 샘플 수준에서 오디오를 수정해야 하므로 당연히 PCM에서 진행되는데 여러가지의 편의를 위해서 integer 환경이 아닌 floating point 환경으로 진행된다.
예를 들어 증폭 시 max 수치를 넘어가 버리면 저장할 수 없어 손실되지만, float일 경우에 1.0을 일시적으로 넘어도 별로 문제는 없으니까.
녹색은 필수에 가까운 것(general purpose), 파랑은 매우 유용한 것(자주 사용되는 것), 빨강은 부가적인 것(음악적 효과를 넣을 때 유용한 것) 이다.
강의에서는 음악에 관심이 많아서 저쪽도 꽤 자세히 이야기했지만 나는 간단하게 넘어가겠다.
적는 순서는 위와 약간 다를 수 있다. (강의 순서)
Volume
소리를 크거나 작게 수정한다. 일반적으로 알고있는 그 볼륨과 유사하다.
디지털 오디오의 범주(domain)에서 볼륨을 수정한다는 것은 단순하게 각 샘플에다가 원하는 만큼을 곱하는 것이라고 볼 수 있다.
샘플의 값(크기)가 바로 소리의 크기이므로, 거기에 값을 곱하면 원하는 만큼 증폭되거나 축소되는 것이다.
대충 위와 같은 식으로 작동한다.
일반적으로 스피커나 컴퓨터 내의 볼륨 조절 기능은 100% 이상으로 올라가는 경우가 적은데, 그 이유는 150%로 했을 경우 천장에 닿아서 clipping 현상을 일으킬 것이 우려되기 때문이다.
이 볼륨 조절도 거기서 자유롭지 못한데, 수정 중에는 floating point 이므로 1.0f를 넘길 수 있지만 저장시에도 1.0이 넘는게 있다면 소리가 망가지게 되는 것에 유의해야 한다.
덤으로, 볼륨 조절기는 보통 선형적이 아니라 로그스케일(logarithmic) 으로 표현되는데, 그 이유는 단순하게 사람의 귀가 그렇게 느끼기 때문이라고 한다. 애초에 dB 부터가 로그 단위인데 어쩌겠는가.
EQ(Equalization)
신호 내에 포함된 주파수 구성 요소를 조정하는 것.
특정 주파수 대역의 소리를 높이거나, 줄이거나, 잘라내는 등의 작업을 한다.
여러 가지의 필터가 존재하는데, 필터 밖의 소리를 쳐내는 식으로 작동한다. 쳐내진 소리는 필터에 걸리는 한계 안에서 낮춰진다(예상)
필터의 종류는 다음과 같다. 아마 이 외에도 많지 않을까 싶다.
각 필터들은 세 가지 파라미터를 쓰는데, 주파수 (~까지, ~를 중심으로, ~부터), gain(dB. 얼마나 boost, 어디까지 cut), bandwitdh(중심 주파수부터 얼마나) 이다. 물론 bandwidth는 아래에서 3,5번만 쓴다.
1. Low Pass Filter
고주파 소리 제거. 기준치 이상의 고주파를 잘라낸다.
2. High Pass Filter
저주파 소리 제거. 기준치 미만의 저주파를 잘라낸다.
3. Notch Filter
특정 주파수 대역 주변의 소리를 제거한다. (파라미터는 중심 주파수 + 범위)
4. Shelving EQ
High shelf, Low shelf 두 가지가 있다. 각각은 높은 주파수와 낮은 주파수를 커버한다.
그 부분의 주파수를 증폭하거나 (~0db인 것을 그대로 scale하여 ~6db로 바꾼다던가), 잘라낸다.
설명을 보면 낮은 쪽은 scale은 아닌 모양. boost or cut 이라고 되어있으니.
5. Band (Picking) EQ
특정 주파수 대역 주변의 소리를 증폭하거나 잘라낸다.
위는 몇 가지 예시이다. 음악하는 애들은 저렇게 주욱 늘어선 버튼 수십개를 보고서 머릿속에 어떤 주파수를 키우고 잘라내고 하는게 머릿속에 들어오나 보다...
Compression
앞의 PCM 압축(코덱) 과는 다른 개념이다. 이펙트에서의 압축은 파일 크기를 줄이지 않는다. 줄이는 것은 dynamic range로, 그래서 dynamic range compressor 라고도 불린다.
가장 소리가 큰 부분의 소리를 줄여서 일관되고 균일한 소리를 만드는 작업이다. 그럼으로서 여유 공간(headroom)을 만들고, 그만큼 전체적인 소리를 키울 수 있다.
사람의 대화를 잘 듣기 위해서(단어들의 소리 크기를 비슷하게 만드려고) 사용하거나, 음악적 효과를 위해 주로 사용된다.
사용할 때는 다음과 같은 파라미터들을 사용한다.
Threshold (dB) - 어느 크기 이상의 소리들의 볼륨을 줄일 것인가. (기준점)
Ratio - 얼마나 줄일 것인가. input : output은 원래 1:1 이지만 그걸 조정한다.
Attack and Release - 오디오의 언제부터 언제까지에 대해서 적용할 것인가.
Make-up Gains - 압축으로 얻은 headroom을 이용하여 얼마나 소리를 증폭시킬 것인가.
글로는 이해가 어렵다. 그래서 위와 같이 그림을 추가한다.
Noise Gate
잡음을 차단하는 방법이다. 원치 않는 소리, signal 이 없을 때 들어오는 input (noise)를 차단하는 문(gate) 이다.
예를 들어 대화중에 나오는 숨소리 따위를 제거하기 위해서 사용된다.
on/off가 반복되며 on 시에는 소리가 mute되어 아무것도 들어오지 않는다.
일정 조건이 만족되면 게이트가 닫히는데, 조건이란 다음 두 가지이다.
Threshold (dB) - 일정 수치 이하의 소리가 들어오면 문을 닫는다.
Hold Time (ms) - 게이트가 닫힌 채로 유지되는 최소 시간. 한번 닫히면 이 안에는 threshold 를 넘어서는 소리가 들어와도 게이트가 열리지 않는다.
여기서 하나 당혹스러운게, hold time이 '열리는 시간' 인지 '닫히는 시간' 인지가 문서마다 말이 다르다. 실제 써볼 때 확인해보도록 하자.
Automatic Gain Control (AGC)
위의 compression과 연관되는 기능이다. compression이 큰 소리를 줄인다면, AGC는 작은 부분의 소리를 자동으로 키우는 기능이다.
주로 통화 등에서 사용되며, 일정 크기의 소리인지 아닌지를 듣고 on/off가 자동적으로 결정된다.
그러나 잡음을 키우면 안 되기 때문에, noise gate와 함께 사용된다.
이걸 '잘' 하기 위해서 다양한 논문과 복잡한 알고리즘이 존재할 것으로 예상된다. 뭐가 노이즈고 뭐가 작은 소린지 구분하기 쉽지 않을 테니. 사람도 멀리서 부르는 걸 듣고 바람소린가? 하는 경우가 있잖은가.
Echo suppression
아래 나오는 delay와 반대로 echo를 감지하고 제거한다.
주로 스카이프 등 통화를 목적으로 하는 경우에 주로 사용된다. 스피커로 나온 소리가 마이크로 들어가면 두 번 들리게 되는데, 이건 누구나 당연히 불쾌하다. (마이크 감도 조절을 틀리면 흔히 일어나는 일이지만...)
일례로, AI스피커들은 TV가 켜 져 있는 환경에서 작동하는데 (기가지니 등은 무조건) 사람 목소리는 높은 확률로 TV소리보다 작다. 보통 AI스피커는 TV 앞에 있고, 사람은 거기서 머니까 어쩔 수 없다. 그런데 TV에 나오는 이들은 말을 하고, 기가지니 광고라도 나오면 각종 명령어를 내뱉을 것이다. 거기에 기계가 작동해 버리면 안되잖은가?
그래서 그들은 자신이 '출력하는 소리' 와 '들어온 소리'를 비교하여, 유사한 소리를 감지하고 제거하는 기능을 포함하고 있다.
그 기능의 이름을 몰랐는데 이 기능인 것으로 추정된다.
Playback Rate Control
여기 나온 것들 중에서 볼륨 다음으로 친숙한 기능이다. 당장 나부터도 매우 자주 사용하는 기능이니까. 단순히 재생 속도 조절이다.
천천히 듣거나 빠르게 듣기 위해서 주로 사용하는데, 역시나 음악적 효과를 주기 위해서 (혹은 악기 연주 연습 등을 위해서)도 사용된다고 한다.
단점으로는 실시간 사운드에는 사용될 수 없어서 통화 따위에는 적용할 수 없다는 것인데, 이건 제약이 아니라 당연한 거라서 큰 의미는 없다. 시간을 뛰어넘어야 하는 거니까... 뭐 느리게 듣기는 저장해뒀다가 틀면 되겠지만.
구현 방법은 의외로 심플한데, sample rate를 재해석하는 방법을 사용한다. 8khz로 제작된 오디오 파일을 마치 16khz인 것처럼 하면 2배속 재생이 된다.
8khz라는 건 1초에 8000개의 sample을 뽑았다는 뜻인데, 이 오디오를 16khz로 해석한다? 그러면 1초동안 재생하는 sample의 수가 16000개가 되고, 그건 2초간 녹음된 분량이다. 즉 2배속 재생이 된다.
---아래는 서브 효과를 주는 Effect. 서술을 간략하게 생략하였다---
Panning
하나의 마이크로 녹음한 모노 사운드를 마치 스테레오인 양 표현하는 방법이다.
먼저 하나의 모노 사운드를 양쪽에 그대로 복사하여 스테레오로 만든 뒤, 마치 '특정 위치'에서 소리가 나는 것마냥 조작한다.
왼쪽에서 나는 것처럼 하려면 왼쪽에 x1, 오른쪽에 x0 하고 반대쪽은 반대로. 가운데에 있는 것처럼 하고 싶다면 양쪽 모두를 -3db한다.
움직이는 걸 표현하고자 한다면 한쪽을 점점 줄이고 한쪽을 점점 늘리면 된다.
Delay
소리에 하나 이상의 에코 효과를 준다.
Pitch Shifting
그나마 TV나 소설 따위에서 자주 접해 본 기능이다.
아주 간단히 말해서 음성을 변조하는 기능이라고 보면 되겠다. 사람의 목소리 등을 바꿔서 높거나 낮은 목소리로 바꿀 수 있다.
흔히들 노래를 '기계로 만졌다' 고 표현하는 오토튠이 이 pitch shifting 의 예시 중 하나이다. 또한 중저음이 되거나 여자 목소리로 바꿀 수도 있다.
Reverb
벽에 의해서 소리가 반사되는 것을 모델링한다.
벽에서 반사되는 소리를 이용하여 마치 실내인 것처럼 소리를 가공한다. 빨리 에코가 들어와 작은 공간으로 표현하거나 천천히 들어와 넓은 공간인 것처럼 만들 수 있다.
Distortion
일부러 음파를 왜곡시켜 원하는 효과를 낸다.
뭘 어떻게 왜곡시키는 건지는 잘 모르겠지만... 일단 음악적(예술적!)이지 않은 일반 환경에서 쓸 일은 적어 보인다.
'개발언어 > NAudio' 카테고리의 다른 글
[C#] 리소스에 있는 mp3 재생하기 중복재생하기 (0) | 2021.07.09 |
---|---|
[Digital Audio] 4. Audio Signal Chains (0) | 2021.07.08 |
[Digital Audio] 2. Audio File Format (0) | 2021.07.08 |
[Digital Audio] 1. Audio Sampling (0) | 2021.07.08 |
[NAudio] 반복재생하기 (0) | 2021.07.08 |