import math import sounddevice as sd import os import sys # Number of times to sample each second bitrate = 44100 def freq(octave, step): """ Returns the frequency of a note """ return 55 * 2 ** (octave + step / 12 - 1) def tone(f, t): """ Returns the intensity of a tone of frequency f sampled at time t """ # https://dsp.stackexchange.com/questions/46598/mathematical-equation-for-the-sound-wave-that-a-piano-makes # https://youtu.be/ogFAHvYatWs?t=254 # return int(2**13*(1+square(t, 440*2**(math.floor(5*t)/12)))) # Y = sum([math.sin(2 * i * math.pi * t * f) * math.exp(-0.0004 * 2 * math.pi * t * f) / 2**i for i in range(1, 4)]) # Y += Y * Y * Y # Y *= 1 + 16 * t * math.exp(-6 * t) w = 2 * math.pi * f Y = 0.6 * math.sin(w * t) * math.exp(-0.001 * w * t) Y += 0.2 * math.sin(2 * w * t) * math.exp(-0.001 * w * t) Y += 0.05 * math.sin(3 * w * t) * math.exp(-0.001 * w * t) Y += Y * Y * Y Y *= 1 + 16 * t * math.exp(-6 * t) return Y note = [] for i in range(0, 24): note.append([tone(freq(3, i), j / bitrate) / 4 for j in range(0, 3 * bitrate)]) sd.default.samplerate = bitrate print('READY') while True: os.system('stty raw -echo') c = sys.stdin.read(1) os.system('stty -raw echo') x = '`1234567890-~!@#$%^&*()_'.index(c) print(x) sd.play(note[x])