I’ve been fiddling with the notion of adding sharps to scales, and playing melodies with the same scale degrees across scales. So, aeolian (minor) would shift to dorian, then mixolydian, then ionian (major), then lydian, then locrian a half step up, then phrygian, then aeolian, and so on.
Here’s a little piece I made:
define :rowstocolumns do |*thesearrays|
results = []
thesearrays.each_with_index do |thisarray, j|
thisarray.each_with_index do |thisitem, i|
(results[i] ||= [])[j] = thisitem
end #each thisitem
end #each thisarray
results #return value
end #define rowstocolumns
define :debugprint do |label, value|
puts (label || "").to_s + (value || "").to_s
end
whole = 4.0
half =2.0
quarter =1.0
eighth =0.5
sixteenth =0.25
dotted =1.5
triplet =2.0 / 3
scales = [:aeolian, :dorian, :mixolydian, :ionian, :lydian, :locrian, :phrygian].ring
pentatonicsperscale = {:ionian=>[1, 2, 3, 5, 6], :dorian=>[1, 2, 4, 5, 7], :phrygian=>[1, 3, 4, 6, 7], :lydian=>[2, 3, 5, 6, 7], :mixolydian=>[2, 4, 5, 6, 1], :aeolian=>[3, 4, 5, 7, 1], :locrian=>[3, 4, 6, 7, 2]}
melodynotes = [1, 3, 5, 4, 5, 6, 7, 5, 3, 2, 5]
melodytimes = [eighth * dotted, eighth, eighth * dotted, eighth * dotted, eighth * dotted, eighth, eighth * dotted, eighth * dotted, eighth, eighth, quarter * dotted].ring
melodies = rowstocolumns melodynotes, melodytimes
debugprint "melodies ", melodies
chordnotes = [[1, 3, 5], [1, 4, 6], [1, 3, 5], [2, 4, 7]]
chordtimes = [half, half, half, half]
chords = rowstocolumns chordnotes, chordtimes
debugprint "chords: " , chords
bassnotes = [1, 1, 4, 4, 1, 1, 5, 5]
basstimes = [quarter * dotted, eighth, quarter * dotted, eighth, quarter * dotted, eighth, quarter * dotted, eighth]
bass = rowstocolumns bassnotes, basstimes
debugprint "bassnotes: ", bassnotes
debugprint "basstimes: ", basstimes
debugprint "bass: ", bass
pentatonics = {:ionian=>[1, 2, 3, 5, 6], :dorian=>[1, 2, 4, 5, 7], :phrygian=>[1, 3, 4, 6, 7], :lydian=>[2, 3, 5, 6, 7], :mixolydian=>[2, 4, 5, 6, 1], :aeolian=>[3, 4, 5, 7, 1], :locrian=>[3, 4, 6, 7, 2]}
melodylength = whole * 2
keysignature = :c4
(0..16).each do
thisscale = scales.tick
if thisscale == :locrian
keysignature += 1
end #if time to modulate
debugprint "keysignature: ", keysignature
debugprint "current scale: ", thisscale
with_synth :hollow do
in_thread do
use_synth_defaults amp: 2
melodies.each do |thisnote|
debugprint "thisnote: ", thisnote
play degree thisnote[0], keysignature, thisscale
sleep thisnote[1]
end #each note
use_synth_defaults amp: 1
end #thread
end #with_synth
with_synth :winwood_lead do
in_thread do
use_merged_synth_defaults cutoff: 60
chords.each do |thischord|
debugprint "thischord: ", thischord
debugprint "thischord[0]: ", thischord[0]
debugprint "thischord[1]: ", thischord[1]
thischord[0].each do |thisnote|
debugprint "thisnote: ", thisnote
play degree thisnote, keysignature, thisscale
end #each note in chord
sleep thischord[1]
end #this chord'
use_merged_synth_defaults cutoff: 110
end #in_thread
end #with_synth
with_synth :bass_foundation do
in_thread do
bass.each do |thisnote|
debugprint "thisnote: ", thisnote
play degree thisnote[0], keysignature - 36, thisscale
sleep thisnote[1]
end #each note
end #thread
end #with_synth
with_synth :kalimba do
in_thread do
use_synth_defaults amp: 5
thispent = pentatonics[thisscale].sort.ring.reflect.drop_last.to_a
4.times do
thispent.each do |thisnote|
debugprint "thisnote: ", thisnote
play degree thisnote, keysignature + 24, thisscale
sleep sixteenth
end #each note
end
use_synth_defaults amp: 1
end #thread
end #with_synth
sleep melodylength
end #(0..9).each
Let me know what you think!