helio-fm / helio-sequencer

Libre music sequencer for desktop and mobile platforms
https://helio.fm
GNU General Public License v3.0
3.09k stars 115 forks source link

Rethink the chord tool #48

Closed suhr closed 3 years ago

suhr commented 6 years ago

Scales and roman numerals are fancy, but chord symbols are practical. I want Gm or C°, not some numbers in a some kind of scale.

peterrudenko commented 6 years ago

Not sure if I understand you: roman numerals represent diatonic functions, e.g. Gm chord you're talking about is a, say, triad:

Am I missing something?

suhr commented 6 years ago

Gm just is a minor chord with the root in G. The meaning of Gm doesn't depend on the key, it's just G-Bb-D.

My point is simple: I don't want Helio to analyze the harmony for me. I want to put a minor chord (maybe an inversion).

peterrudenko commented 6 years ago

I don't want Helio to analyze the harmony for me

I still can't make sense of your suggestion: the chord tool does not analyse anything, it just gives you a mean to

Perhaps you don't need all the scales and functions there, but others may do. So I’m utterly opposed to any simplifications in that dialog: instead, I was wondering if I could also add more different chord types there (like 9th, 11th, inversions) - and try not to turn UI into a complete mess.

peterrudenko commented 6 years ago

Not to mention I had a number of drafts (like the one below), but still wasn't able to decide which one would be more usable. And fancy, for that matter.

2018114140741

Ideas are welcome :)

suhr commented 6 years ago

