Sample Pieces

Buddhist nun in a restaurant
Guitar Solo
sc 03 of 30
With Waldorf Rocket
Ambient Kinetics
Tubes of Steel
Concerto for Viola

Live Performances

Marble Inside
Entresse, part 2

Beyond Limits

It's easy to extend

For Galleries

and Museums

Kandinsky Sound

The purpose of the project is to produce music of images. Yes, we mean music. In other words, melodies, not noisy sounds like here or here.

Based on images, a computer generates melodies and allows a performer to play them using different instruments. In other words, it’s not a format converter which always produces the same result. It is an instrument for a performing artist. At the same time, it is an orchestra as it has many instruments. The performing artist acts as a conductor.

Objects are found as areas of approximately the same colour. This is the original image.

Here we see one object outlined with white dots. Object boundary is used as a route for a music generator moving around the object.
A generator plays its melody on an assigned MIDI instrument. The melody is mainly determined by the track geometry. Multiple tracks can be played simultaneously. Number of tracks is not limited.

MIDI, OSC, CV, Samples

The application controls hardware or software sound modules via MIDI, OSC, or control voltage (CV).


Up to 10 MIDI sound modules can be connected. Each module can have up to 16 different instruments.


As many listeners as required can be configured. As an example, here a custom software adapter receives OSC commands and controls a function generator

Control Voltage

The application can control analogue modules via a serial port. Here is an example of an Arduino controlling Dark Energy


Samples loaded from sound files can be played in 'Audio' mode instead of notes.

Samples are loaded from directories so you can have them as many as fits in memory.
Directories i.e. sample sets are switched like instruments - with numbers from 0 to F (or can be even higher)
There are three ways to control sample speed: no changes in speed (none), according to note position (pitch), and to match the note duration (duration).


Now try how it works in your computer.


The software is free. Download and use. No warranties but if you have questions feel free to ask. For commercial use, please share your success stories and feel free to consider a donation.


Windows XP, 7, 8

Download this archive:


Uncompress the archive and start bo.exe


Download this archive for Ubuntu 12:


or this archive for Ubuntu 14:

Right click the downloaded file and select "Extract here"
to extract the BuddhaOrc folder.

Inside the new folder you will find a file called bo.
Double click it to start the Buddha Orchestra.

You might need to install the following dependencies.

  • alsa-tools
  • libmpg123-0
  • libmpg123-dev
  • freeglut
  • libasound2-dev
  • libfreeimage

Download, make executable, and execute this script
as a super user (note that wget and the url are parts of one command):

$ wget
$ chmod a+x install_dependencies.sh
$ sudo ./install_dependencies.sh


By default, the program uses the image1.jpg from the /data directory.
You can select the image during runtime by pressing the * key - you get the list of jpg files found in the /data directory. Don't put too many files there - the list is limited and cannot scroll.

Configuration is stored in the config.ini file located in the same directory with bo.exe.
For example you might want to change MIDI instruments. The program can use 16 different instruments. Note that you can use many instruments of the same type: three guitars, five pianos...
Complete list of MIDI instruments is here

How to conduct the Buddha Orchestra

We prefer old-fashioned user interface. The keyboard.

Press F1 to see the notes of the currently selected track. Press it once more to hide.

Select a track with UP and DOWN navigation keys.

Press the t button to show the list of available instruments.

Assign an instrument by pressing 1..9 or A,B,..G (capital letters).
Another instrument can be assigned to a track later if needed.

For advanced users:
Key '0' disables MIDI events from the current track. When playing, such track would be only sending OSC events described below. You need a synth application running in order to generate sounds. For example the BuddhaSynth, see below.

Press the p button to play or pause the selected track.

Press F5 to pause/resume playing of all melodies.
Press P to pause/resume playing of all melodies and mute all notes.

Composers, this is for you: press capital M (shift-m) to export the notes of the currently selected track to a MIDI file.

