pysoundtouch

pysoundtouch is a Python interface to libSoundTouch that uses numarray.

Tempo detection

from pk.audio import buffering
from pk.audio import media
import soundtouch

infile = media.SndFile('tests/drums.wav')
sound = buffering.Sound(length=infile.length)
buffering.Filler(infile, sound).run()

# works with a numarray.NumArray, too!
print soundtouch.find_bpm(sound, sound.samplerate)

FIFOSampleBuffer processing (Unstable)

class SoundTouchTest(unittest.TestCase):

    def setUp(self):
        self.st = soundtouch.SoundTouch()

    def test_init(self):
        self.st.setSampleRate(44100)
        self.assertEqual(self.st.isEmpty(), True)
        self.assertEqual(self.st.numSamples(), 0)

        self.st.setRate(44444)
        #self.assertEqual(self.st.rate, 44444)                                  

        self.st.setTempo(149.1)
        #self.assertEqual(int(self.st.tempo), 149)                              

        self.assertRaises(RuntimeError, lambda: self.st.setChannels(3))

        self.st.setChannels(2)
        #self.assertEqual(self.st.channels, 3)                                  

    def test_filter(self):
        self.st.setSampleRate(44100)
        self.st.setChannels(2)
        self.st.setRate(1.0)
        self.st.setRateChange(50)

        stream_in = numarray.array([1] * 100)
        self.st.putSamples(stream_in)
        samples = self.st.numSamples()
        self.assertEqual(samples > 0, True)
        self.assertEqual(self.st.isEmpty(), False)

        stream_out = numarray.array([0] * 110);
        returned = self.st.receiveSamples(stream_out)
        self.assertEqual(returned, samples)
        self.assertEqual(self.st.isEmpty(), True)