[K] Moje narzędzia muzyczne

Teoretycznie producenci oprogramowania dają możliwość użytkownikom zgłaszania nowych potrzeb i oczekiwań. I nawet je niekiedy realizują - problem jest tylko taki, że zwykle jest to robione w drodze głosowania. Który pomysł zdobędzie więcej poparcia, ten jest realizowany wcześniej. Nie mówię, że to źle - ale w ten sposób osoby, które mają specyficzne wymagania, mogą czekać wiecznie, bo zawsze coś będzie bardziej "nośne".

Mam tak od dłuższego czasu ze Studio One, czyli Fender Studio Pro. Zgłaszam, czekam i nic. Niestety, ten DAW nie posiada żadnego API, obsługi jakiegokolwiek silnika skryptowego, a dostępne makra są zazwyczaj zbyt ograniczone. Także do schowka dane są wstawiane w zamkniętym formacie, więc nic stamtąd nie wyciągniemy. Sytuacja bez wyjścia, zdawałoby się.

Python dobry na wszystko

Okazało się, że istnieje częściowe rozwiązanie. Tym rozwiązaniem jest... zakładka Files w Fender Studio Pro. Otóż możemy przeciągać na nie zdarzenia czy nuty, a DAW zamieni je na pliki musicloop lub po prostu MIDI (kiedy przytrzymamy wciśnięty Alt). W czym to niby ma pomóc? Ano w tym, że można wykorzystać jakiś jeden konkretny folder, na którym będziemy... nasłuchiwać. I przetwarzać pojawiające się tam pliki.

Python nadaje się do tego zadania bardzo dobrze, bo po pierwsze, ma mechanizm nasłuchiwania na wskazanym folderze, a po drugie, ma bibliotekę mido, która potrafi czytać i zapisywać pliki MIDI. Jeśli dodać do tego możliwość wyświetlenia okienka, rodzi się dość karkołomny, ale działający pomysł.

Niedoceniana zakładka Files w Fender Studio Pro

Otóż - chcemy przetworzyć poza Fender Studio Pro jakieś dane, np. nuty z piano-roll. Zaznaczamy je i przeciągamy na folder w zakładce Files, tworzony jest plik MIDI, który zostaje wykryty i wczytany przez nasz skrypt pythonowy. Skrypt robi z nim to, co chcemy (np. modyfikuje jakąś funkcją początki nut albo velocity) i zapisuje to do innego pliku, gdzieś w katalogu TEMP, w swoim okienku dając nam do dyspozycji niepozorny panel. Panel, który możemy za pomocą drag'n'drop przeciągnąć na okno Fender Studio Pro - i nasz DAW nagle traktuje to jak klip midi i pozwala osadzić w oknie projektu! Czyli trochę naokoło, ale mamy pewną integrację!

Co można w ten sposób zrobić? Masę rzeczy, a to, czego używam, opiszę poniżej.

Chociaż narzędzie poniżej początkowo pisałem z myślą tylko o nasłuchiwaniu na katalogu i współpracy z Fender Studio Pro, to po czasie przekonałem się, że dobrze jest także móc po prostu przeciągnąć plik MIDI na konkretną zakładkę i przetworzyć go za jej pomocą. W ten sposób narzędzie mogę wykorzystywać niezależnie od Fender Studio Pro.

Wykrywanie tonacji

Tego typu "pomocnika" napisałem już ładnych parę lat temu w Javie. Miał on trochę inne zadanie, ale zasadniczo chodziło w nim o ułatwienie sobie pisania muzyki - po wyborze tonacji program podpowiadał akordy stowarzyszone z ową tonacją (na podstawie koła kwintowego).

Tonacja i podstawowe akordy

Teraz działa to tak, że przeciągam np. linię melodii na pole Files w Fender Studio Pro i mój "asystent" od razu próbuje rozpoznać tonację, pokazuje popularne akordy dla każdego stopnia skali, a każdy kolorowy "kafelek" można po prostu przeciągnąć wprost na okno projektu i dostaniemy klip z akordem. Przeciągnięcie głównego pola spowoduje przeniesienie od razu wszystkich głównych akordów, dla każdego stopnia.

Trills

Standardowe pliki MIDI mają tryle zapisane w bardzo uproszczonej postaci - po prostu jako bardzo gęste, naprzemienne krótkie dźwięki:

"Maszynowy" tryl

Rzecz jasna, próba odtworzenia czegoś takiego skutkuje mało naturalnym efektem - raz, że dźwięki są równiutkie, to jeszcze velocity jak z karabinu maszynowego.

Napisałem zatem "generator tryli", głównie na potrzeby bibliotek, które nie dysponują dedykowanym artykulacjami (wiadomo, nagrany tryl zawsze zabrzmi lepiej). No, ale jak to działa? Przeciągam na Files nutę o długości przyszłego tryla i o jego wysokości, "asystent" to łapie i w oparciu o swoje ustawienia buduje tryl:

