我从未使用过实时音频功能。我想知道是否有 ruby 库可以让我创建类似吉他调音器的东西。
问问题
1179 次
1 回答
4
有两个正交任务:1)读取音频,2)处理它。要获得音频,您可以检查ruby-audio,但老实说,我从未使用过它,而且它的文档似乎很少。就我个人而言,我会求助于您的操作系统提供的任何东西;例如在 GNU/Linux 中,我们有方便的工具,比如bplay。第二个问题是如何计算音频的 FFT,使用FFTW3应该很容易。
这是一个快速而肮脏的示例,它从标准输入(16 位,单声道)获取 FFT 的峰值点:
require 'rubygems'
require 'fftw3'
module Tuner
def self.peaks(input_channel, samplerate, window_size)
Enumerator.new do |enum|
loop do
data = input_channel.read(window_size).unpack("s*")
na = NArray.to_na(data)
fft = FFTW3.fft(na).to_a[0, window_size/2]
max_n = fft.map(&:abs).each_with_index.drop(1).max[1]
enum.yield(max_n.to_f * samplerate / window_size)
end
end
end
end
if __FILE__ == $0
Tuner.peaks(STDIN, 8000, 1024).each { |f| puts f }
end
被调用,例如:
$ brec -s 8000 -b 16 | ruby tuner.rb
于 2010-12-22T18:25:54.160 回答