C# Audio - How to time stretch (different tempo, same pitch)

14.2k Views Asked by At

I'm trying to make a winform app in C# (VS2008) that can load an mp3 (other formats would be nice, but mp3 at a minimum) and be able to adjust the playback speed (tempo) without affecting pitch. I really don't need any other audio effects. I tried using DirectShow but that doesn't seem to offer time stretch capabilities. I was able to incorporate irrklang but that does not seem to have the time stretch capability either. So now I've moved on to SoundTouch. That certainly has the capabilities but I'm very unclear on how to implement in C#.

After a few days of this, about all I've accomplished is using DLLImport on the SoundTouch DLL and am able to successfully retrieve a version number. At this point, I'm not even sure if I can do what I'm trying to do with SoundTouch. Can anyone offer some guidance either on how to implement SoundTouch or a different library with the capabilities that I'm looking for? Thank you.

4

There are 4 best solutions below

0
On

Another way of using SoundTouch in C# is to use the BASS sound library (http://un4seen.com) with the BASS.NET wrapper and the BASS_FX plugin. BASS_FX uses SoundTouch to do TimeStretching.

4
On

The answer is that SoundTouch can do what you want to do.

Take a look at the example program SoundStretch. It gives examples of using the SoundTouch library to change the tempo(without changing the pitch) as well as changing the pitch (without changing tempo) and playback rate(change both pitch and tempo). I would look through the source code and use what you need.

The only problem that I see is that you are using an mp3 format and this uses a WAV format so you will need to convert the file first. I really don't think that you'll find a program that does what you want directly on any sort of compressed file because of the nature of the method used to do this sort of thing. It uses a phase vocoder if you want to look into the whole process a bit more.

0
On

Here is one possible approach to invoke from C#. You need to write a COM wrapper in C++ to wrap around the SoundTouch DLL. Once you have the COM wrapper ready, you can import it into your .NET (C#) project and invoke the underlying SoundTouch DLL through the COM Wrapper. Hope this helps.

0
On

If anyone is still interested, I have written .Net wrapper class for SoundTouch library. http://code.google.com/p/soundtouchnet/