Image
Hyung-Suk Kim

Developer notes Screenshots
Project proposal is here.

Sourcecode

project.zip Download

Dependencies

The following libraries must be installed for the code to compile.

Motivation

With the many HipHop producers, usually without traditional music training, and the ever expanding beat making videos on Youtube, sample-based music experience seems to be a proven method of lowering the entry bar for people who "have an ear" in music but do not have traditional music training.
The process of beat making starts with a "break", a short interval, usually 2 to 4 measures, in a music track that the producer finds interesting. The "break" is then chopped into "samples" that are mapped to keys/pads to trigger. After observing many cases, from Youtube videos to music by famous producers(DJ Premier, DJ Krush, DJ Shadow, etc), it seemed that these samples are usually single chords or something equivalent such as parts of arpeggiated chords. Thus what the producer is ultimately doing is playing chords in a complex sequence.

Product

Software for pad control MIDI interfaces that encourages exploration of music theory concepts for musicians that play "by ear" with a suggestion system. The implemented suggestion systems are a progression map of classical tonal music and a first-order Markov chain that follows the users inputs. The application can be used as a MIDI instrument.

Commands

General Keyboard Pad Controller
Image

Select Mode Play Mode

Developer Notes

The project is also in Google Code.
It is licensed under a BSD license. Feel free to use/modify the code.
Implemented and tested on Ubuntu 10.04, 10.10

Software Design/Architecture

The structure of the software is generally based on a number of objects that listen to each other for events. The event listener relationship is mapped below. For some event calls event objects containing data are "pushed" (e.g. PadEvents, MidiEvents) while in other cases they need to be pulled( stats. )
Image

Discussion

Suggestion System
The suggestion system has 2 modes, Tonal and Statistical. Tonal suggestion is based on tonal progression in classical music. The implementation here is based on the tonal mapping from "Tonal Harmony" by Kostka and Payne. Statistical suggestion is implemented using a first order Markov chain. Further extensions can be added by implementing the SuggestMap interface. In the current implementation the classes TonalMap and PadStatistics implement the SuggestMap interface. But the return values are different since they were initially designed separately, and unifying the way suggests are handled is work to be done.
Once a chord progression is suggested the system creates triads based on the suggested progressions and compare the triad to the chords on the pads. Suggestions are made either if the chord is part of the triad (is contained), or contains the triad. For the latter case the opacity or strength of the suggestion is based on how many of the notes in the chord is in the triad. A good example is 7th chords.
There are limitations to the current implementation. This approach does not work with 4th chords which in classical terms is not a chord, but is used frequently in popular music. Also the root is currently assumed to be the lowest note, thus the system cannot handle inversions yet. Adding further system intelligence for identify chords by the scale values is needed. The design decision whether to add inversions as separate columns or as a separate mode for chords is another problem that I was not able to address in the given time, thus left for future work.

Statistics Visualization
The statistical visualization, that is the 7 x 7 square shown in play mode, was added for debugging and aesthetics or abstract feedback that the system is reading the users input rather than for informative use. None the less, I thought for someone who cared it should be well handled to visualize some meaning.
The square is rendered based on the 7 x 7 progression matrix in PadStatistics. Each column of the matrix is in a sense the suggestion probabilities of each output given an input, e.g. the entries in the first column of the matrix are the probabilities that the next chord will be I~VII when the input is I. Each column is colored separately in the order of probabilities. I tried using a linear coloring of the probabilities but the more information gathered the greyer the image became making it uninformative.
The height of a slot/pixel is the number of times the chord was hit normalized by the maximum hit value. The more the progression returns to the tonic the relatively taller the top row becomes.
I tried showing the past inputs and further suggestions by text (e.g. I - VI - IV - V ), implemented in TextSuggestor, but the motion of the text made it difficult to read.

TODOs

Screenshots

Image
Splash screen

Image
Select mode

Image
Opening a file to load

Image
Playing in select mode to get chord suggestions

Image
Play mode with suggestion visualization showing