Show HN: Modest – musical harmony library for Lua (github.com)
I started this project with the idea of using formal grammar to parse chord symbols. I wanted to use it instead of a hand-written parser, which is the common approach among similar libraries. Lua caught my attention because of Lpeg, a Parsing Expression Grammar library that is both fast and easy to use. An additional motivation for using Lua was the lack of comparable libraries for it, even though the language is commonly used in audio programming.
However, despite being a Lua library, the project itself is written in Fennel — a "lispy" language that transpiles to Lua. Fennel has features that make writing code for the Lua platform much more pleasant: a concise syntax, macros, and destructuring — a feature Lua sorely lacks!
In the process, I definitely learned a lot about music theory, although my new knowledge is quite one-sided. By working on this library, I know a thing or two about types and structure of chords, but I learned almost nothing about their composition and transformation. Perhaps these will be the directions I explore next in the project.
8 comments
[ 3.1 ms ] story [ 22.1 ms ] thread1. https://github.com/monome/norns
2. https://llllllll.co/
You're right it's very expressive. I wish there was something like Teal, but for Fennel. I know there are libraries for runtime typing, but my ideal language would be a gradually statically typed Fennel.
Speaking of use cases, I started this project with the idea of making a flexible parser for chord symbols. In the process of solving this problem, I wrote some general-purpose utilities, which eventually took form of this library. I'm making it public in the hope that it will be useful to others who use Lua for music and audio programming.
I haven't yet implemented the functions related to scales. I'm still thinking about their relation to chords and how to express it in the library's API.
Parsing chords from notes is more difficult, as are most parsing tasks.
You can define interval structure as a sequence of large L, small s, and optionally medium M steps.
For example, the Major diatonic scale, a 7 note scale from 12 EDO, in Ls notation is:
A 6 note scale (Gorgo-6) in 16 EDO is: You can then explore frequency ratios beyond those available in 12 EDO, see this Lua file: https://github.com/robmckinnon/pitfalls/blob/main/lib/ratios...E.g. the Gorgo-6 scale has the intervals S2 (septimal major second), d4 (Barbados third), N4 (undevicesimal wide fourth), s6 (septimal sixth), s7 (septimal minor seventh).
And chords based on those ratios, see Lua file: https://github.com/robmckinnon/pitfalls/blob/main/lib/chords...
The above links are Lua code files for a monome norns library for exploring microtonal tuning: https://llllllll.co/t/pitfalls/37795