Skip to content

Instantly share code, notes, and snippets.

@HajimeKawahara
Created January 4, 2016 14:13
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 HajimeKawahara/3e80ad70a2df600fb854 to your computer and use it in GitHub Desktop.
Save HajimeKawahara/3e80ad70a2df600fb854 to your computer and use it in GitHub Desktop.
generalized Coltrane Changes
#!/usr/bin/python
import argparse
import numpy as np
import sound_driver as sd
import pyaudio
import wave
def generalized_coltrane_change(n,n0,t,nsamp=12):
sg={0:"C",1:"Db",2:"D",3:"Eb",4:"E",5:"F",6:"Gb",7:"G",8:"Ab",9:"A",10:"Bb",11:"B"}
print "GCC: for","n_k=",n,"and","t_k=",t
hg={"":[0,4,7],"Maj":[0,4,7],"Maj7":[0,4,7,11],"7":[0,4,7,10],"m":[0,3,7],"m7":[0,3,7,10],"mb5":[0,3,6,10],"dim":[0,3,6,9]}
L=len(t)
M=len(n)
k=0
a=n0
bseq=[[a]]
cseq=[np.mod(np.array(hg[t[0]])+a,12)]
print sg[a]+t[0],
for i in range(0,nsamp):
for j in range(0,L):
k=k+1
a=np.mod(a+n[np.mod(k,M)],12)
bseq.append([a])
cseq.append(np.mod(np.array(hg[t[np.mod(k,L)]])+a,12))
print sg[a]+t[np.mod(k,L)],
print "\n"
return bseq,cseq
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Generalized Coltrane Changes')
parser.add_argument('-nk', nargs="+", default=[5,3], help='nk',type=int)
parser.add_argument('-tk', nargs="+", default=["","7"], help='tk',type=str)
parser.add_argument('-key', nargs=1, default=[11], help='key',type=int)
parser.add_argument('-o', nargs=1, default=["out.wav"], help='output wave file',type=str)
args = parser.parse_args()
btone=[[0.0,0.0]] #tone for base
ctone=[[0.0,0.1],[0.2,np.pi/3.0],[0.05,np.pi/5.0],[0.01,np.pi/8.0]] #tone for chord
FORMAT = pyaudio.paInt16
VOLUME = 4096
RATE = 44100
#generalized coltrane changes
bseq,cseq=generalized_coltrane_change(args.nk,args.key[0],args.tk)
#play a song
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,channels=1, rate=RATE, output=1)
bline=sd.create_cline(bseq,btone,fA=110.5,vol=3) #base line
cline=sd.create_cline(cseq,ctone,fA=442) #chord line
aline=(cline+bline)*VOLUME #chord+base and volume increase
song=aline.astype(np.int16).tostring()
stream.write(song)
#SAVE AS WAV
wf = wave.open(args.o[0],'wb')
wf.setnchannels(1)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(song))
wf.close()
stream.close()
p.terminate()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment