diff options
author | Anthony Wang | 2023-03-12 13:46:11 -0400 |
---|---|---|
committer | Anthony Wang | 2023-03-12 13:46:11 -0400 |
commit | ba1c702d34ebb9cf7971e165e8e0e96ba1a63c78 (patch) | |
tree | c2fba925229d3b2580d8b2abdffc2e1fc14a0e41 | |
parent | ab835f8e189dcd3ccdf7ae014369d7ee4ab591fb (diff) |
keyboard script using Python sounddevice
-rw-r--r-- | keyboard.py | 51 | ||||
-rw-r--r-- | music.py | 2 |
2 files changed, 52 insertions, 1 deletions
diff --git a/keyboard.py b/keyboard.py new file mode 100644 index 0000000..301c950 --- /dev/null +++ b/keyboard.py @@ -0,0 +1,51 @@ +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]) @@ -327,4 +327,4 @@ def at(t): # Print out music encoded in s16 to standard output for i in range(0 * bitrate, 84 * bitrate): - sys.stdout.buffer.write(struct.pack("i", at(i / bitrate))) + sys.stdout.buffer.write(struct.pack('i', at(i / bitrate))) |