【问题标题】:Guitar tuner with RubyRuby 吉他调音器
【发布时间】:2011-05-29 12:53:39
【问题描述】:

我从未使用过实时音频功能。 我想知道是否有 ruby​​ 库可以让我创建类似于吉他调音器的东西。

【问题讨论】:

    标签: ruby audio audio-processing


    【解决方案1】:

    有两个正交任务: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
    

    【讨论】:

    • 请记住,您需要对 FFT 和乐器频谱有所了解才能获得有用的吉他调音器。您需要以 tokland 为例并对其进行更多处理——选择 FFT 的峰值并不能可靠地为您提供音高。在此处查看有关音高检测的其他一些帖子:stackoverflow.com/search?q=pitch+estimation
    猜你喜欢
    • 2016-08-20
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-05-30
    • 2011-05-28
    相关资源
    最近更新 更多