Sonic Pi: Ringe erzeugen I

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.