Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math, wave, array
- duration = 3 # seconds
- freq = 440 # of cycles per second (Hz) (frequency of the sine waves)
- volume = 1. # percent
- data = [] # signed short integer (-32768 to 32767) data
- sampleRate = 44100 # of samples per second (standard)
- numChan = 1 # of channels (1: mono, 2: stereo)
- dataSize = 2 # 2 bytes because of using signed short integers => bit depth = 16
- numSamplesPerCyc = int(sampleRate / freq)
- numSamples = sampleRate * duration
- def num_to_wav(numbers):
- def SPLIT(x): return (x%256, (x/256)+256*(x<0))
- #return ''.join(map(lambda t: chr(t), reduce(lambda x,y: x+y, map(lambda x: SPLIT(x), numbers)))) - INEFFICIENT WAY
- return array.array('h', numbers).tostring()
- def wav_to_num(stream):
- def JOIN(x): return x[0]+256*((x[1]-128)+128*(2*(x[1]<128)-1))
- temp=map(lambda x: ord(x), stream)
- return map(lambda x: JOIN(x), zip(temp[::2],temp[1::2]))
- def write_wav(stream, path):
- #takes a stream of symbols and records a wav
- f = wave.open(path, 'w')
- f.setparams((numChan, dataSize, sampleRate, numSamples, "NONE", "Uncompressed"))
- f.writeframes(stream)
- f.close()
- def read_wav(path):
- #takes a wav and return a stream
- f = wave.open(path, 'r')
- result=f.readframes(-1)
- f.close()
- return result
- def add_lists(lists):
- '''adding multiple lists like vectors'''
- if len(set([len(lists[i]) for i in range(len(lists))]))<>1: raise ValueError('length is not synchronised')
- else: return [sum([x[i] for x in lists]) for i in range(len(lists[0]))]
- def ADSR_env(x):
- if x<0.2: return 5*x
- if x<1: return 1-0.75*(x-0.2)
- if x<2: return 0.4
- return max(0, 0.4-0.4*(x-2.0))
- def instrument(weigths, k=440, sampleRate=44100.):
- s=sum(weigths)
- weigths=[n/s for n in weigths]
- lists=[]
- for j in range(len(weigths)):
- division=[]
- for i in range(numSamples):
- argument=float(i)/sampleRate
- x=weigths[j] * math.sin(math.pi * 2 * argument * ((j+1)*k))
- component=int(-32767 * x * ADSR_env(argument))
- division.append(component)
- lists.append(division)
- return add_lists(lists)
- #I'm adding 3 different waves of 440Hz, 660Hz and 220Hz.
- for n in instrument([5.,4.,3.]): data.append(n)
- write_wav(num_to_wav(data),'trial4.wav')
- from time import*
- t=time()
- a=wav_to_num(read_wav('trial4.wav'))
- print time()-t
- print data==a
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement