[K] Gades MIDI i krzywe CC

Kiedy zaczynałem przepisywać MIDI Tools Hub do Gades MIDI, wydawało się, że temat krzywych CC jest zamknięty i nie do ruszenia. Rozmawiałem nawet o tym z Lukasem Ruschitzka w nadziei, że może zdradzi jakieś nieoficjalne funkcje API Fender Studio Pro, które umożliwią ingerencję w punkty obwiedni CC. Koniec końców doszliśmy tylko do tego, że da się dodać do partii kontroler CC za pomocą importu pliku XML. Hm... Studio Pro umożliwia import punktów CC z pliku XML?

Od pomysłu do przemysłu

Nie byłoby w tym może nic rewolucyjnego, ale ja znałem już podobne pliki XML, bo swego czasu napisałem przecież przeglądarkę plików .song. A skoro tak, gdyby na wzór tych plików, które przecież mogę sobie tworzyć i analizować do woli, obadać, jak konstruować samodzielnie poszczególne elementy XML, to przecież można by "spreparować" odpowiedni pliczek i go zaimportować omawianą wcześniej funkcją!

Obecna wersja Gades MIDI

Uprzedzając nieco fakty - udało się. Faktycznie da się tak zrobić, że jeśli odpowiednio przygotujemy sobie plik XML z danymi punktów CC, to da się je zaimportować do edytora MIDI. Tu jednak przychodzi smutne otrzeźwienie, że owszem, da się to zrobić, ale jednocześnie jest to najbrzydsze rozwiązanie ze wszystkich dotychczasowych.

Największym minusem jest konieczność polegania na tym, że użytkownik wybierze ten sam kontroler zarówno na moim pasku narzędziowym, jak i w edytorze MIDI. Nie ma (a przynajmniej nie udało mi się nijak znaleźć) możliwości programowego ustawienia aktywnej zakładki w edytorze MIDI, więc nie mogę zadbać o to w kodzie. Jakie są konsekwencje? Z edytora MIDI muszę pobrać aktualne punkty, by bazować na nich położenie punktów generowanych, zaś import mogę zrobić tylko na numerze kontrolera pobranego z mojego paska (bo nie mogę sprawdzić, która zakładka jest wybrana w edytorze MIDI). Zatem po wywołaniu funkcji Dynamic Flow nowe, generowane punkty CC trafiają do zakładki kontrolera wskazanego na pasku narzędziowym Gades MIDI, zaś parametry punktów są dopasowane do punktów z zakładki kontrolera widocznego w edytorze MIDI. Jeśli obie rzeczy pokazują to samo - super, wszystko działa bardzo dobrze. Jeśli jednak się to nie zgadza - zdziwiony użytkownik nie zobaczy nowych punktów w edytorze, za to doda mu się nowa zakładka. Dodałem nawet komunikat z przypomnieniem o tym przed dodaniem punktów, no, ale nie jest to eleganckie rozwiązanie...

I cyk, mamy wygenerowane krzywe Modulation (CC1) dla zaznaczonych nut

Takich cichych założeń jest w kodzie więcej, bo po prostu musiałem się na coś zdecydować, a nie nad wszystkim miałem kontrolę. Funkcja zatem działa dobrze DLA MNIE, bo wiem, jak jej używać, jednak dla innych użytkowników może być dość osobliwa... To jest jednak cena pracy z nieoficjalnym i niekompletnym API.

Inne pomysły

A skoro już zacząłem się bawić punktami CC, dość szybko się okazało, że mając otwarty edytor MIDI i wybraną kartę z tego typu kontrolerem, da się zrobić więcej. Da się przeanalizować punkty i je obrobić - dodać, usunąć, przesunąć. Warunek: trzeba obrabiane punkty wcześniej zaznaczyć, bo inaczej sprawdzenie edytora niczego nie zwraca, więc nie ma właściwie nad czym pracować. To akurat nie był duży problem, bo nareszcie byłem w stanie rozwiązać jeden z problemów, które irytowały mnie "od zawsze" w gotowych plikach MIDI: linie ukośne.

