[ManiaCrash] Synthétiser le son d’un moteur

L’introduction et la théorie

La dernière fois que j’ai posté ici, il y a maintenant pas mal de temps, c’était à propos de ManiaCrash, et j’étais englué dans des histoires de modélisations de la physique d’un moteur à explosion, en particulier au niveau de la gestion du couple, et autour d’une question clef : pourquoi les moteurs calent si peu facilement ? (rapport à ma propre simulation ou on cale tout le temps, au point de ne même pas pouvoir démarrer).

Bref, un article sous forme d’appel à l’aide, sur un sujet assez obscure et pas très sexy qui a en fait, étonnement, suscité un certain intérêt avec plus d’une trentaines de commentaires, particulièrement intéressants pour certains. L’article a également eu pour effet de me permettre de rentrer en contact avec des gens « du métier », dont Claude, qui en une phrase m’a fait réaliser l’énorme erreur de modélisation commise dès le début de ma réflexion …

Je reviendrais en détail sur tout ça après avoir retravaillé complètement cette partie du prototype, devenue petit à petit une impasse extrêmement frustrante, pour voir si ma nouvelle conception du problème me permet d’arriver à un comportement un peu plus réaliste que mon actuel moteur-qui-cale-tout-le-temps.

Mais là n’est pas le sujet de ce post, dont le but est bien de partager avec vous les évolutions de ManiaCrash en ce qui concerne les sons des moteurs. En effet, j’avais déjà commencé à bosser sur ce terrain, considérant que l’audio tient une place très importante dans le réalisme offert par un jeu de caisses, ou tout du moins, dans les sensations de vitesse rendues.

Pour résumer très très rapidement ce que je racontais dans le précédent article à ce sujet (voir le second chapitre), là ou ManiaDrive n’utilisait qu’un seul son pour le moteur de la voiture, qui subissait donc, par exemple, de véritables tortures au niveau de sa vitesse de lecture pour rendre à peu près le son d’un moteur, j’essaye maintenant d’utiliser beaucoup plus de sons (samplés) et ainsi supporter toute la « plage » sonore d’un véritable moteur. Typiquement, 6 samples, à des vitesses de rotations clefs (ralenti, 2000 tours, 3000, …)

Le problème devient alors de savoir comment mixer ces différents sons entre eux pour donner un résultat final qui semble n’être qu’un seul son, sans transitions audibles. La dernière fois, j’avais un résultat potable au niveau du gain (le volume), mais je n’arrivais pas à trouver la bonne « formule » pour le pitch (la vitesse de lecture), mon meilleur essai étant ça : http://ftp.cqfd-corp.org/mc_engine1.mp3 , ce qui est particulièrement mauvais, vous en conviendrez …

La courbe de pitch était celle-ci : (chaque ligne représente un sample)

Très vite, après avoir repensé 2 secondes mon problème, je suis arrivé à une courbe beaucoup plus logique, qui « mappe » tout simplement la fréquence de lecture du son avec la vitesse de rotation du moteur dans le jeu. C’est tellement évident une fois qu’on le voit, que je suis passablement navré d’avoir perdu du temps avec la version précédente :/

Ça donne ce genre de courbes : (qui ressemblent un peu à des courbes de vitesse/rapports de boite, étrangement [ou pas, du coup])

Il y a un sample à 2500 RPM, le moteur enregistré ici ayant une sonorité particulière à cette vitesse.

Le gain, lui, ne change pas du tout dans l’idée générale :

… sauf qu’un nouveau problème pointe le bout de son nez : la dynamique audio d’un moteur de voiture est énorme … pour le dire avec mes mots de noob de l’audio, la différence de volume entre un moteur au ralenti et ce même moteur à sa vitesse de rotation max est gigantesque, et tout simplement impossible à rendre sur le matos du joueur lambda (ralenti inaudible, saturations, parasites dégueulasses à très bas volume sur la majorité des cartes son grand public, …) . Donc impossible de laisser les samples bruts avec les gains donnés sur le graph précédent. Je sais, j’ai essayé, et mes oreilles sifflent encore.

Il faut donc gruger sur les volumes pour « compresser » la dynamique réelle d’un moteur. Plutôt que de faire ça directement dans les samples, technique un peu crade qui risque d’abimer les samples à force de les éditer pour ajuster petit à petit l’amplification, j’ai préféré intégrer tout bêtement un facteur « gain » dans la courbe précédente. Ça permet d’ajuster cette compression facilement pour chaque voiture. Visuellement, c’est très parlant, ça donne ça : (à comparer au graph précédent, donc)

