Interaktywny widget w oscyloskopie

Hejka, jestem z ASP i chciałam zrobić projekt z użyciem oscyloskopu/osci-rendera :)

Myślałam nad stworzeniem interaktywnego widgetu w oscyloskopie a la Shimeji, który po podłączeniu do komputera będzie reagował na poszczególne inputy/eventy, jak np. wciskanie klawiszy na klawiaturze, uruchamianie poszczególnych programów czy też reakcja na rózne eventy w grach. Teraz chcę zacząć od małych kroczków i zobaczyć czy w ogóle da się pracować z interaktywnością w osci-renderze. Chcę was poprosić o pomoc, ponieważ osci-render daje mi dużo technicznych problemów, które nie jestem w stanie ogarnąć sama.

Co chciałabym teraz osiągnąć:

  • Czytanie pozycji myszki i mapowanie jej do efektów (obraz w oscyloskopie zmienia się w oparciu o ruch myszki w lewo/prawo)
  • Reagowanie na poszczególne inputy klawiatury/myszki (efekt zmienia się jak naciśniesz “1” na klawiaturze)
  • (opcjonalnie, ale fajnie by było) Mapowanie efektów do kontrolera do gier; tak naprawdę to samo, co z klawiaturą

Osci-render pozwala na kodowanie własnych efektów w Lua, jednak żeby móc mapować współrzędne myszki lub klawisze klawiatury, trzeba by było pobrać specjalne biblioteki, a nie mam pojęcia czy da się to zrobić w osci-renderze. Z tego co wiem, program został napisany w C++, więc może da się zrobić jakiś reverse engineering, ale nie mam pojęcia jak się za to w ogóle zabrać.
Link do tutorialu Lua od twórcy osci-rendera

W osci-renderze jest także zakodowana klawiatura MIDI, która pozwala na zmianę granych frekwencji, żeby w prosty sposób manipulować obrazem w oscyloskopie, ale nie jestem pewna czy da się to zrobić wystarczająco dokładnie, żeby mieć jakąś większą kontrolę nad obrazem.
Pewnie istnieje możliwość manipulowania MIDI, żeby grała specyficzne frekwencje po zmapowaniu jej do klawiatury/kontrolera, aby symulować zmianę efektów, ale nie wiem, czy to w tym momencie nie stanie się zbyt skomplikowane w porównaniu z efektem końcowym, który chcę osiągnąć. Chciałabym się najpierw skupić na tym, czy da się bezpośrednio odczytać inputy w osci-renderze, a jak się nie uda, to dopiero szukać alternatyw.

Także patrzyłam czy da się coś zrobić z modelem 3D w Blenderze podłączonym do osci-rendera, ale z racji tego, że osci-render czyta wyrenderowaną animację modelu, nie jestem w stanie nic zbytnio zrobić.

Planuję też napisać do twórcy osci-rendera, może byłby zainteresowany dodaniem jakiegoś ustawienia interaktywności. Ja też nie mam żadnego doświadczenia z Lua/C++ i nie byłam w stanie znaleźć żadnego pomocnego tutorialu, więc jest możliwość, że rozwiązanie jest bardzo proste tylko ja nie byłam w stanie go znaleźć.

Dzięki wielkie :)

Dużo pytań ale spróbuję się odnieść w tym zakresie w jakim mi się wydaje, że mam jakieś pojęcie.
Generalnie ten osci-render ma dwie generacje:
1-sza (do wersji 1.33.x) napisana w javie i ona ma mozliwość sterowania z midi nie tylko wysokościa generowanego dzwięku ale też sterowania sliderów (od parametrów w GUI) z kanałów kontrolnych midi - czyli efektywnie z gałkologii na klawiaturze midi.
2- wersja (od wersji 2.X) została przepisana na C++ ale nie ma obsługi sliderów inaczej niż myszą
Natomiast ani jedna ani druga nie pozwala na sterowanie kontrolkami w gui z normalnej klawiatury. Przynajmiej z tegoo issue tak wynika: Controlling osci-render with a keyboard rather than a mouse · Issue #157 · jameshball/osci-render · GitHub
W skrypcie lua, żeby odczytać klawiaturę to te dodatkowe biblioteki, które są do tego potrzebne, trzeba by chyba skompilować do osci-rendera.

