// you’re reading...

tech

on soundComplete(ment) à l'ouest

Je bosse depuis trois jours sur une application de mix online et j’ai donc naïvement tenté d’utiliser le callback onSoundComplete pour enchaîner mes loops en synchro. Autant dire que ce fut comme pisser dans un violon, onSoundComplete est totalement inutilisable dans ce contexte.

Pourquoi ?

Le broadcast de onSoundComplete est temporisé à intervalles réguliers 2048*1000/44100 = 46.43 ms, ce qui génère forcément une latence plus ou moins grande entre le moment où le son s’arrête et celui où l’événement est envoyé. Ce temps de latence peut donc atteindre les sacro-saintes 46.43 ms, un délai inacceptable pour une application de ce genre.

Ceci nous ramène à un précédent billet posté sur ce blog.

La plupart des applications de mix (comme Basement MX d’Andre Michelle) trichent en utilisant 8 canaux maximum et démarrent la lecture de toutes les loops en même temps (afin qu’elles soient synchrones) au lancement de l’application.

C’est en relisant l’article de Frank P. Baumgartner et en parlant avec Andre Michelle que j’ai réalisé que la solution idéale résidait à l’intérieur du nombre magique : 46.439909297052154195011337868441 qui représente la cadence en ms du buffer.

J’ai donc développé une classe AudioTrack qui permet d’ajouter à l’intérieur d’un stack des instances de l’objet Sound et de les jouer de manière synchrone en utilisant une horloge virtuelle (loop audio de 46.43ms) pour cadencer le tout.

Le principe au final consiste à avoir un offset de 50ms (minimum) de silence sur chaque son, démarrer leur lecture en retranchant la durée totale du son (précédemment joué) et la position en cours de la tête de lecture avant que le résultat soit inférieur à 46.43 ms et finalement utiliser ce résultat pour positionner la tête sur le son suivant (offset).

C’est exactement l’idée exposée par Frank P. Baumgartner que j’avais sous-estimé à tort à l’époque.

Le résultat est hallucinant de fluidité, mes sons n’ont jamais aussi bien bouclé entre eux et j’ai pu grâce à cette nouvelle classe construire une application permettant de mixer des loops à l’infini (au lieu de 8 ^^). AudioTrack envoit un événement « onNextLoop » à chaque changement de boucle et peut être instancié 8 fois pour utiliser tous les canaux du player.

Bientôt une démo en ligne ! ;)

Dernière mise en garde sur onSoundComplete, l’événement n’est pas broadcasté s’il n’y a pas d’audio device correctement installé sur la machine utilisateur. Cesar Tardaguila en parle ici.

Discussion

Trackbacks/Pingbacks

  1. [...] in da mix Voici mes derniers travaux en avant-première. Je vous en parlais pas plus tard qu’hier. Il s’agit d’un petit moteur en full-flash de pseudo djaying que j’ai développé pour une campagne publicitaire Sony/RadioFG au sein de Periscope. Ca se passe ici. Plus tard, j’aimerais développer un mode recording avec backend MySQL et peut-être même décliner le moteur en application [...] Billet posté par Francis Bourre Francis Bourre’s Website Voici mes derniers travaux en avant-première. Je vous en parlais pas plus tard qu’hier. [...]

    in da mix | tweenpix - 13 août 2004

Post a comment