Гитарный тюнер с рубиной
-
12-10-2019 - |
Вопрос
Я никогда не работал с аудио-функциями в реальном времени. Я хотел бы знать, есть ли библиотеки Ruby, которые позволили бы мне создать что -то вроде гитарного тюнера.
Решение
Есть две ортогональные задачи: 1) Прочитайте аудио, 2) Обработка его. Чтобы получить звук, вы могли бы проверить Ruby-Audio Хотя, если честно, я никогда не использовал его, и его документация кажется скудной. Лично я прибегал к тому, что предоставляет ваша операционная система; Например, в GNU/Linux у нас есть удобные инструменты, такие как бледный. Анкет Вторая проблема заключается в том, как рассчитать БПФ аудио, это должно быть легко с FFTW3.
Вот быстрый и грязный пример, который получает пиковую точку FFT от stdin (16 битов, моно):
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