środa, 16 września 2020

Kontakt - pierwszy instrument

Kontakt to bardzo rozbudowany sampler, stworzony dwadzieścia lat temu przez firmę Native Instruments. Obecnie dostępny jest w wersji szóstej, zarówno darmowej Player, jak i płatnej. Ale to nie tylko sampler - to także platforma do tworzenia własnych instrumentów muzycznych (bazujących na samplach). Mój kolega z grupy AudioGram, Filip Pawłowski, zajmuje się tworzniem tego typu instrumentów i kiedy zostałem zapytany, czy nie przygotowałbym jakiegoś projektu interfejsu użytkownika, zacząłem wnikać głębiej w te, znane wcześniej tylko ze słyszenia, możliwości Kontakta.

Instrument powstały na drodze eksperymentu

O co chodzi?

Główna część pracy, związanej z tworzeniem nowego instrumentu, polega na przygotowaniu i zmapowaniu próbek dźwiękowych. Jeśli mamy jakiś fizyczny instrument, który chcielibyśmy przenieść do samplera, musimy zrobić dwie rzeczy: nagrać próbki dźwiękowe i po obrobieniu umieścić je w Kontakcie, wskazując która odpowiada jakiemu klawiszowi (nucie). Nagrywanie wydaje się zrazu prostą czynnością, ale może zająć długie godziny: im więcej próbek przygotujemy, tym realniej i wiarygodniej będzie brzmiał instrument. I chodzi nie tylko o spróbkowanie wszyskich dających się wydobyć dźwięków (np. dla gitary - wszystkich strun na wszystkich progach), ale także różnych poziomów dynamicznych, artykulacji czy później powielenia tego wszystkiego, aby zastosować mechanizm round robin. Czyli - trzymając się przykładu gitary: próbkujemy strunę "e" szarpaną maksymalnie mocno palcem (robimy to np. 5 razy, starając się grać tak samo); teraz szarpiemy troszkę słabiej, również pięć razy i tak aż do bardzo cichych dźwięków. Każdy dźwięk nagrywamy i dbamy, aby wybrzmiał do końca. Teraz powtarzamy całą procedurę dla tej samej struny, ale przyciśniętej na pierwszym progu. I na drugim. I dla wszystkich strun. Potem CAŁOŚĆ robimy także dla gry kostką. Potem nagrywamy flażolety. Tapping. Potem wariacje z użyciem kapodastra. Albo z innymi (nylonowymi, stalowymi, grubymi, cienkimi) strunami. Albo inną gitarą. Albo innym mikrofonem. Albo... No, możliwości są niemal nieograniczone.

I gdy się wydaje, że to nagrywanie jest mozolne, przychodzi czas obróbki tego całego materiału. Cięcia, segregacji, odszumiania, docinania, nazywania. Bez dobrze opanowanej techniki obróbki, stosowania skrótów, automatów i tym podobnych wynalazków to zabawa na długie, długie godziny.

W końcu materiał audio jest gotowy i można uruchomić Kontakta, aby wrzucić tam próbki. I tu się również robi zawiło - czym są grupy? jak rozmieścić próbki i przypisać je do klawiatury? Jak skonfigurować round-robin? Jak dostroić niektóre próbki? Jak wyrównać czasy ataku albo głośność? Multum zagwozdek i problemów, zwłaszcza na początku, gdy Kontakt jawi się jako badziew pisany przez kretynów bez pojęcia o wygodnym interfejsie użytkownika (wierzcie mi, że na początku ma się takie wrażenie, a i później czasem to wrażenie powraca). Ale koniec końców całość wreszcie zaczyna jakoś brzmieć i wtedy wpadamy na pomysł, że warto było dać użytkownikowi jakąś gałeczkę czy suwak, którymi mógłby on sobie coś tam dostroić czy przestawić.

GUI w Kontakcie

Teoretycznie nie ma powodów do narzekań: Kontakt ma wbudowane gałki, suwaki, pola liczbowe, listy rozwijane itd. Kłopot pojawia się dla osób, którym nie wystarcza szare tło i standardowe kontaktowe kontrolki. Okazuje się bowiem, że chcąc mieć ładne tła, przyciski, pokrętła i napisy, trzeba nie tylko sobie to wszystko ręcznie narysować czy wyrenderować (w zewnętrznych aplikacjach), ale trzeba to też ZAPROGRAMOWAĆ. I pal licho już programowanie tego, co się ma dziać przy pokręcaniu czy przesuwaniu (bo to nie zależy od wyglądu kontrolki), tu trzeba programować także takie rzeczy jak przezroczystości, położenie na ekranie, wyświetlanie napisów czy liczb i tak dalej, i tak dalej.

W zasadzie GUI, tak jak resztę "działania" instrumentu, pisze się w ekstremalnie niewygodnym edytorze kodu bez kolorowania składni i podpowiadania parametrów, przełączając się do dokumentacji w PDF. Ba, żeby w ogóle cokolwiek wyświetlić, nawet tylko tło, trzeba napisać skrypt "on init" z magiczną linijką "make_perfview" i najlepiej deklaracją wysokości widoku.

Przykładowo, aby wyświetlić własne tło, musimy napisać (całkowicie ręcznie) coś podobnego:

on init    
    make_perfview
    set_ui_height_px(300)
    set_control_par_str($INST_WALLPAPER_ID, $CONTROL_PAR_PICTURE, "my_wallpaper")
