Skip to content

Instantly share code, notes, and snippets.

@interstar
Created April 6, 2021 19:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save interstar/22a1b801adcd918afcdfd1e19d127cff to your computer and use it in GitHub Desktop.
Save interstar/22a1b801adcd918afcdfd1e19d127cff to your computer and use it in GitHub Desktop.
More sonic pi chord play
# 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