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.
- QT4
- Jack
- asound
- freeglut
- FTGL
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
- Space - change mode
- - / + - change key
- [ / ] - change scale mode
- m - toggle suggestion mode
Keyboard Pad Controller
Select Mode
- Direction keys - navigate through chords in the chord selector
- Enter - plays the selected chord
- Ctrl+Enter - assign chord to an empty pad
- Insert - assign chords in a column to empty pads
- Delete - clear the pads
- < / > - change octave
Play Mode
- p - toggles depth view for the probability box plot
- Ctrl+0(zero) - reset the probability box plot
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. PadEvent
s, MidiEvent
s) while in other cases they need to be pulled( stats. )
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
- Handle triad inversions
- Enhance chord suggestions. The application currently will not suggest 4th chords since they do not fit into triads.
- Use setup XML files for pad controller. Current implementation will only work for MPDs with Ableton Live settings.
- Use XML files for chord creation + support custom chords.
Screenshots
Splash screen
Select mode
Opening a file to load
Playing in select mode to get chord suggestions
Play mode with suggestion visualization showing