Comment vérifier que cette jolie théorie rend effectivement quelque chose ? Appliquée à mes quelques samples piqués à droite et à gauche, le rendu semble cohérent, mais est-ce « réaliste » ? (relativement limité hein, le réalisme … on parle d’un simulateur de cascades après tout)

Le pourquoi

Il s’avère que j’ai franchi récemment une dizaine, étape consacrée par ma concubine avec un cadeau inattendu : une 104. Oui, une magnifique Peugeot 104 GL (Grand Luxe, donc, si si) de 1980, avec un moteur rutilant de 1L (moins, en fait) qui tourne au plomb et à l’huile … Un modèle de collection, petite voiture abordable, ancêtre des citadines, emblème de toute une génération d’automobilistes avides d’évasion (mais pas trop loin). « Tout Peugeot en 3,58 m ».

Je dois probablement donner l’impression d’en faire trop, mais cette voiture est vraiment mythique pour moi et mon crew (…), elle est au centre de nombre de délires de cette joyeuse bande, et depuis une bonne 15aine d’années. Et là, on en a une sous la main, en vrai. Et je peux même la conduire. Légalement.

Je ne vais pas me répandre ici sur les longues heures de rire à ausculter, conduire, tester cette vénérable pièce de collection de 30 ans d’age, et aller directement à l’explication de tout ce chapitre : Nous avons décidé de tourner un reportage sur cette voiture. Pas un truc plein de nostalgie coulante et de complaintes sur la lente déchéance de l’automobile plaisir en France, oh que non, mais un truc à la Top Gear, avec des faits, de la fumée, des marteaux et de la sueur.

Pour vous prouver notre bonne volonté, voilà une photo relativement récente qui montre la bête après quelques heures de travail avec quelques membres de la fine équipe :

Beaucoup de détails ne sont pas visibles. Les bandes sont intégralement basées sur les bandes racing « Le Mans » des Ford GT. SERIOUS BUSINESS §§!

Plus prosaïquement, nous avons réalisé quelques tests pour voir si nous avions les moyens techniques et les compétences pour réaliser un tel reportage. La réponse est bien évidement « non », et de très loin. Qu’importe, on fera un machin « qualité youtube », flou, avec zéro cadrage, une clef de 12, et qui fera marrer que nous. L’ambition, c’est surfait.

N’empêche, même si quelques appareils photo récents suffisent a peu près pour les prises de vue, pour le son, c’est autrement plus compliqué. Les micros ne sont pas très sensibles, il est impossible de filmer de loin quelqu’un qui parle, ou même de l’enregistrer dans la voiture pendant qu’elle roule, les sons du moteur sont mal rendus, et je ne parle même pas du souffle du vent.

Notre première idée a été d’aller voir du coté des Freeport de Sennheiser : un micro cravate, un transmetteur UHF avec une portée d’au moins 100m, le tout pour un prix encore abordable, de l’ordre 170 euros. Nous nous sommes rendu chez Michenaud, une grosse enseigne de la vente d’instruments de musique, qui est à Nantes, et qui dispose aussi d’un magasin Live / Home Studio. Grosse aubaine, donc.

Chance, on trouve la référence là bas, le produit est en stock, et nous propose même de l’essayer sur place. Résultat bluffant, l’achat est décidé dans la foulée. En tant que gros débutants, on en profite au passage pour demander l’avis des deux gars du magasin sur le meilleur moyen d’enregistrer la sortie du Freeport. De notre coté, nous avions pensé récupérer un lecteur MiniDisc sur ebay pour trois fois rien, méthode immédiatement déconseillée d’une magnifique grimace synchronisée de la part de nous deux puristes. Il semble que le meilleur moyen pour nous soit encore d’utiliser un PC avec une bonne carte son, ce qui n’est pas sans poser quelques problèmes logistiques (portables obligatoires, donc carte son USB, nécessité d’une table de mixage ou d’entrées multiples si on souhaite utiliser plusieurs micros, …).

Et là, la découverte ultime : le Zoom H2.

Il s’agit à priori d’un bête micro + enregistreur portable, rien de très impressionnant. Sauf que la bestiole dispose de 4 micros directionnels statiques ! Là encore, on nous laisse faire un test, on lance l’enregistrement, et on discute des détails du truc. Au moment de relire l’enregistrement, le casque sur les oreilles, je galère pour trouver comment commencer la lecture, l’ergonomie du H2 étant assez … particulière au début. Pas de son, pas de souffle, rien, soit je sais pas comment lire, soit le volume est à zéro. Mon pote, à ma droite, n’arrête pas de me parler, j’arrive pas à me concentrer, je lève la tête vers lui, un peu vénère, pour lui demander de fermer sa mouille … ses lèvres ne bougent pas pendant qu’il parle. Je suis en train d’écouter l’enregistrement depuis 30 secondes FFS !

