Biblioteka Bass i analiza widma muzyki do wygenerowania efektów świetlnych

0

Witam,

Pora przetrzeć kurz i zacząć robić to, co planuję od wielu lat.

To co mam na chwilę obecną: zmodyfikowany przykład biblioteki bass 'spectrum', tak, że pokazuje mi widmo z karty wejściowej 'Stereo Mix'. Czyli załóżmy, że mam skaczączych 10 prążków.

Za pomocą tego, chciałbym jakoś przeanalizować dźwięk i na podstawie tego wygenerować odpowiednie efekt świetlne w moim urządzeniu (listwa z 21 ledami RGB), gdy np. muzyka jest wolna, szybka, gdy są same basy, albo jakaś gra na pianinie, gdy zmienia się barwa dźwięku, lub tempo.

Myślałem, aby zabisywać 10 prążków w czasie w tablicy 3 wymiarowej (nr prążka, jego wysokość, i kilka następnych wartości prążka) i na podstawie takiej tablicy, dokonywać analizy i dopasowywać różne efekty.
Sęk w tym, że nie wiem jak się zabrać do takiej analizy. A może są jakieś lepsze, prostrsze rozwiązania?

0

Generalnie to jest ciężki temat i zrobienie tego za pomocą 10 pasmowej analizy widma raczej będzie dawało słabe wyniki. A już rozróżnienie tego czy ktoś gra na pianinie czy nie jest moim zdaniem bardzo trudne. Najłatwiejsze będzie określenie tempa utworu, bo to poznasz np. po uderzeniach basu. Same rozpoznanie uderzenia też nie jest proste, bo musiałbyś zróżniczkować w czasie przebieg w zakresie niskich częstotliwości. Jednak to wymagałoby trzymania danych z sensownego przedziału czasu, co najmniej kilka sekund, więc opóźnienie będzie masakryczne.

A to co widzisz na koncertach nie powstaje niestety w ten sposób. Większość efektów jest programowana, ponieważ bardzo trudno (o ile w ogóle możliwe) jest w czasie rzeczywistym rozróżnienie rzeczy o których piszesz.

0

O tym, że na koncertach jest to zaprogramowane i ustalone z góry choreografie - to ja wiem.

Jednak chciałem jak kolwiek podjąć próbę zrobienia takiego analizatora dźwięku.

Piszesz o sporym opóźnieniu - mam w głowie taki pomysł, aby buforować np 10 sekund dźwięku i z takim opóźnieniem wypuszczać go na kartę dźwiękową. Dzięki takiemu opóźnieniu był by czas na odpowiednią analizę dźwięku i odpowiednie dobranie efektów.

Pora poczytać o różniczkowaniu przebiegu - może w końcu pojmę to różniczkowanie i całkowanie, na jakim konkretnym przykładzie.

Edit:
Teraz przyszło mi do głowy, że można zrobić te efekty wizualne w ten sposób, że zaprogramować 20 efektów, które będą włączały się od pewnych parametrów dźwięku i zmieni ały tempo w zależności od tempa muzyki i tyle.

Tylko nadal pozostaje pytanie jak przeanalizować dźwięk.

0

Takie coś jak opisujesz (opóźnianie dźwięku) wydaje się być interesującym rozwiązaniem.

Pytasz jak analizować dźwięk. W sumie to moim zdaniem będzie potrzeba zaznajomić się z pojęciami DSP. Poszukaj do tego książek. Jest nawet stara książka poświęcona przetwarzaniu sygnałów w C. Jednak jeśli chodzi Ci o bardziej zaawansowane rzeczy typu czy to solo na gitarze, czy pianinie będzie trudniej. Ale można by próbować sprawdzając zawartość poszczególnych harmonicznych w dźwięku. Tylko tym raczej nie załatwisz gotową funkcją z biblioteki bass, a będziesz musiał zaimplementować np. 512 punktową FFT. Chyba, że biblioteka już to udostępnia. Nie wiem, nie miałem z nią do czynienia.

Tym samym sposobem można by wyciągnąć tempo. Jak wcześniej wspomniałem wystarczyło by przepuścić sygnał przez filtr dolnoprzepustowy i poddać różniczkowaniu. A to akurat proste. W zależności od dokładności można to zrobić badając różnicę kolejnych próbek z odpowiednimi wagami. Następnie należałoby zbadać co ile czasu zwiększa się pochodna sygnału. Tam można sprawdzić bpm utworu.

0

O tym DPS to muszę poczytać.