Ale wg mnie można by to zrobić inaczej.
Pytanie w jaki sposób chcesz generować geometrię którą ma być widać / słychać ?
Bo generalnie opcji jest tyle:

  1. Domyślny wewnętrzny parametryczny generator, który generuje ten sygnał/gemetrię którą widać/słychać po uruchomeiniu programu i ktory można modyfikować sliderami i/lub ze skryptu lua
  2. Generowanie progamowe skryptem lua
  3. Wysyłanie geometri z blendera
  4. Załadowanie geometrii (statycznej) z pliku graficznego wektorowego, pliku tekstowego (+ wybrany font)
  5. Załadowanie geometrii z pliku wav stereo

Przez midi wprawdzie nie wygeneruje się źródłowej geometri ale ono steruje wysokością tonu (czyli częstotliwością odtwarzanego sampla stereo, który odpowiada geometrii powstałej z któregoś w/w źródła) i obwiednią ( co efektywnie steruje skalowaniem obrazu bo to jakby to samo co chwilowy poziom głośności )
Wg mnie najbardziej elastyczny byłby ten interfejs, który jest do blendera.
Tzn blender wysyła do osci-rendera geometrię przez port tcp (“po sieci”) w postaci listy wierzchołków (z obiektów typu greasepencil), spakowanej w json. To jest w sumie programowo bardzo prosty interfejs - właściwy kod zajmuje może z jeden ekran: osci-render/blender/osci_render/__init__.py at main · jameshball/osci-render · GitHub
Czyli… można by wykorzystać ten interfejs, żeby napisac swój własny skrypt w pythonie (albo czymkolwiek innym co umie otworzyć pąłaczenie tcp i wysyłac dane) , który będzie generował i wysyłał jakąś geometrię zamiast blendera.
Tzn skrypt uruchamiany w ogóle bez blendera, jako aplikację z poziomu OS’a
I ten skrypt mógłby bez problemu reagować na zdarzenia z klawiatury, myszy, pada, żeby tę geometrię modyfikować ( przesuwać, skalować, genrować dla każdego klawisza inną geometrię itp.
A ponieważ (przynajmiej do pythona) sa też biblioteki które umieją udawać urządzenie midi programowo (python-rtmidi · PyPI) , to można by takim skryptem również równolegle i synchronicznie wysyłać do osci-rendera komunikaty midi.
No albo jednak nie rezygnować z blendera a tylko zmodyfikować kod jego plugina, żeby oprócz głupiego przesyłania w kółko geometrii obiektów ( które są w scenie) modyfikował ją “w locie” na podstawie odczytu klawiatury ( wygląda, że da się czytać wewnątrz skryptu blendera “surowe” zdarzenia z klawiatury/myszy w aktywnym oknie blendera: Detect if ANY key is pressed using logic.keyboard.events - Game Engine Support and Discussion - Blender Artists Community ).

Możesz jeszcze spróbować w ogóle zostawić ten osci-render i napisać samodzielny program który będzie robić to co chcesz.
W sumie wszystko się sprowadza do wygenerowania (albo wczytania) próbek dźwieku stereo, odtwarzania tych próbek i manipulacji nimi w odpowiedzi na jakies zdarzenia (klawisze , pad).
Zakładając, że wizualizację dzwięku robisz na prawdziwym oscyloskopie ( ew jakimś gotowym softwarowym widgecie : https://dood.al/oscilloscope/ ) to samo generowanie dzwieku i modyfikowanie próbek żeby np obraz przesuwać po ekranie X/Y, albo przełaczać kształty jest dośc proste. Zobacz taki przykład: https://forge.citizen4.eu/miklo/osc-rendering .
Żeby wyświetlać jakąś geometrię której nie da się prosto wygenerować parametrycznie to można wczytać po prostu tabele próbek z plików wave.
Te .wav’y z kolei zapisać z osci-rendera.
A tam geometrię do nich wyprodukować albo z pliku .svg, albo z jakiegoś obiektu 3d przesłanego z blendera.

Napisanie własnego programu byłoby najlepsze, tylko niestety nie mam ani czasu ani doświadczenia, tym bardziej, że chciałam zrobić ten widget na bazie własnego modelu 3D. Myślę, że to będzie fajny projekt na przyszłość jak będę mieć więcej czasu i doświadczenia z programowaniem.
Twoja podpowiedź o pluginie do Blendera była strzałem w dziesiątkę, właśnie z profesorem piszemy skrypt w Pythonie do osci-rendera, który będzie czytał i manipulował pliki greasepencila wygenerowane przez Blendera. Sama nie wpadłabym na pomysł, żeby spojrzeć na plugin, nie sądziłam, że będzie aż tak prosto napisany.
Dzięki wielkie za pomoc :)