Autor Wątek: Tworzenie leveli do gier rytmicznych  (Przeczytany 2144 razy)

Offline .Dexter.

  • Użytkownik

# Czerwiec 03, 2013, 22:39:20
Gaijin Games wydało serię gier Bit.Trip pewnie niektórym znaną z takich tytułów jak Bit.Trip Runner czy Bit.Trip Beat. Zastanawia mnie jak się tworzy poziomy do takich gier. Przykładowo Bit.Trip Beat wygląda tak:

http://youtu.be/r0Pl4sPurck?t=41s

A Bit.Trip Runner tak: http://www.youtube.com/watch?v=zoQa2A_ITVk

Wyobrażam sobie jakiś zaawansowany edytor który korzysta z FFT, jakichś filtrów itd. i wyciąga z piosenki jakieśtam czasy czy coś, ale nie znam się na cyfrowym przetwarzaniu sygnałów na tyle żeby ocenić czy to mogłoby w ogóle działać. Z drugiej strony siedzenie nad każdą planszą i ręczne ustawianie czasów brzmi jakby miało trwać wieki.

Ma ktoś jakieś inne pomysły na tworzenie takich leveli?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +3
# Czerwiec 03, 2013, 23:13:14
Cytuj
Wyobrażam sobie jakiś zaawansowany edytor który korzysta z FFT, jakichś filtrów itd. i wyciąga z piosenki jakieśtam czasy czy coś
FFT w takim zastosowaniu to jak wyciąganie pomidorów z zupy pomidorowej. Lepiej wziąć po prostu pomidory. Czytaj: export nutek do MIDI z programu muzycznego i import tego w edytorze.

Offline blejd123

  • Użytkownik

# Czerwiec 04, 2013, 02:38:40
Można wyliczać wartość BPM (Beats Per Minute) albo wykrywać poszczególne beaty w utworze i odpowiednio synchronizować efekty w grze. Aktualnie tworze grę oparta właśnie o muzykę i stosuję tam metodę polegająca kolejno na:
1. Obliczeniu FFT np. z 2048 próbek, które są aktualnie przetwarzane.
2. Wyznaczenie różnicy FFT otrzymanego w kroku 1. z FFT z poprzedniego takiego zestawu próbek (różnica dwóch wektorów).
3. Zsumowanie wartości elementów wynikowego wektora i zapisanie tej wartości do wektora z historycznymi wynikami.
4. Sprawdzenie, czy aktualna wartość jest większa od średniej z określonej liczby próbek sąsiednich pomnożonej przez ustaloną stałą.
5. Jeśli tak, to rejestrujemy ją z wektorze potencjalnych miejsc występowania beatu.
6. Mając taki wektor sprawdzamy w których miejscach wartość jest mniejsza od wartości poprzedniej i w takim miejscu identyfikujemy wystąpienie beatu.

Działa to całkiem sprawnie i stosunkowo dobrze wykrywa to na czym nam zależy. Dodatkowo można podzielić FFT na kilka przedziałów częstotliwości i obliczać wartości tylko z tego, który nas interesuje.

Offline .Dexter.

  • Użytkownik

# Czerwiec 04, 2013, 18:22:04
FFT w takim zastosowaniu to jak wyciąganie pomidorów z zupy pomidorowej. Lepiej wziąć po prostu pomidory. Czytaj: export nutek do MIDI z programu muzycznego i import tego w edytorze.

A polecisz jakiś konwerter do MIDI?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 04, 2013, 18:32:58
A polecisz jakiś konwerter do MIDI?
Konwerter czego? Do MIDI eksportujesz nuty bezpośrednio z programu muzycznego w którym tworzysz muzykę.

Offline Kos

  • Użytkownik
    • kos.gd

# Czerwiec 04, 2013, 21:43:04
Midi to btw niejedyny "wektorowy" format muzyki, są jeszcze formaty trackerowe (.mod, .xm, takie tam) - różnią się od MIDI afaik przede wszystkim tym, że zawierają informacje o brzmieniu poszczególnych instrumentów, a nie tylko o nutkach. Przy MIDI nutkom przypisuje dźwięki konkretna karta dźwiękowa (lub softwarowy odtwarzacz).

BTW czytanie muzyki z dowolnego mp3 do gry rytmicznej to nie nowość, Audiosurf tak robił (ale wymagało to skomplikowanego preprocessingu, kilka~naście sekund przed odpaleniem poziomu)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 04, 2013, 21:47:27
Midi to btw niejedyny "wektorowy" format muzyki, są jeszcze formaty trackerowe (.mod, .xm, takie tam)
Tak, ale MIDI to jedyny format wspierany na tyle, że wyeksportujesz do niego nutki z każdego szanującego się programu muzycznego.

Cytuj
różnią się od MIDI afaik przede wszystkim tym, że zawierają informacje o brzmieniu poszczególnych instrumentów, a nie tylko o nutkach. Przy MIDI nutkom przypisuje dźwięki konkretna karta dźwiękowa (lub softwarowy odtwarzacz).
Nikt nie mówił tu o graniu z MIDI, więc ten argument odpada. Za to muzyk raczej będzie układał muzykę do gry w Cubase, FL Studio, Live, itp, które wyeksportować mogą właśnie do MIDI.

