web-dev-qa-db-fra.com

Apprendre à travailler avec l'audio en C++

Mon diplôme était en ingénierie audio, mais je suis assez nouveau en programmation. J'aimerais apprendre à utiliser l'audio dans un environnement de programmation, notamment pour mieux apprendre le C++ grâce à des projets intéressants.

Tout d’abord, C++ est-il le bon langage pour cela? Y a-t-il une raison pour laquelle je ne devrais pas l'utiliser? J'ai entendu parler de Soundfile et de certaines autres bibliothèques - que recommanderiez-vous?

Enfin, connaissez-vous de bons tutoriels sur ce sujet? J'ai appris les bases du DSP - je veux juste le programmer!

EDIT: J'utilise Windows. J'aimerais jouer avec des choses en temps réel, un peu comme Max/MSP mais avec plus de contrôle.

30
Skilldrick

Cela dépend vraiment du type de travail audio que vous voulez faire. Si vous souhaitez implémenter de l'audio pour un jeu, C++ est sûr du bon langage. Il y a beaucoup de bibliothèques autour, OpenAL est génial, gratuit et multiplateforme. J'ai aussi utilisé DirectSound et Fmod avec beaucoup de succès. Découvrez-les, tout dépend de vos besoins.

14
MissT

Si vous décidez d’utiliser C++, alors Le Synthesis Toolkit est à noter. Je l'utilise pour un projet scolaire et il est très utilisable, développé à l'université de stanford, crossplatform (win, mac et linux), gratuit et opensource. Un extrait de la page wikipedia dessus: 

Versions des classes d'instruments STK ont été intégrés à ChucK, Csound, Cmix en temps réel, Max/MSP (en tant que Composant de PeRColate) et SuperCollider

Ils ont beaucoup de testcode inclus sur le site et quelques tutoriels pour se familiariser avec leur bibliothèque. (Mais vous devez bien sûr connaître le C++)

STK a des classes pour lire/écrire des fichiers audio (et des fichiers matlab), audio en temps réel/midi io, des algorithmes de base (utilisation basée sur des fonctions similaires en matlab), ...


Une autre option évident et probablement l'environnement LE plus utilisé pour apprendre/tester les fichiers dsp est Matlab (ou free octave , mais je ne l'ai jamais utilisé auparavant). Je teste parfois des choses dans Matlab avant de les implémenter en C++.


EDIT: Au cours de l’année écoulée, j’utilisais JUCE , qui est une bibliothèque C++ plutôt cool centrée sur la programmation audio C++, bien qu’elle soit davantage orientée vers QT. Un de leurs développeurs (Timur Doumler) a parlé de l’audio temps réel avec C++ et JUCE sur CppCon 2015, ce qui vaut vraiment la peine d’être vérifié, même si vous n’utilisez pas JUCE: https://youtu.be/ boPEO2auJj4

11
Emile Vrijdags

C++ est-il le bon langage? Cela dépend entièrement du contexte. Si vous devez brancher votre code dans une autre application, un autre framework ou autre, vous devrez probablement utiliser le langage pour lequel ce framework est conçu.

Si vous faites votre propre application autonome? Probablement pas. Il y a plusieurs raisons pour lesquelles je suggérerais de choisir une autre langue:

  • C++ n'est pas bien adapté aux débutants. Si votre objectif est d’apprendre à programmer grâce à ces projets, choisissez un langage qui se prête mieux à «l’apprentissage par la pratique». Le C++ est plein de pièges et de choses qui "semblent fonctionner", jusqu'au jour où ils ne le feront pas. Ajoutez à cela une syntaxe horriblement complexe et des idiomes et techniques assez complexes que vous devez maîtriser pour éviter les bizarreries du langage qui ne sont tout simplement pas des problèmes dans à peu près n'importe quel autre langage, et vous avez une bonne source de bugs et de frustrations, et pas beaucoup plus.
  • C++ n'a pas de concept "audio". C++ ne propose aucun type de support pour l’enregistrement, le traitement ou la lecture d’audio, le chargement ou la sauvegarde de fichiers audio ou autre. La plupart des langues modernes ont une forme de support audio intégrée au langage standard (au moins la possibilité de charger et de lire des fichiers mp3 et autres bases de ce type). En C++, tout cela devra être effectué via des bibliothèques tierces et du code spécifique au système d'exploitation.