On a eu l’occasion de faire la démo à plusieurs personnes depuis, l’effet est garanti … C’est vraiment un gros cran au dessus de tout ce que j’ai eu l’occasion de bricoler au niveau des enregistrements audio jusque là. Bref, achat direct et immédiat pour nous : c’est tout léger (110 g) , autonome, toujours autour de 170 euros, ça utilise des cartes SD, ça sort du WAV, du MP3, 2 ou 4 canaux séparés, livré avec une mousse pour réduire le bruit du vent … Magique.

Et le plus fort : même si on a besoin (pour le fameux reportage) d’enregistrer plusieurs personnes en même temps, à des endroits différents, et en mouvement (2 conducteurs dans 2 voitures différentes, par exemple), chacun son Zoom H2, et zou le mixage se fait en numérique dans le logiciel de montage. Plus besoin de transmetteur HF ni de table de mixage … Gros merci aux deux gars qui ont retourné la moitié du magasin pour nous, alors qu’on sort finalement avec un seul truc, sincèrement. Et pour leurs conseils.

Si vous cherchez le rapport avec tout le reste, le voilà : avec le H2, j’ai enfin la possibilité de sampler correctement une vraie voiture. Sans saturation, sans parasites. En stéréo. J’ai déjà essayé de faire ça un paquet de fois, et ça se soldait invariablement par un échec. Même une prise de son qui rendait nickel a priori s’avérait en fait complètement inexploitable dès qu’on changeait le pitch, par exemple (« oh, bhen j’entends plus que le bruit blanc tient ! »)

Avec le H2 : rien.  Mais rien du tout. A un tel point que j’ai pu, sans aucune difficulté compter les RPM de mon moteur à la main dans Audacity ! (et pour ref : rpm=(1/(n_samples/44100))*60)

Et ça, c’est à près de 6000 tours/minutes avec un moteur qui hurle … Limite si on ne visualise pas la course des pistons.

J’ai donc réussi à enregistrer, en un seul essai et une seule prise toute la plage de vitesse de rotation d’un moteur. Je n’ai pas utilisé la 104, probablement incapable de subir un tel traitement pour l’instant, (haut régime à vide et à l’arrêt) et de toutes façons indisponible pour l’instant pour une sombre histoire de batterie et de câbles, et ai donc dû utiliser une voiture un peu plus apte à ce genre d’exercices.

Bon, et le résultat, hein ?

J’ai enregistré le résultat des premiers tests. Pour permettre la comparaison, j’ai placé d’un coté la vraie voiture, et le l’autre la synthèse.

A écouter très fort (même si le son a déjà été normalisé un peu, il faut franchement pousser le volume), et surtout au casque pour bien distinguer la piste gauche et la piste droite. Il s’agit des samples utilisés pour la vue intérieure de la voiture : (l’enregistrement de la vraie voiture a été fait lui aussi depuis l’habitacle)

http://ftp.cqfd-corp.org/mcrash-compare-s16-fake-real.mp3

Et bonus, je viens juste de terminer de coder ça : un autre essai, ou je switch entre la vue intérieure et extérieure de la voiture : (uniquement le « faux » moteur ici, donc)

http://ftp.cqfd-corp.org/mcrash-inout-s16.mp3

Pour ceux que ça intéresse et qui le connaitrait déjà, le moteur est un EW10J4, sur une 206 S16. Pas si mal quand on compare tout ça au premier essai donné plus haut, non ?


Publié

dans

par

Étiquettes :

Commentaires

