Building chords from scales

Hi! Is there a way to get chords built on a particular scale by specifying the degree? I'm thinking something like the chord_degree function in Sonic Pi that takes degree, root note, scale and number of notes and returns a list of midi notes:

(chord_degree :i, :c4, :major, 3)
> 60, 64, 67

(chord_degree :ii, :c4, :major, 3)
> 62, 65, 69

(chord_degree :vii, :c4, :major, 3)
> 71, 74, 77

Can I achieve something similar in Tidal? Maybe composing "scale" with some other function?

Hi, yes you can do it in the mini-notation, e.g.
n "c4'maj'3i"

the first bit is the note and octave, then chord, then number of notes and the degree. I just noticed that degree only accepts a succession of is, I'll make a note to fix that..

There: https://github.com/tidalcycles/Tidal/issues/699

Thank you, that's exactly what I was looking for.

After further inspection I realized that adding degrees in the mini-notation does something different from what I expected. The Sonic Pi chord_degree I was referring to actually returns the chord built on the specific scale degree, picking notes from the original scale but respecting the intervals, thus giving you the classic chord progressions. For the C major scale that would be:

I    ii   iii  IV   V    vi   vii(diminished)
Cmaj Dmin Emin Fmaj Gmaj Amin Bdim

For example:

(chord_degree :ii, :c4, :major, 3)
# 62, 65, 69 -> D minor (degree ii of the C major scale)

(chord_degree :vii, :c4, :major, 3)
# 71, 74, 77 -> B diminished (degree vii(dim) of the C major scale)

Both these chords (Dmin and Bdim) fit in the C tonality and are built on the C scale.
What Tidal does instead I think is looking at the degree specified, picking the notes that compose the original chord, applying an offset and adding the same notes on top from an octave above. For example:

d1 $ arpg $ n "c'maj'4ii" # sound "superpiano"
-- same as:
d1 $ arpg $ n "[g5,c6,e6,g6]" # sound "superpiano"

d1 $ arpg $ n "c'maj'4iiiiiii" # sound "superpiano"
-- same as:
d1 $ arpg $ n "[e7,g7,c8,e8]" # sound "superpiano"

If I'm not mistaken these are all C chord inversions, but my knowledge of musical theory is not so good, I might be wrong :slightly_smiling_face:

You're correct, that notation is for inversions, not referencing scale degrees

This is an interesting problem, you could build triads using mini notation, then describe the interval change:

d1 $ n (scale "ionian" "[0,2,4]") |+ n "<0 1 2 3 4 5 6>" # s "superpiano" 

That should play the triads (built in the scale section), with the degree of the scale described as n - 1 after the |+

Not intuitive relative to normal music notation, but at the very least trying to describe the intended outcome to @yaxu

1 Like

@cleary I came to a similar solution, maybe a bit more "intuitive":

-- degree IV of the D major scale:
d1 $ n (scale "major" ("[-1,1,3]" + "4") + "d5") # s "superpiano"

-- simple progression (I IV V ii) in D major:
d1 $ slow 2 $ n (scale "major" ("[-1,1,3]" + "1 4 5 2") + "d5") # s "superpiano"

-- same as:
d1 $ slow 2 $ n "d5'maj'3 g5'maj'3 a5'maj'3 e5'min'3" # s "superpiano"

-- simple progression (I III v VII) in E minor:
d1 $ slow 2 $ n (scale "minor" ("[-1,1,3]" + "1 3 5 7") + "e5") # s "superpiano"

-- same as:
d1 $ slow 2 $ n "e5'min'3 g5'maj'3 b5'min'3 d6'maj'3" # s "superpiano"

It would be nice to have a dedicated function that could take also roman numbers for the degrees and a chord type (e.g. "maj" instead of "[-1,1,3]") but I'm really a beginner at Haskell :roll_eyes:

7 Likes

Cross linking:

1 Like

Cross linking