サンプルをスライスする

このSonic Piのシリーズの3回目の記事では、最も有名なドラム・ブレイクの1つであるアーメン・ブレイクをループ、ストレッチ、フィルタする方法を見ました。今回の記事では、これをさらに一歩進めて、スライスし、スライスをシャッフルし、まったく新しい順序で一緒に戻す方法を学習します。それは少しクレイジーな話に聞こえるかもしれませんが、心配する必要はありません。それはすべて明らかになり、あなたはライブコーディングのセットのための強力な新しいツールをすぐに習得するでしょう。

データとしてのサウンド

始める前に、少し時間を取って、サンプルで作業する方法を理解しましょう。ここまでで、みなさんはSonic Piの強力なサンプラーで遊んだことがあると思います。もし試したことがなかったら、今やってみましょう! Raspberry Piを起動し、Sonic PiをProgrammingのメニューから起動し、新しいBufferに次のように入力して、Runボタンを押すと、あらかじめ録音されたドラムビートを聞くことができます:

sample :loop_amen

音の記録は、音の波形の山と谷を表す-1から1のたくさんの数値のデータとして単純に表現されます。これらの数値を順番に再生すると、元の音が得られます。しかし、それらを別の順序で再生して新しい音を作り出すことに、何か問題があるしょうか?

実際にサンプルはどのように記録されるのでしょうか? 音の基本的な物理を一度理解すれば、実際のところかなり簡単です。例えばドラムを叩くなどして音を出すと、小石を投げ込んだときに湖の表面が波打つのと同じように、空気中を音が移動します。これらの波紋があなたの耳に届くと、あなたの鼓膜が共振するよう動いて、その動きを聞こえる音に変換します。したがって、音を記録して再生したい場合、これらの波紋をキャプチャし、保存し、再生する方法が必要です。1つの方法は、鼓膜のように音の波紋が届いたときに前後に振動するマイクロフォンを使用することです。マイクロフォンはその位置を小さな電気信号に変換します。そして、それを1秒間に何度も測定します。これらの測定値は、-1と1の間の一連の数値として表されます。

音を視覚化してプロットしようとすると、x軸に時間を、y軸にマイクロフォン/スピーカーの位置を-1と1の間の値として持つデータの単純なグラフになるでしょう。このようなグラフの例は、図表の上部に見ることができるでしょう。

サンプルを部分的に再生する

では、サンプルを別の順序で再生するためには、Sonic Piでどのようにコーディングすれば良いでしょうか? この質問に答えるには、samplestart:finish:オプションを見てみる必要があります。これらは、サウンドを表す数字の再生の開始位置と終了位置を制御します。これらのオプションのどちらの値も01の間の数字として表され、0はサンプルの開始を、1は終了を表しています。したがって、アーメン・ブレイクの前半部分を再生するに必要なことは、次のようにfinish:0.5を指定するだけです:

sample :loop_amen, finish: 0.5

また、start:の値を追加することもでき、先ほどの例より更に短い区間のサンプルを演奏することも可能です:

sample :loop_amen, start: 0.25, finish: 0.5

更に面白いのは、finish:オプションの値をstart:より前に設定することができます。その場合には、その区間が逆再生されます:

sample :loop_amen, start: 0.5, finish: 0.25

サンプル再生の順序並び替え

サンプルが単純にどの順序でも再生可能な数字のリストであることと、特定の位置から再生する方法を習得したので、サンプルを’誤った’順序で楽しく再生することができるようになりました。

Amen Slices

アーメン・ブレイクを8つの同じサイズのスライスにぶつ切りにして、それをシャッフルしてみましょう。図を見てください:上のAはサンプルのオリジナルのデータです。それを8つのスライスにぶつ切りにしたのがBです。それぞれのスライスを異なる色にして区別しやすくしていることに注意してください。また、各スライスの開始と終了の値が上にあるのを見ることができるでしょう。最後にCは、スライスの並び替えの1例です。これを再生して新しいビートを作ることができます。これを実現するためのコードを見てみましょう:

live_loop :beat_slicer do
  slice_idx = rand_i(8)
  slice_size = 0.125
  s = slice_idx * slice_size
  f = s + slice_size
  sample :loop_amen, start: s, finish: f
  sleep sample_duration :loop_amen, start: s, finish: f
end
  1. 0から7のランダムな数字(0から数え始めることを忘れないでください)のいずれかのスライスを選択しています。Sonic Piは正にこれを行うための便利な関数として、rand_i(8)を使うことができます。次に、このランダムなスライスのインデックスをslice_idx変数に格納しています。
  2. slice_sizeを1/8または0.125に定義しています。slice_sizeは、slice_idxstart:オプションで使用する0から1の値に変更するために必要です。
  3. 開始地点であるsは、slice_idxslice_sizeを掛け算して求めます。
  4. 終了地点であるfは、開始地点であるsslice_sizeを足し算して求めます。
  5. 変数sfsample関数のstart:finish:にそれぞれ繋げて、サンプルのスライスを再生することができるようになりました。
  6. 次のスライスを再生する前に、どれだけの時間sleepするか、すなわちスライスされたサンプルの長さを知る必要があります。幸いにも、Sonic Piには単にサンプルの長さを返すsample_duration関数があり、それはsampleと全く同じオプションを受け入れます。したがって、sample_durationstart:finish:オプションを渡してあげれば、スライスの長さを知ることができるのです。
  7. そして、新しいランダムなスライスを選んで再生し続けるように、このコードの全てをlive_loopで包みます。

まとめ

ここまで見てきた全てを組み合わせて最後の例にしましょう。興味深いトラックの作り始めるのに、ランダムにスライスされたビートとベースを組み合せた同じようなアプローチが可能であることを示していると思います。次は、あなたの番です。このコードを開始地点として、自分自身で進めて何か新しいものを作れるか見てみてください…

live_loop :sliced_amen do
  n = 8
  s =  line(0, 1, steps: n).choose
  f = s + (1.0 / n)
  sample :loop_amen, beat_stretch: 2, start: s, finish: f
  sleep 2.0  / n
end
live_loop :acid_bass do
  with_fx :reverb, room: 1, reps: 32, amp: 0.6 do
    tick
    n = (octs :e0, 3).look - (knit 0, 3 * 8, -4, 3 * 8).look
    co = rrand(70, 110)
    synth :beep, note: n + 36, release: 0.1, wave: 0, cutoff: co
    synth :tb303, note: n, release: 0.2, wave: 0, cutoff: co
    sleep (ring 0.125, 0.25).look
  end
end