Si vous avez un vrai choix de langage, je vous conseillerais quelque chose comme Python ou C #. Ils sont plus faciles à apprendre, disposent de beaucoup plus de fonctionnalités et rendent beaucoup plus difficile la tâche de se tirer une balle dans le pied. Je ne recommanderais pas le C++ à quelqu'un qui n'est pas déjà un programmeur expérimenté.

9
jalf

Départ Audacity . Il s'agit d'un éditeur audio open source multiplate-forme (Linux, OS X et Windows) écrit en C++. Je ne sais pas à quel niveau se situent vos compétences d'interface graphique, mais le code qui traite du travail audio devrait être assez facile à distinguer du code wxWidgets (GUI).

4
Chris Lutz

Le C++ peut être un excellent langage pour le traitement audio. J'utilise le Marsyas framework, un package multiplate-forme qui vous permet d'effectuer très facilement des tâches compliquées de traitement du signal audio, de recherche d'informations musicales et d'apprentissage automatique. C'est également très rapide et vous pouvez effectuer de nombreuses tâches compliquées en temps réel, contrairement à beaucoup d'autres packages. Lors des tests que nous avons effectués, Marsyas peut être des centaines de fois plus rapide que Matlab.

Pour vous aider à démarrer, voici du code. Supposons que vous vouliez lire un fichier audio. Pour cela, vous créeriez un réseau dans Marsyas qui ressemblerait à ceci:

  • Séries
    • SoundFileSource
    • Gain
    • AudioSink

Marsyas utilise un modèle de correctif implicite, un peu similaire au correctif explicite que vous voyez dans Max/MSP, mais vous n'avez pas à tracer de fils entre les objets, vous les mettez simplement dans des conteneurs et les fils sont créés automatiquement. L'objet Series ci-dessus contient une source SoundFileSource, dans laquelle vous insérez un fichier audio, puis le transmet à un gain, qui vous permet de modifier le volume de l'audio, puis le transmet à un AudioSink, qui lit le fichier audio sur vos haut-parleurs.

Le C++ pour créer ce réseau est extrêmement simple:

 MarSystem * playbacknet = mng.create ("Series", "playbacknet"); 
 playbacknet-> addMarSystem (mng.create ("SoundFileSource", "src")); ;__. playbacknet-> addMarSystem (mng.create ("Gain", "gt")); 
 playbacknet-> addMarSystem (mng.create ("AudioSink", "dest")); ;________. // Définit le SoundFileName 
 playbacknet-> updctrl ("SoundFileSource/src/mrs_string/nom_fichier", inAudioFileName); 

 // Activer la sortie audio 
 playbacknet-> updctrl ("AudioSink/dest/mrs_bool/initAudio", true); 

 while (playbacknet-> getctrl ("SoundFileSource/src/mrs_bool/notEmpty") -> isTrue ()) {
 playbacknet-> tick (); 
 } 

Les quatre premières lignes créent le MarSystem qui traite votre audio. L'objet Series, qui contient tout le reste, est créé en premier, puis SoundFileSource, Gain et AudioSink y sont ajoutés.

La ligne suivante définit le nom de fichier de SoundFileSource, vous lui attribuez le nom du fichier .wav, .au, .aiff ou .mp3 que vous souhaitez traiter ici.

Vous activez ensuite AudioSource, qui indique à votre carte son de commencer à jouer du son en mettant à jour le contrôle "initAudio" de AudioSource. La boucle while est ensuite bouclée tant que SoundFileSource contient des données audio.

Vous pouvez voir que cet exemple simple est vraiment facile à faire, mais le vrai pouvoir de Marsyas réside dans le fait que vous souhaitez effectuer des tâches plus complexes. Par exemple, pour faire une FFT, vous feriez simplement:

 MarSystem * net = mng.create ("Series", "net"); 
 net-> addMarSystem (mng.create ("SoundFileSource", "src")); 
 net-> addMarSystem (mng.create ("Spectrum", "spectre")); 
 net-> addMarSystem (mng.create ("PowerSpectrum", "powerspectrum")); 

 while (playbacknet-> getctrl ("SoundFileSource/src/mrs_bool/notEmpty") -> isTrue ()) {
 cout << net-> getctrl ("mrs_realvec/processingData") -> à <mrs_realvec> () << endl; 
 } 

