Advertisement
Guest User

Untitled

a guest
Oct 27th, 2010
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.89 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. canales = 2 # Stereo
  4. framerate = 11025
  5. ancho = 16
  6. volumen = 10000 # Para un ancho de canal de 16 bits
  7.  
  8. frecuencia = 300 # Hz
  9. duracion = 2 # Segundos
  10.  
  11. archivo = "salida.wav"
  12.  
  13. def arr2Stream(sample, width):
  14.     stream = ""
  15.     for i in sample: # Por cada frame
  16.         for k in i:  # Y cada canal
  17.             for j in xrange(width):
  18.                 stream += chr(k & 255 ) # Se extrae un byte
  19.                 k >>= 8
  20.  
  21.     return stream
  22.  
  23. def getBase(freq, framerate):
  24.  
  25.     # Si no es una onda plana
  26.     if (freq != 0):
  27.         base = []
  28.  
  29.         # Se obtiene el numero de frames a generar
  30.         frames = int(framerate / abs(freq))
  31.  
  32.         # Y la base de los valores que tomaran
  33.         p = (math.pi * 2) / frames
  34.  
  35.         # Por ultimo se genera la onda sinusoidal entre seno de  0 y 2*Pi
  36.         for i in xrange(frames):
  37.             base.append(math.sin(i * p))
  38.  
  39.     # Si es una onda plana
  40.     else:
  41.         base = [0]
  42.  
  43.     return base
  44.  
  45. # Fija el volumen y los canales
  46. def setVolChan(src, vol, n_can):
  47.     out = []
  48.  
  49.     for i in src:
  50.         n = int(i * vol) # Se aplica el volumen
  51.         out.append([n] * n_can) # Y se replica para otros canales
  52.  
  53.     return out
  54.  
  55. # Extiende la base a todo el tiempo
  56. def mkFrames(base, t, framerate):
  57.         base_flen = len(base) / float(framerate) # Lo que dura la base
  58.  
  59.         n = int(round(t / base_flen)) # Las veces que hay que repetirla
  60.  
  61.         return base * n
  62.  
  63. def genFrames(freq, t, framerate, vol, chan, width):
  64.         s = getBase(freq, framerate)
  65.         s = setVolChan(s, vol, chan)
  66.         s = mkFrames( s, t, framerate)
  67.         return arr2Stream(s, width)
  68.  
  69. import math, wave
  70.  
  71. w = wave.open(archivo, "wb")
  72.  
  73. w.setnchannels(canales)
  74. w.setsampwidth(ancho / 8)
  75. w.setframerate(framerate)
  76.  
  77. w.writeframes(genFrames(frecuencia, duracion, framerate, volumen, canales, ancho / 8))
  78.  
  79. w.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement