Skip to content

Instantly share code, notes, and snippets.

@nyuichi
Created January 10, 2011 15:51
Show Gist options
  • Save nyuichi/772932 to your computer and use it in GitHub Desktop.
Save nyuichi/772932 to your computer and use it in GitHub Desktop.
Synth
from math import *
import struct
import pyaudio
from multiprocessing import Process, Pipe
import threading
import sys, pygame
start = 0
def play(conn):
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(2),
rate=44100, channels=2, output=True)
def gen(hz, msec):
global start
data = ""
for i in xrange(start, int(44.1*sec)+start):
s = floor(30000*sin(2*pi*hz/44100*i))
data += struct.pack('h', s)
start = i
"""
import operator as op
return reduce(op.add, map(lambda i: struct.pack('h', floor(30000*sin(2*pi*hz/44100*i))), xrange(int(44.1*sec))), "")
"""
return data
dat = ""
while True:
rec = conn.recv()
if rec is None:
stream.close()
p.terminate()
break
level, sec = rec
if len(dat) > 1024*2:
stream.write(dat)
dat = ""
elif level == -1:
zero = struct.pack('h', 0)
dat += zero * int(44.1*sec)
else:
dat += gen(int(440*pow(2, level/12.0)), sec)
def gui():
rec, snd = Pipe()
p = Process(target=play, args=(rec,))
p.start()
pygame.init()
size = width, height = 320, 320
screen = pygame.display.set_mode(size)
d = {}
for i in range(8):
for j in range(8):
d[(i,j)] = 0
last = pygame.time.get_ticks()
while True:
pygame.time.Clock().tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
snd.send(None)
sys.exit()
if pygame.mouse.get_focused():
x, y = pygame.mouse.get_pos()
x /= 40
y /= 40
now = pygame.time.get_ticks()
snd.send((x+y, now-last))
last = now
d[(x,y)] = 45
else:
now = pygame.time.get_ticks()
snd.send((-1, now-last))
last = now
screen.fill((0,0,0))
for x in range(8):
for y in range(8):
if d[(x,y)] > 0:
pygame.draw.rect(screen,(0,0, 255*d[(x,y)]/60), (x*40, y*40, 40, 40))
d[(x,y)] -= 1
for i in range(9):
pygame.draw.line(screen, (255,255,255), [0, 40*i], [320, 40*i])
pygame.draw.line(screen, (255,255,255), [40*i, 0], [40*i, 320])
pygame.display.flip()
gui()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment