2010-11-17 8 views
6

Quiero crear una serie de pitidos de bajo y alto tono en tiempos fijos. Por ejemplo:¿Cómo creo una serie de pitidos de alto y bajo tono usando Ruby o Python?

  • -Tono alto pitido en 150 ms
  • pitido de paso bajo a 151 ms
  • pitido de paso bajo a 200 ms
  • pitido de alto campo en 250 ms

¿Hay alguna manera de hacer esto en Ruby o Python? Realmente no me importa cuál es la codificación de salida (.wav, .mp3, .ogg, lo que sea), pero sí quiero crear un archivo de salida.

+0

Por qué plataforma? – martineau

Respuesta

4

He aquí una función en Python que hace que un archivo con una sola onda sinusoidal:

# based on : www.daniweb.com/code/snippet263775.html 
import math 
import wave 
import struct 

def make_sine(freq=440, datasize=10000, fname="test.wav", framerate=44100.00): 
    amp=8000.0 # amplitude 
    sine_list=[] 
    for x in range(datasize): 
     sine_list.append(math.sin(2*math.pi * freq * (x/frate))) 
    # Open up a wav file 
    wav_file=wave.open(fname,"w") 
    # wav params 
    nchannels = 1 
    sampwidth = 2 
    framerate = int(frate) 
    nframes=datasize 
    comptype= "NONE" 
    compname= "not compressed" 
    wav_file.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname)) 
    #write on file 
    for s in sine_list: 
     wav_file.writeframes(struct.pack('h', int(s*amp/2))) 
    wav_file.close() 

frate = 44100.00 #that's the framerate 
freq=987.0 #that's the frequency, in hertz 
seconds = 3 #seconds of file 
data_length = frate*seconds #number of frames 
fname = "WaveTest2.wav" #name of file 
make_sine(freq, data_length, fname) 

No es el código más rápido ... Pero si no necesita velocidad, no tendrán ningún problema!

+0

La variable 'data_length' debe ser un' int', por lo que es más correcto: 'data_length = int (frate * seconds) #número de marcos', ya que' range (datasize) 'espera que' datasize' sea un entero. – Soumendra

1

Aquí hay un poco de ayuda para Ruby: Adding Sound to Your Ruby Apps. Para realmente grabar un pitido del altavoz de la PC en un wav/mp3, no sé si eso es posible.

Para un pitido desde la tarjeta de sonido (no los altavoces), en caso de que tenga que, sólo tiene que utilizar el módulo Win32API que viene con Ruby:

require 'Win32API' 
Beep = Win32API.new('kernel32', 'Beep', ['I', 'I'], 'I') 
Beep.call(1200,150) 
Beep.call(200,150) 
Beep.call(300,150) 
Beep.call(1400,150) 
2

Pruebe la Ruby Audio File Library (RAFL). Es compatible con:

Al escribir un archivo WAV:

escribir cualquier número de canales en cualquier frecuencia de muestreo generar ruido blanco, ruido rosa y ondas sinusoidales en cualquier amplitud o frecuencia

está aquí el GitHub source para el proyecto.

1

Python:

Parece que necesita el módulo winsound.

En concreto, la función:

winsound.Beep(frequency, duration) 

cual hace lo que quiere. Pero esto es específico de Windows solamente.

Hay un paquete llamado beep que le permite hacer lo mismo en Linux. Llame al beep usando subprocess en caso de que quiera tener una solución basada en Linux para esto.

+0

Parece que esto hace que suene un pitido, pero no coincide con la solicitud de grautur para _ "Sí quiero crear un archivo de salida" _, ¿correcto? – Phrogz

+0

@Phrogz: Me di cuenta de esto más adelante y lo iba a eliminar, pero la respuesta resolvió su problema de generar los pitidos bastante acertadamente así que decidí dejarlo. – user225312

+0

responde a la pregunta tal como se presenta en el título, por lo que es la mitad de la correcta. Podría ser útil para algún Googler aleatorio algún día. –

0

para usuarios de Windows: usar la gema win32-sonido

# gem install win32-sound 

require 'win32/sound' 
include Win32 

Sound.play("SystemAsterisk", Sound::ALIAS) # play system asterisk sound 
Sound.beep(600,200) # play a beep 600 hertz for 200 milliseconds 
Sound.play("trompet.wav") # play a file from disk 
Cuestiones relacionadas