2010-11-17 25 views
6

Tôi muốn tạo một loạt tiếng bíp thấp và cao ở những thời điểm cố định. Ví dụ:Làm cách nào để tạo một loạt tiếng bíp cao và thấp bằng Ruby hoặc Python?

  • cao sân bíp ở 150 ms
  • Low-sân bíp tại 151 ms
  • Low-sân bíp ở 200 ms
  • cao sân bíp tại 250 ms

Có cách nào để thực hiện điều này trong Ruby hoặc Python không? Tôi không thực sự quan tâm những gì các mã hóa đầu ra là (.wav, .mp3, .ogg, bất cứ điều gì), nhưng tôi muốn tạo ra một tập tin đầu ra.

+0

Đối với nền tảng những gì? – martineau

Trả lời

4

Dưới đây là một hàm trong Python mà làm cho một tập tin với một làn sóng sin duy nhất:

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

Không mã nhanh nhất ... Nhưng nếu bạn không cần tốc độ, nó sẽ làm việc tốt!

+0

Biến 'data_length' phải là' int', do đó, điều này chính xác hơn: 'data_length = int (frate * seconds) #number of frames', vì' range (datasize) 'hy vọng' datasize' là một số nguyên. – Soumendra

1

Đây là một số trợ giúp dành cho Ruby: Adding Sound to Your Ruby Apps. Để thực sự ghi âm một tiếng bíp từ loa của máy tính đến một wav/mp3 - Tôi không biết nếu đó là có thể.

Đối với một tiếng bíp từ card âm thanh của bạn (không loa), trong trường hợp bạn cần điều đó, chỉ cần sử dụng các mô-đun Win32API mà đi kèm với 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

Hãy thử các Ruby Audio File Library (RAFL). Nó hỗ trợ:

Khi viết một tập tin WAV:

Viết bất kỳ số lượng các kênh truyền hình tại bất kỳ tỷ lệ mẫu Tạo tiếng ồn trắng, tiếng ồn màu hồng và sóng sin tại bất kỳ biên độ hoặc tần số

Dưới đây là GitHub source cho dự án.

1

Python:

Có vẻ như bạn cần mô-đun winsound.

Cụ thể, chức năng:

winsound.Beep(frequency, duration) 

nào làm những gì bạn muốn. Nhưng điều này chỉ dành riêng cho Windows.

Có một gói gọi là beep cho phép bạn thực hiện tương tự trên Linux. Vì vậy, hãy gọi beep bằng cách sử dụng subprocess trong trường hợp bạn muốn có giải pháp dựa trên Linux cho điều này.

+0

Dường như điều này gây ra tiếng bíp, nhưng không khớp với yêu cầu của grautur đối với _ "Tôi muốn tạo tập tin đầu ra" _, đúng không? – Phrogz

+0

@Phrogz: Tôi đã nhận ra điều này sau và sẽ xóa nó nhưng câu trả lời đã giải quyết được vấn đề của mình trong việc tạo ra tiếng bíp khá khéo léo vì vậy tôi quyết định để nó ở lại. – user225312

+0

nó trả lời câu hỏi như được đặt ra trong tiêu đề vì vậy nó là một nửa bên phải. Có thể hữu ích cho một số người dùng Googler ngẫu nhiên vào một ngày nào đó. –

0

Đối với cửa sổ sử dụng: sử dụng đá quý win32-âm thanh

# 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 
Các vấn đề liên quan