import wave import array ### init values CHANNELS = 2 BIT_RATE = 16 SAMPLE_RATE = 44100 MAX_AMPLITUDE = (2 ** BIT_RATE) / 4 notes = {'c-1': 32.7, 'c#1': 34.6, 'd-1': 36.7, 'd#1': 38.9, 'e-1': 41.2, 'f-1': 43.7, 'f#1': 46.2, 'g-1': 49.0, 'g#1': 51.9, 'a-1': 55.0, 'a#1': 58.3, 'b-1': 61.7, } for note in notes.keys(): for i in range(2, 9): notename = note[:2] + str(i) notes[notename] = notes[note] * (2 ** (i - 1)) ### tone generation code def generate_tone(tonefreq, length, channels): buffersize = int(SAMPLE_RATE * length) * channels * (BIT_RATE / 8) step = float(tonefreq) / float(SAMPLE_RATE) * 2 buf = bytearray(buffersize) amplitude = -MAX_AMPLITUDE bytes_per_sample = BIT_RATE / 8 for i in xrange(0, buffersize, channels * bytes_per_sample): amplitude += step * MAX_AMPLITUDE if amplitude > MAX_AMPLITUDE: amplitude = -MAX_AMPLITUDE for k in range(channels): for o in range(bytes_per_sample): buf[i + k * bytes_per_sample + o] = (int(amplitude) >> o * 8) & 0xFF return buf ### song generation song = ['c-1', 'c-2', 'c-1', 'c-2', 'e-1', 'e-2', 'e-1', 'e-2', 'f-1', 'f-2', 'f-1', 'g#2', 'g#1', 'g#2', 'c-2', 'c-3', ] song_repeat = 4 wav = wave.open('out.wav', 'wb') wav.setnchannels(CHANNELS) wav.setsampwidth(BIT_RATE / 8) wav.setframerate(SAMPLE_RATE) for i in range(song_repeat): for note in song: b = generate_tone(notes[note], 0.27, CHANNELS) wav.writeframes(b) wav.close()