2010-11-17 7 views
6

Desidero creare una serie di segnali acustici a bassa e alta tonalità a orari prestabiliti. Ad esempio:Come posso creare una serie di segnali acustici di tonalità alta e bassa utilizzando Ruby o Python?

  • -alto campo acustico a 150 ms
  • Low-passo beep a 151 ms
  • Low-passo beep a 200 ms
  • alta passo beep a 250 ms

C'è un modo per farlo in Ruby o Python? Non mi interessa davvero quale sia la codifica dell'output (.wav, .mp3, .ogg, qualunque), ma voglio creare un file di output.

+0

Per quale piattaforma? – martineau

risposta

4

Ecco una funzione in Python che rende un file con una singola onda sinusoidale:

# 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) 

non il codice più veloce ... Ma se non hai bisogno di velocità, che funzionerà bene!

+0

La variabile 'data_length' dovrebbe essere un' int', quindi questo è più corretto: 'data_length = int (frate * seconds) #number of frames', come' range (datasize) 'si aspetta 'datasize' per essere un numero intero. – Soumendra

1

Ecco alcuni aiuti per Ruby: Adding Sound to Your Ruby Apps. Per registrare effettivamente un segnale acustico dall'altoparlante del pc a un wav/mp3 - non so se è possibile.

Per un bip dalla scheda audio (non altoparlante), nel caso in cui fosse necessario che, è sufficiente utilizzare il modulo Win32API che viene fornito 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

Prova il Ruby Audio File Library (Rafl). Supporta:

Quando si scrive un file WAV:

scrivere qualsiasi numero di canali in qualsiasi frequenza di campionamento generare rumore bianco, rumore rosa e onde sinusoidali in qualsiasi ampiezza o frequenza

Ecco il GitHub source per il progetto.

1

Python:

Sembra che è necessario il modulo winsound.

In particolare, la funzione:

winsound.Beep(frequency, duration) 

che fa quello che si vuole. Ma questo è specifico solo per Windows.

C'è un pacchetto chiamato beep che consente di fare lo stesso su Linux. Quindi chiama beep usando subprocess nel caso tu voglia avere una soluzione basata su Linux a questo.

+0

Sembra che questo accada, ma non corrisponde alla richiesta di grautur per _ "Voglio creare un file di output" _, corretto? – Phrogz

+0

@Phrogz: l'ho capito più tardi e stavo per cancellarlo ma la risposta ha risolto il suo problema di generare i beep in modo abbastanza appropriato, così ho deciso di lasciarlo stare. – user225312

+0

risponde alla domanda posta nel titolo quindi è a metà destra. Potrebbe essere utile un giorno a qualche Googler casuale. –

0

per gli utenti Windows: utilizzare la gemma win32-suono

# 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 
Problemi correlati