Un râleur ne suffit pas à enterrer un titre
Comment Orfeo décide quel morceau passe ensuite. Une note par titre, et derrière chaque règle du calcul, un comportement très humain qu'il fallait anticiper.
Dans toute soirée, il y a un pote qui n'aime rien.
Tu lui donnes un bouton « je n'aime pas ce titre », il appuie dessus toute la nuit. Si ton système l'écoute, c'est lui qui fait la programmation. Si ton système l'ignore, à quoi sert le bouton ?
C'est exactement le genre de question que pose Orfeo. Les invités proposent, votent, râlent — et à la fin, il faut bien choisir un morceau. Voici comment.
Une note, et le meilleur passe
Le principe tient en une ligne : chaque titre candidat reçoit une note, on trie, le premier passe.
La note, c'est une somme. Des choses qui font monter, des choses qui font descendre :
note = votes + humeur + phase + dédicace + époque
− même artiste récemment − même genre récemment − votes négatifs
+ préférence de l'hôte
Rien de magique. Pas de machine learning, pas de boîte noire. Chaque terme est un nombre entre 0 et 1, multiplié par un poids. Si un titre passe et que je me demande pourquoi, je peux lire le détail du calcul.
Ce qui est intéressant, ce n'est pas la formule. C'est pourquoi chaque morceau de la formule existe.
Le dixième vote compte moins que le premier
Si tu additionnes bêtement les votes, un tube à quinze votes écrase tout. Puis le suivant. Puis le suivant. La soirée devient un top 50.
Alors les votes passent par un logarithme :
static func votesNorm(_ votes: Int, maxVotes: Int) -> Double {
guard votes > 0, maxVotes > 0 else { return 0 }
return log(Double(1 + votes)) / log(Double(1 + maxVotes))
}
En clair : passer de 0 à 3 votes, ça compte beaucoup. Passer de 12 à 15, presque pas. Un titre aimé par quelques-uns garde sa chance face à un titre adoré par tout le monde.
Le râleur solitaire
Retour à mon pote qui n'aime rien.
Les deux premiers votes négatifs sur un titre sont tout simplement ignorés. Il en faut trois pour que ça commence à peser. Un seul mécontent ne peut pas enterrer un morceau ; un vrai rejet collectif, oui.
Celle-là, je ne l'ai pas découverte en soirée. Je l'ai décidée à froid, avant d'écrire le bouton, parce que le scénario était évident.
Même logique pour l'humeur. Les invités peuvent dire s'ils veulent plus calme ou plus fort. Dans ma première version, un seul avis suffisait à déplacer la cible de toute la salle. Maintenant un avis isolé pèse peu, et il faut que plusieurs personnes disent la même chose pour que ça bouge.
Le moment de la soirée
Chaque titre a une énergie, de 1 à 5. Chaque phase de la soirée aussi. Un morceau à 5 pendant l'apéro perd des points ; le même morceau à minuit en gagne.
C'est ce qui fait qu'une proposition peut attendre son heure. Elle n'est pas refusée, elle est juste mal placée pour l'instant.
L'hôte a le dernier mot
Celle-ci est la règle que j'assume le plus.
Je peux dire à Orfeo « plus de ce genre » ou « moins de ce genre », sur une échelle de −2 à +2. Et ce réglage est volontairement plus fort que les votes : un genre à +2 passe devant le titre le plus voté de la salle.
Le soir de mon anniversaire, je m'en suis servi pour pousser l'électro en fin de soirée. La foule choisit les titres, mais c'est l'hôte qui tient la direction. Une fête n'est pas une démocratie parfaite, et ce n'est pas grave.
Ne pas se répéter
Deux pénalités : une si le même artiste vient de passer, une si le même genre vient de passer. Sans ça, trois votes pour trois titres du même groupe te font un mini-concert.
Et un titre déjà joué est exclu pendant un moment. Là, par contre, je me suis fait surprendre. J'avais mis cette exclusion à 50 titres — environ trois heures de musique. Parfait pour une soirée normale.
Sauf que mon anniversaire a duré une journée entière. Sur une durée pareille, attendre trois heures avant de pouvoir réentendre un tube, c'est trop long. J'ai réduit à 25 titres après coup. Le bilan de la journée : 203 titres joués, et 2 vraies répétitions.
Le hasard que j'ai fini par couper
J'avais prévu un grain d'aléa dans la note, pour éviter qu'à égalité ce soit toujours le même titre qui gagne. Avec une graine fixe, pour que les tests donnent toujours le même résultat.
En pratique, je l'ai mis à zéro. Le calcul tourne en boucle pendant la soirée, et avec de l'aléa, la file d'attente se réordonnait toute seule à chaque passage. Les invités voyaient leur titre monter et descendre sans raison. Mauvaise idée.
Un cerveau sourd
Dernier point, et c'est celui qui m'a le plus servi.
Ce cerveau ne sait pas ce qu'est Apple Music. Il ne connaît ni la base de données, ni l'interface. Il reçoit une photo de la situation — les candidats, les votes, l'historique, la phase — et il rend une liste ordonnée de codes ISRC. C'est tout.
Conséquence : je peux le tester sans jouer une seule note. Je lui donne une situation, je vérifie l'ordre qu'il rend. Toutes les règles ci-dessus ont leurs tests, y compris celle du râleur.
Et le jour où je voudrai brancher autre chose qu'Apple Music, le cerveau ne s'en rendra même pas compte.
— Pato