reTONE이 시작된 곳이므로, 이 첫 글은 어떻게 시작했는지에 대한 이야기를 조금, 그리고 처음 잘못되었던 몇 가지를 다룹니다.
시작은 이랬습니다
한동안 오래된 디지털 오디오 플레이어인 AR-M20을 만지작거리고 있었습니다. 디자인은 정말 좋아하지만, 안에 든 Android가 너무 오래되어 무엇에 쓸지 늘 막막했습니다. 딱히 생각한 것이 있었던 것은 아니고, 이런 물건은 다시 쓰일 자격이 있다는 느낌뿐이었습니다.
그러다 중고 전자제품 매장에 들어갔다가 오래된 스마트폰이 헐값에 팔리는 것을 보고, 충동적으로 한 대에 약 1,000엔 (약 7달러)씩 몇 대를 샀습니다. Sharp AQUOS CRYSTAL 305SH, Kyocera URBANO, Nexus 6, iPhone 5s, 그리고 iPod nano입니다. iPhone과 iPod에는 reTONE이 아무것도 할 수 없지만, 그건 또 다른 이야기입니다. 바로 써 보니 Android 기기들은 문진이나 다름없었습니다. 그렇게 오래된 Android를 지원하는 앱은 이제 거의 없어서, 바라보는 것 말고는 할 일이 없었습니다. 그래도 이미 돈을 냈으니까요. 그래서 이 폰들을 위한 무언가를 만들기 시작했습니다. 솔직히 그게 탄생 이야기의 전부입니다.


reTONE은 첫날부터 AI와 함께 만들었습니다. 처음에는 ChatGPT로 시작했습니다. 원하는 것을 설명하자 홈 화면, 음악 플레이어, 잠금 화면 같은 대략적인 버전이 놀랄 만큼 빨리 갖춰졌습니다. 전체 시스템은 그 단계에서 만들어졌습니다. 하지만 디자인이나 "내일은 이 부분이 이렇게 동작했으면 좋겠다" 같은 세부적인 요청으로 들어가자, 다른 AI인 Claude가 그냥 더 잘했기 때문에 옮겨 갔습니다. 그 뒤로는 Claude가 대부분의 작업을 하고, ChatGPT도 가끔 거들고 있습니다.
그러니 누가 무엇을 하는지 분명히 해 두겠습니다. 코드는 대부분 AI가 씁니다. 나머지는 제가 합니다. reTONE이 무엇이어야 하고 어떻게 짜여야 하는지, 그리고 소리에 관해 어디서 고집을 부릴지 정하는 것입니다. EQ나 효과를 덧씌우지 않을 것, 휴대전화가 실제로 알려 주는 출력 레이트를 보여 줄 것, 앱이 확인할 수 없을 때는 결코 비트퍼펙트라고 주장하지 않을 것, 그리고 모든 것을 2012년 폰에서도 돌아갈 만큼 가볍게 유지할 것. 그다음은 시행착오인데, 이것이 작업의 대부분입니다. 빌드할 때마다 실제 오래된 폰에 넣고, 듣고, 무언가 이상하면 알아차리고, 맞을 때까지 주고받습니다. 그 폰들은 AI의 책상이 아니라 제 책상 위에 있습니다.
두 개가 존재한 플레이어 (0.24.1)
Android 4.4 폰에서 HOME 버튼으로 reTONE을 열 때와 아이콘으로 열 때, reTONE이 두 개 따로 생겼습니다. 앱은 그런 일이 일어나지 않도록 설정되어 있었지만, 이 폰에서는 그래도 일어났습니다. 그래서 한쪽을 조작하는 동안 실제로 재생하고 있는 것은 다른 쪽인 상황이 생길 수 있었습니다.
reTONE은 이제 살아 있는 하나를 추적하고, HOME에서 연 쪽이 재생을 이어받습니다. 하는 김에, 이제 어디서든 HOME을 누르면 재생 화면으로 돌아갑니다.
1 dB 단위의 음량 (0.31~0.32)
Android는 음악에 15단계의 음량을 주는데, 한 단계마다 차이가 큽니다. 작게 들을 때는 딱 맞는 단계가 없는 경우가 많습니다.
reTONE은 root 없이 건드릴 수 있는 두 가지 음량 조절을 조합합니다. Android의 15단계가 큰 단위를 맡고, 앱 자체의 음량이 그 사이를 채워서, 한 번 누를 때마다 약 1 dB가 됩니다. 올릴 때는 reTONE이 먼저 자기 음량을 낮춘 다음 Android의 음량을 올리므로, 순간적으로 소리가 커지는 일이 없습니다. 0은 언제나 무음입니다.
단서가 있습니다. 앱 자체의 음량을 완전히 무시하는 폰이 있고, 그런 폰에서는 다시 15단계로 돌아갑니다. 또 한때는 다른 화면이 앞에 있을 때도 이 미세 조절을 적용해 보았습니다. Android가 먼저 자기 단계를 움직이고 자기 슬라이더를 보여 주었기 때문에, 음량이 귀에 들릴 만큼 떨어졌다가 다시 바로잡혔습니다. 다음 날 다시 뺐습니다.
다이렉트 출력은 어디서 왔나 (0.46.0)
월말 무렵 Android One X5에서, Android의 표준 재생이 출력하는 과정에서 어떤 곡을 변환하는지 확인했습니다. 48 kHz로 변환되는 것은 48 kHz 이하의 16비트 곡뿐이었습니다. 다시 말해 바로 CD 음원입니다. 해상도가 더 높은 파일은 이미 손대지 않은 채 나가고 있었습니다.
그래서 16비트 곡을 디코딩해 오디오 자체는 바꾸지 않은 채 24비트로 Android에 다시 넘겨 보았습니다. 그러자 44.1 kHz 그대로, 변환 없이 나왔습니다. Android 10에는 주어진 형식을 변환 없이 내보낼 수 있는지 앱이 물어볼 방법이 추가되었고, 그 답은 제가 측정한 결과와 매번 일치했습니다. 덕분에 reTONE은 어느 폰인지가 아니라 폰이 알려 주는 내용을 바탕으로 판단할 수 있게 되었습니다.
그것이 Android 10 이상의 폰을 위한 reTONE의 다이렉트 출력 기능이 되었습니다. 표시되는 DIRECT 라벨은 Android가 알려 주는 내용을 바탕으로 합니다. 앱은 오디오가 실제로 거치는 경로를 볼 수 없기 때문입니다.
그 밖의 변경
- 헤드셋 버튼: 한 번 누르면 재생 또는 일시정지, 두 번은 다음 곡, 세 번은 이전 곡.
- 탐색 막대는 손이 닿은 순간부터 끌 수 있고, 손을 뗄 때 한 번만 탐색합니다.
- 헤드폰, Bluetooth, DAC가 분리되면 재생이 항상 일시정지됩니다.
- 반복과 셔플. (셔플 버튼은 그때까지 아무 일도 하지 않고 있었습니다.)
- 갭리스 재생.
- 재생 화면 아래쪽에 출력과 그 샘플레이트를 표시합니다.
- Android 4.1 지원.
- 라이브러리의 정렬과 A~Z 색인.