end on

i zadziała to przy założeniu, że w odpowiednim folderze ręcznie umieścimy plik graficzny "my_wallpaper.png" wraz z również ręcznie utworzonym plikiem tekstowym "my_wallpaper.txt" o mniej więcej takiej treści:

Has Alpha Channel: no
Number of Animations: 0
Horizontal Animation: no
Vertical Resizable: no
Horizontal Resizable: no
Fixed Top: 0
Fixed Bottom: 0
Fixed Left: 0
Fixed Right: 0

(koniecznie z pustą linią na końcu, której znaczenie jest zupełnie nieznane i wszyscy ją dodają, bo inaczej "czasem to nie działa").

Przyznam, że widząc to wszystko przypomniały mi się czasy pisania pierwszych programów w Fortranie 77 - ale to było ponad dwadzieścia, trzydzieści lat temu! Wydaje mi się, że w 2020 roku Native Instruments powinno jednak pochylić się nad tym problemem i nieco ułatwić życie twórcom instrumentów... A przynajmniej dodać kolorowanie składni i uzupełnianie kodu oraz sprawdzanie składni w czasie rzeczywistym, a nie dopiero przy "kompilacji" (że o czytelniejszym opisywaniu błędów nie wspomnę, bo na początku można sobie oczy nadwyrężyć od analizowania kodu podanego malutkimi literkami, żeby np. po długim czasie wpaść na to, że jakaś zmienna nie ma deklaracji). Od strony kodowania jest to prawdziwa katorga i 100 razy lepiej jest przenieść skrypt do SublimeTexta, do którego da się zainstalować kolorowanie składni KSP (Kontakt Script Processor). Można się także posiłkować specjalnym edytorem napisanym przez fana, Nilsa Liberga - Nils Liberg's KScript Editor.

Pierwszy instrument

Żeby w pełni zrozumieć, co tu się w ogóle wyrabia, postanowiłem przygotować prościutki instrument, bazujący na zabawce córki. Nie bawiłem się w różne poziomy dynamiczne, za to spróbkowałem po kilka razy każdą płytkę, żeby zastosować mechanizm karuzelowy round-robin. Do obróbki wykorzystałem Reapera, bo ze względu na wykorzystywany świetny tutorial nie chciałem sobie komplikować życia. Płytek w instrumencie nie było dużo, więc przygotowanie próbek nie zajęło aż tak dużo czasu, jak się początkowo obawiałem. Zatem wszystko nagrane, obrobione, poszatkowane i ponazywane, czas zasiąść do Kontakta.

Dzięki wspomnianemu tutorialowi mapowanie próbek poszło nadzwyczaj sprawnie - ale przyznam, że bez pomocy Davida w życiu sam bym nie doszedł, jak należy całą rzecz przeprowadzić. Instrument gra (i to lepiej niż oryginał, który kompletnie nie był nastrojony, a poza tym nie wypełniał całej gamy), czas zatem na interfejs użytkownika i duże gały do regulowania filtra (pomyślałem, że może być to ciekawe).

Przygotowałem zatem grafikę tła, napisałem metodę "on init" tak, aby się to tło wyświetliło, po czym dodałem w pierwszym kroku dwa suwaki (bo do suwaków można później podpiąć własne pokrętła - kontaktowe pokrętła zaś nie mogą być stylizowane przez użytkownika!) i zaprogramowałem ich działanie dla punktu odcięcia i rezonansu filtra. Wszystko działało bardzo dobrze, zatem przeszedłem do ostatecznego kroku.

W Affinity Designerze przygotowałem rysunek pokrętła na wzór tych z Nucleusa. Wczytałem je do specjalnego programu KnobMan, który potrafi przygotować serię obrazków tworzących animację pokrętła. Tu się trochę namęczyłem, bo na przygotowany kształt pokrętła musiałem nałożyć animowaną linię i znacznik. Po wyeksportowaniu plik graficznego i wrzuceniu go do zasobów instrumentu, wreszcie mogłem podpiąć moje grafiki do zdefiniowanych wcześniej suwaków.

No i instrument gotowy - wystarczyło go teraz tylko spakować i opublikować, chętni zatem mogą go pobrać z tego linku.

Podsumowanie

Fanem budowania instrumentów dla Kontakta raczej nie zostanę, chyba że wpadnie mi do głowy jakiś fajny pomysł. Mimo wszystko przygotowanie nawet tak prostego instrumentu było ciekawym doświadczeniem, a szczerze mówiąc bardziej podobałoby mi się przygotowanie jakiegoś narzędzia, które po pierwsze miałoby edytor z kolorowaniem składni, a po drugie umożliwiałoby wizualne przygotowanie interfejsu użytkownika (i "pod spodem" tworzyłoby i zmieniało wszystkie potrzebne pliki). Podejrzewam zresztą, że tego typu narzędzia gdzieś tam są dostępne, a na pewno firmy dostarczające kontaktowe instrumenty mają swoje edytory, bo nie wierzę, że wszyscy posługują się wyłącznie prostym edytorem w Kontakcie. Tak czy owak, warto było zrobić powyższy eksperyment.

Pomoc dla chcących

Osoby, które chciałyby rozpocząć swoją przygodę z tworzeniem instrumentów dla Kontakta, powinny koniecznie zapoznać się z tutorialem Davida Hilowitza:

0 komentarze:

Publikowanie komentarza