Wenn man in Sonic Pi Abfolgen von Werten (Tonhöhen, Samples, Optionen von Synths und Effekten etc.) speichern möchte, sind Ringe dafür bestens geeignet. Hier ist ein einführender Artikel zum Thema Ringe
In diesem Artikel soll es um einige Funktionen gehen, mit denen man Ringe erzeugen kann.
ring
Die Funktion ring
erzeugt einfach einen Ring, der sämtliche Argumente in der gegebenen Reihenfolge enthält:
r = ring 1, 3, 5, 7, 11, 13 puts r #=> (ring 1, 3, 5, 7, 11, 13) r = ring "boing", "bum", "tschak" puts r #=> (ring "boing", "bum", "tschak")
range
range
erzeugt einen Ring, der einen Werteverlauf zwischen einem Start- (erstes Argument) und einen Endpunkt (zweites Argument) enthält. Das dritte Argument legt die Schrittweite fest. Ist es nicht gegeben, beträgt die Schrittweite 1:
r = range(1, 3) puts r #=> (ring 1, 2) r = range 10, 5 puts r #=> (ring 10, 9, 8, 7, 6)
Sie sehen an dem obigen Beispiel, dass der Endpunkt nicht im Ergebnis enthalten ist. Wünschen Sie dies, setzten sie die Option inclusive: true
r = range 10, 5, inclusive: true puts r #=> (ring 10, 9, 8, 7, 6, 5)
Es folgt ein tönendes Beispiel, das zwei Ringe für die Tonhöhen und die Pausen zwischen den einzelnen Tönen nutzt. Beide Ringe haben drei Argumente – das dritte steht jeweils für die Schrittweite:
tonhoehen = range 50, 70, 3 pausen = range 0.1, 0.5, 0.01 use_synth :piano live_loop :zwei_range_ringe do play tonhoehen.tick sleep pausen.look end
knit
knit
(zu deutsch: „stricken“) benutzt man, um Ringe zu erzeugen, in denen Werte mehrmals hintereinander wiederholt werden sollen. Die Argumente verfahren nach folgendem Muster: knit Wert, Anzahl, Wert, Anzahl...
pausen = knit 1, 1, 0.25, 2, 0.125, 4 puts pausen # => (ring 1, 0.25, 0.25, 0.125, 0.125, 0.125, 0.125) live_loop :stricker do sample :elec_blup sleep pausen.tick end
bools
bools
erzeugt einen Ring mit Wahrheitswerten (true
und false
). Das Argument 1 steht für true, 0 für false. In dem tönenden Beispiel wird in jedem Schleifendurchlauf der Ring entscheidung
mit tick
abgefragt. Ist das Ergebnis true
, wird die Bassdrum gespielt, sonst nicht:
entscheidung = bools 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 puts entscheidung # => (ring true, false, false, false, true, true, false, false, true, true, true, false) live_loop :entscheider do sample :bd_haus if entscheidung.tick sleep 0.25 end
spread
spread
nutzt den Euklidischen Algorithmus, um einen Ring mit true
– und false
-Werten zu füllen. Diese Ringe sind geeignet, komplexe Rhythmen zu entwerfen. Das erste Argument bestimmt die Anzahl der Werte des Rings, die true
sind. Das zweite Argument bestimmt die Länge des Rings. Der folgende Code stammt aus den von Sonic Pi mitgelieferten Beispielen:
live_loop :euclid_beat do sample :elec_bong, amp: 1.5 if (spread 3, 8).tick sample :perc_snap, amp: 0.8 if (spread 7, 11).look sample :bd_haus, amp: 2 if (spread 1, 4).look sleep 0.125 end
Es gibt noch einige weitere interessante Funktionen, um Ringe aufgrund von Grundtönen, Akkorden und Oktaven zu erzeugen: scale, chord
und octs
. Stoff für einen weiteren Artikel.
Darüber hinaus gibt es zahlreiche interessante Methoden, um aus vorhandenen Ringen neue Ringe zu erzeugen, etwa reverse, take, shuffle, drop, butlast rotate, repeat, mirror
und noch viele weitere. Dazu gibt es hier einen Artikel.