Цветомузыка в машину: Част 2 – Оцифровка

После того, как заработал прототип, я начал изучать варианты для захвата звука. На Nexus 7 есть выход на наушники, который я подключаю к AUX входу в машине. В целом работает неплохо, но есть посторонние шумы. Кто именно виноват не понятно, а вот что делать – есть варианты.

  • Первый и самый простой – это забить.
  • Второй – это использовать внешнюю звуковух вместе с Nexus 7
  • третий – это отказаться от использования планшета и собрать мультимедиа систему на базе одноплатного компьютера типа Raspberry Pi 2 или ODROID C1+. Вместе с HiFi Shield-ом (Для Raspberry Pi вот и Odroid C1 вот)

Пока что решено забить. Тогда нужно каким-то образом оцифровывать звук и разложить на частоты, чтобы принять решение о том, какой канал светодиодной ленты нужно включить.

  • Первый, очевидный способ – это взять уже имеющийся EasyCap, по сколько он не только оцифровывает видео, но и аудио.
  • Второй – взять USB звуковуху специально для этой задачи.

20151103_220604

Решил попробовать оба. EasyCap на основе utv007 у меня уже был, а вот звуковуху пришлось купить, к счастью стоит она ~500р.

20151211_202757Lightshowpi – cофт, который я использовал в прошлый раз для управления светодиодной лентой на основе проигрываемой композиции, так же может работать и в режиме аудио захвата. Для этого нужно сделать конфиг, который укажет, что нужно работать именно с внешним аудио сигналом и какую звуковуху использовать для этих целей.

Для того, чтобы указать название звуковой карты нужно запустить скрипт (audio_in_cards.py), который идёт в комплекте – он то и выдаст список подключенных звуковых устройств. В моем случае правда он ничего не принтит и мне пришлось сделать небольшую модификацию в нём, чтобы он заработал:

cd lightshowpi/tools
vim audio_in_cards.py

надо на последнюю строчку добавить print

import alsaaudio as aa

if __name__ == "__main__":
    print aa.cards()

теперь всё как надо – запускаем:

pi@rpitestmusic ~/lightshowpi/tools $ sudo python audio_in_cards.py
[u'ALSA', u'usbtv']

Тут видно, что для EasyCap – это usbtv. Соответственно просто пропишем это в конфиг.

vim /home/pi/.lights.cfg

там уже есть секция hardware, которая переопределяет какие пины использовать для управления лентой. Теперь нужно поменять, чтобы скрипт работал в режиме захвата звука со звуковухи и указать с какой:

[hardware]
gpio_pins = 0,1,2

[lightshow]
mode = audio-in
audio_in_card = usbtv

Собственно, надо попробовать – как это работает. Запускаем скрипт в режиме захвата

sudo python py/synchronized_lights.py

Первое, чтоб бросается в глаза – это “шум”. Даже если нет никаких звуков лента всё равно моргает.

Теперь заменим EasyCap на купленную USB звуковуху. Честно взял некую рандомную. Вот dmesg если вдруг интересно:

cmediadmesgСнова запустив скрипт, который показывает название аудио устройств в системе, увидим, что имя, которое нужно поместить в конфиг – это просто Device.

pi@rpitestmusic ~/lightshowpi/tools $ sudo python audio_in_cards.py
[u'ALSA', u'Device']

Заменим usbtv на Device, используя любимый редактор vim /home/pi/.lights.cfg

[hardware]
gpio_pins = 0,1,2

[lightshow]
mode = audio-in
#audio_in_card = usbtv
audio_in_card = Device

И ребутнем Raspberry для профилактики возможных USB глитчей. После чего запустим скрипт syncronized_lights.py теперь уже с USB звуковой картой.

Заодно прикинул как это будет выглядеть если прилепить светодиодную ленту за телевизором:

Выглядет неплохо, хотя лучше прикрепить за картиной или зеркалом.

Что скажите?

 

 

Leave a Reply