Last active
December 19, 2015 13:29
-
-
Save sykire/5962669 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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