2010-02-23 17 views
11

J'essaye de faire une application winform en C# (VS2008) qui peut charger un mp3 (d'autres formats seraient bien, mais mp3 au minimum) et être capable d'ajuster la vitesse de lecture (tempo) sans affecter la hauteur. Je n'ai vraiment pas besoin d'autres effets audio. J'ai essayé d'utiliser DirectShow mais cela ne semble pas offrir de capacités d'étirement du temps. J'ai été capable d'incorporer irrklang mais cela ne semble pas avoir la capacité d'étirer le temps non plus. Alors maintenant, je suis passé à SoundTouch. Cela a certainement les capacités mais je ne suis pas très clair sur la façon de mettre en œuvre en C#. Après quelques jours de ceci, à peu près tout ce que j'ai accompli utilise DLLImport sur la DLL SoundTouch et suis capable de récupérer avec succès un numéro de version. À ce stade, je ne suis même pas sûr de pouvoir faire ce que j'essaie de faire avec SoundTouch. Quelqu'un peut-il donner des conseils sur la façon d'implémenter SoundTouch ou une bibliothèque différente avec les capacités que je recherche? Je vous remercie.C# Audio - Comment étirer le temps (différent tempo, même hauteur)

Répondre

6

La réponse est que SoundTouch peut faire ce que vous voulez faire.

Jetez un coup d'œil au programme d'exemple SoundStretch. Il donne des exemples d'utilisation de la bibliothèque SoundTouch pour changer le tempo (sans modifier la hauteur) ainsi que pour changer la hauteur (sans changer le tempo) et la vitesse de lecture (changer la hauteur et le tempo). Je regarderais à travers le code source et utiliserais ce dont tu as besoin.

Le seul problème que je vois est que vous utilisez un format mp3 et cela utilise un format WAV, donc vous devrez d'abord convertir le fichier. Je ne pense vraiment pas que vous trouverez un programme qui fait ce que vous voulez directement sur n'importe quel type de fichier compressé en raison de la nature de la méthode utilisée pour faire ce genre de chose. Il utilise un phase vocoder si vous voulez examiner un peu plus tout le processus.

+0

J'écrivais un commentaire disant essentiellement la même chose. Tu m'as battu dessus;) –

+0

Ça m'arrive tout le temps. –

+0

Ok, au moins je sais que je vais dans la bonne direction. Mon problème maintenant est que les exemples que je vois (et je peux certainement manquer quelque chose d'important) sont tous en C++. En utilisant DLLImport, je peux obtenir ceci pour travailler en C#: SOUNDTOUCHDLL_API const char * __ stdcall soundtouch_getVersionString(); Pour mes besoins, je devrais être en mesure d'appeler: SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance(); Et SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange (HANDLE h, float nouveauTempo); Et c'est là que je suis complètement coincé maintenant. – heath

-1

Voici une approche possible à invoquer à partir de C#. Vous devez écrire un wrapper COM dans C++ pour enrouler la DLL SoundTouch. Une fois le wrapper COM prêt, vous pouvez l'importer dans votre projet .NET (C#) et appeler la DLL SoundTouch sous-jacente via le COM Wrapper. J'espère que cela t'aides.

3

Une autre façon d'utiliser SoundTouch en C# est d'utiliser la bibliothèque sonore BASS (http://un4seen.com) avec l'enveloppe de BASS.NET et le plug-in BASS_FX. BASS_FX utilise SoundTouch pour faire du TimeStretching.