6-1 グラニュラーシンセ 1では、原理を理解するために、サウンドファイルの最初から100ミリ秒だけを再生するサンプルを紹介しました。
このままでは、まだグラニュラーシンセの面白いところが、まだ出てきていません。グラニュラーシンセの醍醐味は「少し操作するだけでガラっと変わった音になる」ところです。
ガラっと印象を変えるため、3つの変化を与えてみます。
「pdws6-1-5.pd」に追加していきます。
[ tabread~ soundfile1 ] の前に、[ +~ ] をつけて、サウンドファイルに入っているデータ数を足し算します。これで、音の読み出し開始位置を変えることができます。
音の読み出し位置は「0〜サウンドファイルのデータ数」になります。サウンドファイルによってデータ数が異なるので、音を読み込んだ時にスライダーの範囲が「0〜サウンドファイルのデータ数」となるようにしています。
スライダーに[ range ]メッセージで最小値と最大値を送ることで、範囲を変えることができます。
スライダーを変更すると、またブチブチしたクリックノイズが発生してしまいます。このノイズを取り除くために、また工夫を施します。
なぜノイズが発生するのか考えます。
スライダーを操作する前は「ループのはじまりと最後がきれいにつながる」状態だったのですが、スライダーを操作するタイミングはユーザー次第なので、「ループの途中で次のはじまりがくる」状態ができてしまいます。
解決するには、スライダーの変更を反映させるタイミングと、ループのはじまりのタイミングを合わせます。ループが最後まで終わるまで、スライダーの変更を反映させない、とも言えます。
ループの最後を調べるには[ samphold~ ] を使います。
[ samphold~ ] は、右インレット値が前の値よりも小さいときのみ、左インレット値を読み込みます。次に右インレット値が前の値より小さくなるまでは、読み込んだ値を出力し続けます。
[ phasor~ ] はノコギリ波なので、「前の値よりも小さくなる時は、周期の終わりのみ」です。
[ samphold~ ] の右インレットに [ phasor~ ] をつなぐことで、「周期の終わりを検出し、そのタイミングでスライダー値を出力する。しかも周期の途中はスライダーの変更を無視する」 という動作をしています。
音の再生時間は、[ phasor~ 10] と [ *~ 4410 ] で決めていました。
サンプリングレート44100のデータという前提ですが、10Hzで4410コまで読み進めることで、0.1秒=100ミリ秒となっていました。
この時間を変えるためには、
[ phasor~ ]に与える値と、[ *~ ] に与える値の両方を変えることになります。この2つの値は関係していて、[ phasor~ ●● ] なら [ *~ ] に与える値は、「44100/●●」になります。
時間で変わるようにするには、
10秒にしたい場合は、[ phasor~ 0.1 ] となりますので、[ phasor~ ]に与える値は、
[ phasor~ ]に与える値 = 1 / 10秒
スライダーで変化させるには、
[ phasor~ ]に与える値= 1 / スライダー値
となります。
ちなみにスライダーが0になると、ゼロで割り算することになり、計算不可能なので(C言語などではエラーになりますがPdではエラーにはならないようです)、
サンプルのスライダーでは、最小0.1秒〜最大サンプリングデータの時間、となるようにしています。
サンプリングした音は、クリックノイズを取り除くためにコサインで音量を変化させていました。
さらに、この音と半周期ずれた音を同時に鳴らして、音の消えてしまう瞬間を補いました。
この方法では、たとえばもとの音が2秒だとすると、大きく聞こえるのは1秒目にさしかかる時です。そして、その1秒目が大きく聞こえる状態の音が、半周期ずれて重なって鳴っています。つまり、1秒目の音がよく聞こえてしまうことになります。
自分でもおや?と思ったのですが、クリックノイズを取り除くための仕様という感じです。
音の再生速度は、1倍速で、音を切り刻んで再生している状態でした。
スライダーを動かした時だけ、リアルタイムに数値が反映されるので、再生速度が変化したように感じたかもしれません。
ここでは、スライダーで再生速度を変えてみます。
再生速度を変えると音の高さが変わるので、ピッチを変えるとも言えます。
音の再生速度の黄色いスライダーは、最小0〜最大2、としています。
2倍速で再生するには、このスライダーの数値と、[ phasor~ ] に設定する数値、サンプリングレート44100から計算します。
たとえば2倍速にしたい場合は、
スライダーが2、phasor~値は先ほどの再生時間の設定によって変化するので、そのまま(phasor~値)とすると、以下のようになります。
44100 /(phasor~値) * 2
これを[expr]を使って以下のように計算しています。
[expr 44100 / $f1 * $f2 ]
この値を、2つの音の[ samphold~ ] へ渡します。
[ t b f ]は、再生速度の黄色いスライダーを動かした時に反映させ、さらに再生時間の水色のスライダーを動かしても反映させるために使っています。
黄色いスライダーを動かすと、[t b f ]の右アウトレットから小数が出力され、同時に左アウトレットからbangが出力されるようにしています。
ひとまず、グラニュラーシンセはここで一区切りとします。
異なるサンプリングファイルを読み込みたい時は、[ openpanel ]オブジェクトで、読み込むファイルの選択画面を出したり、複数のグラニュラーシンセを作りたい場合は、前回のサブパッチ・外部パッチなどを使うと便利です。
ブラッシュアップしてみてください。