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:
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..
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
@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