Simplify Flow upraszcza przebiegi złożone z regularnych "schodków", zachowując charakter przebiegu

Chodzi o fakt, że standard MIDI nie przewiduje dla kontrolerów CC opisu przebiegu w postaci krzywych. To są punkty. W konkretnym miejscu mamy konkretną wartość, która od tego miejsca obowiązuje. Siłą rzeczy zatem kontrolery, które mają np. płynnie zmieniać wartość, są realizowane za pomocą bardzo dużej liczby punktów upakowanych na małym odcinku, które starają się odwzorować przebieg krzywej. I była ta rzecz, której nie mogłem rozwiązać skryptem czyszczącym wstępnie plik MIDI, bo właśnie... zapisywał on plik MIDI, więc też musiał stosować takie "schodkowe" podejście.

Simplify Flow Triangles służy do wygładzania ostrych "pił", ale raczej należy każdy duży "trójkąt" upraszczać osobno

Co innego, jeśli jesteśmy już wewnątrz DAW. Fender Studio Pro przechowuje punkty CC w swój własny sposób i nie tylko daje możliwość stosowania linii ukośnych, ale wręcz łuków. Tych nie udało mi się na razie rozszyfrować, ale już samo wyczyszczenie nadmiarowych punktów powoduje, że przebieg CC robi się czytelniejszy i - co najważniejsze - dużo prostszy do edycji. Dużo łatwiej manipulować odcinkiem, który ma tylko dwa punkty, niż kiedy tych punktów ma kilkadziesiąt lub kilkaset.

Innym problemem związanym z ułożeniem punktów CC są nagłe skoki, widoczne w edytorze jako duże "schody". Jeśli coś takiego ma miejsce na początku nuty - czyli nuta się zaczyna, a jednocześnie kontroler CC skacze z wartości małej na bardzo dużą - mogą powstawać brzydkie kliki i trzaski. Jest to, rzecz jasna, zależne od biblioteki, ale generalnie w większości przypadków taka kombinacja nie brzmi dobrze. Rozwiązanie jest banalne - wystarczy lewy punkt CC przesunąć nieco w lewo, nawet minimalnie. Spowoduje to, że zanim CC osiągnie wartość maksymalną, DAW musi przesłać do instrumentu wszystkie dane pośrednie, więc i instrument musi sobie z nimi poradzić, co wychodzi mu zwykle dużo lepiej niż przestawienie w jednej chwili wartości skrajnych. Stąd dodałem funkcję likwidującą takie "kwadratowe" przejścia:

Nawet taka stroma krzywa rozwiązuje problem głośnych i nieprzyjemnych "pików"

I ostatni problem, który może dźwiękowo niczego nie zmienia, ale irytuje podczas edycji. Otóż często przy kopiowaniu i wklejaniu punktów obwiedni punkty "łączenia" są powielane i jeśli potem chcemy taki punkt np. podnieść czy opuścić, to chwytamy tylko jeden z nich, co psuje przebieg krzywej. Dorzuciłem więc jeszcze funkcję usuwającą duplikaty, tzn. punkty, które mają takie same czasy i wartości.

Testy, testy

Przyznam, że nie udostępniłem od razu opisanych funkcjonalności, a i teraz, w momencie ich upublicznienia czuję niepokój. Zwłaszcza Dynamic Flow budzi moje zastrzeżenia, bo po prostu działa "na słowo honoru" i nawet ja sam ciągle używam tej funkcji z pewną obawą. Chociaż - co podkreślę - po opracowaniu kilku mock-upów nic złego się na razie nie wydarzyło. Wszystkie funkcje pracują tak, jak to obmyśliłem i szczerze mówiąc, dodatek naprawdę się sprawdza. Tryle, divisi, legato i wspomniane zabawy kontrolerami CC naprawdę oszczędziły mi masę czasu. Wielka szkoda, że nie miałem takiego rozwiązania dwa lata temu - do dzisiaj pamiętam godziny spędzone na "upraszczaniu" modulacji w Beethovenie czy Vivaldim...

Komentarze