Co do różniczkowania, to od czasów 1 roku studiów mam awersję do tego tematu i podobnych. Mógłby mi ktoś podać sensowny przykład, który mi jasno wytłumaczy to różniczkowanie itp.

Piszesz o filtrze dolnoprzepustowym, a co w przypadku, gdy rytm muzyki nadają wyższe tony?

Dziś główkowałem nad taką analizą i przyszedł mi do głowy taki pomysł, dość prozaiczny. Mianowicie, aby ze spektrum dla danego momentu pobierać najwyższą wartość i zapisywać w tablicy '1', pod indeksem częstotliwości, w której wystąpiło maksimum, dla pozostałych indeksów częstotliwości wpisujemy '0'. Przychodzi następna próbka, zwiększamy drugi index tablicy o 1 i mam kolejny krok. W efekcie wyjdzie jakby krzywa częstotliwości.
Dzięki temu możemy np zliczać co jaki czas wystąpiło makximum dla niskich częstotliwości, albo np wykryć zmianę tonu, poniważ linia w tablicy będzie się przesuwała np z wysokich częstotliwości do niższych.

Myślałem, żeby się jakoś zachczyć o 'akustyczny odcisk palca', ale jakoś nie chwyciłem tematu.

EDIT:
Muszę zrozumieć co zwraca funkcja 'BASS_ChannelGetData'. (tu jest dobry przykład: Częstotliwość, barwy, itp. dzwięków), bo jak na razie po konwersji zmiennej single mam wartość 0,000234 i to skacze. Co prawda skacze jakoś w rytm muzyki, ale coś małe te wartości. może to wartość w becybelach? Nie wiem, muszę poczytać.

0
siekierzyński napisał(a):

Co do różniczkowania, to od czasów 1 roku studiów mam awersję do tego tematu i podobnych. Mógłby mi ktoś podać sensowny przykład, który mi jasno wytłumaczy to różniczkowanie itp.
Akurat pochodna sygnału dyskretnego jest bardzo łatwa do zrealizowania. Np. tu masz fajne wzory http://programowanie.opole.pl/archives/1277

siekierzyński napisał(a):

Piszesz o filtrze dolnoprzepustowym, a co w przypadku, gdy rytm muzyki nadają wyższe tony?
Generalnie uważa się, że rytm nadają basy.

siekierzyński napisał(a):

Dziś główkowałem nad taką analizą i przyszedł mi do głowy taki pomysł, dość prozaiczny. Mianowicie, aby ze spektrum dla danego momentu pobierać najwyższą wartość i zapisywać w tablicy '1', pod indeksem częstotliwości, w której wystąpiło maksimum, dla pozostałych indeksów częstotliwości wpisujemy '0'. Przychodzi następna próbka, zwiększamy drugi index tablicy o 1 i mam kolejny krok. W efekcie wyjdzie jakby krzywa częstotliwości.
Dzięki temu możemy np zliczać co jaki czas wystąpiło makximum dla niskich częstotliwości, albo np wykryć zmianę tonu, poniważ linia w tablicy będzie się przesuwała np z wysokich częstotliwości do niższych.
Ale weź pod uwagę, że ucho ludzkie nie wychwytuje tak samo wszystkich częstotliwości o tym samym natężeniu. Jeśli będziesz miał dwie składowe o różnych częstotliwościach i równych natężeniach w pliku audio, to taka sytuacja nie oznacza, że oba będą tak samo głośne dla ucha. Poczytaj o krzywych izofonicznych. Jeszcze ciekawiej się robi jak Ci powiem, że izofony zmieniają się wraz z natężeniem... Ogólnie za bardzo upraszczasz.

siekierzyński napisał(a):

Myślałem, żeby się jakoś zachczyć o 'akustyczny odcisk palca', ale jakoś nie chwyciłem tematu.
Każdy instrument ma charakterystyczną zawartość różnych składowych harmonicznych. Badając wzajemny stosunek tych harmonicznych można próbować zgadywać jaki to instrument.

siekierzyński napisał(a):

Muszę zrozumieć co zwraca funkcja 'BASS_ChannelGetData'. (tu jest dobry przykład: Częstotliwość, barwy, itp. dzwięków), bo jak na razie po konwersji zmiennej single mam wartość 0,000234 i to skacze. Co prawda skacze jakoś w rytm muzyki, ale coś małe te wartości. może to wartość w becybelach? Nie wiem, muszę poczytać.
A sprawdziłeś do dokumentacji? Tak chyba powinno być wyjaśnione ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1