소리꽃 KeyBloom TIL 4
파일을 틀어 보는 것만 되던 앱에 실시간 연주를 붙이며 나온 것들.
차이가 어디까지인지 보기
입력만 다르면 아래는 그대로 쓴다
파일 재생과 실시간 연주는 다른 기능처럼 보인다. 그런데 뜯어 보니 “음이 언제 오는가”만 달랐다. 파일은 타임라인을 보고 때가 되면 오고, 연주는 사람이 건반을 누를 때 온다. 그 뒤로 벌어지는 일 — 파티클이 피어오르고 소리가 나고 건반이 눌리는 것 — 은 완전히 같다.
그래서 “음이 시작됐다”와 “음이 끝났다” 두 지점을 만들고, 양쪽이 거기로 모이게 했다. 화면을 그리는 부분은 한 줄도 안 고치고 연주 모드가 얹혔다.
새 기능을 검토할 때 기존 기능과 무엇이 다른지를 끝까지 좁혀 보는 게 견적을 가른다. “비슷한데 다르다”에서 멈추면 통째로 새로 만들게 되고, “입력만 다르다”까지 좁히면 붙이는 일이 된다.
하드웨어가 필요한 기능은 없이도 쓸 길을 만든다
연주 모드는 원래 건반 악기를 연결해야 쓸 수 있다. 그러면 장비가 없는 사람은 이 기능을 아예 못 만져 본다.
그래서 컴퓨터 자판을 건반에 매핑했다. 개러지밴드의 뮤지컬 타이핑처럼 음악 프로그램들이 흔히 하는 방식이다. 자판으로는 두 옥타브쯤 닿고, 옥타브를 옮기면 전체를 커버한다.
이게 세 군데서 값을 했다. 장비 없이 개발하고 확인할 수 있고, 남에게 보여 줄 때 장비를 안 들고 가도 되고, 장비 없는 사용자도 기능을 경험하고 나서 살지 말지 정할 수 있다.
하드웨어를 전제로 하는 기능을 만들 때 “없으면 어디까지 되게 할 것인가”를 같이 정해 두는 게 좋다. 아예 못 쓰게 두면 그 기능은 소수만 아는 기능으로 남는다.
자판으로 연주할 때 옥타브를 바꾸면 누르고 있던 음이 안 꺼지는 일이 있었다. 켤 때와 끌 때 다른 값을 쓰면 이렇게 된다. 켜고 끄는 짝은 켤 때의 값을 기억해 뒀다가 그걸로 꺼야 한다.
권한은 그 기능에 들어갈 때 묻는다
MIDI 악기를 읽으려면 Web MIDI 권한(브라우저가 연결된 MIDI 기기를 읽어도 되는지 사용자에게 묻는 것)이 필요하다. 시작하자마자 물으면 파일만 볼 사람에게도 팝업이 뜬다.
연주 모드에 처음 들어갈 때 묻게 미뤘다. 그 시점에는 사용자가 왜 묻는지 알기 때문에 허용할 이유가 분명하다.
권한 요청은 “필요한 순간에, 이유가 보이는 자리에서” 하는 게 허용률도 높고 인상도 좋다. 시작할 때 몰아서 묻는 건 만드는 쪽만 편한 방식이다.
한계를 숫자로 확인하기
실측해야 플랫폼을 바꿀 근거가 된다
실시간 연주는 누른 순간 소리가 나야 한다. 늦으면 연주 자체가 안 된다.
줄일 수 있는 건 다 해 봤다. 그러고 나서 실제 지연을 재서 화면에 띄웠다. 우리가 손댈 수 있는 내부 버퍼가 10밀리초, 그 아래 운영체제와 장치가 쓰는 출력 지연이 48밀리초, 합쳐서 58밀리초였다.
여기서 안 게 컸다. 브라우저는 소리를 낼 때 윈도우의 공용 통로(WASAPI 공유 모드)만 쓸 수 있는데, 그 통로는 여러 앱의 소리를 섞느라 버퍼(소리를 미리 채워 두는 대기열)가 크다. 음악 프로그램들이 5밀리초를 내는 건 장비에 거의 직결하는 ASIO라는 저지연 규격을 쓰기 때문인데, 브라우저는 거기 접근할 수 없다. 좋은 오디오 장비를 꽂아도 웹에서는 안 나온다.
즉 이건 우리 코드로 더 못 줄이는 벽이었다. 이 숫자가 나중에 설치형 앱으로 가는 결정의 근거가 됐다.
막연히 “웹은 느리다”고 아는 것과 “58밀리초이고 그중 48은 우리가 못 건드린다”고 아는 것은 다르다. 앞엣것으로는 아무 결정도 못 하고, 뒤엣것으로는 플랫폼을 바꾸는 큰 결정을 할 수 있다. 한계에 부딪혔을 때 그 한계를 숫자로 만들어 두면, 그게 다음 결정의 재료가 된다.
요약
- 새 기능이 기존과 무엇이 다른지 끝까지 좁힌다 — “입력만 다르다”까지 좁히면 붙이는 일이 된다
- 하드웨어가 필요한 기능은 없이도 쓸 길을 만든다. 개발·시연·구매 판단 세 군데서 값을 한다
- 켜고 끄는 짝은 켤 때의 값으로 꺼야 한다. 중간에 설정이 바뀌면 어긋난다
- 권한은 필요한 순간, 이유가 보이는 자리에서 묻는다
- 한계는 숫자로 만들어 둔다 — 막연한 한계로는 결정을 못 하고, 숫자는 플랫폼을 바꿀 근거가 된다