Offline .Dexter.

  • Użytkownik

# Czerwiec 07, 2013, 12:52:12
Bardziej chodziło mi właśnie o wykorzystanie gotowych utworów tak jak to robi Audiosurf. Poszukałem trochę, najważniejsza fraza to onset detection. Tutaj: http://www.badlogicgames.com/wordpress/?cat=18
jest świetna seria tutoriali jakby ktoś potrzebował. Z tego co zdążyłem przeczytać to przedstawia ona podobne podejście do tego, o którym pisał blejd123. Muszę przyznać, że CPS to bardzo ciekawy temat :)

Korzystając z okazji mam takie poboczne pytanie: jak realizowana jest wizualizacja dźwięku? Chodzi mi o takie coś jak na przykład w Windows Media Playerze efekt oscyloskopu, czyli taka linia zmieniająca się w czasie rzeczywistym. Z tego co zdążyłem przeczytać to pewnie jest wyświetlane ileśtam próbek potraktowanych FFT. Problem w tym, że nie potrafię sobie wyobrazić jak to zrealizować w czasie. Bo jeśli częstotliwość próbkowania wynosi 44.1kHz, a okno ma 1024 próbki to te 1024 próbki trwają około 0.02s. Gdyby to wyświetlać, to nie zmieniało by się za szybko? Z drugiej strony też nie powinno "lagować". Jak do tego podejść?

Offline Karol

  • Użytkownik

# Czerwiec 07, 2013, 13:13:03
Korzystając z okazji mam takie poboczne pytanie: jak realizowana jest wizualizacja dźwięku? Chodzi mi o takie coś jak na przykład w Windows Media Playerze efekt oscyloskopu, czyli taka linia zmieniająca się w czasie rzeczywistym. Z tego co zdążyłem przeczytać to pewnie jest wyświetlane ileśtam próbek potraktowanych FFT. Problem w tym, że nie potrafię sobie wyobrazić jak to zrealizować w czasie. Bo jeśli częstotliwość próbkowania wynosi 44.1kHz, a okno ma 1024 próbki to te 1024 próbki trwają około 0.02s. Gdyby to wyświetlać, to nie zmieniało by się za szybko? Z drugiej strony też nie powinno "lagować". Jak do tego podejść?
1. Częstotliwość nagrania ma się nijak do rozmiaru okna FFT.
2. Nie próbkujesz całości, tylko raz na FPS wizualizacji sekund.
3. Weź pod uwagę to, że te próbki nie są kompletnie od siebie różne z klatki na klatkę. Dźwięk też tak gwałtownie się nie zmienia inaczej uszy by bolały.
4. Zrób prosty programik i zobaczysz jak to działa (albo mogę podrzucić swój jak znajdę po pracy).

Offline .Dexter.

  • Użytkownik

# Czerwiec 07, 2013, 14:18:43
Dzięki za odpowiedź, fajnie by było gdybyś coś znalazł :)
Pod jakimi hasłami mogę szukać informacji na ten temat? Chodzi mi bardziej już o samo rysowanie, zgranie tego jakoś sensownie.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 07, 2013, 15:37:19
Cytuj
Nie próbkujesz całości, tylko raz na FPS wizualizacji sekund.
0.02s to 20ms, czyli wyjdzie tak około raz na klatkę.


Ale tak w ogóle to osobiście bym nie bawił się w FFT (chyba że chcesz mieć dokładne rozbicie na 1024 pasma), tylko przepuścił całość przez 3-7 filtrów (jeden dolno, jeden górnoprzepustowy, reszta pasmowe) i liczył RMS wychodzących sygnałów w oknie od poprzeniej klatki - mniej obliczeń i wyniki prostsze w interpretacji.

Offline bies

  • Użytkownik

# Czerwiec 07, 2013, 19:00:09
Ale tak w ogóle to osobiście bym nie bawił się w FFT (chyba że chcesz mieć dokładne rozbicie na 1024 pasma), tylko przepuścił całość przez 3-7 filtrów (jeden dolno, jeden górnoprzepustowy, reszta pasmowe) (...)
Ale żeby zastosować te filtry trzeba mieć sygnał w dziedzinie częstotliwości więc FFT i tak będzie potrzebne (chyba, że czegoś nie pamiętam z studiów ;) ).

// edit
Nie pamiętam. ;) W dziedzinie częstotliwości jest po prostu łatwiej.
« Ostatnia zmiana: Czerwiec 07, 2013, 19:10:09 wysłana przez bies »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 07, 2013, 20:15:29
Cytuj
Ale żeby zastosować te filtry trzeba mieć sygnał w dziedzinie częstotliwości
Wszystkie implementacje filtrów DSP jakie dotychczas widziałem (a widziałem ich sporo) działają w dziedzinie czasu.

Cytuj
Nie pamiętam. ;) W dziedzinie częstotliwości jest po prostu łatwiej.
Jeżeli pominąć etap FFT i odwrotnego FFT - tak. Ale nadal tylko dla sygnałów o skończonej liczbie próbek i będącej potęgą dwójki. W przypadku przetwarzania real-time byś musiał dzielić to na fragmenty i potem składać w nietrywialny sposób żeby nie mieć artefaktów na łączeniach.