Pour estimer la fréquence fondamentale d’une source audio, procédez comme suit:

 MarSystem * net = mng.create ("Series", "series"); 
 net-> addMarSystem (mng.create ("AudioSource", "src")); 
 net-> addMarSystem (mng.create ("AubioYin", "yin")); 

 while (playbacknet-> getctrl ("SoundFileSource/src/mrs_bool/notEmpty") -> isTrue ()) {
 cout << net-> getctrl ("mrs_realvec/processingData") -> à <mrs_realvec> () << endl; 
 } 

Ce dernier lira le son en temps réel à partir de votre carte son et exécutera le puissant algorithme de détection de hauteur YIN. Doux, hein?

Pour plus de code, consultez le site Web - Marsyas , en particulier, consultez la documentation .

2
sness

Ne m'écoute pas! J'ai peut être tort!

Je ne programme pas C++, mais je suis d'accord avec Jalf car c'est difficile pour les débutants, il y a beaucoup de choses à faire manuellement que d'autres langues feront automatiquement pour vous, telles que l'allocation de mémoire, la récupération de place, etc. en disant que C++ ne connaît pas l'audio et que d'autres langages ont des capacités audio intégrées à partir de zéro. Cependant, généralement, la plupart de ces capacités sont assez élémentaires: ouvrir et lire des fichiers, envoyer la tête de lecture à différentes parties du fichier, régler le panoramique et le volume, voire extraire des données eq.

Mais ... je suppose que vous voulez approfondir un peu le son, que ce soit par synthèse ou par effets, et que vous voulez créer ces éléments au lieu de les ajouter. Je vous encourage à regarder VST et VSTi, mais c’est un domaine c ++ (bibliothèque JUCE, génial génial génial), et un travail ardu, mais si vous voulez créer votre propre produit, alors c’est peut-être la solution. sinon, comme d'autres l'ont suggéré, CSound, Max, Cycling et Processing pourraient peut-être vous intéresser. Des logiciels comme Reaktor vous permettent de patcher ensemble des composants modulaires avec beaucoup moins de codage (le cas échéant).

allez jeter un coup d’œil sur certains des forums de KVRAudio, quelques héros ont développé un vieux logiciel gratuit classique tel que Hammerhead, puis d’autres logiciels indépendants tels que Fruity Loops, Rebirth, Touareg, Audiomulch, etc.

Je pense qu'apprendre sur VST et C++ est le meilleur, mais ce sera un long chemin avec douleur et angoisse, et à moins que vous ne souhaitiez créer un logiciel autonome ou un plug-in pour un autre logiciel (à l'exception de Csound, etc.), ce sera décevant.

Je pense.

2
Assembler

C pourrait être un meilleur choix que C++ pour l'audio, en particulier si vous voulez utiliser n'importe quel DSP.

  • Les ouvrages de référence audio et DSP les plus pratiques utilisent C pour des exemples de code
  • La plupart des bibliothèques audio/DSP sont écrites en C (ou ont au moins une API C)
  • C++ augmente considérablement la courbe d'apprentissage par rapport au C mais n'apporte pas beaucoup d'avantages pour le travail audio/DSP (la POO n'est pas particulièrement pertinente pour le code de bas niveau/en temps réel)

Bien sûr, il n’ya rien de mal à apprendre le C++ et cela ne vous empêchera pas de comprendre et d’utiliser du code C (puisque le C++ est essentiellement un sur-ensemble de C), vous pouvez toujours passer au C++ plus tard si vous le décidez.

1
Paul R

Je n'ai pas beaucoup d'expérience dans la création d'applications audio pour moi-même, mais si j'étais dans votre position, je m'amuserais avec la création du premier instrument VSTi (instrument de technologie de studio virtuel). Pour autant que je sache, Steinberg a publié un SDK C++ pour cela et je pense que ce serait un bon point de départ si vous souhaitez vous lancer dans des applications de conception sonore.

1
Ciaran

