This post explains how to do real-time pitch-shifting and audio time-stretching in Java. It uses two components. The first component is a high quality software C++ library for audio time-stretching and pitch-shifting C++ called Rubber Band. The second component is a Java audio library called TarsosDSP. To bridge the gap between the two JNI is used. Rubber Band provides a JNI interface and starting from the currently unreleased version 1.8.2, makefiles are provided that make compiling and subsequently using the JNI version of Rubber Band relatively straightforward.
However, it still requires some effort to control real-time pitch-shifting and audio time-stretching from java. To make it more easy some example code and documentation is available in a GitHub repository called RubberBandJNI. It documents some of the configuration steps needed to get things working. It also offers precompiled libraries and documents how to compile those for the following systems:
- Audio Time-Stretching vdia JNI on Debian
- Audio Time-Stretching via JNI on Mac OS X
- Audio Time-Stretching via JNI for Android on Debian
If the instructions are followed rather precisely you are able to control the tempo of a song in real-time with the following Java code:
float tempoFactor = 0.8f; float pitchFactor = 1.0f; AudioDispatcher adp = AudioDispatcherFactory.fromPipe("music.mp3", 44100, 4096, 0); TarsosDSPAudioFormat format = adp.getFormat(); rbs = new RubberBandAudioProcessor(44100, tempoFactor, pitchFactor); adp.addAudioProcessor(rbs); adp.addAudioProcessor(new AudioPlayer(JVMAudioInputStream.toAudioFormat(format))); new Thread(adp).start();