Skip to content

Instantly share code, notes, and snippets.

@sykire
Last active December 19, 2015 13:29
Show Gist options
  • Save sykire/5962669 to your computer and use it in GitHub Desktop.
Save sykire/5962669 to your computer and use it in GitHub Desktop.
from __future__ import division
from pygame import mixer
from pygame import sndarray
import pygame
import numpy as np
class Wave(object):
"""Se operan entre ellas y pueden generar sonido"""
def __init__(self, frequency, sampling=44100, buffersize=512):
super(Wave, self).__init__()
self.current_pos = 0
self.period_speed = frequency / sampling
self.sampling = sampling
self._frequency = frequency
self.buffersize = buffersize
@property
def frequency(self):
return self._frequency
@frequency.setter
def frequency(self, value):
self._frequency = value
self.period_speed = self._frequency / self.sampling
def __iter__(self):
return self
def next(self):
buffered = [x * self.period_speed
for x in range(self.buffersize)]
buffered = (np.array(buffered) + self.current_pos) % 1
print buffered[-1]
self.current_pos = (buffered[-1] + self.period_speed) % 1
return np.array(buffered)
class SineWave(Wave):
"""docstring for SineWave"""
def __init__(self, **kwargs):
super(SineWave, self).__init__(**kwargs)
self.wavegenerator = self.sinGen
def sinGen(self, arr):
return np.sin(2 * np.pi * arr)
class Sintetizador(object):
"""docstring for Sintetizador"""
def __init__(self, frequency=22050, size=-16,
channels=2, buff=512, titulo="None",
master_volume=32767):
super(Sintetizador, self).__init__()
self.frequency = frequency
self.size = size
self.channels = channels
self.buffer = buff
self.titulo = titulo
self.master_volume = master_volume
self.wave = SineWave(frequency=440)
def run(self):
self.END_MUSIC_EVENT = pygame.USEREVENT + 0
pygame.mixer.init(frequency=self.frequency,
size=self.size,
channels=self.channels,
buffer=self.buffer)
pygame.init()
pygame.display.set_mode((640, 480))
pygame.display.set_caption(self.titulo)
self.clock = pygame.time.Clock()
self.channel = mixer.Channel(0)
self.channel.set_endevent(self.END_MUSIC_EVENT)
sonido = self.makesound(self.wave.next())
self.channel.queue(sonido)
self.channel.queue(sonido)
return self.mainloop()
def makesound(self, arr):
scaled = np.int16(arr / np.max(np.abs(arr)) * self.master_volume)
sonido = sndarray.make_sound(scaled)
return sonido
def mainloop(self):
while True:
for event in pygame.event.get():
if event.type == self.END_MUSIC_EVENT and event.code == 0:
sonido = self.makesound(self.wave.next())
self.channel.queue(sonido)
if event.type is pygame.KEYDOWN:
keyname = pygame.key.name(event.key)
if event.key == pygame.K_ESCAPE:
return 0
if keyname == 'left':
self.wave.frequency -= 100
if keyname == 'right':
self.wave.frequency += 100
self.loop()
pygame.display.flip()
return 0
def loop(self):
pass
# if not self.channel.get_busy():
# sonido = self.makesound(self.wave.next())
# self.channel.queue(sonido)
if __name__ == '__main__':
sint = Sintetizador(channels=1, buff=512)
sint.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment