Takafumi Horiuchi

고동치는 메트로놈

개요

화면 한가운데의 원이 클릭음의 박자와 세기에 맞춰 고동친다. 광고도 계정도 설정 화면도 없는 iPhone용 메트로놈을 만들었다.

메트로놈 화면. 검은 화면 중앙의 흰 원 위에 박자를 나타내는 네 점이 있고, 아래에는 120 BPM과 −/+가 나란히 있다. 원은 박자에 맞춰 부풀었다가 돌아온다.
앱과 같은 수식으로 움직이는 인터랙티브 화면이다. 템포는 120 BPM, 한 마디는 4박이다. 원을 탭하면 멈춘다.

테너 색소폰을 연습할 때 직접 쓰려고 만들었다. 열면 바로 시작할 수 있고, 소리를 듣기 어려운 상황에서도 박자가 눈에 보인다. 기획과 디자인, SwiftUI 구현, 클릭음 합성까지 모두 혼자 했다.

조작 — 바꾸고 싶은 것을 직접 만지기

화면에는 박자를 나타내는 점, 원, 템포 숫자만 있다. 메뉴나 설명문 없이, 바꾸고 싶은 것 자체를 만져 바꾼다.

멈춘 화면. 중앙의 연한 회색 원에 재생 삼각형이 겹쳐 있다. 위에는 네 점, 아래에는 120 BPM과 −/+, 왼쪽 위에는 작은 ⓘ가 있다.
ⓘ
지원 페이지를 연다.
박자 표시 점
탭하면 한 마디의 박자 수가 한 박씩 늘어난다(1–7박). 손가락으로 쓸어서 늘리거나 줄일 수도 있다.
원
탭하면 시작하거나 멈춘다. 길게 누른 뒤 곡에 맞춰 두드리면 템포를 정할 수 있다.
템포
드래그해서 템포를 높이거나 낮춘다. 천천히 움직이면 더 세밀하게 조절된다. − 또는 +를 탭하면 1 BPM씩 바뀐다.
멈춘 화면. 화면의 글자는 숫자와 ‘BPM’만 남겼다.

고동: 클릭음의 박자와 세기에 맞추기

iOS가 보고하는 출력 지연을 이용해 원의 고동이 클릭음에 맞춰지도록 시점을 조정한다. Bluetooth 이어폰에서는 약 0.1–0.3초의 지연이 생길 수 있다. 원이 커지는 정도는 클릭음의 음량에 비례한다. 첫 박에서는 음높이와 음량이 모두 높은 클릭음과 함께 원도 눈에 띄게 크게 부푼다.

한 마디 4박의 클릭음과 원의 크기를 나타낸 그래프. 클릭할 때마다 크기 곡선이 바로 올라가 첫 박에서는 1.25배, 2–4박에서는 1.15배에 도달하고, 1배 아래로 조금 내려갔다가 돌아온다.
한 마디의 클릭음(채운 영역)과 원의 크기(선). 템포는 120 BPM, 한 마디는 4박이다. 원은 클릭음이 시작된 뒤 0.02초에 가장 커지고, 원래 크기보다 조금 작아졌다가 젤리처럼 제자리로 돌아온다.

오디오 스레드가 각 박의 시점을 샘플 단위의 정밀도로 정한다. 시간 계산에서 오차가 누적되지 않도록 하여, 한 시간 연속 재생한 뒤에도 오차가 0.5샘플 이내에 머물도록 한다.

0.5샘플이라는 수치의 적용 범위와 계산 조건은 추가 확인이 필요하다. 소리가 청취자에게 도달하는 시점이나 화면과의 동기화 정확도를 뜻하는 수치로 해석해서는 안 된다.

탭 템포 — 두드리는 동안은 소리 내지 않기

원을 길게 누르면 젤리처럼 떨리기 시작한다. 곡이나 머릿속 템포에 맞춰 두드리면 만진 부분이 움푹 들어갔다가 출렁이며 돌아온다. 템포는 진동으로 전해진다.