select a root key by dragging that + button, select a scale (Aeolian in your case), select a function (seems that you don't want any other than Tonic)

Basically, “everybody lives in the Riemannian world”. But consider the following:

  1. Chords doesn't have to be made of thirds (sus chords for example)
  2. Chords doesn't have to belong to a scale

instead, I was wondering if I could also add more different chord types there (like 9th, 11th, inversions) - and try not to turn UI into a complete mess

It's easier to fit in more if you throw something away first. Like replacing scales with the chord type (triad, seventh, eleventh, sus, power, etc...) and the functions with a list of specific chords (major, minor, dominant, etc). And you can choose an inversion by clicking the variant several times.

No fancy music theory, but instead you can easily have even the Prometheus chord.

Shadowhenge commented 5 years ago

So my suggestion (and I can work up a basic vector graphics set this weekend if you are interested) is to have the circle of 5ths on the menu as the letters. The key of the song would be selected elsewhere and when the chord menu opens up it shows the circle with all of the notes in that scale highlighted around it. I'd do a a green highlight for the tonic and and blue for the others in the scale with the not-in-scale notes slightly greyed out but still usable. Scale notes would be relative to the chosen key appearing as say... Cm over an i... for those that care to reference the roman numeral system. if you right click on a scale note it gives a breakout of alternate chords for that position in the key (maj7, sus2, etc etc) and will sound each if moused over. right clicking back on the main note will close the breakout and allow selection of a new note in the circle. only a left click will select and apply a given chord. You can even provide markers on the piano roll that will let you change keys and the functionality of the widget will follow the key currently indicated by the location of the roll. inversions of each chord can be selected by holding the right click on a given note in the widget and dragging up and down to chose inversion and left and right to change octave. selection will be remembered. performing the same action in the center (in an element that shows the current key and key change options), will allow a change to octave or inversion that applies to all subsequent selections (but can still be overridden by an individual selection). in the center of the widget there should be the main key you are currently in as well as elements to perform a key change while inputting notes (key change placed at start of bar where the widget was opened and can be moved if needed). I'd highlight the keys that are relative using the circle of fifths method and order everything as it appears on the circle (even though I prefer linear representation, most people don't). overall the widget doesn;t need to be large and if color coded a little bit can provide a very fast and intuitive workflow. You can even have an option available to display the scale letters, intervals, diatonic function. or whatever alternate notation you like or the user may prefer. (it may get cluttered if you show all of them but that is fine, too.)

regards,

peterrudenko commented 5 years ago

I can work up a basic vector graphics set this weekend if you are interested

I'd appreciate if you do - just to make sure I understand you correctly.

The key of the song would be selected elsewhere You can even provide markers on the piano roll that will let you change keys

The development version already allows setting key signatures and highlighting root and in-scale keys: scales

Shadowhenge commented 5 years ago

circle of fifths widget

So this is about as close to what I was thinking as I can get given I can;t seem to figure out how to get inkscape to do it. When you right click a blank spot on the screen the widget assumes that selected octave for placement. It will show you the scale notes, labeled as I-VII and let you select it. You may, of course chose any note and are not restricted to the currently set key in the song. Right clicks add or remove quality elements and play the new chord with each one. Left click or enter places the chord in the octave that the widget was opened in on, centered as close to the crosshair as possible. There are obviously more elements to chord naming and I felt it would be cumbersome to simply list every possible chord for a given note. It can work so people can construct chords on-the fly and you could potentially even show a small keyboard in the middle of the widget and highlight the keys each element is adding to the base chord as a way to show people what is being played. Also having keyboard input of a chord while the widget is opened should name it as approximate as possible and offer alternatives for it. Out of scale or nonsensical notes should be indicated if the keyboard view is implemented.

suhr commented 5 years ago

If you already have chord types, what's the point in the circle of fifths?

Shadowhenge commented 5 years ago

I had thought of that but I wanted to cater to people who are familiar with the notes to be able to select (and have the chord placed at the closest root note to the one selected) in one step rather than a place and drag to move fashion. Just trying to remove steps and provide a familiar environment. (It also allows people to select chords not in the current scale for transition chords). I suppose it can go either way but I personally know the notes by the chromatic alphabet and like to have them for reference.

suhr commented 5 years ago

All right, it's time for polemic.

circle of 5ths with the not-in-scale notes slightly greyed roman numeral system highlight the keys that are relative using the circle of fifth nonsensical notes

Please do not design a user interface that encourages people to blindly follow patterns. Or even encourages usage of one specific framework over the other one.

There are two reasons:

Shadowhenge commented 5 years ago

I apologize. I guess this just isn't the app for me, then. Anyone know of any programs exactly like helio with a chord tool that uses standardized scales and modes?

suhr commented 5 years ago

Don't get me wrong, I'm not saying that standard tools are not allowed. They just should not dominate over everything else. And anyway, I'm not a maintainer, it's @peterrudenko who decides the future of the app.

Sorry if I sound rude or inflexible, English is not my native language. I really expected a discussion.

Anyone know of any programs exactly like helio

Helio is the best, because it achieves more with less. “Keep it simple” is a powerful design principle (and a yet another argument against an overly fancy chord tool).

But answering your question, Odesi looks somewhat similar and it is quite music theory centered. It is commercial though.

Shadowhenge commented 5 years ago

Yeah I looked at it and it doesn;t let me add the incidentals I like. I already have chorder (which sadly doesn't work with Helio) if I want to grab some basic chords for my other 2 daws. I was hoping to use this as a simple composition tool. No real distractions or workflow issues like most DAWs can get you into fairly fast. I guess I don;t understand how the current system works musically. I end up trying every one till I find the one I like but I have a hard time reconciling and translating it in my head to what I know for music theory. I'm all for outside the box theory, but I still like to have a framework of familiarity. Tom me, anyways, lacking a structure and familiar pattern means time wasted trying a ton of wrong things before getting to something that does work. The circle of 5ths provides a good framework for this. You can even highlight the notes that correspond to various key changes to indicate what scales go well together. It's been used for hundreds of years now I think. It works. It breaks down when you get into some of the exotic scales, though. I love some of them but I don;t think they would fit into the circle well. in those cases the roman numerals may just be omitted. I guess I was trying to think of a way other than a bland chord list. Breaking a chord down into the root, triad type, and extended quality and not pairing them up for people still gives them an idea of what everything does within the confines of standard music theory, but encourages them to try working that 13th button they rarely use in there. Chords in western music tend to be extremely formulaic. There's a name for everything. it took me a while to figure out what a C#Maj7 9 b11 13 was. But once I understood the pattern, it's like a whole new world of possibilities opened up to me. what if I made it a CSus27 9 #11 13? What would that sound like? Good? Bad? Meh? by putting the chord components in you're not restricted to the "common" chords in that series. You may end up building a chord that would never be actually used but sounds wonderful. I was kind of trying to treat them more like lego bricks with only half the instructions given.

suhr commented 5 years ago

There are many ways to look at things, and it is helpful to know more than one way. For example, you can see chords and chord progressions not only as separate entities, but also as several melodic lines working together. It is called counterpoint and there's a good youtube channel on this topic.

Shadowhenge commented 5 years ago

yeah, I call that chord stacking and Chord slicing. I actually just made a video on the technique in synth music. Essentially what he is doing is taking two or more different instruments and having each play a different note in a chord. That would be a neat tool to have but would have to be separate... kind of a highlight a series of notes and right click and "send to track" where they will be removed from the current instrument (or "copy to track" where they are not) and the notes would appear in the same location on a different track in the song. I could definately get behind that. I will typically play a 13th chord with every other note in one synth voice and the remainder in a different one. the chord doesn't exist individually but the joining of the sounds creates a sound that is otherwise not possible. I have always tried to write my songs so that the arps, leads, pads, chorals, strings, etc... all occupy notes that are different parts of the core chord progression. Sometimes the odd incidental will sneak out in passing and if it sounds good I will leave it. I don;t really understand music written down. I see it as various waves (think like an envelope or function graph) up and down and I make the notes look like that and it works. (why I love linear piano rolls over staff written notation) Once you see it that way you can tell where things are going to clash. (particularly the 2nds and 7ths in a given a scale clashing with the tonic) If you keep the flow lines spaced certain amounts from each other, or right on top of each other in unison, everything sort of works. Unfortunately I can't program so I will never have a music program that displays music the way I intuitively see it, but the piano roll concept for midi is pretty close.

peterrudenko commented 5 years ago

Ok, from what I see in this thread, we might need several tools using different approaches for people to play around with and see what works for them better.

@Shadowhenge, I really like your idea of constructing chords on the fly from multiple elements. Just a quick thought: what if the widget looked like this chort-tool (as you type in your Db maj7 b11 13 chord description, it parses chord symbols and previews the new chord; this approach wouldn't work well in mobile versions though).

Shadowhenge commented 5 years ago

I think that is a good option for people who already know what all the components are as they can likely type it out faster than putting in the individual notes. My only concern would be people who don't know them or want to sample say, the Gm Sus2 add13 inv2 and Gm add13 inv2 back to back. they have to backspace and re-type each time.

How about a "waterfall" of buttons on and off in the same order they would be written in the chord below that. Kind of like a spreadsheet of buttons with all the possible element rows based on position in the chord name.

so,

(excuse the formatting but I did it in sheets real quick. The black box with the V is the toggle for the lower menu expand)

2019-01-17 06_33_24-songwriting quick reference v3 - google sheets

and so on down the list. I think that everything could be crammed into a drop down where, like with my previous example, elements can be clicked on and off, causing the preview to play with each change. It can also be entered manually as you suggest.

The scale can be the first element, displayed along the top in scale order, too, and can simply default select the note for the place selected on the piano roll. again, incidentals greyed out.

Wolf2789 commented 5 years ago

Since I'm not an expert theorist musician, I searched for "how chords are formed", which led me to this wonderful brief explanation videos with examples. https://www.youtube.com/watch?v=TnYMhs5SyHw https://www.youtube.com/watch?v=FggWrME028s

So basically there are few base concepts that I would definitely stick with. But I'd treat them as "presets", not as an actual option for building chords. Here's what I have in mind: Chords builder which basic concept could look like this (shown by e.g. pressing down and holding C key note in editor): https://codepen.io/anon/pen/jdwBVW

This kind of builder gives user the freedom, to choose which keys he wants to form chord of, and also gives non-educated in this topic people predefined options to choose from. I know that this design is kinda wide, but you can always show scrollable window, or maybe make top toggleable buttons scroll horizontally.

Also of course there should be some option for other non-standard chords like inverted ones or suspended 2 or 4.

EDIT

It's basically the same as @Shadowhenge 's proposition. Mine just differs in manner of naming keys in numbered system.

Shadowhenge commented 5 years ago

I have actually calculated out most of the "standard" chords as part of a side project I am working on that uses most of the numbering that those videos discuss.

chord |abbrv|chromatic interval|numbering formula Major |   | 0,4,7 | 1,3,5 Minor | min | 0,3,7 | 1,b3,5 Augmented | aug | 0,4,8 | 1,3,#5 Diminished | dim | 0,3,6 | 1,b3,b5 Suspended 2nd | sus2 | 0,2,7 | 1,2,5 Suspended 4th | sus4 | 0,5,7 | 1,4,5 Major 6th | maj6 | 0,4,7,9 | 1,3,5,6 Minor 6th | min6 | 0,3,7,9 | 1,b3,5,6 Major 7th | maj7 | 0,4,7,11 | 1,3,5,7 Minor 7th | min7 | 0,3,7,10 | 1,b3,5,b7 Minor Major 7th | m maj7 | 0,3,7,11 | 1,b3,5,7 Augmentd 7th | aug 7 | 0,4,8,10 | 1,3,#5,b7 Augmented-major 7th | M7#5 | 0,4,8,11 | 1,3,#5,7 Half-Diminished 7th | m7b5 | 0,3,6,10 | 1,b3,b5,b7 Diminished 7th | dim7 | 0,3,6,9 | 1,b3,b5,bb7 Dominant 7th | dom7 | 0,4,7,10 | 1,3,5,b7 Dominant 7th Suspended 4th | 7sus4 | 0,5,7,10 | 1,4,5,b7 Major 7th Suspended 2nd | M7sus2 | 0,2,7,11 | 1,2,5,7 Major 7th Suspended 2nd | M7sus4 | 0,5,7,11 | 1,4,5,7 Major 9th | maj9 | 0,4,7,11,14 | 1,3,5,7,9 Minor 9th | min9 | 0,3,7,10,14 | 1,b3,5,b7,9 Major 11th | maj11 | 0,4,7,11,14,17 | 1,3,5,7,9,11 Minor 11th | min11 | 0,3,7,10,14,17 | 1,b3,5,b7,9,11 Major 13th | maj13 | 0,4,7,11,14,17,21 | 1,3,5,7,9,11,13 Minor 13th | min13 | 0,3,7,10,14,17,21 | 1,b3,5,b7,9,11,13

That's why I had suggested having a root note selected and a scale (to ensure the chords chosen are in that selected scale, similar to how the Scaler app works from plugin boutique) and then being able to just add the individual components as they can all be mathematically described. You could hit nearly any combination of keys and be able to translate that back to a specific chord name if you know what each component means. The scales simply tell you what main chord type goes in what spot for a progrssion using the roman numeral system.

Here's the full chart I am working on. Eventually I hope to build all of the options into tables such as this and then create a tab that has a tool that can be used similar to scaler or captain chords, but getting a google sheets program to allow dragging and dropping midid may be a bit of a challenge for a non-programmer like myself

https://drive.google.com/open?id=1FefghakYG8o-eGWnjpIWLuPmng8mfBl9Bc5garVBnvE

peterrudenko commented 5 years ago

Thanks for sharing these links, I'd say that "scalar spelling" of chords feels like the right way to go.

The only thing that confuses me is those chord definitions containing scale names (like, major/minor something). What is the user wants to have any kind of leading whole-tone inverse madness, or if, say, someone implements support for microtonal temperaments in future and wants to define microtonal scales and chords?

I'm wondering whether it would make sense to have only scale-agnostic chord definitions, like this: https://github.com/helio-fm/helio-workstation/blob/cd8021ca961aa9bc1a2e6a54cc828a219ff5d8dd/Resources/chords.json#L6-L15

And, actually, I'm already playing with this approach in the develop branch, making another chord tool that is harmonic context aware: chord-tool-2

Shadowhenge commented 5 years ago

That looks great. Can't wait to see how well it works. Personally I would use the chromatics. more chord formulas can be added that way, including the chords that would use out of scale notes. You don't have to deal with #'s or b's that way, and it allows microtonal scales to be added as a function of raw intervals, rather than the 3rds 5ths of a given scale. A doubled microtonal scale would, for instance, not change previously entered notes, merely double all values for the traditional chord on the microtonal scale. 4 degrees of resolution (like a seaboard appears to use) would quadruple all values for the same chords. that doesn't work with scalar spelling easily. I do love the concept of color you have chosen, though.

eNorthug commented 5 years ago

My compliments, Peter, for an impressive piece of engineering. I might be late for the discussion on chords, but anyway ... Here's a theorists suggestion: Instead of grouping chords by their labels, you could have one common chord object with some basic properties. Chord (types) can be arranged in a tree structure rather than grid-like. Chord label (name) would be the output, not the input. The number of resulting chords would be ... large. This approach would also support chord voice leading and scales. Notes grouped into chords, chords paired, pairs forming progressions and keys. The model would work both ways, supporting chord and key recognition. If this is the direction you are heading.

yetoyeto commented 5 years ago

Chord Tool I hope it was okay to post this but this is what Rapid Composer's chord tool looks like. RC, for people like me who write music and play guitar, is overly complicated. Every time I go to use RC I have to refer back to my notes. To me it is just waaaaaaaaaaaaaay overly complicated. I like Helio, I just wish I could click on "suggested chords" and get like minor, minor7 and maj7 etc.

peterrudenko commented 4 years ago

Hi all, just letting you know that version 2.4 adds an experimental chord builder, available in the command palette control.

A bit of a context: this 'command palette' control is inspired by 'goto anywhere' in Sublime Text or 'locator' in QT Creator, and is meant for quick access to things like commands, projects, timeline events, etc. But once I've added that, I couldn't resist the temptation of implementing the chord constructor mode too.

So you just hit '!' and start typing a chord description. It also tries to provide some suggestions, which is something akin to the chord components menu you guys have suggested earlier:

chord-compiler

I've tested it against the examples from this thread, so it should work most of the time, yet it might not handle correctly all the tricky exceptions from the chord name decoding rules, and the suggestions are still not super smart.

That said, it's an experimental thing, so please give it a try and let me know what goes well and what doesn't :)