본문 바로가기
개발언어/C#

[NAudio] 7. Visualization

by 창용이랑 2021. 7. 8.
728x90

이번 7강은 시각화이다.

내게는 가장 중요하다고 할 수 있는 부분 중의 하나.

 

오디오 편집에 있어서 빠질 수가 없는 내용이기도 하다. NAudio에서는 그다지 중요하게 보지는 않은 것 같지만 역시 뺄 수는 없는 부분이다.

 

NAudio 에서는 세 가지 시각화 수법을 제시하는데, 내가 필요한 것 하나(spectrogrtam)는 여기에 안 나온다... 이건 두 가지를 합친 거라고 봐야 해서 직접 만들어야 할듯. 흑.

 

 

Visualization

 

청각 정보인 오디오를 시각으로 표현하는 방법이다.

이렇게 함으로서 사람의 주관적인 감각(청각)으로 판단하지 않고 수치적으로 된 값을 보고 구분할 수 있게 된다.

또한 동시에 오디오 전체에 대한 내용을 봄으로서 직접 수 분, 수 시간짜리 소리를 듣지 않고 단번에 파악할 수도 있게 된다.

 

시각화는 두 파트로 구분된다.

1. 시각화하고자 하는 데이터 수집

2. 수집한 데이터를 랜더링

 

2번은 플랫폼마다, 원하는 방법마다 다르고 1번이 좀 더 중요하다고 할수 있겠다.

 

NAudio 에서는 세 가지의 시각화 방법과 예제를 제공하고 있다.

 

PeakMeter

 

 

볼륨과 비슷하면서도 다른 개념이다.

소리의 '데시벨'을 보여주는 것으로, 현재 나오는 소리의 크기를 시각화한다. 즉 오디오 재생 중에는 계속 바뀌게 된다.

경우에 따라서는 이게 오디오 파일로 만들어질 시 cliping 되는 소리인지를 표시하는 기능도 있다는데, 즉 보통은 녹음시에 사용하는 기능으로 추정된다.

그래서 자세한 내용은 생략하겠다.

 

아래에서도 계속 사용될 듯해서 작동 방식만 간략하게 적자면, 매 sample 마다 peak를 계산하고 peakMeter를 업데이트하는 것은 매우 비효율적이므로(초당 44100번의 업데이트를 해야 한다! 가능할 리가 없다. 44100fps라니.)  몇 ms를 하나로 묶어서 사용한다.

예를들어 100ms씩 묶을 경우, 1초에 10번 업데이트되는 것이다.

그리고 100ms 안에서 '최고 수치' 를 사용하는게 일반적이지만, '평균 수치' 를 사용하거나 하는 다른 몇 가지 방법도 존재한다.

 

 

WaveForm

 

 

위와 같은, 가장 메이저한 소리의 시각화 방법이다.

위쪽은 높이만을 표시한 것이고(Vertical Line), 아래쪽이 윤곽선(outline) 방식이다. 아래 쪽을 좀 더 메인으로 할 것이다.

 

파형(waveform) 은 말 그대로 파형인데, 여기서 x축은 시간이고 y축은 소리의 크기이다.

peakmeter와 마찬가지로 일정 구간을 묶어서 그 안에서 소리 값을 찾고(보통 max값) 그걸 list 에 추가해서 쓴다.

 

코드를 찾아보면, max와 min 만을 찾아서 추가하는 것... 으로 추정된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private Image Render(IPeakProvider peakProvider)
        {
            var b = new Bitmap(Width, TopHeight + BottomHeight);
            using (var g = Graphics.FromImage(b))
            {
                g.Clear(BackgroundColor);
                var midPoint = TopHeight;
                for (var x = 0; x < Width; x++)
                {
                    var peak = peakProvider.GetNextPeak();
                    if (DecibelScale) peak = ToDecibels(peak, 48);
                    var lineHeight = TopHeight * peak.Max;
                    g.DrawLine(TopWaveformPen, x, midPoint, x, midPoint - lineHeight);
                    lineHeight = BottomHeight * peak.Min;
                    g.DrawLine(BottomWaveformPen, x, midPoint, x, midPoint - lineHeight);
                }
            }
            return b;
        }
Colored by Color Scripter
cs

 

다만 코드 자체가 wpf도 아니고 winform 이라서 잘 모르겠다... 코드를 전부 뜯어보기엔 또 너무 어렵고.

일단 위 함수가 그리는 함수가 맞는 것 같기는 한데 또 확신을 못 하겠네.

 

 

자세한 건 wpf로 직접 짜 본 다음에야 확인해볼 수 있을 것 같다.

 

 

Spectrum Analyze

 

x축을 주파수, y축을 소리의 크기로 하는 그래프 형태로 보여주는 방식이다.

 

 

 

 

위의 두 가지 방식으로 주로 사용된다. 일반적으로 보는 건 아래쪽의 그래프를 많이 보게 되는데, 그래픽적으로 소리를 보여줄 때 흔히 보는 거다.

저걸 켜 놓고 도레미파솔라시도 를 치다 보면 점점 오른쪽이 높아지는 걸 볼 수 있다.

 

저걸 어떻게 만드느냐 하면, FFT(Fast Fourier transform)라는 걸 사용해서 만드는데... 이건 time domain 을 frequency domain 으로 바꾸는 거라고 한다.

그런데 이건 너무 어렵고, 프로그래밍이 아닌 수학의 영역이라고 보여서 생략한다.

실제로 강의에서도 이건 굳이 알려고 하지 말고 이미 구현된 코드를 사용하라고 한다.

 

일단 강의자료에 코드가 있긴 한데?

이것도 위와 마찬가지로 그다지 이해하기 좋은 내용은 아닌데다가, 이건 매우 FFT 적이라서... 솔직히 아예 이해가 안갔다!

직접 해봐야 압니다 2 인듯.

 

그리고 내가 해볼 것은 이 스펙트럼 분석이 아니라, 스펙트럼+waveform을 합친 sperctrogram 이라서...

갈 길이 멀다.

에휴.

 

출처 : https://m.blog.naver.com/luku756/221904302356