Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- canales = 2 # Stereo
- framerate = 11025
- ancho = 16
- volumen = 10000 # Para un ancho de canal de 16 bits
- frecuencia = 300 # Hz
- duracion = 2 # Segundos
- archivo = "salida.wav"
- def arr2Stream(sample, width):
- stream = ""
- for i in sample: # Por cada frame
- for k in i: # Y cada canal
- for j in xrange(width):
- stream += chr(k & 255 ) # Se extrae un byte
- k >>= 8
- return stream
- def getBase(freq, framerate):
- # Si no es una onda plana
- if (freq != 0):
- base = []
- # Se obtiene el numero de frames a generar
- frames = int(framerate / abs(freq))
- # Y la base de los valores que tomaran
- p = (math.pi * 2) / frames
- # Por ultimo se genera la onda sinusoidal entre seno de 0 y 2*Pi
- for i in xrange(frames):
- base.append(math.sin(i * p))
- # Si es una onda plana
- else:
- base = [0]
- return base
- # Fija el volumen y los canales
- def setVolChan(src, vol, n_can):
- out = []
- for i in src:
- n = int(i * vol) # Se aplica el volumen
- out.append([n] * n_can) # Y se replica para otros canales
- return out
- # Extiende la base a todo el tiempo
- def mkFrames(base, t, framerate):
- base_flen = len(base) / float(framerate) # Lo que dura la base
- n = int(round(t / base_flen)) # Las veces que hay que repetirla
- return base * n
- def genFrames(freq, t, framerate, vol, chan, width):
- s = getBase(freq, framerate)
- s = setVolChan(s, vol, chan)
- s = mkFrames( s, t, framerate)
- return arr2Stream(s, width)
- import math, wave
- w = wave.open(archivo, "wb")
- w.setnchannels(canales)
- w.setsampwidth(ancho / 8)
- w.setframerate(framerate)
- w.writeframes(genFrames(frecuencia, duracion, framerate, volumen, canales, ancho / 8))
- w.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement