Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math, wave, array, operator, winsound
- BPM = 120
- BEAT_VALUE = 4
- NOTES = {'C': 16.35, 'C#': 17.32, 'Db': 17.32, 'D': 18.35,
- 'D#': 19.45, 'Eb': 19.45, 'E': 20.60, 'F': 21.83,
- 'F#': 23.12, 'Gb': 23.12, 'G': 24.50, 'G#': 25.96,
- 'Ab': 25.96, 'A': 27.50, 'A#': 29.14, 'Bb': 29.14,
- 'B': 30.87}
- SAMPLE_RATE = 44100 # standard samples per seconds
- CHANNELS = 1 # mono
- BYTE_RATE = 2 # 2 bytes, 16 bit
- VOLUME = 50 # percent
- def create_data(d, f):
- duration = d # seconds
- frequency = f # cycles per second
- data = array.array('h') # signed short integer
- samples_per_cycle = int(SAMPLE_RATE / frequency)
- number_samples = int(SAMPLE_RATE * duration)
- for i in range(number_samples):
- sample = 32767 * float(VOLUME) / 100
- sample *= math.sin(math.pi * 2 * (i % samples_per_cycle) / samples_per_cycle)
- data.append(int(sample))
- return data
- def write_wave(data, duration):
- w = wave.open('output.wav', 'w')
- w.setparams((CHANNELS, BYTE_RATE, SAMPLE_RATE, SAMPLE_RATE * duration, "NONE", "Uncompressed"))
- w.writeframes(data.tostring())
- w.close()
- def getFreq(note, octave):
- return NOTES[note] * (2**octave)
- def getTime(beat, multiplyer = 1):
- return (60/BPM) * (1/beat) * BEAT_VALUE * multiplyer
- if __name__ == '__main__':
- data = array.array('h')
- data2 = array.array('h')
- data3 = array.array('h')
- data.extend(create_data(getTime(1), getFreq('C', 4)))
- data2.extend(create_data(getTime(1), getFreq('Bb', 4)))
- data3.extend(create_data(getTime(1), getFreq('G', 4)))
- for i in range(len(data)):
- data[i] += data2[i]
- data[i] += data3[i]
- write_wave(data, int(len(data)/SAMPLE_RATE))
- winsound.PlaySound('output.wav', winsound.SND_FILENAME)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement