C’est ici que reTONE a commencé : ce premier billet raconte donc un peu ses débuts, puis les premières choses qui ont mal tourné.
Les débuts
Depuis un moment, je bricolais l’AR-M20, un ancien baladeur numérique. J’adore son design, mais l’Android qu’il embarque est si ancien que je n’ai jamais vraiment su quoi en faire. Rien de précis en tête, juste le sentiment que ce genre d’objet méritait de resservir.
Puis je suis entré dans un magasin d’électronique d’occasion, j’ai vu d’anciens smartphones vendus pour presque rien, et j’en ai acheté une poignée sur un coup de tête, environ 1 000 yens (à peu près sept dollars) chacun : un Sharp AQUOS CRYSTAL 305SH, un Kyocera URBANO, un Nexus 6, un iPhone 5s et un iPod nano. reTONE ne peut rien pour l’iPhone ni l’iPod, mais c’est une autre histoire. En les essayant tout de suite, j’ai constaté que ceux sous Android n’étaient guère plus que des presse-papiers. La plupart des applications ne prennent plus en charge un Android aussi ancien : il n’y avait rien d’autre à faire que les regarder. Mais je les avais déjà payés. Alors j’ai commencé à créer quelque chose pour eux. Honnêtement, c’est toute l’histoire.


Je construis reTONE avec l’IA depuis le premier jour. J’ai commencé avec ChatGPT : je décrivais ce que je voulais, et une version sommaire a pris forme étonnamment vite : un écran d’accueil, un lecteur de musique, un écran de verrouillage. L’architecture d’ensemble a été construite pendant cette phase. Mais lorsqu’il s’est agi des détails, du design, des demandes du genre "demain, je veux que cette partie fonctionne comme ceci", une autre IA, Claude, s’en sortait tout simplement mieux, alors je suis passé à elle. Depuis, Claude fait l’essentiel du travail, ChatGPT donnant encore un coup de main de temps en temps.
Pour être clair sur qui fait quoi : l’IA écrit l’essentiel du code. Le reste, c’est moi. Décider de ce que reTONE doit être et de la façon dont il doit être construit, et des points sur lesquels être intransigeant côté son : aucun EQ ni effet ajouté par-dessus, afficher la fréquence de sortie que le téléphone signale réellement, ne jamais prétendre au bit-perfect quand une application ne peut pas le vérifier, et garder l’ensemble assez léger pour un téléphone de 2012. Ensuite, il y a les essais et les erreurs, qui représentent l’essentiel du travail. Chaque build est installé sur de vrais anciens téléphones, j’écoute, je remarque quand quelque chose ne va pas, et nous faisons des allers-retours jusqu’à ce que ce soit juste. Ces téléphones sont sur mon bureau, pas sur celui de l’IA.
Le lecteur qui existait en double (0.24.1)
Sur un téléphone sous Android 4.4, ouvrir reTONE depuis le bouton HOME et l’ouvrir depuis son icône donnait deux copies distinctes de reTONE. L’application était configurée pour que cela n’arrive pas et, sur ce téléphone, c’est arrivé quand même. Vous pouviez donc vous retrouver à piloter une copie alors que c’était l’autre qui jouait réellement.
reTONE garde désormais la trace de la seule copie active, et celle ouverte depuis HOME prend le relais de la lecture. Au passage, appuyer sur HOME vous ramène maintenant à l’écran de lecture, où que vous soyez.
Le volume par pas de 1 dB (0.31–0.32)
Android accorde 15 pas de volume à la musique, et chaque pas est un grand saut. Quand on écoute à faible volume, il n’y a souvent aucun pas tout à fait juste.
reTONE combine les deux réglages de volume auxquels il peut toucher sans root. Les 15 pas d’Android assurent le réglage grossier, et le volume propre à l’application comble l’écart entre eux, ce qui donne environ 1 dB par appui. Pour monter le volume, reTONE baisse d’abord son propre volume puis augmente celui d’Android, si bien que vous n’avez jamais de bref pic sonore. Zéro signifie toujours le silence.
Il y a un hic. Certains téléphones ignorent complètement le volume propre à l’application, et sur ceux-là, on revient à 15 pas. Par ailleurs, j’ai un temps essayé d’appliquer ce réglage fin même lorsque d’autres écrans étaient au premier plan. Android déplaçait d’abord son propre pas et affichait son propre curseur : le volume baissait donc de façon audible avant de se corriger. J’ai retiré cela dès le lendemain.
D’où vient la sortie directe (0.46.0)
Vers la fin du mois, sur l’Android One X5, j’ai vérifié quels morceaux la lecture standard d’Android convertit en sortie. Seuls les morceaux 16 bits à 48 kHz ou moins étaient convertis en 48 kHz, c’est-à-dire exactement l’audio CD. Les fichiers de plus haute résolution sortaient déjà intacts.
Nous avons donc essayé de décoder les morceaux 16 bits et de les rendre à Android en 24 bits, sans modifier le son lui-même. Ils sont sortis en 44.1 kHz, sans conversion. Android 10 a ajouté un moyen pour les applications de demander si un format donné peut sortir sans conversion, et ses réponses ont correspondu à chaque fois à ce que j’avais mesuré. reTONE pouvait donc décider d’après ce que le téléphone signale, et non d’après le modèle de téléphone.
C’est devenu la fonction de sortie directe de reTONE, pour les téléphones sous Android 10 ou version ultérieure. L’indication DIRECT qu’elle affiche repose sur ce que signale Android, car une application ne peut pas voir le chemin réellement emprunté par le son.
Autres modifications
- Boutons du casque : un appui pour lire ou mettre en pause, deux pour passer au morceau suivant, trois pour revenir en arrière.
- La barre de progression peut être glissée dès que vous la touchez, et ne se déplace dans le morceau qu’une fois que vous la relâchez.
- La lecture se met toujours en pause lorsqu’un casque, un appareil Bluetooth ou un DAC est déconnecté.
- Répétition et lecture aléatoire. (Jusque-là, le bouton de lecture aléatoire ne faisait rien.)
- Lecture sans blanc (gapless).
- Le bas de l’écran de lecture affiche la sortie et sa fréquence d’échantillonnage.
- Prise en charge d’Android 4.1.
- Tri et index A–Z dans la bibliothèque.