oolaboola - cyber-shamanic noise-maker


oolaboola [ options ]


oolaboola is a digital DJ tool. It allows you to mix .wav files in real-time modifying their rate of play, levels etc.

Various facets of its behavior can be controlled via an rc file, environment variables, and command-line options. Settings provided by more than one of those override each other in that same order.



Print a help message and exit.


Print the version number of oolaboola and exit.

--music-directory DIRECTORY

Set the default directory for opening sound files to DIRECTORY.

--midi-device DEVICE

Get MIDI input from DEVICE (default /dev/midi).


Execute the python suite PYTHON-SUITE after reading any rc file.

--cue-channel DEVICE

Output cue data to DEVICE.


Turn off EQ.


Don't log actions to a time-stamped file.

--fragment FRAGMENT-SPEC

Set output OSS fragment to FRAGMENT. FRAGMENT should be an 8 character hex string. The fact that it's hex means that if you don't know what a `fragment' is you shouldn't use it. :)


Turn on python profiling of the GUI.

--mixd ARG

Pass ARG directly to the mixd program (the backend the GUI uses for actual sound manipulation).


The user interface should be fairly self-explanatory. There are two players presented. You select files to play with a player's `select' button. Then you can control it's amplitude level with the `level' slider and it's rate of play with the `rate' slider. The position is both reflected and controllable via the position slider. The total track length as well as how much of it has played and how much remains is displayed. Playing files can be paused and unpaused via the pause button.

When a player's position slider is selected, file position can be controlled via the keyboard. Left and right arrows move it one second backward and forward respectively. If you hold down the control key while doing this the change is 10 seconds. Holding down the Alt key causes motion to be by .1 seconds, and holding down control and alt causes motion to be by .01 seconds. Home and End move to the beginning and end of the track respectively.

You can control which players output to the cue channel (without level control) with the cue toggle buttons. You can also select a file for raw digital audio output of the mix.

Mark and Loop Buttons

You can set and goto a mark in each player. This mark is taken into account when reading ahead in the file to avoid playing gaps. The mark defaults to the beginning of the file. You can set a loop to exist between the current point (i.e., point-of-play) and the current mark.

rc Files

If extant, the file $HOME/.oola/rc is executed by oolaboola. For example, my rc file has:

   music_directory = '/music'
   cue_channel = '/dev/dsp1'
   fragment = '00070009'

This sets the default directory in which to find .wav files, says that I have a cue channel available on /dev/dsp1 (because my soundcard has two audio outs), and sets the OSS fragment to 00070009.

Since the main oolaboola program is a python program and the rc file is python source that it executes, the rc file can also be used for fairly arbitrary customization by those who are familiar with the oolaboola source.



Sets the default directory for opening sound files.


Sets the device to which to output cue data.


Sets the output OSS fragment and should be an 8 character hex string. The fact that it's hex means that if you don't know what a `fragment' is you shouldn't use it. :)

MIDI Bindings

The current default MIDI bindings are quite a work in progress; I do find them convenient with a keyboard and the KeyFax PhatBoy (a MIDI controller that provides 13 continuous controller knobs):

 On channel 5:
   Controller  Effect
    1          Player 0 coarse rate (0 to 2)
    2          Player 0 fine rate (0 to 0.2)
    3          Player 0 level
    8          Player 1 coarse rate (0 to 2)
    9          Player 1 fine rate (0 to 0.2)
   10          Player 1 level
    7          Cross-fade

 On channel 1:
   Key 60 (middle C) acts as a pause button for player 0
   Key 62 (`middle' D) acts as a pause button for player 1

For the adventurous, there's a python-based midi-binding interface. The default bindings in contain statements like this:

  mi.cb['control-change'][5][1] = \
    lambda v: players[0].set_coarse_rate(v / (127.0 / 2))

This says that controller 1 on channel 5 should set the coarse play rate for player 0.

You can override or add to these bindings by placing similar statements in your rc file. Note, however, that at this point major parts of oolaboola's internal architecture are subject to change.


Eric Tiedemann (