加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

吉他调音器与Ruby

发布时间:2020-12-17 02:28:06 所属栏目:百科 来源:网络整理
导读:我从未使用过实时音频功能. 我想知道是否有ruby库可以让我创建类似吉他调音器的东西. 解决方法 有两个正交的任务:1)读取音频,2)处理它.要获得音频,你可以检查 ruby-audio,说实话,我从来没有使用它,它的文档似乎很少.就个人而言,我会诉诸你的操作系统提供的
我从未使用过实时音频功能.
我想知道是否有ruby库可以让我创建类似吉他调音器的东西.

解决方法

有两个正交的任务:1)读取音频,2)处理它.要获得音频,你可以检查 ruby-audio,说实话,我从来没有使用它,它的文档似乎很少.就个人而言,我会诉诸你的操作系统提供的任何东西;例如在GNU / Linux中,我们有像 bplay这样的便利工具.第二个问题是如何计算音频的FFT,这应该很容易用 FFTW3.

这是一个快速而肮脏的例子,它从stdin(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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读