afinador de guitarra con Ruby
-
12-10-2019 - |
Pregunta
Nunca había trabajado con características de audio en tiempo real. Me gustaría saber si hay bibliotecas rubí por ahí que me permitiría crear algo así como un afinador de guitarra.
Solución
Hay dos tareas ortogonales: 1) Lea el audio, 2) procesarlo. Para obtener el audio podrías comprobar rubí de audio, sin embargo, para ser honesto, Nunca he utilizado y su documentación parece escasa. Personalmente me recurro a lo que su sistema operativo proporciona; por ejemplo, en GNU / Linux tenemos herramientas útiles como bplay . La segunda cuestión es cómo calcular la FFT de audio, esto debería ser fácil con FFTW3 .
Aquí está un ejemplo rápido y sucio que obtiene el punto de pico de la FFT de stdin (16 bits, mono):
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
a ser llamado, por ejemplo:
$ brec -s 8000 -b 16 | ruby tuner.rb