Аудиовизуализатор на светодиодной матрице

#python #audio #aubio

#python #Аудио #aubio

Вопрос:

Мне нужно воспроизвести аудиофайл и отобразить его содержимое на матрице 8×8 в аспекте эквалайзера, как это сделано в Piccolo, совсем как анализатор спектра, адаптированный для BeagleBone или RaspberryPi. Для этого не требуется анализ окружения с микрофона: просто визуализация при воспроизведении музыки на той же плате.

Adafruit создал библиотеку, которая упростила управление светодиодной матрицей, чего не хватает, так это анализа звука вплоть до матрицы для каждого звукового фрагмента.

Языки, возможно, C или C , но было бы лучше, если бы это было в коде Python.Для этого есть хорошие библиотеки, такие как Timeside и aubio, но я не смог выяснить, как заполнить матрицу светодиодов так же, как в Piccolo, хотя я протестировал несколько примеров.

Комментарии:

1. Вы не говорите, какое оборудование вы используете; piccolo — это arduino, но если вы хотите запрограммировать дисплей на Python, вам нужно что-то вроде Raspberry Pi. У Adafruit есть руководство по управлению светодиодными матричными дисплеями i2c от R-Pi: learn.adafruit.com /…

2. Отредактировано в этом смысле, спасибо. Библиотека BeagleBackpack от Adafruit предназначена только для управления матрицей, и это нормально. Недостающая часть касается аудиоанализатора для управления этими светодиодами

Ответ №1:

Чтобы получить грубую 8-полосную, 8-уровневую текущую спектральную оценку (на Python, используя numpy):

 import numpy as np

fftsize = 4096  # about 100ms at 44 kHz; each bin will be ~ 10 Hz
# Band edges to define 8 octave-wide ranges in the FFT output
binedges = [8, 16, 32, 64, 128, 256, 512, 1024, 2048]
nbins = len(binedges)-1
# offsets to get our 48 dB range onto something useful, per band
offsets = [4, 4, 4, 4, 6, 8, 10, 12]
# largest value in ledval
nleds = 8
# scaling of LEDs per doubling in amplitude
ledsPerDoubling = 1.0
# initial value of per-band energy history
binval = 0.001 * np.ones(nbins, np.float)
newbinval = np.zeros(nbins, np.float)
# How rapidly the displays decay after a peak (depends on how often we're called)
decayConst = 0.9

if not_done:
    # somehow tap into the most recent 30-100ms of audio.  
    # Assume we get 44 kHz mono back
    waveform = get_latest_waveform()
    # find spectrum
    spectrum = np.abs(np.fft.rfft(waveform[:fftsize]))
    # gather into octave bands
    for i in range(nbins-1):
        newbinval[i] = np.mean(spectrum[binedges[i]:binedges[i 1]])
    # Peak smoothing - decay slowly after large values
    binval = np.maximum(newbinval, decayConst*binval)
    # Quantize into values 0..8 as the number of leds to light in each column
    ledval = np.round(np.maximum(0, np.minimum(nleds, 
                                               ledsPerDoubling * np.log2(binval) 
                                                 offsets)))
    # Now illuminate ledval[i] LEDs in column i (0..7) ...
 

Помимо захвата последней (4096 точек) формы сигнала, это должно дать вам представление.