Extract the root note of a chord ?
Oct 23 2015 | 2:49 pm
Hi ! does anyone know an algorithm or, better, a patch that finds the root note in a chord ?
i am looking to do a patch that generates a bass line based on a chord played on top, if anyone has ideas or know some patches !
- Oct 23 2015 | 3:22 pmas it happens, I made this while teaching a Max class last year:
- Oct 23 2015 | 3:47 pmyou can build that around [minimum]
- Oct 25 2015 | 12:02 amMarcel - your patch is brilliant, thanks so much for sharing that.
- Oct 25 2015 | 4:58 amA much simpler way to obtain the lowest note in a chord:Getting a root note isn't that straightforward, and for most chords there is more than one proper solution.
- Oct 25 2015 | 8:42 amNice patch AK, I had forgotten about the bag object. There's a problem if you start by playing just one note though.And indeed, finding the root of a chord instead of just the lowest note would be an interesting exercise!
- Oct 25 2015 | 9:48 amThank you all, but i am interested in finding the root note. The lowest note is indeed not a problem.i think i might need to reduce the choice to a few combinations of intervals and apply different rules to different combinations. Not as elegant as a global algo, but could be at least working.
- Oct 25 2015 | 10:33 amI would analyse the intervals to find the chord position. Then the root note can be derived. Example for major triads: intervals (4,3) -> root position -> lowest note intervals (3,5) -> 1. inversion -> highest note intervals (5,4) -> 2. inversion -> middle note
- Oct 25 2015 | 1:16 pm@Marcel Yes indeed, it chokes on the first note (or any subsequent single note higher than played before). [prepend list] before [minimum] solves the issue. Thank you for pointing out.@OP Worth looking up: V.J.Manzo's Modal Object Library (http://www.eamir.org/developers/modal-object-library), and PC tools in Bach library (http://bachproject.net).
- Oct 25 2015 | 4:58 pmThanks. Broc, that's the way i'm going. Extract the intervals into a list, then compare with several lists and apply one scenario for each matching list.
- Oct 25 2015 | 9:24 pmif you really want to limit your horizon to traditional chords^^... i would suggest to collect their structure in a table, this seems more appropiate than building a complex expression.look for lowest note, then transpose all members so that the lowest note is"0", then compare the chord with stored presets. (in a second branch you will store and compare the key, i.e. an offset factor between 0 and 11). thats how i am doing it in my processors.0 4 7 4 7 11 7 11 150 3 7 ...
- Oct 26 2015 | 4:32 amThis is not Max-specific, but you might also check out Robert Rowe's book "Machine Musicianship". It presents and explains several algorithms for these types of symbolic listening tasks.
- Oct 26 2015 | 10:13 amI haven't had a chance yet to look at the patches posted here, but I made this Max for Live device that does exactly what you're describing, the way it works is similar to what Roman offered.It relies on a database of chord voicings (there's most definitely a better way to search and append to a database than the way I used, it just wasn't that important for me at the time).I'll admit I thought it would be a much simpler task than it ended up being, having to account for inversions, adding/subtracting of notes etc.