Zanim wygeneruję pierwszą klatkę, rozbieram utwór na części. To najtańszy etap klipu i najczęściej pomijany. Pierwsza wersja jednego z moich klipów dostała ocenę „to pokaz slajdów, nuda”: długie ujęcia obojętne na muzykę. Druga wersja miała 73 ujęcia rozpisane na takty i dopiero ona ruszyła.
W tej lekcji pokazuję, jak robię mapę utworu: dokładną długość, tempo, granice sekcji zmierzone na sygnale, akcenty i momenty na zmianę świata. Z tej mapy w kolejnych lekcjach powstanie storyboard i shot lista.
Krok 1. Trzy odsłuchy, zanim cokolwiek zapiszę
Słucham numeru trzy razy w słuchawkach, za każdym razem z innym zadaniem.
- Odsłuch na emocję, bez kartki. Po skończeniu zapisuję jedno zdanie: o czym jest ten numer i jak ma się czuć widz na końcu. To zdanie wraca potem przy każdej decyzji.
- Odsłuch z tekstem. Mam przed sobą tekst i zaznaczam słowa, które da się pokazać: przedmioty, miejsca, gesty. „Wyjąłem stary keyboard” da się pokazać. „Czułem strach” nie da się pokazać wprost, trzeba to przełożyć na sytuację.
- Odsłuch z licznikiem. Odtwarzam w programie, który pokazuje czas z dokładnością do dziesiątych sekundy (DaVinci Resolve, Audacity, cokolwiek). Zapisuję, kiedy wchodzi perkusja, kiedy zaczyna się refren, gdzie jest pauza, drop, solo instrumentu, ostatnie uderzenie.
Po trzecim odsłuchu mam szkic, ale ucho przesuwa granice o sekundę albo dwie, więc mierzę.
Krok 2. Mierzę, nie zgaduję
Potrzebuję czterech liczb: dokładnej długości pliku, tempa (BPM), długości taktu i granic sekcji. Długość biorę z pliku, który poleci w klipie, nie z wersji demo. Przy jednym z moich klipów utwór miał dokładnie 142,000 s, przy innym 160,000 s. Te liczby wpisuję na górze mapy i pilnuję, żeby każda wersja montażu kończyła się co do klatki.
Granice sekcji wyznaczam na energii sygnału. Uruchamiam prosty skrypt w Pythonie z biblioteką librosa. Liczy głośność w oknach po 0,25 s, wygładza ją i szuka miejsc, gdzie energia najmocniej skacze w górę albo w dół. To są kandydaci na granice, na przykład wejście perkusji albo wyciszenie przed zwrotką.
# mapa.py - tempo, takt i kandydaci na granice sekcji
import sys
import numpy as np
import librosa
plik = sys.argv[1]
y, sr = librosa.load(plik, sr=22050, mono=True)
dlugosc = len(y) / sr
tempo, bity = librosa.beat.beat_track(y=y, sr=sr, units="time")
tempo = float(np.atleast_1d(tempo)[0])
okno = 0.25 # sekundy
hop = int(sr * okno)
rms = librosa.feature.rms(y=y, frame_length=hop * 2, hop_length=hop)[0]
db = librosa.amplitude_to_db(rms, ref=np.max)
gladkie = np.convolve(db, np.ones(8) / 8, mode="same") # wygladzenie ok. 2 s
skok = np.diff(gladkie)
granice = []
for i in np.argsort(np.abs(skok))[::-1]:
t = (i + 1) * okno
if t < 2 or t > dlugosc - 2: # pomijam brzegi pliku
continue
if all(abs(t - g) > 6 for g in granice): # min. 6 s miedzy granicami
granice.append(t)
if len(granice) >= 12:
break
print(f"dlugosc: {dlugosc:.3f} s | tempo: {tempo:.1f} BPM | takt 4/4: {240 / tempo:.3f} s")
for t in sorted(granice):
i = int(t / okno)
przed = gladkie[max(i - 4, 0)]
po = gladkie[min(i + 4, len(gladkie) - 1)]
kierunek = "W GORE" if po > przed else "w dol"
print(f"{t:7.2f} s {przed:6.1f} dB -> {po:6.1f} dB {kierunek}")
np.savetxt("bity.txt", bity, fmt="%.3f")
print(f"zapisano {len(bity)} uderzen do bity.txt")
Uruchamiam go poleceniem python mapa.py utwor.mp3. Wcześniej instaluję zależności: pip install librosa numpy. Wynik porównuję ze szkicem z trzeciego odsłuchu. Tam, gdzie skrypt i ucho się zgadzają, mam pewną granicę. Tam, gdzie się różnią, słucham fragmentu jeszcze raz i decyduję sam. Skrypt nie zna tekstu, więc nie wie, że punchline wypada sekundę po skoku energii.
bity.txt z czasami uderzeń wczytam potem do montażu jako markery.Krok 3. Długość taktu to waluta klipu
W utworach w metrum 4/4 takt trwa cztery uderzenia. Długość taktu w sekundach to 240 podzielone przez BPM. Na tej jednostce opieram długości ujęć, bo cięcie na początek taktu odbiera się jako „w punkt”, a cięcie w połowie uderzenia jako błąd, nawet jeśli widz nie umie powiedzieć dlaczego.
| Tempo | 1 takt | 2 takty | 4 takty |
|---|---|---|---|
| 90 BPM | 2,67 s | 5,33 s | 10,67 s |
| 120 BPM | 2,00 s | 4,00 s | 8,00 s |
| 140 BPM | 1,71 s | 3,43 s | 6,86 s |
| 152 BPM | 1,58 s | 3,16 s | 6,32 s |
Modele wideo generują ujęcia o minimalnej długości (Seedance zaczyna od 4 s). Krótkie cięcia, na przykład seria po jednym takcie w refrenie, robię więc w montażu, przycinając dłuższe generacje. Planuję to od razu: ujęcie, które na ekranie trwa 1,6 s, i tak kosztuje mnie generację 4-sekundową.
Krok 4. Mapa utworu w jednej tabeli
Wszystko składam w tabelę. Jedna linijka to jeden fragment utworu z decyzją, co się wtedy dzieje w obrazie. Tak wyglądał początek mapy w moim klipie do własnego numeru (skrót):
| Sekundy | Co leci w utworze | Energia | Funkcja w klipie | Obraz |
|---|---|---|---|---|
| 0,0-17,5 | sam głos i klawisze, bez perkusji | niska | wprowadzenie bohatera | świt, pokój, bohater wyciąga instrument; długie ujęcia |
| 17,5 | wejście perkusji | skok | zmiana świata | cięcie w czerń i od razu nowy świat, czarno-biały |
| 17,5-44,0 | refren, pełny groove | wysoka | energia, obsada | krótkie cięcia na takt, kilka postaci |
| 41,9-44,0 | opad przed zwrotką | spadek | przejście | światła gasną jedno po drugim |
| 44,0 | zwrotka | średnia | historia | ciepły pokój, ujęcia pod konkretne wersy |
Przy zwrotkach rozpisuję wersy z dokładnością do sekundy i obok każdego wpisuję, czy da się go pokazać. Wersy, których nie da się pokazać wprost, dostają sytuację zastępczą. „A mój zapał cichł po trochu” zamieniłem na bardzo szeroki kadr: mały człowiek w pustym białym studiu.
Krok 5. Co zaznaczam na mapie i co z tego wynika
Każdy znacznik na mapie od razu zamieniam na decyzję w obrazie.
- Wejście perkusji albo drop - zmiana świata, koloru albo lokacji, najmocniejsze cięcie w klipie.
- Początek refrenu - wraca stały motyw wizualny (to samo miejsce, ten sam rekwizyt). Widz ma rozpoznać refren okiem.
- Pauza albo break - bezruch, stopklatka, detal.
- Solo instrumentu - osobna scena, zwykle bez artysty. W jednym klipie około 20 sekund solówki dostało własny wątek z rekwizytem.
- Słowa klucze w tekście - ujęcie pod konkretne słowo, wypadające dokładnie w tej sekundzie.
- Ostatnie uderzenie - ostatni kadr.
Z mapy wyciągam też tempo cięć.
| Energia fragmentu | Średnia długość ujęcia na ekranie | Typ ujęć |
|---|---|---|
| niska (intro, bridge) | 4-8 taktów | szerokie plany, statyw, powolny ruch |
| średnia (zwrotka) | 2-4 takty | plany średnie, ujęcia pod wersy |
| wysoka (refren, drop) | 1-2 takty | zbliżenia, detale, performance |
Protip: Seedance 2.5 przyjmuje referencję audio i dopasowuje do niej rytm ruchu w ujęciu. Kroję utwór na wycinki pokrywające się z granicami z mapy i każdy blok generuję z jego własnym fragmentem muzyki. U jednego dostawcy filtr praw autorskich odbijał pełny miks, więc zostawiam w wycinku samą warstwę perkusyjną (separacja HPSS w librosie). Do sterowania ruchem rytm w zupełności wystarcza.
Krok 6. Z mapy do liczby ujęć i budżetu
Na koniec liczę, ile ujęć potrzebuję. Sumuję fragmenty z mapy według tabeli tempa cięć. Przykład dla utworu 3:00 przy 120 BPM: intro 16 s (2 ujęcia), dwie zwrotki po 32 s (po 8 ujęć), trzy refreny po 16 s (po 8 ujęć), bridge 16 s (2 ujęcia), outro 12 s (2 ujęcia). Razem około 46 ujęć. Do tego doliczam 20-30% zapasu na ujęcia, które nie wyjdą, czyli planuję około 60 generacji.
Ta liczba trafia do wyceny, którą omawiam w ostatnim module. Już na tym etapie widzę, czy klip mieści się w budżecie artysty. Jeśli nie, upraszczam koncepcję: więcej długich ujęć i mniej postaci.
Zadanie: mapa twojego utworu
Weź utwór, do którego chcesz zrobić klip demo (własny albo za zgodą autora). Zrób jego pełną mapę.
- Zrobiłem trzy odsłuchy: na emocję, z tekstem, z licznikiem. Mam zdanie „o czym jest numer”.
- Uruchomiłem skrypt i znam dokładną długość pliku, BPM (sprawdzone ręką) i długość taktu.
- Mam tabelę mapy z kolumnami: sekundy, co leci, energia, funkcja, obraz.
- Zaznaczyłem wejście perkusji, refreny, pauzy, solówki, słowa klucze i ostatnie uderzenie.
- Dla każdego fragmentu wpisałem tempo cięć z tabeli energii.
- Policzyłem liczbę ujęć i dodałem 20-30% zapasu.