Umeboshi – A Haskell Drum Machine
Umeboshi is a drum machine written in Haskell and built from a Roland 808 sound bank. The drum machine is designed to facilitate poly-rhythmic percussion in non-standard time signatures. It relies heavily on Unboxed Vector types and the Data.WAVE library.
By design, most drum machines facilitate writing drum patterns in common 3/4 and 4/4 time signatures and render the ability to have more unusual rhythms such as an even pentuplet over three quarter notes nearly impossible. This limitation has a coercive effect on the forms of music typically made with drum machines. Umeboshi is an attempt to fill the gap left by such design choices.
Methods such as buildMeasure allow users to write a pentuplet over a three quarter note measure as easily as:
buildMeasure 122 (Time 3 4) [("xxxxx", conga)]
By passing a length five string of either '.'
or 'x'
and instrument type conga
, umeboshi determines that a conga should be played evenly five times over the 3/4 measure. The function makeWavFile
(thanks to the wonderful Data.WAVE library) then can produce a wav file of the constructed rhythm.
For a more elaborate example, let’s take a measure of 5/4 and layer a hi tom triplet evenly over the measure, a snare tuplet and otherwise maracas on every other of the underlying quarter notes:
layeredExample = do
[hiTom, maracas, snare] <- roland808
let ensemble1 = [("xxx", hiTom),("xx", snare),("x.x.x", maracas)]
let measure = buildMeasure 122 (Time 5 4) ensemble1
makeWavFile measure
For the gritty details see this project on GitHub: Umeboshi