Si vous avez déjà appris les bases du DSP, je vous recommanderais Processeurs Blackfin d'Analog Devices . Vous pouvez utiliser à la fois C et C++, et ils fournissent un certain nombre d'exemples audio pour vous aider à démarrer. Ils fournissent suffisamment de code pour lire de l'audio dans le tableau, le traiter et le restituer.

À partir de là, vous pouvez appliquer tous les types de filtres ou autres traitements souhaités. J'ai utilisé le BF533 Ez-Kit Lite en combinaison avec un panneau LCD série pour créer un égaliseur audio pour un projet. Ce fut une excellente expérience d'apprentissage et beaucoup de plaisir!

1
Sean

Selon vos besoins, peut-être que R est une langue plus facile. Je l'utilise depuis un an maintenant, il effectue des analyses statistiques, des graphiques, des cartes et des analyses sonores. Avec les bibliothèques png, tuneR et seewave, vous avez besoin d’une ligne pour lire un fichier .wav, d’une autre pour obtenir la matrice de données et d’une autre pour la placer dans une image png ou la voir à l’écran. Être conçu pour analyser des données et être plus facile à utiliser sont deux avantages pour moi. Par exemple, R numérote les tableaux et les tableaux à partir de 1 et non de 0 comme la plupart des langages de programmation. Cela rend notre cerveau humain beaucoup plus à l'aise avec les scripts déjà compliqués. Je pense que vous devriez y jeter un coup d'œil: http://www.r-project.org/

Bonne chance!

0
Rodrigo

Pour répondre à votre deuxième question, vous devriez consulter ce livre: Conception de plug-ins d’effet audio en C++: avec la théorie du traitement du signal audio numérique de Will Pirkle.

Le livre passe en revue quelques DSP de base et vous explique comment créer des plugins audio. Vous coderez en C++ mais ce ne sera pas difficile, car le livre vous propose de télécharger un framework, RACKAFX, qui gère tous les événements de l'interface graphique. Tout ce que vous avez à faire est de vous concentrer sur l’écriture des formules et le stockage des données dans les bons canaux.

Bonne chance!

0
ThePhantom05

Si vous avez déjà des connaissances en DSP, ces tutoriels montrent comment transformer le code DSP en un programme terminé, y compris les contrôles de l'interface graphique. Cela commence par une simple distorsion, puis passe à la synthèse, etc.
En gros, vous écrivez du code qui peut être construit soit comme un fichier .exe autonome, soit comme un plugin VST pour des hôtes comme Cubase ou Ableton Live. 

0
basteln

Beaucoup de bonnes suggestions ici. De plus, je suggérerais de consulter la boîte à outils Jack Audio, le cadre JUCE, et d'apprendre à porter le code C à partir de bibliothèques de synthèse telles que Csound. Le "livre de programmation audio" est également bon pour cela.

En ce qui concerne C++ et C++, je pense que vous constaterez que, dans le travail audio, la partie C++ n’est souvent que du chrome pour la gestion du code. Les bits DSP sont tous des mathématiques procédurales de bas niveau sur des signaux, donc ce sont probablement des appels en C et peu importe que vous utilisiez le C ou C++. Un grand nombre de projets audio C++ sont essentiellement du C dans les entrailles de l'audio.

hth!

0
Iain Duncan

Sur Windows, recherchez des tutoriels sur DirectSound.

Sous Linux, il existe une variété de bibliothèques et de méthodes pour accéder aux cartes son. La plus simple consiste simplement à ouvrir un fichier sur le périphérique et à utiliser ioctrl pour définir la vitesse, etc.

Si vous donnez plus d'informations sur l'environnement, nous aurons peut-être de meilleures recommandations.

-Adam

0
Adam Davis

Si vous voulez vous concentrer sur le traitement du son actuel (par opposition à tout le fard que rencontrent les applications d'interface graphique), je voudrais vérifier CSound . Cela vous donne un langage basé sur un fichier texte qui vous permet de construire pratiquement n'importe quel périphérique audio à partir de ce qu’ils appellent des opcodes, mais vous avez également le code source dans lequel vous pouvez vous plonger pour voir les algorithmes réels qu’ils représentent. 

0
U62