Created
January 4, 2016 14:13
-
-
Save HajimeKawahara/3e80ad70a2df600fb854 to your computer and use it in GitHub Desktop.
generalized Coltrane Changes
This file contains 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
#!/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