Created
April 6, 2021 19:16
-
-
Save interstar/22a1b801adcd918afcdfd1e19d127cff to your computer and use it in GitHub Desktop.
More sonic pi chord play
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MIDI Chord generation | |
# Now with modal interchange, secondary dominants & inversions | |
# See https://www.youtube.com/watch?v=3yryQbRgsGo | |
define :oneChord do | tonic, mode, deg | | |
majorKeyTriads = [:M,:m,:m,:M,:M,:m,:dim] | |
minorKeyTriads = [:m,:dim,:M,:m,:m,:M,:M] | |
majorKey7s = [:M7,:m7,:m7,:M7,:dom7,:m7,:halfdiminished] | |
minorKey7s = [:m7,:halfdiminished,:M7,:m7,:m7,:M7,:dom7] | |
# First test if deg is actually an array. | |
# Because if it is, this is a more complex chord item | |
if deg.class == Array then | |
# Representation here is [chord-deg, inversion] | |
# chord-deg is understood as degree to calculate chord, | |
# inversion is 1 (first inversion), 2 (2nd inversion), | |
# -1 (first inversion and drop an octave | |
# -2 (second inversion and drop an octave) | |
t,m,c = oneChord(tonic,mode,deg[0]) | |
case deg[1] | |
when 0 | |
newChord = c | |
when 1 | |
newChord = c[1..10]+[c[0]+12] | |
when 2 | |
newChord = c[2..10]+[c[0]+12]+[c[1]+12] | |
when 3 | |
newChord = c[3..10]+[c[0]+12]+[c[1]+12]+[c[2]+12] | |
when -1 | |
newChord = (c[1..10]+[c[0]+12]).map {|n| n-12 } | |
when -2 | |
newChord = (c[2..10]+[c[0]+12]+[c[1]+12]).map {|n| n - 12} | |
when -3 | |
newChord = (c[3..10]+[c[0]+12]+[c[1]+12]+[c[2]+12]).map {|n| n - 12} | |
else | |
newChord = c | |
end | |
return [t,m,newChord] | |
end | |
# Modal interchange (negative numbers major <-> minor) | |
if deg < 0 then | |
return oneChord(tonic,(mode=="major") ? "minor" : "major",-deg) | |
end | |
case deg | |
when 1..7 # Simple Triads | |
root = degree(deg,tonic,mode) | |
lookup = (mode == "major") ? majorKeyTriads : minorKeyTriads | |
theChord = chord(root,lookup[deg-1]) | |
when 71..77 # Seventh Chords | |
deg = deg - 70 | |
root = degree(deg,tonic,mode) | |
lookup = (mode == "major") ? majorKey7s : minorKey7s | |
theChord = chord(root,lookup[deg-1]) | |
when 21..27 # Secondary dominants | |
deg = deg - 20 | |
original_root = degree(deg,tonic,mode) | |
root = degree(5,original_root,mode) | |
theChord = chord(root,:dom7) | |
tonic = root | |
end | |
return [tonic,mode,theChord] | |
end | |
define :chordSeq do | tonic, mode, degs | | |
cs = [] | |
degs.each { | deg | | |
xs = oneChord(tonic,mode,deg) | |
cs.append(xs) | |
} | |
cs | |
end | |
use_bpm 96 | |
with_fx :reverb do | |
with_synth :piano do | |
c = [] | |
tonic = :C3 | |
mode = "major" | |
live_loop :piano do | |
cs0 = chordSeq(:C4,"major", [1,[6,-1],[4,2],5]) | |
cs1 = chordSeq(:D3,"minor",[1,76,4,75, 5,7,74,5, | |
1,76,4,75, [5,1],7,74,1]) | |
css1 = [4] | |
cs2 = chordSeq(:C3,"major",[1,24,4,26,6,25,[5,1],21]) | |
cs3 = chordSeq(:Fs3,"major",[ | |
71,6,23,73, | |
4,-4, 75, 75, | |
-76, -73, 1, 1 | |
]) | |
cs4 = chordSeq(:C4,"minor",[ | |
71,6,23,73, | |
-4,4, 6, 7, | |
72, -21, 6, 1 | |
]) | |
cs5 = chordSeq(:E3,"minor",[71,77,76,75, 3,24,74,75,76]) | |
css5 = [4,4,4,4, 4,4,4,2,2] | |
cs6 = [cs1,cs1,cs3,cs3,cs4,cs4].flatten(1) | |
cs6.each {| xs | | |
tonic,mode,c = xs | |
play c, amp: 0.8, decay: 2 | |
play c[0]-12, amp: 0.2, decay: 2 | |
sleep css1.tick(:tt) | |
} | |
end | |
with_synth :pluck do | |
live_loop :p2 do | |
v = 0.5 | |
dec = 0.2 | |
sus = 0.1 | |
rel = 0.1 | |
sleep 0.5 | |
oct = 0 | |
oct2 = 12 | |
n = c.choose + oct | |
play n, amp: v, decay: dec, sustain: sus, release: rel | |
sleep 0.5 | |
play n, amp: v, decay: dec, sustain: sus, release: rel | |
sleep 0.5 | |
n = c.choose+oct2 | |
play n, amp: v, decay: dec, sustain: sus, release: rel | |
sleep 0.5 | |
n = scale(tonic,mode).choose+oct2 | |
n = c.choose+oct2 | |
play n, amp: v, decay: dec, sustain: sus, release: rel | |
sleep 0.5 | |
end | |
end | |
end | |
end | |
live_loop :drums do | |
sample :bd_808 | |
sleep 1 | |
sample :drum_snare_hard, amp: 0.3 | |
sleep 1 | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment