Рассмотрим следующий живой цикл:
live_loop :foo do
play 50
sleep 1
end
Вы, наверное, заинтересовались, почему он называется :foo
. Это имя имеет значение, поскольку оно показывает, что этот живой цикл отличается от всех других живых циклов.
Не может быть двух живых циклов, выполняющихся под одним именем.
Это значит, что если мы хотим иметь несколько одновременно выполняющихся циклов, нам просто нужно дать им разные имена:
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
Теперь можно обновлять и изменять каждый живой цикл отдельно и всё будет прекрасно работать.
Есть один важный момент, который вы, наверное, уже заметили - все живые циклы автоматически работают с механизмом распарралеливания потоков, который мы исследовали ранее. Всякий раз, когда живой цикл начинает выполняться, он генерирует новое cue
событие с названием цикла. Следовательно, мы можем sync
эти сигналы, чтобы гарантировать нашим циклам синхронизацию без необходимости что-либо останавливать.
Рассмотрим этот плохо синхронизированный код:
live_loop :foo do
play :e4, release: 0.5
sleep 0.4
end
live_loop :bar do
sample :bd_haus
sleep 1
end
Давайте посмотрим, сможем ли мы исправить тайминг и синхронизировать его без остановки воспроизведения. Сначала исправим время сна в цикле :foo
на что-то вроде 0.5
:
live_loop :foo do
play :e4, release: 0.5
sleep 0.5
end
live_loop :bar do
sample :bd_haus
sleep 1
end
Но мы ещё не совсем закончили, ведь вы заметили, что такты пока не выстроились правильно. Это происходит потому, что циклы не в фазе. Давайте исправим это, синхронизировав один цикл с другим:
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
Ого, теперь всё прекрасно синхронизируется по времени и всё это без остановки.
А теперь вперёд! Кодируйте вживую с живыми петлями!