Teraz nauczyliśmy się już wystarczająco dużo, aby rozpocząć prawdziwą zabawę. W tym rozdziale będziemy czerpać ze wszystkich poprzednich i pokażę Ci, w jaki sposób możesz zacząć tworzyć swoje własne kompozycje muzyczne na żywo i zmienić je w występy na żywo. Będziemy do tego potrzebować 3 podstawowych składników:
W porząsiu, zaczynamy. Spróbujmy zakodować na żywo nasze pierwsze dźwięki. Najpierw potrzebujemy funkcję zawierającą kod, który chcemy zagrać. Zacznijmy od czegoś prostego. Potrzebujemy również, aby każda pętla wywołująca tę funkcję była uruchamiana w nowym wątku:
define :my_sound do
play 50
sleep 1
end
in_thread(name: :looper) do
loop do
my_sound
end
end
Jeśli powyższy kawałek kodu wydaje Ci się zbyt skomplikowany, wróć z powrotem i ponownie przeczytaj rozdziały dotyczące funkcji i wątków. Gdy to zrobisz i uda Ci się dobrze zrozumieć te 2 tematy, to powyższy kawałek nie powinien sprawić Ci żadnych kłopotów.
To, co mamy powyżej, to nic innego jak funkcja, która po prostu gra nutę o wartości 50 i następnie czeka 1 uderzenie. W kolejnym kroku mamy definicję wątku nazwanego :looper
, który po prostu kręci się w kółko i uruchamia funkcję my_loop
.
Gdy uruchomisz ten kod, usłyszysz nutę 50, która powtarza się i gra w kółko…
Teraz czas na moment, w którym zaczyna się cała zabawa. W momencie, gdy kod jest wciąż uruchomiony, spróbuj zmienić liczbę 50 na inną, powiedzmy 55, następnie naciśnij przycisk Run jeszcze raz. Łał! To się zmieniło! Ten kod żyje!
Nowa warstwa dźwięku nie została dodana, ponieważ korzystamy z nazwanych wątków, co pozwala tylko na jeden wątek dla jednej nazwy. Ponadto, dźwięk się zmienił, ponieważ przedefiniowaliśmy funkcję. Nadaliśmy funkcji :my_loop
nową definicję - znaczenie. Kiedy wątek :looper
przekręci się po raz kolejny, to w następnej iteracji zostanie zawołana funkcja o nowej definicji.
Spróbuj zmienić ją ponownie, zmień nutę, zmień wartość parametru, jaki przekazujemy do funkcji sleep. Co powiesz na dodanie polecenia use_synth
? Na przykład zmieńmy kod w taki sposób:
define :my_loop do
use_synth :tb303
play 50, release: 0.3
sleep 0.25
end
Brzmi to całkiem ciekawie, ale możemy urozmaicić to jeszcze bardziej. Zamiast grać w kółko tę samą nutę, spróbujmy zagrać akord:
define :my_loop do
use_synth :tb303
play chord(:e3, :minor), release: 0.3
sleep 0.5
end
A co powiesz na granie losowych nut z akordu:
define :my_loop do
use_synth :tb303
play choose(chord(:e3, :minor)), release: 0.3
sleep 0.25
end
Albo użycie losowej wartości dla parametru odcięcia (cutoff):
define :my_loop do
use_synth :tb303
play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
sleep 0.25
end
I na sam koniec dodajmy trochę bębnów:
define :my_loop do
use_synth :tb303
sample :drum_bass_hard, rate: rrand(0.5, 2)
play choose(chord(:e3, :minor)), release: 0.2, cutoff: rrand(60, 130)
sleep 0.25
end
Teraz zabawa zaczyna być naprawdę ekscytująca!
Jednakże zanim zamkniesz tutorial i zaczniesz kodować na żywo z wykorzystaniem funkcji i wątków, zatrzymaj się na chwilę i przeczytaj kolejny rozdział dotyczący funkcji live_loop
, która zmieni Twój sposób kodowania w Sonic Pi na zawsze…