from pylibpd import *
from struct import unpack
import array
import pygame
import numpy
from os import environ
BUFFERSIZE = 1024
BLOCKSIZE = 64
SCREENSIZE = (640, 480)
environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
screen = pygame.display.set_mode(SCREENSIZE)
m = PdManager(1, 2, pygame.mixer.get_init()[0], 1)
patch = libpd_open_patch('funtest.pd', '.')
print("$0: ", patch)
inbuf = array.array('h', range(BLOCKSIZE))
ch = pygame.mixer.Channel(0)
sounds = [pygame.mixer.Sound(numpy.zeros((BUFFERSIZE, 2), numpy.int16)) for s in range(2)]
samples = [pygame.sndarray.samples(s) for s in sounds]
rectangles = []
rectcolor = (255, 0, 0)
bg = (255, 255, 255)
rectsize = 200
def updatexy(event):
libpd_float('x', float(event.pos[1]) / SCREENSIZE[1])
libpd_float('y', float(event.pos[0]) / SCREENSIZE[0])
libpd_bang('trigger')
rectangles.append([event.pos, 0])
selector = 0
quit = False
while not quit:
if not ch.get_queue():
for x in range(BUFFERSIZE):
if x % BLOCKSIZE == 0:
barray = m.process(inbuf)
outbuf = unpack('h'*(len(barray)//2),barray)
samples[selector][x][0] = outbuf[(x % BLOCKSIZE) * 2]
samples[selector][x][1] = outbuf[(x % BLOCKSIZE) * 2 + 1]
ch.queue(sounds[selector])
selector = int(not selector)
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == 27:
quit = True
if event.type == pygame.MOUSEBUTTONDOWN:
updatexy(event)
screen.fill(bg)
delrects = []
for r in rectangles:
dr = pygame.Rect(r[0][0], r[0][1], r[1], r[1])
dr.center = r[0]
cv = 255 * (rectsize - r[1]) / rectsize
pygame.draw.rect(screen, (255, 255 - cv, 255 - cv), dr, 2)
r[1] += 1
if r[1] >= rectsize:
delrects.append(r)
for r in delrects:
rectangles.remove(r)
pygame.display.flip()
libpd_release()