Garść parametrów do sterowania postacią trylu

Można, rzecz jasna, przeciągnąć po prostu cały stary tryl, co będzie jeszcze lepsze, bo "asystent" wyciągnie z tego informację o typie (półtonowy, całotonowy) i "erze", jak to nazwałem. Chodzi bowiem o to, że w baroku tryle zaczynało się od wyższego tonu, a kończyło na niższym, natomiast w romantyzmie zaczynało się od niższego tonu i na nim kończyło.

Zbudowany tryl różni się od początkowego - zmieniają się długości nut, dążąc do kulminacji w ok. 2/3 długości tryla, tak samo zmienia się parametr velocity:

Tryl ze zmienną dynamiką i długością nut

Widoczna opcja Auto-detect all trills sprawia, że możemy wrzucić do "asystenta" całą partię albo wręcz wszystkie partie, a on postara się wykryć i "podmienić" wszystkie istniejące tam "mechaniczne" tryle.

Basso Continuo

Zderzyłem się już z mnóstwem partytur, gdzie brakuje linii akompaniamentu (np. dla lutni czy klawesynu), zaś jest wyłącznie basso continuo. Pokopałem trochę i napisałem sobie "generator", który w oparciu o znane reguły (np. Regola dell'Ottava) buduje akordy, korzystając z linii basso continuo, posiłkując się pozostałymi głosami utworu.

Zakładka niezbyt imponująca - po prostu dużo się dzieje w tle i nie wymaga dodatkowych parametrów

Nie jest to może jakaś niesamowita rewelacja, ale dla moich prostych mock-upów wystarcza.

Wersja oryginalna

Wersja z dodatkową, wygenerowaną ścieżką

Eksperymentalnie dodałem też "strumming", czyli delikatne opóźnienie kolejnych dźwięków w akordzie z coraz mniejszą wartością velocity, co ma symulować grę na lutni.

Legato

Niektóre biblioteki orkiestrowe do poprawnego odtworzenia legato potrzebują "nakładania się" nut, to znaczy jedna musi jeszcze chwilkę trwać, a już musi zaczynać się kolejna. Teoretycznie Fender Studio Pro posiada możliwość modyfikowania nut, aby się nieco nakładały - niestety, zrobiono go bezmyślnie, bo nakładają się także nuty o tej samej wysokości, czyli nachodzą na siebie. Dobre legato z tego nie powstanie.

Mój "asystent" jest sprytniejszy - nuty o różnych długościach wydłuża o zadaną wartość, ale jeśli mamy dwie takie same nuty, to ta wcześniejsza nie zostanie wydłużona, żeby się nie "zderzyć" z nutą następującą.

Legato nie ma wielu opcji, ale już tak mało - wystarcza

Jak widać, to nie wszystko. Wbudowałem sobie dodatkowy tryb dla bibliotek Spitfire (a może i innych, o Spitfire wiem z doświadczenia). Otóż "silnik" od Spitfire nie radzi sobie w sytuacji, gdy mamy właśnie następujące po sobie dwie takie same nuty legato. Jeśli przerwa między nimi jest krótsza niż 50ms, druga nuta nie zostanie odtworzona lub zostanie odtworzona "od połowy". Jeśli zatem przygotowuję legato dla BBC lub Appassionaty, zaznaczam opcję i pierwsza nutka będzie się zawsze kończyła ok. 55ms przed kolejną o tej samej wysokości. Stąd zresztą pole do wpisania tempa (jeśli nie zostanie prawidłowo wykryte). Wielkość "skrócenia" nuty trzeba sobie wyliczyć z tempa.

Velocity

Kopiowanie velocity między nutami to nie jest trywialne zadanie. W Fender Studio Pro - niemożliwe do zrobienia. Więc jeśli pracowicie ustawialiście ten parametr dla jakiegoś ostinato, a potem takich samych ostinato macie w partyturze więcej, ale np. z innymi nutami (na innych pozycjach), to można gryźć palce z niemocy. Rozwiązałem to tak: przeciągam taką gotową grupę nut (z ustawionymi prawidłowo velocity) do pola Files. "Asystent" przechwytuje to i wyświetla rozpoznane nuty oraz ich velocity w postaci pasków.

Białe paski reprezentują "wzorcowe" nuty z ustawionym velocity

Wystarczy teraz do Files wrzucić nuty, które mają "przejąć" velocity i tyle. Jeśli nut będzie więcej niż w oryginale, to zaznaczenie pola Loop Pattern spowoduje powtórzenie oryginału tyle razy, ile trzeba. Jeśli ruszę suwakiem Randomizer, podczas przepisywania velocity każda wartość będzie randomizowana w wybranym zakresie procentowym.

Aby takie wynikowe nuty łatwiej wklejać projektu w DAW, dodałem domyślną opcję Enable Transpose, która transponuje wynik, aby można go było scalić z oryginalnym fragmentem i potem usunąć oryginalne nuty, a na ich miejsce przesunąć nowe.

Cleaner

I na koniec czyszczenie. To jest nieco rozwinięta forma skryptu, który opisywałem jakiś czas temu. Chodzi o pozbycie się pewnych problemów z danych MIDI: niepotrzebnych kontrolerów CC, zbyt krótkich nutek, zbyt mechanicznego velocity itp. Po co umieściłem Cleanera w tym narzędziu? Bo często się zdarzało w praktyce, że zapominałem oczyścić jakiś plik MIDI, wczytywałem go do DAW, po czym się orientowałem, że jest on nieoczyszczony. I znów, zamykamy plik, czyścimy, otwieramy ponownie - strata czasu. A wystarczy po prostu przeciągnąć wszystkie ścieżki na pole Files, zaś "asystent" zajmie się resztą.

Oczyszczanie ścieżek MIDI i dodatkowy profit - możliwość separacji divisi

Dodatkową opcją, której nie miał skrypt sprzed miesięcy, jest funkcja divisi. Otóż często internetowe pliki MIDI mają łączone linie, np. dwa oboje na jednej ścieżce (takie "podwójne nuty"). Niby można tak grać, ale co, jeśli jeden obój ma grać tryl, a drugi w tym czasie długą nutę? Nie da się naraz ustawić dwóch artykulacji. Wtedy można taką ścieżkę także wrzucić do Cleanera, a ten powinien rozpoznać łączenie i "rozszyć" ścieżkę na dwie osobne. Jeśli dodatkowo mamy zaznaczoną opcję Copy divisi (Unisono), to w miejscach, gdzie są tylko pojedyncze nuty, zostaną one skopiowane na drugą ścieżkę, więc instrumenty będą grały unisono. Przy wyłączonej tej opcji, druga ścieżka będzie zawierała tylko materiał złożony z "dolnych" nut.

Bonus - MIDI Viewer

A na koniec taki zupełny drobiazg - dzięki temu, że Python oferuje bibliotekę mido, całkiem sprawnie przyszło mi napisanie prostej przeglądarki do plików MIDI. Tak to bywa, że kiedy się ma tych plików tyle, to ciągłe otwieranie ich w programie DAW jest bardzo irytujące. Zwykle albo tworzą się niepotrzebne pliki czy katalogi, trzeba odpowiadać na dodatkowe pytania (np. czy utworzyć instancje instrumentów dla poszczególnych ścieżek) - jednym słowem: zamieszanie. Tymczasem potrzebny jest zwykle tylko rzut oka, żeby sprawdzić liczbę ścieżek, czy są jakieś nuty na tych ścieżkach, ile trwa utwór i tym podobne.

MIDI Viewer służy właśnie do tego - otwieramy w nim dowolny plik MIDI i od razu widzimy, ile ma ścieżek, jakie są zdefiniowane kontrolery CC, gdzie są jakie nuty, ile trwa utwór, jakie ma tempo. I to w zasadzie wystarcza, żeby się zorientować, z czym mamy do czynienia. Rzecz jasna, nie ma tu żadnego odtwarzania - jak "viewer", to "viewer", a nie "player". Z reguły orkiestrowe pliki MIDI odtwarzane na jakichś syntetycznych instrumentach brzmią fatalnie, a trzeba by to jakoś obsłużyć + obsługa głośności, wybór interfejsu audio i tak dalej, i tak dalej... Kompletnie niepotrzebny nakład sił.

Bonus II - Audio Viewer

Coś, wydawałoby się, zupełnie zbędnego, bo przecież jakiś odtwarzacz audio każdy w komputerze ma. A zdecydowana ich większość potrafi wyświetlać metadane i inne informacje o pliku audio. Diabeł, jak zwykle, tkwi w szczegółach.

Podobnie jak w przypadku plików MIDI, chciałem mieć coś, co potrafi szybko otworzyć plik audio i pokazać to, na czym mi zależy: metadane, osadzoną okładkę, parametry pliku - i to najlepiej od razu, bez szperania po opcjach czy dodatkowych okienkach:

A skoro już coś takiego zrobiłem, to dodałem sobie od razu pomiar głośności LUFS (realizowany tak naprawdę przez ffmpeg, ale można łatwo pobrać wyniki jako plik JSON i wyciągnąć, co się chce). Jako wisienkę na torcie potraktowałem dodatkową zakładkę z podglądem graficznym plku, co pozwala mi bez odsłuchu ocenić, czy i co się w tym pliku znajduje.

Obie przeglądarki uruchamiają się błyskawicznie, obie można zamknąć klawiszem Esc, obie obsługują zarówno drag'n'drop, jak i uruchamianie z parametrem. Na chwilę obecną mają wszystko, czego potrzebuję.

To nie wszystko

Oczywiście, to nie wszystkie narzędzia, bo nie każde narzędzie potrzebuje ładnego okienka. Część z nich pozostała jako skrypty - na przykład skrypt normalizujący głośność do -15LUFS, korzystający z silnika Reapera i możliwości, które to stwarza. Z tych ciekawszych mogę napisać o skrypcie do okładek, bo bardzo upraszcza mi on życie.

Otóż gdy wrzucam muzykę na YouTube'a, muszę przygotować plik wideo, bo YouTube nadal nie przyjmuje plików audio. Dawno temu robiłem to za pomocą DaVinci Resolve, czyli przygotowywałem grafikę, wrzucałem razem z audio do DaVinci, rozciągałem grafikę na cały timeline i renderowałem plik mp4 do publikacji. Łatwo sobie wyobrazić, że nie było to szybkie, zwłaszcza na starym komputerze i przed RTX3060, kiedy renderowanie trwało i trwało.

Potem odkryłem, że właśnie program ffmpeg świetnie nadaje się do podobnych celów, co zresztą skrzętnie opisałem. Wystarczy połączyć plik audio z plikiem graficznym, a reszta zadzieje się w tle, i to dużo szybciej, bo nie są wymagane żadne re-kompresje, ffmpeg po prostu opakuje pliki w kontener mp4 i to działa!

Wciąż jednak pozostawała sprawa okładki. Jej ręczne przygotowanie trwa - na główny kanał mogę wrzucać takie ręcznie robione okładki, ale na kanał testowy to już byłaby przesada, bo tam nagrań pojawia się dużo więcej (główny kanał dobija do setki, GadesTester istnieje od pół roku, a ma dwa razy więcej filmów!), a okładka nie ma aż takiego znaczenia estetycznego, raczej informacyjne.

Wymyśliłem zatem sposób, jak automatycznie generować okładki, ale tak, by różniły się one między sobą w zależności od zawartości. Fender Studio Pro daje możliwość ustawienia metadanych projektu, które potem są zapisywane w renderowanym pliku. Idea była zatem prosta: przy opracowywaniu utworu, jednym z kroków jest staranne uzupełnienie metadanych. Robię to raz i później każdy render ma już te dane. Poza oczywistymi tytułem i artystą, uzupełniam też album, który w moim przypadku zawiera informację o głównej wykorzystywanej bibliotece, oraz pole kompozytora, gdzie wpisuję sobie znacznik "typu" utworu - orkiestrowy, organowy, klawiszowy, opisywałem to niedawno.

Po wyrenderowaniu pliku audio uruchamiam zatem skrypt, który czyta metadane i na ich podstawie (np. "(WIP)" w nazwisku artysty, pola kompozytora czy pola z nazwą albumu/biblioteki) dobiera odpowiednie tło z kilkunastu przygotowanych szablonów, wypisuje na nim napisy określonym krojem pisma itd, w skrócie - tworzy pełną okładkę, która następnie po pierwsze służy do wygenerowania pliku wideo mp4, a po drugie służy do osadzenia w wynikowym pliku mp3, który wrzucam sobie na dysk Google'a, żeby móc kontrolnie przesłuchać nagranie na telefonie lub w samochodzie.

Małe narzędzia, a przydatne

I znów okazuje się, że umiejętność programowania popłaca. W teorii jest na pewno mnóstwo programów, które robią omówione rzeczy (i to na pewno lepiej), choćby taki Cubase sam w sobie załatwia dużą część problemów. W dodatku posługiwanie się plikami MIDI i jakieś dziwne "nasłuchiwanie" na katalogu - brzmi to mało poważnie. Ale ostatecznie działa i jest póki co jedyną metodą ułatwiania sobie pracy w Fender Studio Pro.

A MIDI Viewer jest sam w sobie fajnym narzędziem i wielokrotnie bardzo go doceniałem.

Powyższy artykuł jest bardziej dla mnie, jako rodzaj dokumentacji - żadnego z tych programów nie mam zamiaru rozpowszechniać, na to są zdecydowanie za słabe. Zresztą, chyba już kiedyś pisałem, że zniechęciłem się do udostępniania swoich programów. Nie mam czasu na ich regularne utrzymywanie czy rozbudowę, a potencjalni użytkownicy - takie ich prawo - chcieliby zobaczyć coś, co z kolei im by się przydało. Dlatego niech będzie, że się tylko chwalę.

Komentarze