Sync(hronisation)

In Kapitel 5.7 beschäftigten wir uns mit den Funktionen cue und sync, um Threads zu synchronisieren. Dort wurde allerdings nicht erklärt, was es mit dem Time State System auf sich hat, das diese Funktionalität zur Verfügung stellt. Tatsächlich ist set eine Variation von cue und baut auf die gleiche Kernfunktionalität auf, Informationen im Time State System zu hinterlegen. Zusätzlich ist sync`so gestaltet, dass es einfach mit dem Time State funktioniert - es kann auf jegliche Information, die im Time State gespeichert ist, kann auch synchronisiert werden. Mit anderen Worten: wir synchronisieren auf Ereignisse, die im Time State gespeichert werden.

Warten auf Ereignisse (Events)

Lass uns mal anschauen, wie man syncverwendet, um auf neue Ereignisse zu warten, die dem Time State hinzugefügt werden:

in_thread do
  sync :foo
  sample :ambi_lunar_land
end
sleep 2
set :foo, 1

In diesem Beispiel erstellen wir zuerst einen Thread, der darauf wartet, dass ein ‘:foo’ event zum Time State hinzugefügt wird. Nach dieser Threaderstellung (Deklaration) schlafen wir für 2 beats und dann setzen wir mit ‘set’-Befehl den ‘:foo’-Wert auf ‘1’. Diese Aktion ‘releases’ (beendet) den ‘sync’ und geht weiter zur nächsten Zeile, wo das ‘:ambi_lunar_land’-Sample getriggert wird.

Beachte, dass sync immer auf *zukünftige Ereignisse” wartet and den Thread genau an dieser Stelle so lange blockiert, bis das Ereignis eingetreten ist. Zusätzlich erbt der (gesyncte) Thread die logische Zeite des anderen Threads, der ihn mit Hilfe von set oder cue getriggert (angestossen) hat. Das heißt, dass man durch dieses Verfahren auch die Zeit von zwei Threads synchronisieren kann.

Übergabe von Werten in die Zukunft

In diesem Beispiel setzen wir ‘:foo’ auf den Wert ‘1’, mit dem wir dann nichts gemacht haben. Diesen Wert können wir im Thread auch wieder abfragen (‘get’), in dem wir den Befehl ‘sync’ aufrufen:

in_thread do
  amp = sync :foo
  sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5

Beachte, dass Werte, die mit Hilfe von set und `cue übergeben werden, “thread safe” sein müssen. Das bedeutet, dass nur Werte übergeben werden dürfen, die sich in der Zukunft nicht verändern können wie zum Beispiel “unveränderliche Zeichenketten” (immutable strings), Zahlen, Symbole oder eingefrorene Zeichenketten (frozen strings). Sonic Pi wirft einen Fehler, falls ein Wert verwendet wird, der nicht dieser Vorgabe entspricht.