13 comments

[ 3.8 ms ] story [ 37.8 ms ] thread
Super cool! Even though I'm far from musical I instantly got the urge to come up with some tunes :)
It is amazing never thought about how you could translate a music sheet to Lisp but it makes total sense...

Also somewhat relevant though not in Lisp for anyone interested in programming music check out Sonic Pi:

https://sonic-pi.net/

I'm not affiliated with that project, just find it fun. It's in Ruby btw, I'm not a Rubyist but when it comes to Vagrant and Sonic Pi that's the full extent of my Ruby usage.

Lilypond is best-in-class and is in Scheme; it uses a DSL for friendliness, but it all comes down to Scheme after that.
The editor auto-linting my input is incredibly frustrating - try pasting anything of complexity in, for example.
A tempo-correct version of the default tune, which was really getting on my nerves:

  [:piano {:tempo 130}
   1/8 :c :c 5/8 :a 1/8 :f :g :f 3/4 :d
   1/8 :d :d 5/8 :a# 1/8 :g :a :g 3/4 :e
   1/8 :e :e 5/8 :+c 1/8 :a :a# :+c 3/4 :+d
   1/8 :f :g 5/8 :a 1/8 :e :f :g 3/4 :f]
I don’t want to minimize any of the work being put into this, which is clearly not a trivial amount, and is actually quite interesting and useful for learning purposes. That being said, I have some blunt criticism to offer that I hope provides some context as to what kind of tooling is useful in this space:

I’m not sure I would prefer this over a different (probably visual) tool that facilitates, e.g., ensuring that a given set of notes fits into a measure, or checking which notes are played simultaneously. It also frustratingly does not take advantage of any of Clojure’s functional affordances, such as the ability to transform data programmatically, and does introduce global state, harkening back to C’s misplaced notion of “macros”. Not much here seems Clojure-specific other than the sometimes confusing dynamic behavior, such as implicit list interpolation, and JS interop. All that said, I hope this becomes more than just a Lisp-based clone of an existing format with mature tooling: http://lilypond.org/text-input.html

You actually have full access to ClojureScript functions, including all data transformation functions. I just didn't make use of them in any of the posted midis. Also i have no idea what global state you are talking about.
Anyone into both Clojure and music production should look into Overtone: https://github.com/overtone/overtone

It's essentially a synthesizer in a REPL + a multitude of other capabilities (sequencing, sampling, MIDI)

I always have the radio on when I am on my pc... but hey this is so cool ... so cool ... that I had to turn the radio off well done