Advertisement
Guest User

Wave Python Generator

a guest
Jul 18th, 2014
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.80 KB | None | 0 0
  1. import math, wave, array, operator, winsound
  2.  
  3. BPM = 120
  4. BEAT_VALUE = 4
  5.  
  6. NOTES = {'C': 16.35, 'C#': 17.32, 'Db': 17.32, 'D': 18.35,
  7.         'D#': 19.45, 'Eb': 19.45, 'E': 20.60, 'F': 21.83,
  8.         'F#': 23.12, 'Gb': 23.12, 'G': 24.50, 'G#': 25.96,
  9.         'Ab': 25.96, 'A': 27.50, 'A#': 29.14, 'Bb': 29.14,
  10.         'B': 30.87}
  11.  
  12. SAMPLE_RATE = 44100 # standard samples per seconds
  13. CHANNELS = 1 # mono
  14. BYTE_RATE = 2 # 2 bytes, 16 bit
  15. VOLUME = 50 # percent
  16.  
  17. def create_data(d, f):
  18.     duration = d # seconds
  19.     frequency = f # cycles per second
  20.  
  21.     data = array.array('h') # signed short integer
  22.    
  23.     samples_per_cycle = int(SAMPLE_RATE / frequency)
  24.     number_samples = int(SAMPLE_RATE * duration)
  25.  
  26.     for i in range(number_samples):
  27.         sample = 32767 * float(VOLUME) / 100
  28.         sample *= math.sin(math.pi * 2 * (i % samples_per_cycle) / samples_per_cycle)
  29.         data.append(int(sample))
  30.  
  31.     return data
  32.  
  33. def write_wave(data, duration):
  34.     w = wave.open('output.wav', 'w')
  35.     w.setparams((CHANNELS, BYTE_RATE, SAMPLE_RATE, SAMPLE_RATE * duration, "NONE", "Uncompressed"))
  36.     w.writeframes(data.tostring())
  37.     w.close()
  38.  
  39. def getFreq(note, octave):
  40.     return NOTES[note] * (2**octave)
  41.  
  42. def getTime(beat, multiplyer = 1):
  43.     return (60/BPM) * (1/beat) * BEAT_VALUE * multiplyer
  44.  
  45. if __name__ == '__main__':
  46.     data = array.array('h')
  47.     data2 = array.array('h')
  48.     data3 = array.array('h')
  49.  
  50.     data.extend(create_data(getTime(1), getFreq('C', 4)))
  51.     data2.extend(create_data(getTime(1), getFreq('Bb', 4)))
  52.     data3.extend(create_data(getTime(1), getFreq('G', 4)))
  53.  
  54.     for i in range(len(data)):
  55.         data[i] += data2[i]
  56.         data[i] += data3[i]
  57.  
  58.     write_wave(data, int(len(data)/SAMPLE_RATE))
  59.     winsound.PlaySound('output.wav', winsound.SND_FILENAME)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement