How do I create a series of high- and low-pitch be

2020-07-13 07:58发布

I want to create a series of a low- and high-pitch beeps at fixed times. For example:

  • High-pitch beep at 150 ms
  • Low-pitch beep at 151 ms
  • Low-pitch beep at 200 ms
  • High-pitch beep at 250 ms

Is there a way to do this in Ruby or Python? I don't really care what the output encoding is (.wav, .mp3, .ogg, whatever), but I do want to create an output file.

标签: python ruby
5条回答
我只想做你的唯一
2楼-- · 2020-07-13 08:35

Python:

Looks like you need the winsound module.

Specifically, the function:

winsound.Beep(frequency, duration)

Which does what you want. But this is specific to Windows only.

There is a package called beep that allows you to do the same on Linux. So call beep using subprocess in case you want to have a Linux based solution to this.

查看更多
放荡不羁爱自由
3楼-- · 2020-07-13 08:40

Here's some help for Ruby: Adding Sound to Your Ruby Apps. For actually recording a beep from the pc's speaker to a wav/mp3 -- I don't know if that's possible.

For a beep from your sound card (not speaker), in case you ever need that, simply use the Win32API module that comes with 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)
查看更多
家丑人穷心不美
4楼-- · 2020-07-13 08:41

Here's a function in Python that makes a file with a single sine wave:

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

Not the fastest code...But if you don't need speed, it will work fine!

查看更多
甜甜的少女心
5楼-- · 2020-07-13 08:51

For windows users: use the gem win32-sound

# 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
查看更多
一纸荒年 Trace。
6楼-- · 2020-07-13 08:54

Try out the Ruby Audio File Library (RAFL). It supports:

When writing a WAV file:

Write any number of channels at any sample rate Generate white noise, pink noise and sine waves at any amplitude or frequency

Here's the GitHub source for the project.

查看更多
登录 后发表回答