원의 위쪽 가장자리를 한 번 두드린 뒤의 윤곽을 시간순으로 보여 주는 여섯 장면. 0.03초에 위쪽이 들어가고 0.08초에 돌아오기 시작한다. 0.17초와 0.3초에는 세로와 가로로 조금 일그러지고 1.3초에 다시 원이 된다.
원의 위쪽 가장자리를 한 번 두드린 뒤의 윤곽. 앱과 같은 수식으로 그렸다. 점선은 완전한 원이다.
개발 중인 앱 화면. 탭 템포 모드의 원은 회색이며, 아래에는 일본어 ‘젤리 조정’ 패널이 열려 있다. ‘탄성(흔들리는 속도) 3.6회/초’, ‘점성(흔들림이 가라앉는 방식) 0.10’ 등의 슬라이더와 설명이 있다.
흔들림은 개발 버전에만 넣은 조정 패널로 정했다. 탄성과 점성 등 10개 값을 슬라이더로 바꾸면서 실제로 원을 두드려 확인했다. ‘푸딩’, ‘와라비모치’, ‘액체에 가까운’ 설정과도 비교한 뒤, 잘 튕겨 오르고 약 0.9초 만에 가라앉는 ‘젤리’를 기본값으로 골랐다.

두드리는 동안에는 의도적으로 소리를 내지 않는다. 두드린 순간 소리로 응답하면 Bluetooth에서는 늦게 들리고 메트로놈 소리와 겹치게 된다. 두드리기를 멈추면 그 템포의 소리가 희미하게 시작되어 6초에 걸쳐 평소 음량에 도달한다.

다섯 번의 탭 뒤에 진동을 나타내는 점이 점점 작아지고, 대신 클릭음의 막대가 거의 들리지 않는 높이에서 6초에 걸쳐 커지는 그림.
120 BPM으로 다섯 번 두드린 뒤 손을 멈췄을 때. 아래부터 탭, 진동(작을수록 약함), 클릭음(높을수록 큼)이다. 음량을 데시벨 기준으로 고르게 올려 희미한 소리가 갑자기 커지지 않게 했다.

소리 — 색소폰에 묻히지 않는 높이를 귀로 고르기

클릭음은 음원 파일 없이 사인파로 합성한다. 비교 청취용 페이지를 만들고, 테너 색소폰을 불면서 iPhone 스피커로 세 차례 비교했다. 처음 주파수의 1.25배인 1875 Hz와 1250 Hz로 정했다. 색소폰이 가장 강하게 울리는 대역보다 높고 귀를 찌르기 쉬운 대역보다 낮다.

100 Hz부터 10 kHz까지의 주파수 축. 낮은 쪽에는 테너 색소폰의 대역이, 2.5–4 kHz에는 귀를 찌르기 쉬운 대역이 있다. 클릭음 1250 Hz와 1875 Hz는 그 사이에 있으며, 처음 소리인 1000 Hz와 1500 Hz는 점선으로 표시된다.
채운 띠는 테너 색소폰의 에너지가 모이는 대역(오른쪽일수록 약함), 빗금은 귀를 찌르기 쉬운 2.5–4 kHz다. 점선은 처음 소리(1000/1500 Hz), 실선은 선택한 소리다. 선의 높이는 음량을 나타낸다.

더 높고 긴 소리나 배음을 더한 후보가 더 잘 들렸다. 그래도 부드럽고 중립적인 전자음의 느낌을 유지할 수 있는 범위에서 골랐다.

덜어내기 — 넣지 않은 것들

선택을 망설이게 하는 것은 두지 않는다. 없어도 성립하는지 하나씩 확인하고 덜어냈다.

광고·추적·계정
처음부터 정한 것. 앱은 스스로 네트워크 통신을 하지 않는다.
설정 화면
모든 일을 한 화면에서 마친다.
음색 선택
강박과 약박 두 소리면 충분하다. 선택지는 망설임을 만든다.
음량 슬라이더
기기의 음량 버튼이면 충분하다.
라이트 모드
검은 화면 하나만 둔다.
8박 이상
12/8박자는 4박, 9/8박자는 3박으로 센다.
박자 세분화(8분·셋잇단·16분)
필수는 아니다. 첫 번째 추가 후보로 남겨 둔다.
템포 숫자 입력
−/+와 드래그면 충분하다.

외부 라이브러리 없이 SwiftUI로 구현했으며, iOS 17 이상의 iPhone에서 작동한다. 영어 이름은 No Ads Simplest Metronome이다. 전체 사용법과 개인정보 처리방침은 지원 페이지(영어)에 실었다.