Tuesday, March 25, 2008

-funroll-sample-loops

Bon, j'avais un peu mis le développement de libntxm en berne ces derniers jours, notamment par ce que je ne comprenais pas ce qui faisait sonner faux tous mes chiptunes. je soupçonnais quelque-chose du côté des ajustements de notes (vous savez,le truc calibré à 8636Hz pour un DO, et qu'il faut ajuster à la main quand on importe un nouveau son dans un mod), mais non. C'est 0xtob qui a mis le doigt dessus : la DS gère les loops en hardware, mais uniquement quand la longueur des loops est un multiple de 4 ...

Aucun soucis si on a un son "ordinaire" que l'on essaie de faire tourner en boucle (au pire, il y aura des petites déformations dans le son). Mais s'il s'agit d'une onde pour un chiptune (souvent faite à la main, et dont la taille a tout juste la longueur d'onde du son), c'est tout différent. Retirez-lui un ou deux samples, et vous vous retrouvez avec une autre longueur d'onde (et donc une autre note de référence). Bref, c'est l'horreur.
Heureusement, la solution est plus simple que le problème: répéter (au plus 4 fois) la boucle de sorte que sa longueur devienne un multiple de 4 (si ça c'est pas bête et sot :P)

Well, coding on libntxm has been a bit slowed down these last days, maybe because i couldn't figure out why all those chiptunes i've got sounded de-tuned. My guess was that i missed something in the "instrument fine-tuning" mechanism, but Oxtob pointed out that there was actually something going wrong with loops.
You typically use looped in two cases. Case 1 is that you want something like a "strings" instrument that can keep playing (the same) as long as you let it flow. These are the loops the DS prefers to play. Case 2 is that you're doing a chiptune and hand-crafted a waveform that you want to loop to create your bare sample. In that case the loop is typically very small (as small as 32 bytes for some musicians), and this is where DS sound hardware gets in your way.

What happens is that the DS hardware wants loops to have lengths expressed in 32 bits quantities (yep, even with 8 and 16-bit samples :P ), but hand-crafted loops may not conform to this requirement. And given that the loop length is the wavelength (which define the note's height), a single byte skipped by the hardware may doom your module's playback.
Hopefully enough, the cure is simpler than the illness here. You need a multiple-of-four amount of samples in your loop and you have an odd (or just even) amount ? well, just copy-paste the loop as many times as it takes to have 4xN samples. Period. Since loops are small, it doens't hurt.

Voilà. J'attends les nouveaux .xm de Pierrick, et je vais aller ranger un peu parce que mon beau-père vient m'aider à travailler dans la salle de bain cet après-midi ... le plus dur, ça va être de débrancher la DS de la chaine Hi-Fi qui est occupée à me rejouer la musique du niveau 1 de SMB3 en boucle depuis 10 minutes ^_^

Get it on sourceforge : code and binary (runme)

2 comments:

Anonymous said...

ET tu les as eu les petits mods nouveaux de Pierrick ?

PypeBros said...

not yet...