Sekcja 5.7 wprowadziła funkcje cue
i sync
, mieliśmy wtedy do czynienia z problemem synchronizacji wątków. To co nie zostało wytłumaczone to fakt, że funkcjonalność ta jest zapewniona przez system Stanu Czasu (Time State). Tak się właśnie dzieje gdyż funkcja set
jest w zasadzie wariacją funkcji cue
i jest zbudowana na bazie tej samej podstawowej funkcjonalności, która pozwala na umieszczenie informacji w systemie Stanu Czasu. Ponadto, sync
jest również zaprojektowany w taki sposób, że działa bezproblemowo z Stanem Czasu - do każdej informacji, którą chcielibyśmy umieścić w Stanie Czasu, możemy się zsynchronizować. Innymi słowy - synchronizujemy się (sync
) na zdarzeniach, które będą umieszczone w Stanie Czasu.
Spróbujmy spojrzeć szybko jak należy używać polecenia sync
aby móc poczekać aby nowe zdarzenia zostały dodane do Stanu Czasu (Time State):
in_thread do
sync :foo
sample :ambi_lunar_land
end
sleep 2
set :foo, 1
W tym przykładzie najpierw tworzymy wątek, który czeka na zdarzenie :foo
aby można go było dodać do Stanu Czasu. Po zadeklarowaniu tego wątku śpimy przez 2 uderzenia i następnie ustawiamy (set
) :foo
na wartość 1
. To z kolei zwalnia sync
co pozwala na przeniesienie się do kolejnej linii, w której zostaje wywołany sampel :ambi_lunar_land
.
Zauważ, że funkcja sync
zawsze czeka na przyszłe zdarzenia, i że zablokuje on aktualny wątek w oczekiwaniu na kolejne zdarzenie. Ponadto, odziedziczy ona czas logiczny wątku, który wywołał ją poprzez funkcję set
lub cue
, więc może też być używana do synchronizowania czasu.
W przykładzie powyżej nadajemy :foo
wartość 1
i nic z nią nie robimy. Możemy właściwie pobrać tę wartość wewnątrz wątku korzystając z sync
:
in_thread do
amp = sync :foo
sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5
Zauważ, że wartości które są przekazywane do funkcji set
i cue
muszą być bezpieczne dla wątków - np. niezmienne pierścienie (rings) liczby, symbole lub zamrożone łańcuch znaków (strings). Sonic Pi rzuci błąd jeśli wartość którą próbujesz umieścić w Stanie Czasu (Time State) jest niepoprawna.