2010-02-23 64 views
11

que estoy tratando de hacer una aplicación WinForm en C# (VS2008) que puede cargar un mp3 (otros formatos sería bueno, pero mp3 como mínimo) y ser capaz de ajustar la velocidad de reproducción (tempo) sin afectar el tono. Realmente no necesito ningún otro efecto de audio. Intenté usar DirectShow, pero eso no parece ofrecer capacidades de estiramiento de tiempo. Pude incorporar irrklang, pero eso tampoco parece tener la capacidad de estiramiento de tiempo. Así que ahora pasé al SoundTouch. Eso ciertamente tiene las capacidades, pero no tengo muy claro cómo implementarlo en C#.C# Audio - ¿Cómo alargar la duración (diferente ritmo, el mismo tono)

Después de unos días de esto, sobre todo lo que he logrado es el uso de DLLImport en el SoundTouch DLL y soy capaz de recuperar con éxito un número de versión. En este punto, ni siquiera estoy seguro de poder hacer lo que estoy tratando de hacer con SoundTouch. ¿Alguien puede ofrecer alguna orientación sobre cómo implementar SoundTouch o una biblioteca diferente con las capacidades que estoy buscando? Gracias.

Respuesta

6

La respuesta es que SoundTouch puede hacer lo que usted desea hacer.

Tome una mirada en el programa de ejemplo SoundStretch. Da ejemplos del uso de la biblioteca SoundTouch para cambiar el tempo (sin cambiar el tono), así como cambiar el tono (sin cambiar el tempo) y la velocidad de reproducción (cambiar el tono y el tempo). Revisaría el código fuente y usaría lo que necesita.

El único problema que veo es que está utilizando un formato MP3 y esto utiliza un formato WAV por lo que tendrá que convertir el archivo en primer lugar. Realmente no creo que encuentres un programa que haga lo que quieras directamente en cualquier tipo de archivo comprimido debido a la naturaleza del método utilizado para hacer este tipo de cosas. Utiliza un phase vocoder si desea ver un poco más todo el proceso.

+0

Escribía un comentario diciendo básicamente lo mismo. Me ganaste; –

+0

Eso me pasa todo el tiempo. –

+0

Ok, bueno, al menos sé que voy por la avenida correcta. Mi problema ahora es que los ejemplos que veo (y ciertamente me falta algo importante) están todos en C++. Usando DLLImport, puedo conseguir que esto funcione en C#: SOUNDTOUCHDLL_API const char * __ soundtouch_getVersionString stdcall(); Para mis propósitos, necesitaría poder llamar al: SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance(); Y SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange (HANDLE h, flotar newTempo); Y ahí es donde estoy completamente estancado ahora. – heath

-1

Aquí hay un posible enfoque para invocar desde C#. Necesita escribir un contenedor COM en C++ para envolver la DLL de SoundTouch. Una vez que tenga listo el contenedor COM, puede importarlo a su proyecto .NET (C#) e invocar la DLL SoundTouch subyacente a través del COM Wrapper. Espero que esto ayude.

3

Otra forma de utilizar SoundTouch en C# es el uso de la biblioteca de sonido BASS (http://un4seen.com) con la envoltura BASS.NET y el plugin BASS_FX. BASS_FX usa SoundTouch para hacer TimeStretching.

Cuestiones relacionadas