Bass Whistle

Note: this is obsolete. Try the new one.

Transpose whistling to bass range. Optimized for responsiveness, with 1-2ms latency.


A natural question would be, why not use existing pitch-shifting software? I experimented with several different products, and couldn't find one that was sufficiently low-latency. I decided to write my own software optimized specifically for whistling. This allows us to take advantage of ways that whistling is unusual (nearly a pure sine wave, very high pitched) to make something that recognizes it and processes it very quickly (more).

Version that runs in the browser, with latency that depends on the platform. In Firefox on a Mac it's solid, other platforms and browswers less so: bass-whistle-js.


VST plugin, for Mac:(VST3)
Plugin source, for Mac/Windows:(source)
Stand-alone source, with PortAudio:(source)
  • Gate: how sensitive should the input be? The higher you set this, the more sensitive it will be. For noisy environments, set the gate as low as you can.

  • Attack: how sharply should sounds begin? The higer you set this, the more smoothly sounds will start.

  • Release: how sharply should sounds end? The higher you set this, the longer sounds will linger.

  • Octave: how many octaves down should it transpose?

  • F1: how much of the first harmonic (the fundamental) should there be?

  • F2: second harmonic

  • F3: third harmonic

  • F4: fourth harmonic

  • Slide: how quickly should pitch update when sliding between pitches? Lower values make it move more responsively.

  • Range Low: what's the maximum wavelength to recognize as whistling? Higher values mean recognizing lower pitches. Set this to match your whistling range, to as small a number as possible to minimize misrecognition.

  • Range High: what's the minimum wavelength to recognize as whistling? Opposite of Range High.

  • Response: how much should output volume vary based on input volume? At 0% output volume will be constant, while at 100% output volume will be fully responsive to input volume.

This is intended to be used with a low-pass filter following it, a shelf at around 400Hz. The output is not clean in the high frequencies.

Blog posts: