リング

標準のリストを一捻りした面白いものにリングがあります。いくつかのプログラミングを理解していれば、リングバッファやリングアレイなどを見たことがあるかもしれません。ここでは、まさにring(環状リスト)について見ていきます - それは短く、簡単です。

リストに関する前のセクションでは、インデックスの機構を使用してリストから要素を取り出す方法を説明しました。

puts [52, 55, 59][1]

もしインデックス100を取り出そうとしら、何が起こるでしょう? まあ、3つの要素しか持たないリストの中でインデックス100の要素は、明らかにありません。だからSonic Piは空を意味するnilを返すでしょう。

ここでは、現在のビート(拍子)が継続的に増加するcounterを考えてみましょう。まずはカウンタとリストを作成します。

counter = 0
notes = [52, 55, 59]

これで、リストの音符にアクセスするためのカウンタを使用することができます。

puts notes[counter]

素晴らしい、52を取得しました。カウンタを増やして別の音符を取得してみましょう。

counter = (inc counter)
puts notes[counter]

すごいでしょう、55を取得し、それを再び繰り返すならば59を得ます。さらに繰り返す場合は、リスト内の数が不足しnilになるでしょう。では、ちょうどループのはじめに戻り、再びリストの先頭から開始したい場合はどうしたらようでしょうか? そのためにリングを使います。

リングの作成

リングは、2つの方法のどちらか1つで作成することができます。どちらの方法もリングの要素を引数とするring関数を利用します。

(ring 52, 55, 59)

また、通常のリストを取得し、それに.ringメッセージを送ることで、リングに変換することができます。

[52, 55, 59].ring

リングのインデックス化

いったんリングを取得したら、通常のリストを使用する場合とまったく同じ方法で使用することができます。ただし、インデックスがマイナスもしくはリングの数値より大きい場合は、通常のリストと動作が異なり、先頭あるいは末尾に巻き戻ってリングの要素のどれか1つを必ず指します。

(ring 52, 55, 59)[0] #=> 52
(ring 52, 55, 59)[1] #=> 55
(ring 52, 55, 59)[2] #=> 59
(ring 52, 55, 59)[3] #=> 52
(ring 52, 55, 59)[-1] #=> 59

リングを使用する

ここで、現在のビート(拍子)の値を表すために変数を使用しているとしましょう。その変数は、現在表しているビート値に関わらず、演奏に使用する音符やリリース・タイム、その他リングに格納された何か有用な値を取得するのに、インデックスとして使用できます。

スケールとコードはリング

知っておくと役立つこととして、scale(音階)とchord(和音)によって返されたリストもリングであり、任意のインデックスでそれらにアクセスすることを可能にします。

リングのコンストラクタ(作成関数)

ring関数の他にも、リングを作成する沢山の関数があります。

詳細については、個々のドキュメントを見てください。