Rubber Band Library

« Home

Technical notes

(These notes refer to the Rubber Band R2 engine; R3 has some technical differences.)

Rubber Band Library is a block-based phase vocoder with phase resets on percussive transients, an adaptive stretch ratio between phase reset points, and a "lamination" method to improve vertical phase coherence. It is written in portable C++, and supports a number of separate libraries for the FFT and resampler implementations.

Much of the work that has gone into Rubber Band is in dealing with the corner cases of implementation detail: providing sample-accurate stretching when run offline, a true real-time streaming operation with close to sample accuracy, multi-threaded operation, dynamic adjustment to stretch and pitch shift ratios, and appropriate tuning to ensure good results across as wide a range of input material and parameters as possible.

Rubber Band does not implement any single complete published method, and as far as I know the adaptive stretch and phase lamination methods are not published anywhere (although they are not all that exciting, and you have the source code). But there are good discussions of many of the problems and techniques involved in a wide selection of papers. Time-stretching is not magic. Some papers include:

Rubber Band implements pitch-shifting using the standard technique of resampling before or after a time stretch, with the combination of resampling in one direction and stretching in the other resulting in returning the audio to its original duration but with different pitch. This method has the advantage of making the amount of pitch adjustment extremely accurate and stable, even for small changes.