The TAB key allows to see the list of currently playing melodies (the list also includes the melodies marked with Ins key) or the list of active 'drummers'.

If you prefer using a mouse, press 'g' to show/hide the GUI:


Melody modification commands

split - each note is divided into 3 shorter notes (1/4, 1/4, and 1/2)
merge - each three notes are merged into one
reduce number of notes (every other note is deleted)
insert a pause after every group of three notes
arpeggio - play groups of notes as defined in Chord Matrix (modes: None, Up, Down, UpDown, Random)
inserts longer pauses in currently active melodies
restores melody to the original form (made of an image)
the keys transpose the current melody up/down
Staccato - legato adjustment
mutes current melody. A muted melody only sends CC to assigned instrument.


In addition to the melody, each track can have a drummer activated when a cursor (see at the bottom of the screen) reaches horizontal position of the track centre.

Pressing PgUp and PgDn keys increases/decreases number of times the drummer hits. The . (dot) changes drum type, note it shown at the top of the screen. The '+' and '-' change maximum number of drum hits - this allows making more complex patterns.


volume control
envelope period change (Korg slider 9)
tempo change (tick) (Korg knob ?)

Press ESC when you're bored.


It's possible to play music in different scales. Add reference to Scala file in config.ini like following:

At the moment, the chord matrix / arpeggio described here is disabled if number of notes is not 12.

Read about microtonal music

This feature has been developed upon request and with kind support from Burning Cicada.

Technical Details

The project uses Open Frameworks OF 0.7.4 which in turn uses OpenCV

MIDI Controller

Devices similar to KORG's nanoKontrol make a handy addition to the software. The default configuration is made for the device which is out of production but similar MIDI controllers can be also used. It only requires changes in configuration file.

MIDI Sound Modules

By default, the application sends MIDI events (like 'play this note') to the MIDI module of a computer sound card.
It is possible to utilise external MIDI sound modules - e.g. MidiTech Pianobox
Each sound module can use its own set of 16 instruments. Up to 10 modules can be configured.
If more than one MIDI module is used, the F10 key toggles through all modules.
It is preferrable that the modules appear under different names in the list of MIDI devices. If multiple hardware modules are connected via MIDI-to-USB adapters of the same type and they all are shown as MIDIOUT then the system would not be able to tell Roland from Korg.
Each melody can send note events to MIDI, to OSC, or to both, or to serial port, or sound samples are played instead of notes. The destination is switched with 'T' key.

OSC events

/bo/note/on (int id, int ch, float x, float y, int n, float v, float d)

/bo/note/off (int id, int ch)

/bo/track/on (int id, float cx, float cy)

/bo/track/off (int id)

id - the track number
ch - MIDI channel assigned to the track
x, y - normalized coordinates of the currently played note, in range 0..1
n - the note number (MIDI value from 0 to 127)
v - note velocity (0..127)
d - note duration in 50 msec units
cx, cy - coordinates of the track 'centroid', in range 0..1

/bo/adsr (int id, int par, int val)

This event transfers position changes of six first sliders of a MIDI controller. The par is the slider number (0..5) and the val is its position in the ranges specified in config.ini. By default the ranges are 0..100 for parameters 0, 3, and 5, and 0..1000 for 1, 2, and 4.
The sample OSC application (see below) uses these OSC events to control parameters of ADSR envelope generator.

Simple OSC synthesizer

The synth is meant to extend plain MIDI capabilities of the Buddha Orchestra. It generates sounds of note events having channel = 0. It shows all events in its small window.

It is recommended to have the synthesizer running when you start the Buddha Orchestra application.

The synth requires java. You can download it from


Uncompress the archive and start BuddhaSynth.exe


Uncompress the archive and execute BuddhaSynth.

More Technical Details

The video tells the story of the project.

Feature Requests

Send your ideas to victor (at) victorx (dot) eu, thank you!

Related Software

Buddha Sequencer


Ask them on the Discussion page.


The problem was resolved by upgrading video card.

A project by Victor X