Advertisement
Guest User

Procedural music with PyAudio and NumPy, improved playback

a guest
Apr 28th, 2011
890
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.35 KB | None | 0 0
  1. import numpy
  2. import encode
  3.  
  4.  
  5. def as_int16(data):
  6.   ''' Return data encoded as signed 16 bit integer
  7.  '''
  8.   data = data.clip(-1, 1)
  9.   return (data * 32767).astype(numpy.int16)
  10.  
  11.  
  12. def as_uint8(data):
  13.   ''' Return data encoded as unsigned 8 bit integer
  14.  '''
  15.   data = (data / 2 + 0.5).clip(0, 1)
  16.   return (data * 255).astype(numpy.uint8)
  17.  
  18.  
  19. def pygame_play(data, rate=44100):
  20.   ''' Send audio array to pygame for playback
  21.  '''
  22.   import pygame
  23.   pygame.mixer.init(rate, -16, 1, 1024)
  24.   sound = pygame.sndarray.numpysnd.make_sound(as_int16(data))
  25.   length = sound.get_length()
  26.   sound.play()
  27.   pygame.time.wait(int(length * 1000))
  28.   pygame.quit()
  29.  
  30.  
  31. def pygame_supported():
  32.   ''' Return True is pygame playback is supported
  33.  '''
  34.   try:
  35.     import pygame
  36.   except:
  37.     return False
  38.   return True
  39.  
  40.  
  41. def oss_play(data, rate=44100):
  42.   ''' Send audio array to oss for playback
  43.  '''
  44.   import ossaudiodev
  45.   audio = ossaudiodev.open('/dev/audio','w')
  46.   formats = audio.getfmts()
  47.   if ossaudiodev.AFMT_S16_LE in formats:
  48.     # Use 16 bit if available
  49.     audio.setfmt(ossaudiodev.AFMT_S16_LE)
  50.     data = as_int16(data)
  51.   elif ossaudiodev.AFMT_U8 in formats:
  52.     # Otherwise use 8 bit
  53.     audio.setfmt(ossaudiodev.AFMT_U8)
  54.     data = as_uint8(data)
  55.   audio.speed(rate)
  56.   while len(data):
  57.     audio.write(data[:1024])
  58.     data = data[1024:]
  59.   audio.flush()
  60.   audio.sync()
  61.   audio.close()
  62.  
  63.  
  64. def oss_supported():
  65.   ''' Return True is oss playback is supported
  66.  '''
  67.   try:
  68.     import ossaudiodev
  69.   except:
  70.     return False
  71.   return True
  72.  
  73.  
  74. def pyaudio_play(data, rate=44100):
  75.   ''' Send audio array to pyaudio for playback
  76.  '''
  77.   import pyaudio
  78.   p = pyaudio.PyAudio()
  79.   stream = p.open(format=pyaudio.paFloat32, channels=1, rate=rate, output=1)
  80.   stream.write(data.astype(numpy.float32).tostring())
  81.   stream.close()
  82.   p.terminate()
  83.  
  84.  
  85. def pyaudio_supported():
  86.   ''' Return True is pyaudio playback is supported
  87.  '''
  88.   try:
  89.     import pyaudio
  90.   except:
  91.     return False
  92.   return True
  93.  
  94.  
  95. def play(data, rate=44100):
  96.   ''' Send audio to first available playback method
  97.  '''
  98.   if pygame_supported():
  99.     return pygame_play(data, rate)
  100.   elif oss_supported():
  101.     return oss_play(data, rate)
  102.   elif pyaudio_supported():
  103.     return pyaudio_play(data, rate)
  104.   else:
  105.     raise Exception("No supported playback method found")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement