Przygotowanie pliku MIDI przy tworzeniu mock-upu
Nagrywając mock-upy MIDI od dłuższego już czasu, znam dobrze "ból" przygotowywania wstępnego pliku do dalszej pracy. Pliki takie, pozyskiwane ze stron https://musescore.com, https://www.kunstderfuge.com czy https://imslp.org, mają szereg cech, które mi osobiście przeszkadzają w dalszej pracy, dlatego poświęcałem sporo czasu na wstępne oczyszczenie pliku MIDI. A co mi tak bardzo przeszkadza?
Zbiorcze zestawienie "wad", powszechnie spotykanych w plikach MIDI
Program Change i Control Change
Podstawowym problemem są zbędne komunikaty Program Change i Control Change. Pierwsze służą do ustawienia brzmienia/instrumentu na danym kanale MIDI i po prostu ich nie potrzebuję - wiem, co która ścieżka ma grać i o wyborze instrumentu decyduję, przeciągając odpowiedni preset ścieżki do projektu.
Nadmiarowe komunikaty Control Change to zaś prawdziwa zmora. Niektóre pliki MIDI mają tego całą masę, jakieś dziwne Data Entry, Dump Entry czy jeszcze inne. Najbardziej jednak irytujące są CC7 i CC10, czyli odpowiednio głośność i panorama. A irytujące są dlatego, że większość bibliotek orkiestrowych na nie reaguje (w tym np. Kontakt), czyli ni z tego, ni z owego możemy zacząć słyszeć skrzypce ze skrajnie lewej strony czy kontrabasy ze skrajnie prawej i machanie pokrętłami w instrumencie czy w mikserze programu DAW nic nam nie da.
Na podobnej zasadzie mogą "szkodzić" pozostałe komunikaty CC, bo nigdy nie możemy być pewni, na które z nich nasze biblioteki są czułe i mogą się wówczas zachowywać nieprzewidywalnie.
Najbezpieczniej pozostawić sobie CC1 (modulacja) i CC11 (ekspresja), ewentualnie jeszcze CC2 (czasem odpowiada za dynamikę, czasem za vibrato). Resztę najlepiej wyrzucić jeszcze przed przypisaniem do ścieżki biblioteki, by uniknąć ryzyka przypadkowego wysłania tych komunikatów do instrumentu.
Nadmiar punktów CC1/CC11
Jeśli nam się trafił plik z już zdefiniowanymi komunikatami CC1/CC11, często są one rozmieszczone bardzo gęsto, chociaż wartość parametru się nie zmienia. Podczas późniejszej edycji trzeba wiele z tych punktów usuwać, bo są zbędne i utrudniają rysowanie krzywych (a krzywe bardzo się przydają np. do budowania naturalnych zmian crescendo/diminuendo).
Zagęszczone są także punkty mające "odtwarzać" krzywe - czyli właśnie jakieś stopniowanie parametru. Standard MIDI nie przewiduje krzywych - można dodawać tylko punkty o określonej wartości, więc chcąc oddać linię ukośną, trzeba po prostu dodać wiele punktów o rosnących/malejących wartościach. Nie wiem, czy standard MIDI 2.0 rozwiązał tę kwestię, ale zdecydowana większość istniejących plików MIDI jest wciąż w starszym standardzie.
Dobrze było zatem mieć jakiś mechanizm usuwający zbyt gęsto rozmieszczone punkty CC1/CC11 - tak, by charakter krzywej był oddany, ale za pomocą kilku-kilkunastu punktów, które łatwo usuniemy i zastąpimy w DAW krzywą.
Brak CC1/CC11
Te dwa komunikaty, czyli modulacja i ekspresja, są podstawą przy kształtowaniu dynamiki utworu, więc dobrze, by już były w pliku, nad którym zaczynamy pracę. Chodzi o to, by w aranżacji na 20-30 ścieżek nie wchodzić do każdej z nich i nie dodawać ręcznie punktów CC1/CC11. A jest to istotne, zwłaszcza dla niektórych bibliotek - ja mam problemy np. z bibliotekami od Spitfire, które często domyślne wartości CC1/CC11 mają ustawione dość dziwnie i nieraz zdarzało mi się, że pracowałem dłuższy czas nad utworem, by odkryć, że biblioteka gra z jakimś bardzo niskim poziomem ekspresji, bo nie było to ustawione. I część pracy trzeba było powtarzać, bo po właściwym ustawieniu ekspresji dźwięk długich i krótkich artykulacji przestawał do siebie pasować.
Fajnie zatem, gdyby każda ścieżka w pliku MIDI miała oba te komunikaty "dodane z marszu" i wysterowane za każdym razem tak samo.
Krótkie niby-nutki
Prawdziwa zmora niektórych plików MIDI - malutkie nutki, długie na dosłownie parę tzw. ticków, zasłonięte długimi nutami. Jeśli próbujecie odtwarzać jakąś linię artykulacją legato i niektóre dźwięki po prostu "nie grają", mimo że w DAW widać, że kursor przez nie przechodzi i grać powinny, to w 99,9% przypadków wina malutkich niby-nutek, które znajdują się w tym samym punkcie czasowym. Często z powodu ich krótkości po prostu są niewidoczne, dopiero odsunięcie na bok długiej nuty pokazuje, że coś tam jest pod spodem.
I znów, ręczne pozbywanie się ich z każdej ścieżki jest męczące, więc dobrze, gdyby nasz plik był wolny od tego typu śmieci już na starcie.
Stałe velocity
No i ostatnia sprawa - maszynowe velocity. Spotykane w sieci pliki MIDI mają z reguły velocity ustawione jak od linijki - 50 nut spiccato jedna po drugiej, wszystkie z velocity=76, to proszenie się o efekt karabinu maszynowego, nawet jeśli nasza biblioteka ma długą listę round-robin.
Z tego właśnie powodu przez długi czas używałem funkcji randomizacji velocity w samym Studio One, ale czasem o tym zapominałem i dopiero przy odsłuchiwaniu gotowego utworu po pewnym czasie w ucho rzucała się dziwna "sztuczność" - w większości przypadków wynikała ona właśnie z takiego stałego i niezmiennego velocity.
Rozwiązanie problemów
Część problemów przez długi czas rozwiązywałem ręcznie - miałem specjalne makra do usuwania przeróżnych CC, korzystałem z opcji randomizacji, wyszukiwałem ręcznie niby-nutki i je kasowałem i tak dalej, i tak dalej. Ale coraz częściej stawało się jasne, że lepiej byłoby po prostu startować z już wstępnie spreparowanym i oczyszczonym plikiem MIDI. I tak, krok po kroku, budowałem sobie skrypt midicleaner w Pythonie, bo - korzystając z biblioteki mido - można otwierać i edytować pliki MIDI. Najpierw oczyszczałem plik ze zbędnych komunikatów CC, potem przyszła pora na "wygładzanie" danych CC1/CC11, by pozbyć się zbędnych, niczego nie zmieniających punktów. Na koniec doszła randomizacja velocity i dodawanie CC1/CC11, jeśli ich w pliku nie było. A, i jeszcze, gdy okazało się, że sporo plików MIDI ma dynamikę zapisaną w CC2 zamiast CC1, dodałem algorytm przepisujący CC2 do CC1 (jeśli, rzecz jasna, CC1 nie istnieją dla danej ścieżki)
Skrypt można pobrać za pomocą tego linku, tylko trzeba zadbać przed uruchomieniem o zainstalowanie biblioteki mido, co korzystając z pip osiąga się tak:
python -m pip install mido
Przy wywołaniu skryptu midicleaner należy podać pełną ścieżkę do bazowego pliku MIDI, a jako drugi parametr można, ale nie trzeba, podać nazwę pliku wynikowego. Jeśli wynikowej nazwy nie będzie, skrypt stworzy nazwę samodzielnie, dodając do nazwy bazowej dopisek "_out" lub "_random", w zależności od trybu uruchomienia.
Tryb ten ustawiany jest w samym skrypcie, przy wywołaniu metody process_midi() i domyślnie parametr randomize jest ustawiany na True. Oznacza to, że wartości velocity będą randomizowane na poziomie ok. 3% wartości. Jeśli chcemy zachować oryginalne velocity, trzeba randomize ustawić na False.
Plik "oczyszczony" i gotowy do dalszej pracy
W tym miejscu uwaga do obrazka powyżej - pokazany tam przebieg krzywej modulacji CC1 jest już po ręcznej edycji, omawiany skrypt nie zrobi czegoś takiego automatycznie właśnie ze względu na ograniczenia standardu MIDI, który nie daje możliwości zdefiniowania przebiegu jako krzywej (czy w tym wypadku - odcinka pod kątem).
Wyjaśnienie
Zdaję sobie sprawę, że mało osób będzie miało tyle samozaparcia, by zainstalować Pythona i nauczyć się wykonywać z jego pomocą powyższy skrypt, ale dlatego poświęciłem niema cały wpis na opisanie samych problemów do rozwiązania. Myślę, że świadomość ich istnienia i objawów też może być cenną wiedzą, ułatwiającą pracę nad mock-upami. A jeśli ktoś skorzysta ze skrypty, to tym lepiej.


Komentarze
Prześlij komentarz