for writing chord progressions on the command line. I use it for building progressions which I drag into my DAW. It has voice leading, which required me translating an algorithm from 18th century German musical textbook into Python. I don't speak German and there were no unit tests in the 1700s so I'm only fairly certain that it works properly.
I will make a plugin version once ableton supports CLAP.
Wow, never seen that before. This seems more like a whole plaintext musical language, like mma is to midi what markdown is to HTML. Mine is just a way for somebody in a hurry to get the MIDI chords they want without putting all of the notes in manually.
"Gradus ad Parnassum" by Johann Joseph Fux, right?
Read it a couple of years ago after learning basic music theory, as I was still struggling to write consonant voices.
I probably wasn't the first person to think that contrapunctual rules might lend themselves to algorithmic implementation - so it's very cool to see you've done just that in your project!
Hey there everyone. My name is Pedro and I'm the creator of the mentioned project.
First of all, I'm really grateful for all the feedback, positive and negative, about my project. When I started this 6 years ago, I was teaching myself harmony. Writing a Ruby Gem was a way of making sense of all that and at the same time making what I consider "music calculations".
A lot has happened since then. I've realized that while a Ruby gem might be cool for some applications, I really wanted to have something more visual and more inviting. Like an app. I have completed my (belayed) college degree on Graphic Design with my final project being this app's design. It's all ready. Now it's just a matter of finally implementing it. So I've been working, since around 3 years, on a multiplatform app. Possibly also a VST plugin version for DAWs.
Thank you all for the interest on the Gem/CLI project however. It's not abandoned. Since many of you expressed interest on it, I'll take a look at the problems you reported. Certainly a way to install via homebrew would help I believe.
It's 4 AM over here now so I better cut it here but will comeback later and maybe answer some of the individual messages.
I must be the only one here who downloaded it to try it out, because none of the commands work. See issue#56, I just get "abnormal end". It also hasn't been updated since 2021.
The chords for guitar also are weird. It doesn't seem to be using traditional shapes, but is looking for available notes within a fret range. Which leads to difficult, basically unusable fingerings.
The other functions would be very useful to have, if it worked. Maybe one day I'll write a similar CLI tool.
> The chords for guitar also are weird. It doesn't seem to be using traditional shapes, but is looking for available notes within a fret range. Which leads to difficult, basically unusable fingerings.
That's a design choice on this library. I tried to rely the least as possible on lookup tables, dictionaries, etc, leaving things to be discovered algorithmically instead. It is a difficult challenge, but for example if someone decides to use an entirely different tuning, the software will provide. The software might also find chords that you have never thought about. What has to be improved here is the sorting mechanism for guitar chords.
> The other functions would be very useful to have, if it worked
Just try running `coltrane` and test it interactively.
Yeah. I really wanted to try it but I couldn't get the commands to work. All the issues seem related to another gem written by the same author, which has not been updated since around the same time.
Not knowing ruby, I can't really invest too much time trying it to work. :<
$ bundler
$ ./bin/coltrane
? Welcome to Coltrane 4.1.1 (You chose: notes)
? Which notes?
> C E D F G A
? How to display? (You chose: Guitar)
-> coltrane notes notes:C-E-D-F-G-A representation:Guitar
[[ omitted ]]
? What to do now? (Choose with ↑ ↓ ⏎, filter with 'f')
> 1. Different notes
2. Different representation
3. Go back
I don't really remember much about Ruby and I'm having a hard time
$ bundler
[... many packages listed ...]
Using coltrane 4.1.1
[... some more packages ...]
$ ./bin/coltrane
zsh: no such file or directory: ./bin/coltrane
$ gem which coltrane
/opt/homebrew/lib/ruby/gems/3.2.0/gems/coltrane-4.1.1/lib/coltrane.rb
$ /opt/homebrew/lib/ruby/gems/3.2.0/gems/coltrane-4.1.1/bin/coltrane
Could not find [... many packages ...]
Run `bundle install` to install missing gems.
Curiously enough, I have been working on a project named after the same person (John Coltrane) as a way to help me practice music: https://github.com/trane-project/trane/
I have been meaning to generate flashcards to teach you the notes of scales and chords so that I can have instant recall. It gets really annoying to not know them when improvising or composing. I have some basic courses, but I found the process a bit tedious, so I have been working on other courses and features instead.
I am going to try to use this utility to help me generate the flashcards instead of writing my own logic. Hopefully it works well as it would save me a lot of time.
> I am going to try to use this utility to help me generate the flashcards instead of writing my own logic. Hopefully it works well as it would save me a lot of time.
My favourite practise tool is slightly more complex than flashcards (but could still be implemented as flashcards). It's better for playing but still works for rote memorisation.
Randomly filled rectangular grids.
They are incredible adaptable and very amenable to generating with scripts or small programs.
e.g. notes of the A major scale:
Shuffle the notes and make them into a grid (here is a 7x7 sample shifting each row 2 places - although any shift of 1 - 6 places would work.)
C# G# A B F# E D
E D C# G# A B F#
B F# E D C# G# A
G# A B F# E D C#
D C# G# A B F# E
F# E D C# G# A B
A B F# E D C# G#
Play the rows from left to right along each row. Then right to left.
Plat the columns from top to bottom. Or reverse it.
Snake along the rows top to bottom from left to right, then back right to left.
Play the grid in a spiral. Clockwise, then the opposite way.
Play diagonal slices rising or falling.
Concentrate on the first notes in each row/column - play the mode starting from that note.
Make it a cloze exercise by removing columns (or rows or just random notes)
C# - A B - E -
E - C# G# - B -
B - E D - G# -
G# - B F# - D -
D - G# A - F# -
F# - D C# - A -
A - F# E - C# -
The adaptability is really limited only by your imagination:
e.g. Chords:
Bm D Fdim C Dm G Am
Fdim C Dm G Am Bm D
G Am Bm D Fdim C Dm
Name the notes, play them (frets 1-5 then frets 5-10), play the triads, inversions, arpeggios...
Or the same idea but using roman numerals/nashville numbers and play them in different keys:
Interesting. I wrote a silly little bash script that more or less did this, and then eventually realized I could do better for now by just printing out a bunch of blanks (keyboard) and making physical ones.
It's just too much work. Just doing it in one key is a lot, and you have to do that twelve times (fifteen if you want to be thorough and include all the enharmonic keys). So I am glad someone seems to have done it all already in a command line tool that hopefully I can automate.
This shouldn't be free, I'd pay $500 for such a thing.
UPDATE: Why? Because it's got all the features without the abuse of the various websites and apps spread out and containing just some of those features. Let alone captchas and Cloudflare and ads.
You could always donate $500 to him. And if he won't take it, you could pay a freelancer $500 and task them with tackling some of the open issues that are present in the tracker.
This is very cool! Sometime ago I ended up starting a similar project in Common Lisp, but then life happened and it has stayed as WIP for quite a while already... Maybe now I don't need stress about finishing it since this seems quite handy!
Additionally, the author wrote a post about the motivation for creating the library but it's a little difficult to find via the (now broken) link in the README, so here is a direct link to the archived page on the Wayback Machine:
[0] Or, in a pinch, even with a Godot 4 web export as I did for my (very incomplete) "AI and Games" Game Jam entry: https://rancidbacon.itch.io/the-conductor (For reasons far too convoluted to go into now.)
Its a very cool project but as I have seen some other cool efforts as well, I feel that the domain of "open source computer-assisted music theory tools" is quite fragmented and people must reinvent wheels.
I wonder if we could imagine some sort of community project that abstracts certain music related objects (scales, chords) and representations and allows e.g. CLI or web-based rendering using possibly different stacks, interfacing with musicxml, lilypond etc.
Something like the "Grammar of Graphics" but for Music Theory
> abstracts certain music related objects (scales, chords)
I've been thinking about that again recently & attempting to resist both creating such an abstraction and re-inventing the wheel. :)
The first format that came to mind for its cross-language potential was essentially "Music Theory expressed in JSON format".
Yesterday I did another search for what current options there might be and after a very circuitous path ended up on an old version of the Tonal Javascript library I've already been using. :D
My impression is that there are a few tensions that complicate the creation of a "universal" cross-language/tool solution:
* Static vs dynamic storage/representation. e.g. Do you statically store the set of notes in a scale or store the intervals & the operation(s) needed to generate the result dynamically? e.g. https://github.com/Cycling74/node-music-theory/blob/518babe7...
* Reuse vs reinvention (time taken): When starting out it seems the amount of Music Theory most people want to use & have encoded is quite small. So initially the time required to "re-invent the wheel" is quite small vs time required to find & use a common shared abstraction.
* Reuse vs reinvention (knowledge gained): I know, for me, part of the motivation related to re-inventing the wheel is I also want to learn aspects Music Theory so I can understand/apply the knowledge in potentially non-programmatic contexts also.
I do think there is value in having the knowledge encoded in some manner so it's at least available for re-use for those who want it.
Edit #1:
> and representations.
In relation to the aspect of representation, my recent explorations introduced me to the following projects which might also be of interest to you or others:
* MNX - "representing music notation as machine-readable data" (intended as improvement of MusicXML): https://w3c.github.io/mnx/docs/
FWIW my experience with SMuFL & its reference font(s) "Bravura" and "Bravura Text" (https://github.com/steinbergmedia/bravura/releases) was...mixed. Primarily because the emphasis (& use/testing) really does seem to be on the use of "Bravura" within notation software rather than "Bravura Text" which is intended for use in e.g. text editors.
But, for example, it is "Bravura Text" that (seems to) offer the inviting niceties of easy Unicode-based combining of head + stem + flag and/or vertical placement of notes on a stave.
Until, for example, you want to use one of the "note name" heads and discover that (a) they don't work with the stem/flag combining characters; and, (b) they're 7-10% larger in size than the default note heads.
Or, you find that the "latest" v1.380 "release" actually seems to be missing the entire ligature table that makes the vertical positioning feature work and you actually need to use the unlinked two year-old v1.392 "pre-release" instead.
(And that seemingly all the other "Text" variants of "SMuFL-compatible" fonts don't actually include any of the niceties that make it appealing.)
Err, excuse the rant, the wound might still be a little bit raw. :)
Repeating a recent comment on another music-related link. I've recently come across the Humdrum [0] toolkit, which does a bunch of related stuff, in very interesting ways. Coltrane looks awesome! I'll have to delve into this :D
Is there a way to automate piano voicings with this?
Most good (especially jazz) pianists can easily find a simple (nice) sounding sequence of voicings for chords - is there an analytical/algorithmic solution for this?
A teacher is by far the best way to go, failing that The Complete Musician is the best book/source I have seen for self study. The problem with self study is that the basics of harmony/triads seems very simple and people plow through it and think they understand than get completely stuck. Everything is built on harmony and if you do not understand it you will not progress. If you go with self study remember that if you are stuck it means you did not understand what came before, go back and figure out what you missed, which is where a teacher is very handy since they will have a much better idea about what you missed than you do.
Rick Beato is not great for complete basics. Gracie Terzian has a really good music theory playlist on YouTube that builds on itself. I watched her videos in that order and it really helped me finally understand so many concepts in music theory that went over my head before. She has a way of explaining things that just works for me. Here’s the playlist: https://youtube.com/playlist?list=PLjpPMe3LP1XKgqqzqz4j6M8-_...
Yes, Rick Beato. He covers all sorts of stuff to different extents. Like music theory in ten minutes: https://www.youtube.com/watch?v=mWpXy57-mvc .. but he has hundreds of videos on keys, modes, analyzing popular music, the works.
If you really know nothing you might enjoy this attempt at explaining harmony at five different levels from a child to Herbie Hancock: https://www.youtube.com/watch?v=eRkgK4jfi6M
Rick Beato also has a book and interactive courses that are on sale at the moment: https://rickbeato.com/ (I have bought the bundle, but I haven't had time to check it out yet.)
Don't feel rushed, Rick's content is always on sale. I don't have first-hand knowledge, but have read some criticisms that the "Beato Book" is not always coherent or well organized. That said, I believe he has recently made substantial revisions, and added a lot of on-line content.
Check out Gracie Terzian on YouTube if you’re a total beginner and getting overwhelmed by other music theory sources. Her speciality is really breaking things down and simplifying as much as possible.
It's an ongoing series of illustrated one page "posters" in PDF form each on a specific Music Theory-related topic. Nice bite-sized content written in a non-dry style. (All licensed CC-BY-NC-ND.)
Also available to download as a (currently) 63-page single file PDF.
It's a great resource if that medium of communication is effective for you--I just learned/got clarification on some things from a skim of 63-page PDF.
The PDF I downloaded is ~1100 pages and it's the second revision of an originally crowd-funded project
I've only briefly skimmed it but it certainly seems very comprehensive & way more than I'm ever likely to need. :D
But just now I've just noticed that they describe (on https://openmusictheory.github.io/about.html) their use of the textbook for "...“inverted” or “flipped” courses, often following an inquiry-based model" and the "..text is meant to take a back seat to student music making (and breaking)".
Which matches what's motivated me to learn more about the theory side: it was after playing around & creating tracks (using the FLOSS LMMS / Carla / Surge XT music creation software) that I hit a point where I wanted to learn how to make my music have more of a melodic component to it.
And it turned out, for me, at least, creating rather than playing/reproducing music is way more motivating for me to learn the theory which I kinda wish someone had shown me during the short period multiple decades ago when my parents were paying for piano lessons until it was suggested that if I wasn't going to practice perhaps it wasn't the best investment... :)
The respective associated channels may also be of interest depending on your specific genre/style interests.
Early on I also watched many of the videos on the "Hack Music Theory" channel (e.g. https://www.youtube.com/watch?v=uEElzai3tIo) but over time they seemed to tip the ratio of "informative content" to "promo"/"filler" too far in the "wrong" direction, so I mostly stopped watching.
(I understand why they did--I can't imagine music teaching is an easy YouTube "niche" to succeed in.)
More recently I've also discovered these channels which might have unique aspects that also appeal to you:
It can be...challenging... to "sift the wheat from the chaff " with YouTube music education and quite apart from personal taste there's also the effect of the pressure to "please the algorithm" in terms of presentation that can also make some channels hit/miss.
But hopefully you'll find something that works for you! :)
I know jazz guitarists have double jointed, mangled hands but most of those generated guitar chords fingerings are, well, let's just say not traditional.
It is a chord and scale library and does not show how those things relate or present them in a way conducive towards study of that. If you know how the information this app provides is related then you probably do not need the app for theory. Theory is not memorization of chords, scales and progressions; theory shows you how to construct those things so you do not need to memorize everything.
A slide rule would be more analogous to a musical instrument. If you want an analogy between this app and engineering in the slide rule days, it would be closer to a pocket sized reference book of log tables and formulas.
I did not say that at all. This programs relation to theory is about the same as the relation between numbers and calc, while numbers are very important to calc you are not learning or using calc by using numbers, there is a hell of a lot more to it.
I sort of see where you are coming from, but "music theory" is the standard accepted term for this general field of study, which includes the fundamentals (notes and chords and more). source: used to teach music theory at the university level
The accepted term for this would be method, learning by doing which is the opposite of theory but generally provides part of the foundation for learning theory. Learning by method is the way the vast majority learn to play and write music and really is all most people need or want. Theory is not of much use for most musicians, a concept of key (intuitive or literal) and what works with a key is all they need. How instead of why.
Perhaps this is being pedantic but these sorts of distinctions are fairly important, understanding what you do and do not know will make you more effective at learning and help you identify what is of use for you to learn. As someone who taught this stuff you should know that the ones who are most difficult to teach are the ones who think they already know.
I'm on a (possibly multi-)lifetime quest to understand this better.
all of what this music library does comes out of the concept of the music keyboard, which is (in my head) the same as the 12-note "meta"-scale which is a system that enables 12 different version of 7 note scales.
in this view, a scale does not begin in any specific note; this perspective of "scale" goes beyond the typical music theory view. understanding 'scales' like this implies that the major and minor 'scales' are the same 'scale'. I should choose another vocabulary term for this quasi-scale idea (semiscale?)
If you are talking about a set of seven notes, that is not a scale. C and Am have the same notes, but a different tonic, but they are different scales, so a scale is defined by the notes it contains and the mapping of scale degrees to those notes.
What you are describing, seven notes that do not 'start' anywhere, is the set of all scales that are enharmonic with a given scale, meaning they have all the same notes. These scales are said to be relative to each other: Am is the relative minor of C.
I think what you're trying to get at is that when you don't consider any note to be the tonic, and play freely in a set of seven notes, you can play more expressively. If you change the tonic without changing the notes in the scale, you are now playing in a different mode.
For example, if you started in C, playing the notes CDEFGAB, you are playing in C Ionian (much more frequently just called C Major). If you change the tonic to A, the scale is now ABCDEFG, or A Aeonian (much more frequently just called A minor). Now if you change the tonic to D, the scale is DEFGABC, or D Dorian.
One small correction: changing just the mode (i.e. keeping the same notes while changing the tonic) is usually called a modal interchange.
Modulation typically changes the notes, which is achieved by changing either the tonic or the mode or both. For example C major to D major is a modulation, but C Ionian (major) to D Dorian is usually called a modal interchange.
Also, to be honest, the last paragraph is very simplistic and makes me wonder if the whole comment didn't come out of ChatGPT.
Wow, ok. I think I'll take that as a compliment, at least my input looks good at surface level! :)
I'm not super knowledgeable about modal jazz but when I think 'mode', I think 'modal jazz', so I thought that would be good to throw in there as an example of music you can listen to if you want to hear these concepts in action rather than just reading about them.
Thanks for the correction, that's my bad.
edit: I removed the last paragraph, "This process is called modulation, and it is the defining feature of modal jazz.", since your correction explains it better than I could
What fooled me was going from an entirely correct paragraph to one that... had words that were consistent with the topic but a lot of inaccuracies. I think we can treat it as a reverse Turing test. :) I knew I was probably wrong but it seemed like an interesting observation.
Modes other than major or minor are very common in modern non-jazz music. A lot of minor songs are actually Dorian (not all! a couple examples are Boulevard of Broken Dreams or Wicked Game) or in the case of metal Phrygian. A lot of major pop songs are Mixolydian (all those that sound like Hey Jude, for example Sweet Child O'Mine).
Also Lydian is quite common in soundtracks because it has a very "suspended" feeling (due to the lack of a dominant seventh chord that can resolve to the tonic), for example Yoda's theme and the Back to the Future theme are both Lydian. In the case of Yoda it then goes to major (I don't remember if it's a mode change or a modulation), while BTTF remains Lydian.
David Bennett has videos on YouTube with many examples of songs for each mode.
yea, but for some reason I don't think I could explain very well (which is a problem), I am trying to somehow consider all those 7 notes (and their 7 modes) as the same 'scale'. As I said, I need to find another term to refer to this way to consider the intervalic structure as if it were one thing.
Essentially I'm trying to grab a 'scale' and combine it with all it's conjugate words (or circular shifts) [1,2] and I don't know what to call this thing but I'm interested in it.
Why? because of how I choose to understand the origin of the 7 note major scale:
you take any note (the base tone) and multiply the frequency by 3. this creates a fifth (plus one octave). I'll keep in mind that 'the octave' is defined by multiplying the frequency by 2.
then, fit the fifth (base tone * 3) into only one octave (3/2). And repeat 'recursively'.
This is the famous circle of fifths, but we all knew that. Finally, after twelve repetitions we're back on the same note, but an octave above. (but why? why stop at twelve? I'm still working through this answer, but it has something to do with convergence maybe? or just the fact that after 12 notes we have now landed within two notes which we 'found' already???)
With this in mind, we have two different ways to sort all notes. Sequentially within a single octave, like on the piano or a guitar. Or in the way which we generated them out repeating 3/2.
If we only did 7 notes (instead of 12) we would get these two ways to sort:
ABCDEFG;ABCDEFG; ABC...there are 8 octaves in a piano
CGDAEB... F# C# .... C
I just cannot yet get over the fact that this is not a conjugate (not a circular shift) but a full on permutation, a shuffling of the notes.
By this point, it should be apparent that the labels we use for the notes are but a minor detail. I'm trying to abstract all this away from the ultimately arbitrary names of the notes.
...I can keep going. this is just part of the setup.
when this starts to get interesting is when I go on to consider the rhythmic aspect of music using similar symbolic tools; but in a subtly different way. As I said upthread, I've been thinking about this stuff for a while now, and it adds up.
All this because I still do not understand (to my own satisfaction) what's going on with the 12 note system, up to which extent and how does it do? what I (almost but not quite) understand to happen with 7 notes and major/minor/other modes scales.
Note that different modes of the same scale are only enharmonic in the standard piano tuning (equal temperament). Under different tunings [1], the exact frequencies of the notes in e.g. the A minor scale and the C major scale do not necessarily match up. These different tunings are the reason why certain keys are ascribed a certain character (e.g. the E♭ scale was considered morose whereas the same scale in A was considered uplifting).
Then there's the octatonic scale, the double harmonic scale and quarter-tone intervals present in e.g. arabic music [2], or even more exotic scales [3]. So whatever "deeper logic" you're after, there will always be scales that do not match your preferred system. Be careful you're not straying into numerology, trying to find a deeper "truth" beyond what sounds agreeable to the ears of the listeners.
>Why? because of how I choose to understand the origin of the 7 note major scale: you take any note (the base tone) and multiply the frequency by 3. this creates a fifth (plus one octave). I'll keep in mind that 'the octave' is defined by multiplying the frequency by 2. then, fit the fifth (base tone * 3) into only one octave (3/2). And repeat 'recursively'.
This is called 3-limit tuning: https://en.xen.wiki/w/3-limit . 5-limit tuning is what standard western music uses: https://en.xen.wiki/w/5-limit (to include thirds as well as fifths) After reducing the ratios to fit in an octave, you get exactly 8 notes (7 if you subtract the octave itself). Note how https://oeis.org/A054540 shows that 7 notes are a good approximation of the ratios, but so are 12 (which shows why creating a 12-note system was an advantageous move, over 11 or 13). Technically in 12-EDO a fifth is not exactly generated by the ratio 1.5, it's slightly flat at 1.498307... but we choose the note closest to 1.5.
> This is the famous circle of fifths, but we all knew that. Finally, after twelve repetitions we're back on the same note, but an octave above. (but why? why stop at twelve? I'm still working through this answer, but it has something to do with convergence maybe? or just the fact that after 12 notes we have now landed within two notes which we 'found' already???)
Suppose we already chose a 12-note equal-tempered system. The closest note to the perfect fifth of a fundamental frequency `f` will be `f * 12th-root(2)^7`, (7 notes out just happens to be close to multiplying by 3/2). The next fifth after that would be `f * 12th-root(2)^7 * 12th-root(2)^7 = f * 12th-root(2)^14`. Going out by a fifth 12 times gets you `f * 12th-root(2)^84 = f * 12th-root(2)^(712)`. But we know that `12th-root(2) ^ 12 = 2`, simply from the definition of 12th root. Multiplication is commutative, so we can group the roots-of-twelve by groups of 12 instead of groups of 7, and we get `f 2^7`. Taking that modulo 2, we just get f, i.e. the same (enharmonically equivalent) note.
Now suppose we didn't make that choice, instead we chose a 31-note system (I'm a big fan of 31-EDO). In that case, we have the same construction. The fifth in 31-EDO happens to be an interval of 18 notes, and similarly we jump around the scale, but this time an interval of one note is `31st-root(2)`, so we have to do 31 fifths to get back to the same note.
This actually tells us something interesting - if we want to form a circle (made out of intervals, that end up hitting the original enharmonically-equivalent-note) to hit all of the notes in our scale the notes we hit must be a permutation of the original scale. It's a little beyond my math to tell you how this works, I think Fermat's little theorem and modular arithmetic has something to do with how it works. Something about how 7 and 12 (or 18 and 31) are relatively prime compared to each other, and it forms a group which generates a permutation.
> the major and minor 'scales' are the same 'scale'
Indeed, they are two modes of the same pattern. If you look at that pattern in a circle, sometimes called a "necklace", the major and minor scales are rotations of each other.
For this way of looking at music, I recommend the book A Geometry of Music by
Dmitri Tymoczko, who teaches composition and theory at Princeton.
> A Geometry of Music provides an accessible introduction to a new, geometrical approach to music theory. The book shows how to construct simple diagrams representing voice-leading relationships among familiar chords and scales. This gives readers the tools to translate between the musical and visual realms, revealing surprising structure in otherwise hard-to-understand pieces.
It's written by Godfried Toussaint, a computer scientist who discovered "Euclidean rhythms", a large set of rhythm patterns generated by a simple algorithm, many of which are common in world music traditions.
> In 2004 he discovered that the Euclidean algorithm for computing the greatest common divisor of two numbers implicitly generates almost all the most important traditional rhythms of the world.
well, at least they are aware they merely discovered this. Because so could I, in fact I am well (ok, not so well) on my way to also discover those same ideas, except I'm not at Princeton nor anywhere near it.
thanks for the tip on the geometry of musical rhythm book. I was aware of the other one but not this one.
If there other hackers who make music here, I wrote this:
https://github.com/Miserlou/chords2midi
for writing chord progressions on the command line. I use it for building progressions which I drag into my DAW. It has voice leading, which required me translating an algorithm from 18th century German musical textbook into Python. I don't speak German and there were no unit tests in the 1700s so I'm only fairly certain that it works properly.
I will make a plugin version once ableton supports CLAP.