Programowanie rekreacyjne staje się ostatnio popularne w kręgach nerdów. To takie programowanie jak rekreacyjna gra w szachy lub rekreacyjne rozwiązywanie zadań matematycznych. Dla przyjemności i samorozwoju.
Ostatnio jdh ma serię wypróbowywania róznych języków programowania w ten sposób, przez implementację prostych gier. Gdy wypróbowywał język Odin, implementował grę Space Invaders 「スペースインベーダー」. Na podstawie tego nagrania: https://www.youtube.com/watch?v=MU4psw3ccUI
Na początku dziwiło mnie, że chce dokładnie odzwierciedlić mechanikę i ruch z gry. Zwykle jestem za tym by ktoś pisał po swojemu, jedynie inspirując się tytułem. Jednak oglądając dalej stwierdziłem, że odzwierciedlanie wszystkich szczegółów może być niezłym wyzwaniem.
Najbardziej interesującym był ruch samych alienów. Nie podobała mi się interpretacja przez jdh, który twierdził, że są tam jakieś sinusy. Postanowiłem sam ten ruch odtworzyć wg mojej intepretacji.
Takie było moje wyzwanie w Róló. Uważam, że je rozwiązałem. Wydaje mi się, że algorytm nie jest trudny. Nie będę spojlował. Ciekaw jestem waszych interpretacji.
W następnym etapie chciałbym odzwierciedlić niszczenie “budynków”/“osłon” za którymi ukrya się gracz. Algorytm w grze wydaje się prosty (xor). Tu chciałbym eksperymentować z czymś własnym, bardziej proceduralnym.
“To się chyba nazywa scratchbuilding.”
Aż sprawdziłem czy się nie walnąłem. Nadal podtrzymuję scrapbooking. Masz całe sklepy internetowe, które zajmują się sprzedawaniem materiałów, dla ludzi, którzy w tym siedzą.
“Czy też używasz piezo? Jeśli tak to jak robisz, żeby był wystarczająco głośny?”
No używam piezo wymontowanego z takiej starej kartki. Udało się znaleźć cały stos takich starych kartek grających i po prostu posłużą za dawców buzzerów.
Co do głośności to w takich buzzerach niewiele można zrobić w tym temacie. Ogólnie każdy model piezo jest przez producenta wyskalowany, żeby w pewnych częstotliwościach pracować ciszej, a w innych głośniej i nie jest to zależność liniowa. W nocie katalogowej buzzerów możesz znaleźć takie wykresy SOUND PRESSURE CHARACTERISTICS (przykładowa poszlaka https://www.mouser.com/datasheet/2/400/ef532_ps-13444.pdf). Jest to zależność generowanego ciśnienia akustycznego od częstotliwości i kształtu zadanego sygnału sterującego. I tak, wiem że ciśnienie akustyczne nie przekłada się 1:1 na “głośność”, ale z braku lepszej charakterystyki, to ono robi za punkt odniesienia. Napisałem nawet kawałek kodu, który co kilka sekund podnosił częstotliwość o 100Hz. Faktycznie dało się usłyszeć nieliniowość tej charakterystyki. Przykładowo w tym głośniku, który mam w okolicach 700Hz jest ogólnie ok, w okolicach 1600Hz jest dramat, odnoszę wrażenie, że najgłośniej gra w okolicach 2000Hz. Więc w teorii jeżeli chcesz podgłośnić jakiś utwór na piezo to powinieneś poszczególne dźwięki przenieść do oktawy, która operuje w najgłośniejszym zakresie częstotliwości. Na ten moment jeszcze nie bawiłem się w takie skalowanie.
“Ciekawi mnie jak i co odtwarzasz?”
Na ten moment nie jest to coś zbytnio przekombinowane. Po prostu mam zapisane, że dźwięk o danej częstotliwości ma grać przez X milisekund. Największym problemem jest tutaj konwersja z materiału źródłowego. Przeglądając w sieci widziałem dwa podejścia. Jedni za źródło brali pliki MusicXML, a inni MIDI. Niezależnie co wybierzesz, to gotowe konwertery, które znalazłem mają jakieś problemy jak załadujesz im cokolwiek spoza bazy przykładów od autora programu. Np w przypadku MIDI jedne gubią się jak w pliku jest użytych kilka kanałów albo na raz zostają odtworzone dwa dźwięki, ewentualnie giną jeżeli plik MIDI ma kilka osobnych ścieżek itp. Osobna sprawa, że wiele z tych konwerterów zamiast wygenerować ci same sekwencje danych np w formie tablic, to generuje ci cały kod, gdzie po prostacku masz wołanie po sobie funkcji “tone” i “delay” ręcznie dla każdego sampla (super optymalizacja bulwo). Dlatego postanowiłem napisać swój prosty konwerter wychodząc z założenia, że jeżeli będzie spierdzielone, to będzie spierdzielone po mojemu ;-).
Dzisiaj zamówiłem kilka sztuk krzemu, który docelowo ma trafić do kartki. Wybór padł na STM32G0 (Cortex M0). Jest to kompromis pomiędzy takimi cechami jak cena, szybkość dostawy/dostępność, możliwości, dostępne warianty obudowy itd. Owszem można znaleźć jakieś procki po 20gr za sztukę, ale potem czytasz, że musisz zamówić tego 1000 sztuk, a i tak dostawa będzie za 2 miesiące. Myślałem przez chwilę nad jakimś Attiny13, ale potem odkryłem tego STM32G0, który nie dość, że ma wszystkiego więcej, to jest jeszcze tańszy (różnica rzędu kilku złotych na jednej sztuce). Więc wewnętrzna cebula wygrała.
Niesamowite!
Nie myliłeś się. Ja tylko napisałem jak nazywa się bliźniacza dziedzina, którą się zachwyciłem. Tu masz jednego z fajniejszych przedstawicieli: https://www.youtube.com/@CutTransformGlue/videos
To dość niszowa zabawa. Na tyle, że ludzie wolą prezentować swoje prace na lokalnych wystawach zamiast na tubie. Tak jak dioramy.
Tak myślałem, że głośniczki piezo mają jakąś charakterystykę. Wynika ona choćby z częstotliwości rezonansowej blachy, którą odkształca kwarc. Jednak w materiale który pokazałeś, niektóre są dość zrównoważone po podaniu fali prostokątnej (np PS1740P02CE). Więc jeśli kogoś nie przeraża muzyka z chiptune i starej nokii to może coś tym ugrać. Tylko zastanawiało mnie jak wzmocnić sygnał głosnika. Na TTL były zwykle bardzo ciche. Układy które widziałem miały jakieś transformatory zwiększające napięcie lub formy przetwornicy zasilającej tranzystor sterujący.
Myślałem, że chodzi w tym o to, żeby zrobić wszystko z odpadów (jak koleś z kanału ELEKTRON), więc jestem trochę rozczarowany tym, że kupiłeś kontroler. Nie wiem który dokładnie wybrałeś, ale pamięci wydaje się wystarczająco dużo, a bogatsza wersja ma nawet DAC.
Czytając twój komentarz, jeszcze przekonany o tym by budować ze śmieci, pomyślałem, że można uzyskać wyższą jakość dźwięku, wykorzystując małe głośniczki ze starych smartfonów. Wydaje mi się, że one są wysokości płytki z baterią od zegarka.
Wcześniej odniosłem wrażenie, że masz problem ze zmieszczeniem melodii niczym programiści intr 4k. Ale teraz myślę, że na takiej platformie sobie poradzisz, przy okazji ucząc się teorii muzyki by opanować midi i odtwarzanie wielokanałowe.
Jeśli chodzi o kompresję to wyobrażałem sobie, że melodia nie musi składać się ze wszystkich nut. Więc można ograniczyć ilość bitów wysokości dźwięku do tylu ile ma dana melodia [1]. Druga sprawa, że melodia lubi się powtarzać. Czasem tylko z jakimś argumentem innej tonacji. Więc to też może redukować rozmiar. Jeśli lubisz samplować to dużo można się dowiedzieć z prac demoscenowych trackerów (formaty mod/xm). Jeśli nie ma miejsca na sample. można też użyć syntezy i ręcznie generować parametryzowany dźwięk. Zwykle parametry to wysokość, kształt fali lub szum, głośność, oraz attack, decay, sustain, and release. To pozwala emulować wiele instrumentów. Sztuka polega na dobrym trafieniu częstotliwością w częstotliwości prawdziwych nut. Żeby nie fałszowało.
Powodzenia. Jeśli możesz, dziel się doświadczeniami. To fajne.
PS Kanał o tym co można znaleźć w “śmieciowych” urządzeniach: https://www.youtube.com/@bigclivedotcom/videos
EDYCJA: [1] Chodziło mi o to, że melodia może składać się np. z 6 różnych wysokości dźwięku. Więc można zrobić tablicę z 6 częstotliwościami. A melodię zapisać jako indeksy tablicy o szerokości trzech bitów. Podobnie może być z czasem.
[2] Przypomniało mi się, że Teensy miało rozbudowany tor audio. Mieli też fajny edytor z generatorem kodu do tego: https://www.pjrc.com/teensy/gui/index.html