A re-frame application to visualize and edit compositions created with Leipzig for Overtone.
Overtone is a suberb Clojure sound library created by Sam Aaron. It lets you design own synths, play samples, interact with MIDI devices through SuperCollider platform. Overtone is realy good for sound design and playing individual notes but not that good at modeling complex compositions. That's why some abstraction layer libraries over it like Leipzig and mud were created.
Leipzig is a composition library for Overtone created by Chris Ford. The main idea behind Leipzig is that you can model (most of) melodies by sequence of notes with durations:
{:time 0 :pitch 67 :duration 1/4 :part :bass}
Leipzig provides a DSL which allows you to model these melodies with convenient transformations of Clojure collections.
Consider classic Da Funk track by Daft Punk:
(->> (phrase (concat [2]
(take 12 (cycle [1/2 1/2 1/2 2.5]))
[1 1])
[7 6 7 9 4 3 4 6 2 1 2 4 0 1 2])
(where :pitch (comp scale/G scale/minor))
(all :part :supersaw)
(all :amp 1))
The phrase
function takes 2 collections - with note durations and pitches - which are zip
ped to create base melody items with :time
, :pitch
and :duration
entries. You can use standard Clojure collection functions like cycle
, take
and concat
there. The pitches are steps of a given scale, which is provided with scale
namespace, when you can comp
ose scale root, type (minor
, major
, pentatonic
and many more), you can go octave down with low
and octave up with high
. Then you just specify what instrument (part
) should play this melody and other properties of the notes, like :amp
, :cutoff
and other. So, the resulting Leipzig structure looks like this:
[{:pitch 67, :time 0, :duration 2, :part :da-funk, :amp 1}
{:pitch 65, :time 2, :duration 1/2, :part :da-funk, :amp 1}
{:pitch 67, :time 5/2, :duration 1/2, :part :da-funk, :amp 1}
...]
As a non-musician it was hard for me to understand the context of the notes without actually seeing them on the screen. So I built Disclojure-UI as a browser-based DAW with a piano-roll like view that visualizes melodies created with Leipzig. The data is synced in both directions - when you change the Leipzig structure in the REPL (via websocket) and when you just edit the notes by clicking in the web GUI (via REST api):
Apart from editing melodies, Disclojure-UI helps you edit beats in a separate beat
view:
Frontend is built with re-frame and sente for websockets. Backend manages state with component and uses system and compojure-api to expose REST API, also visible as Swagger spec:
Compile Clojurescript:
lein cljsbuild once dev
Run:
lein repl
(require 'repl)
(reloaded.repl/reset)
Browse to http://localhost:3005.
Interact (better with some IDE like Cursive, vim-clojure, Emacs):
(require '[leipzig.melody :refer :all])
(require '[leipzig.scale :as scale])
(require '[leipzig.live :as live])
(require '[disclojure.live :as l])
(->> (phrase (concat [2]
(take 12 (cycle [1/2 1/2 1/2 2.5]))
[1 1])
[7 6 7 9 4 3 4 6 2 1 2 4 0 1 2])
(where :pitch (comp scale/G scale/minor))
(all :part :supersaw)
(all :amp 1)
(l/assoc-track :supersaw))
(live/jam (l/track))
...
(live/stop)
More info about live coding in disclojure docs.
You can see example session in this live-coding demo:
Copyright © 2016 Piotr Jagielski
The project name refers to Disclosure band.
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.