12 réponses à “[ManiaCrash] Synthétiser le son d’un moteur”

  1. Avatar de polioman
    polioman

    nice car dude 🙂

  2. Avatar de __MaX__
    __MaX__

    Excellent taf, j’ai juste noté des clics de ruptures entre les samples, c’est normal ?

  3. Avatar de skaven
    skaven

    Pinaise, c’est super classe. Beau boulot 🙂

  4. Avatar de Lork
    Lork

    Joli !

    La 104, ma première voiture. J’avais une SL (Sport Luxe, fear): 4 vitesses, 15L au 100 mais vitres électriques ma bonne dame. Je l’avais achetée à une mémé qui s’en servait uniquement le samedi matin pour aller au marché. 20000Kms au compteur avec le plastique d’origine encore sur les sieges arrières pour … 2500 francs.

  5. Avatar de Xfennec
    Xfennec

    __MaX__ : Effectivement, j’ai eu beaucoup de mal à me débarrasser de la majorité des clics audio. Ceux qui restent ici sont très majoritairement issus du périphérique « wave writer » d’OpenAL Soft, utilisé pour ces enregistrements, donc non audibles quand on utilise une vraie carte son. Même si je dois encore pouvoir ajuster certains samples, vu que j’ai fait très vite. D’ailleurs, c’est quoi le meilleur moyen de rendre un son « loopable » ? Je fais ça à la main pour l’instant, et c’est pas forcément optimal.

    Par contre, lorsque je bascule entre le « canal » intérieur et le canal extérieur de la voiture, ça clic à mort, il faut que je creuse.

    Lork : Yeah ! Vendue ? Pliée ? 🙂

  6. Avatar de __MaX__
    __MaX__

    La meilleure technique que j’ai trouvé vu que personne n’a été foutu d’écrire un tuto la dessus sur le net :

    Tu crées ton son pile comme tu veux qu’il loop, tu l’exportes en wav. Et ensuite tu l’édites sous un soft audio, tu zoomes ta waveform a fond (pour afficher au niveau de la milliseconde) et tu fais un fade in de quelques millisecondes au début et un fade out à la fin.

    Ce sont les ruptures de niveau audio qui causent les cracks généralement… l’autre chose à savoir si tes sons sont en mp3, il est possible de ne pas pouvoir se séparer des clicks, vu que le mp3 compresse avec le début et la fin du son « vide », je ne saurais pas t’expliquer pourquoi mais d’après ce que j’avais lu, c’est obligatoire sur les fichiers mp3.

  7. Avatar de Xfennec
    Xfennec

    __MaX__ : Malheureusement, j’ai essayé avec des fondus, mais même en limitant très fortement leur taille, ils sont clairement audibles. J’imagine que c’est tout simplement dû à l’aspect assez particulier de ces samples (cf la capture dans l’article). D’ailleurs, c’est grâce à cette forme courte et répétitive qu’il est possible de bricoler à la main pour tenter de les rendre loopable.

    J’ai vu que Audacity était scriptable, faudrait que je regarde s’il je peux pas coder vite fait un machin pour ajuster précisément la « forme » de l’onde entre le début du sample et sa fin … (sur quelques dizaines d’échantillons, pas plus)

    Par contre, effectivement, exit le MP3, il y a un padding énorme au début et à la fin, et ça n’est de toutes façons pas très adapté au temps réel.

  8. Avatar de Gama
    Gama

    Pour éviter les clics tu peux effectivement faire des fondus, ça marche très bien sans être audible – mais les fades doivent être vraiment courts, en fait sur un seul buffer, genre 64 ou 128 échantillons.
    Y’a pas de technique miracle pour boucler, ou alors sur des sons super propres (pas d’harmonique).

    Bon, par contre, et sans vouloir te casser ton truc, on entend quand même pas mal le croisement des samples…Essaye de faire une interpolation autre que linéaire (pour que le croisement se fasse plus vite, et surtout à énergie constante histoire de pas avoir de variations bizarres de volume).
    De ce que j’ai pu constater avec mes propres oreilles ça marche très bien.

    Aussi, t’as peut-être déjà vu ça, mais fmod possède un éditeur très impressionnant. Évidemment, ça n’est pas libre, mais ça te permettrait d’avoir une bonne idée de ce qui est possible de faire dans cette voie.
    Pour mieux « voir » le truc, tu peux essayer de bosser avec un logiciel capable de te rendre un son en temps-fréquence, c’est super pratique pour voir les montées en régime, tout ça.

    Et si tu veux spatialiser le rendu, envoie-moi un mail !

    Bonne chance en tout cas.

  9. Avatar de Xfennec
    Xfennec

    Gama : oui, c’est vrai que j’ai clôturé l’article un peu vite sur un ton qui laisse penser que le boulot est terminé, mais il s’agit bien d’un WIP 🙂

    D’ailleurs, Il a fallu que je visualise les courbes de gain pour me rendre compte que le résultat était un peu « brut ». Mon idée actuelle était d’utiliser un bête sinus, mais vu que tu sembles de la partie, tu conseillerais quel genre d’interpolation ?

    Et merci pour le conseil sur le temps-fréquence, je viens de jeter un oeil rapide, et même si ça a l’air un peu costaud au premier abord, ça semble très intéressant !

  10. Avatar de Lork
    Lork

    Xfennec a dit :
    Lork : Yeah ! Vendue ? Pliée ? 🙂

    Vendue à un sourd …

  11. Avatar de drytaffin
    drytaffin

    Sympa l’article, je préférais l’autre mais bon, on y peut rien 🙂
    Je précise que je n’y connais rien en quoi que ce soit !

  12. Avatar de Gama
    Gama

    Pour l’interpolation, dans mes souvenirs ça fonctionnait pas mal avec une parabole, peut-être aussi en log (moins sûr).

    En tout cas, tiens-nous au courant de tes avancées !

Laisser un commentaire