#jsynth module
#moddified by Jared Cacho
#originally written by Tyler Eaves

import wave,math
f=wave.open('result.wav','w')
f.setnchannels(1)
f.setsampwidth(1)
f.setframerate(44100)
f.setcomptype('NONE','Not Compressed')

#This is where the note information is stored.
#Format [['Note',length]]
#Where note is a string containg one of the following notes:
#A,B-,B,C,D-,D,E-,E,F,G-,G
#- Means Flat For sharps just ue the flat of one note higher
#Where length is a number:
#1=Whole Note 2=Half Note 4=Quater Note etc


def length(l):
	return 44100*(1.0/l)
def waves(hz,l):
	a=float(88200.0)/hz
	b=l/(float(88200.0)/(hz))
	return [a,int(b)]
def sixteenbit(x):
	y1=""

	x=x+1
	x=x*128

	x=int(x)
	#y1=chr(x/256)

	#x=x-((x/256)*256)
	return chr(x)
def asin(x):
	x=x*360
	x=(float(x)/180)*3.145


	return math.sin(x)
	 
def render(p,w,l):
	ow =''
	a=0
	for x in range(l[0])[:]:
		a=x
		ow=ow+sixteenbit((asin(float(x)/l[0])+asin(float(x)/(l[0]/2.0))+asin(float(x)/(l[0]/4.0)))/3.0)
	f.writeframesraw((ow*l[1])+(sixteenbit(0)*1000))

def pitchhz(note):
	if note=="A5":
		return 440.0
	if note=="A6":
		return 880.0
	if note=="A7":
		return 1760.0
	if note=="A8":
		return 3520.0
	if note=="A9":
		return 7040.0
	if note=="A10":
		return 14080.0
	if note=="B-5":
		return 466.164
	if note=="B-6":
		return 932.328
	if note=="B-7":
		return 1864.656
	if note=="B-8":
		return 3729.312
	if note=="B-9":
		return 7458.624
	if note=="B-10":
		return 14917.248
	if note=="B5":
		return 493.883
	if note=="B6":
		return 987.766
	if note=="B7":
		return 1975.532
	if note=="B8":
		return 3951.064
	if note=="B9":
		return 7902.128
	if note=="B10":
		return 15804.256
	if note=="C4":
		return 261.6255
	if note=="C5":
		return 523.251
	if note=="C6":
		return 1046.502
	if note=="C7":
		return 2093.004
	if note=="C8":
		return 4186.008
	if note=="C9":
		return 8372.016
	if note=="C10":
		return 16744.032
	if note=="D-4":
		return 277.1825
	if note=="D-5":
		return 554.365
	if note=="D-6":
		return 1108.73
	if note=="D-7":
		return 2217.46
	if note=="D-8":
		return 4434.92
	if note=="D-9":
		return 8869.84
	if note=="D-10":
		return 17739.68
	if note=="D4":
		return 293.665
	if note=="D5":
		return 587.33
	if note=="D6":
		return 1174.66
	if note=="D7":
		return 2349.32
	if note=="D8":
		return 4698.64
	if note=="D9":
		return 9397.28
	if note=="D10":
		return 18794.56
	if note=="E-4":
		return 311.127
	if note=="E-5":
		return 622.254
	if note=="E-6":
		return 1244.508
	if note=="E-7":
		return 2489.016
	if note=="E-8":
		return 4978.032
	if note=="E-9":
		return 9956.064
	if note=="E-10":
		return 19912.128
	if note=="E4":
		return 329.6275
	if note=="E5":
		return 659.255
	if note=="E6":
		return 1318.51
	if note=="E7":
		return 2637.02
	if note=="E8":
		return 5274.04
	if note=="E9":
		return 10548.08
	if note=="E10":
		return 21096.16
	if note=="F4":
		return 349.228
	if note=="F5":
		return 698.456
	if note=="F6":
		return 1396.912
	if note=="F7":
		return 2793.824
	if note=="F8":
		return 5587.648
	if note=="F9":
		return 11175.296
	if note=="F10":
		return 22350.592
	if note=="G-4":
		return 369.9945
	if note=="G-5":
		return 739.989
	if note=="G-6":
		return 1479.978
	if note=="G-7":
		return 2959.956
	if note=="G-8":
		return 5919.912
	if note=="G-9":
		return 11839.824
	if note=="G-10":
		return 23679.648
	if note=="G4":
		return 391.9955
	if note=="G5":
		return 783.991
	if note=="G6":
		return 1567.982
	if note=="G7":
		return 3135.964
	if note=="G8":
		return 6271.928
	if note=="G9":
		return 12543.856
	if note=="G10":
		return 25087.712
	if note=="A-4":
		return 415.3045
	if note=="A-5":
		return 830.609
	if note=="A-6":
		return 1661.218
	if note=="A-7":
		return 3322.436
	if note=="A-8":
		return 6644.872
	if note=="A-9":
		return 13289.744
	if note=="A-10":
		return 26579.488

def music(song):
	for x in song[:]:
		if x[0]!='R':
			a=pitchhz(x[0])
			b=length(x[1])
			c=waves(a,b)
		if x[0]=='R':
			b=length(x[1])
			b=b/2.0
			f.writeframesraw(sixteenbit(0)*int(b))
		render(a,b,c)
	f.writeframes('')
	f.close()



def tab(value,mus):
	if (value<0):
		return "C4"
	else:
		if (mus == 1):
			if (value>35):
				return "C7"
			else:
				return{
					0 : "C4",
					1 : "D-4",
					2 : "D4",
					3 : "E-4",
					4 : "E4",
					5 : "F4",
					6 : "G-4",
					7 : "G4",
					8 : "A-4",
					9 : "A5",
					10 : "B-5",
					11 : "B5",
					12 : "C5",
					13 : "D-5",
					14 : "D5",
					15 : "E-5",
					16 : "E5",
					17 : "F5",
					18 : "G-5",
					19 : "G5",
					20 : "A-6",
					21 : "A6",
					22 : "B-6",
					23 : "B6",
					24 : "C6",
					25 : "D-6",
					26 : "D6",
					27 : "E-6",
					28 : "E6",
					29 : "F6",
					30 : "G-6",
					31 : "G6",
					32 : "A-6",
					33 : "A7",
					34 : "B-7",
					35 : "B7",
				}[value]
		else:
			if (value>20):
				return "C7"
			else:
				return{
					0 : "C4",
					1 : "D4",
					2 : "E4",
					3 : "F4",
					4 : "G4",
					5 : "A5",
					6 : "B5",
					7 : "C5",
					8 : "D5",
					9 : "E5",
					10 : "F5",
					11 : "G5",
					12 : "A6",
					13 : "B6",
					14 : "C6",
					15 : "D6",
					16 : "E6",
					17 : "F6",
					18 : "G6",
					19 : "A7",
					20 : "B7",
				}[value]
