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
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.
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 F5to 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.
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.
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.
/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.