더북(TheBook)

다른 음 간단한 수식으로 반음계의 다른 음을 설명할 수 있다. 반음계에 있는 12개의 음은 밑수 2인 로그 함수로 균일하게 분할된다. i번째 음은 주파수에 2의 i/12 제곱을 곱해 구한다. 즉 반음계에 있는 각 음은 바로 아래 음에 21/12(대략 1.06)을 곱해 구한다. 자, 이제 음악을 컴퓨터로 재생할 기본적인 준비는 된 것 같다! 예를 들어 프레르 자크(Frère Jacques)의 노래를 연주하려면 A B C# A에 해당하는 주파수를 0.5초씩 생성하고 이 패턴을 반복하면 된다.

샘플링 디지털 사운드도 함수 그래프를 그리는 방법과 마찬가지로 일정 간격으로 샘플링해 곡선으로 표현한다. 이때 충분히 조밀하게 샘플링해야 정확한 곡선을 얻을 수 있으며, 일반적으로는 초당 44,100번 샘플링하는 방법이 널리 사용된다. '라'음의 경우 이 비율은 사인 곡선 하나를 약 100개의 점에서 샘플링해 그리는 정도가 된다. 일정한 간격으로 샘플링하므로 샘플로 선택한 점에서 y 값만 계산하면 된다. 샘플링은 이처럼 간단하다. 소리를 -1과 1 사이의 실수를 담은 배열로 표현하는 것이다. 예제용 라이브러리 stdaudio 모듈에는 인수로 실수 배열을 받아 이 배열이 표현하는 소리를 재생하는 stdaudio.playSamples() 함수가 있다.

예를 들어 10초 동안 ‘라’음을 재생하는 경우를 생각해보자. 초당 44,100 샘플을 사용하는 경우 441,001개의 실수가 필요하다. 이 배열을 채우려면 t = 0 / 44100, 1 / 44100, 2 / 44100, 3 / 44100, ..., 441000 / 44100인 t에 대해 sin(2𝜋t × 440) 함수를 샘플링하기 위해 for 루프를 사용한다. 일단 이 배열에 값을 채워 준비가 끝난 후에는 다음 코드의 stdaudio.playSamples() 함수를 이용해 사운드를 재생할 수 있다.

SPS = 44100               # 초당 샘플 수
hz = 440.0                # '라'음
duration = 10.0           # 10초
n = int(SPS * duration)
 
a = stdarray.create1D(n+1)
for i in range(n+1):
    a[i] = math.sin(2.0 * math.pi * i * hz / SPS)
stdaudio.playSamples(a)
stdaudio.wait()
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.