Syncronome
개발 중여러 기기가 같은 박자를 ±10ms 안에서 듣는 메트로놈
iOS 앱 · 2026 — 현재
개요
밴드 합주에서 각자 메트로놈을 켜는 대신, 호스트 한 명이 BPM·박자·셋리스트를 잡으면 방에 있는 모든 멤버가 같은 클릭을 듣는 앱입니다. 투어 밴드가 쓰는 하드웨어 클릭 트랙 장비를 휴대폰으로 옮긴 셈입니다. 시끄러운 합주실을 위해 박자를 전체 화면 플래시로도 줍니다.
설계의 핵심은 동기화를 두 층으로 나눈 것입니다. 실시간 메시지는 상태를 잘 전파하지만 도착 시간이 50~500ms로 흔들려서 "지금 시작"이라는 신호로는 박자를 맞출 수 없습니다. 그래서 상태 동기화(BPM, 재생 여부, 시작 시각)와 시간 동기화(NTP 방식 오프셋)를 분리하고, 각 클라이언트가 이 둘로 박자 시각을 로컬에서 계산합니다.
기술적으로 공들인 지점
NTP 방식 클럭 동기화
서버 시각을 5~7회 물어 샘플별 오프셋을 구하고 왕복 시간이 가장 짧은 3개를 평균합니다. 최소 왕복 시간의 절반을 불확실도로 삼고, 30초마다 드리프트를 재측정하며 백그라운드 복귀 직후에는 즉시 재동기화합니다.
룩어헤드 비트 스케줄러
25ms마다 깨어나 다음 100ms 안에 떨어지는 모든 박자를 네이티브 오디오 스케줄러에 미리 예약합니다. 가비지 컬렉션이나 이벤트 루프 지터가 박자를 밀지 못합니다.
위상을 보존하는 템포 변경
BPM만 바뀌면 다음 박자 경계에서 시작 시각을 다시 계산해 위상을 유지하고, 곡이 바뀌면 모든 클라이언트가 첫 박을 미리 예약할 수 있도록 200ms 뒤로 잡습니다.
기기별 오디오 지연 보정
블루투스는 200ms까지 벌어질 수 있어서 -300~+300ms 보정값을 두고, 탭 동기화 테스트로 자동 추정합니다.
광민감성을 고려한 플래시
WCAG 2.3.1을 기준으로 초당 3회를 넘으면 자동 감쇠하고, BPM 180 이상에서 밝기를 절반으로 줄이고, 흰색만 쓰며 기본값은 꺼짐입니다.
이유가 적힌 디자인 결정
밝은 배경은 플래시 대비를 죽여 기능 자체를 무력화하므로 다크 테마만 두고 설정에서 제외했습니다. 변하는 숫자는 모두 고정폭 서체로, 무대 모드 버튼 크기는 1m 시야 거리 기준으로 지정했습니다.