Lazy Chords: An instrument for exploring chord progressions

Hi everyone,

for the past few weeks I’ve been working on a personal project that I thought some of you might find interesting.

The idea is to create a space where you can simply play with harmony, discover interesting chord progressions and inspect them afterward to understand why they work. No music theory knowledge is required to get started.

The interface is designed to feel more like playing an instrument than operating a software. My goal is to make finding harmonic ideas as immediate and enjoyable as tweaking a synth or experimenting with a sequencer.

One feature I’m particularly excited about is that chords aren’t stored as MIDI files. Instead, they’re saved as compact JSON documents that preserve the harmonic information itself. That means a chord can be recreated at any time - that does not sound like much but that also means, it can be stored in a text file. So sharing a chord or a chord progression is literally copy and paste. For the future that would also open up possibilities to work on music with git!

The project is still under active development, and I’d really appreciate feedback from you! I’m especially interested in getting feedback on the music theory side. I know that a few naming conventions aren’t correct right now, it sounds good though :smiley:

The best feature for me right now is playing around with chords without thinking and then listen back to them in the log. Each chords already nicely separated, playback is literally clicking on them, perfect for sampling chords (without the chopping).

I’ll share some screenshots and the link to the repo below, thanks for checking it out!


PS: In case it isn’t clear, this thing speaks midi!

25 Likes

Since my description might come of as a bit abstract, here a few examples. The first two videos use the builtin piano sound, drone mode uses Surge XT to highlight that feature.

The first video show the gamepad controls - you select one of the seven chords nodes by very easy to remember combos. For example the I chord is up + up, then X to trigger it. For seamless and stressfree chord changes, you hold down A to open the gate. So each chord will ring out as long as you hold down A. If you want to play the next chord without interrupting the sound, you keep A pressed, enter the next combo and press X to trigger it.

You can also select chord extension by adding a third direction. First up, up for the I chord, then down for dom7 for example.

Keyboard controls behave exactly the same way.

Here’s the mouse controls, it’s a bit quicker to use but it lacks the gate mechanics, so each chord is just being played for two seconds or so. I might work on this to make it behave more like the gamepad or keyboard controls. Super comfortable for trying out things. You start dragging on a node and then you either select the chord itself or one of the four extensions. Upon releasing, the chord will play, with or without an extension, depending on your choice.

And here’s drone mode! You press the left stick down to enable it (or d on the keyboard). Then you open the gate, it’s a toggle in this case. Then you select your chord and it will start playing but when you select the next chord, the algorithm will take its sweet time to make the transition as smooth as possible. If there are notes from chord A that might clash with notes from chord B, it will disables the clashing note first and then slowly introduce new notes from chord B until the transition is complete. I think it sounds beautiful. You can force faster transition with the left trigger.

The chord nodes are automatically arranged to match the harmonic structure of the selected scale. You only need to remember one set of combos and you can play in any scale instantly. Smooth voice leading does the rest.

Forgot to show the strum feature but you’ll figure that one out…

2 Likes

So there’s a new lazy feature to do modulations. Instead of saying that you want to move to G major (you’d need to know what that is and how it sounds) next, the app will present you with four options that just work:

The ↓← combo selects the MOD node, which immediately replaces the chord ring with four modulation options. Select one to change key and scale; the app plays the chord that voice-leads most smoothly into the new key immediately after selection.

Direction Type What it does
Voice-Led Searches all 12 roots and related modes, picks the key with least total voice movement
Pivot Moves up a fifth (dominant); plays a chord shared between both keys as the transition point
Lift Shifts the root up a whole tone, same scale type
Modal Shift Same root note, changes mode one step darker (e.g. Major → Mixolydian → Dorian → Natural Minor…)

If the best continuation chord is identical to the one already sounding, the second-best ranked chord is played instead. And then you’re free to play in the new key.

2 Likes

Coming from this discussion (Proposal: LLM disclosure) about the usage of AI in software development: Yes, I did use AI! And will quote myself from the repo:

For me personally, AI is an enabling technology. Even if I had much more time at my disposal, my cluttered mind wouldn’t allow me to explore ideas so freely and quickly at the same time. I would get hung up on technicalities constantly without ever getting anything done. And, sadly, my time is limited. I also do have a technical background so I am well aware of all the implications. Also be assured that this software would be in a much different state if I hadn’t laid out the architecture. And as for having good ideas, yeah, I still need to come up with those as well.

So, yes, a large portion of the codebase has been generated at some point. It is my task to review that code and change it when needed. But that’s also one of the reasons why this project is open source. All codebases start in a rough shape, then they get refined until they are replaced by something better. If you know how to do something better, by all means, please open a pull request!

1 Like

And here’s an ambient track with the drone mode, wandering though questionable scales.

1 Like

I’m pretty happy with the current state of the project so far - it does what I wanted it to do :smiley: You can freely explore chords and scales without having to think (at least not a lot…). Currently, I’m working on a “scene” feature. A scene will have its own history of played chords, current scale, root key and other things. And you can share them easily with other users, it’s literally one button in the UI which copies the scenes in text format (JSON). Another user can then paste the text in Lazy Chords and you’ll have exactly the same scene. No need to mess around with midi files or other binary files which are always a hassle to deal with.

Currently, the whole harmonic context will get stored but not the instrument (a built-in instrument or midi). And that’s what I’m working on next. I want to create an abstraction layer on top of a synth engine so you will see an instrument called “warm pad” in the UI and that’s all. That instrument is tied to a specific synth patch and other settings but you don’t need to mess around with that. When that’s done, you’ll be able to copy and paste the full scene, harmonic context and the instrument definition. The resulting JSON data will only be a few kilobytes big.

I’m thinking about ways to embed an sfz player for sampled instruments like pianos and at least one software synth. Surge XT looks to be the best option.