Wiele Żywych Pętli

Przyjrzyjmy się następującej żywej pętli:

live_loop :foo do
  play 50
  sleep 1
end

Być może zastanawiałeś się, dlaczego konieczna jest nazwa :foo. Nazwa ta jest ważna, ponieważ oznacza, że ta konkretna żywa pętla jest inna od wszystkich innych żywych pętli.

W tym samym czasie nie mogą być uruchomione dwie żywe pętle o tej samej nazwie.

Oznacza to, że jeśli potrzebujemy kilku jednocześnie kręcących się żywych pętli, to po prostu musimy nadać im inne nazwy:

live_loop :foo do
  use_synth :prophet
  play :c1, release: 8, cutoff: rrand(70, 130)
  sleep 8
end
live_loop :bar do
  sample :bd_haus
  sleep 0.5
end

Możesz teraz aktualizować i zmieniać każdą z żywych pętli niezależnie - i wszystko będzie po prostu działać.

Synchronizacja Żywych Pętli

Jedną z rzeczy, które być może już zauważyłeś, jest to, że żywe pętle działają automatycznie z mechanizmem punktów cue dla wątków, które poznaliśmy już wcześniej. Za każdym razem, gdy żywa pętla wykona jedno okrążenie, generuje nowe zdarzenie cue, nadając mu nazwę taką samą, jaką nadaliśmy żywej pętli. Możemy więc synchronizować się z wykorzystaniem funkcji sync na każdym zdarzeniu cue, aby upewnić się, że nasze pętle są zsynchronizowane, bez konieczności zatrzymywania czegokolwiek.

Spójrzmy na poniższy kod, który został źle zsynchronizowany:

live_loop :foo do
  play :e4, release: 0.5
  sleep 0.4
end
live_loop :bar do
  sample :bd_haus
  sleep 1
end

Zobaczmy, czy możemy naprawić chronometraż (timing) bez zatrzymywania. Najpierw naprawmy pętlę :foo, tak aby sprawić, że wartość parametru sleep będzie współczynnikiem liczby 1 - coś jak 0.5 powinno być okej:

live_loop :foo do
  play :e4, release: 0.5
  sleep 0.5
end
live_loop :bar do
  sample :bd_haus
  sleep 1
end

To jeszcze nie koniec - powinieneś zauważyć, że uderzenia nie do końca ustawiają się odpowiednio. Dzieje się tak, ponieważ pętle nie są synchronizowane. Spróbujmy to naprawić przez ich synchronizację:

live_loop :foo do
  play :e4, release: 0.5
  sleep 0.5
end
live_loop :bar do
  sync :foo
  sample :bd_haus
  sleep 1
end

Łał, teraz wszystko działa perfekcyjnie w czasie - i to wszystko bez zatrzymywania.

A teraz nie zatrzymuj się i koduj na żywo z wykorzystaniem żywych pętli!