前回の入門講座では最もシンプルな正弦波を用いたシンセサイザーを作りました。今回はもう少し機能を加えてシンセサイザーらしいプログラムを作ってみようと思います。とうわけでまずは一般的なシンセサイザーの構成をちょっと見てみます。
シンセサイザーの構成
機種などの違いはあるものの、一般的な減算合成方式のシンセサイザーは次の様な処理の流れで音を作り出しています。この図の中でも特に重要な要素がVCO, VCF, VCAの3つの部分です。それぞれ
という役割を持っています。コントローラ(キーボードなど)からの指示がVCOに入り、音の元となる信号をつくり、VCFで音色を変えて、VCAで音量の変化を与え、最終的に音を出すという大きな流れです。その他では代表的なところで、LFO: 低い周波数の発信器、EG: 音量の時間的変化をコントロールする、などがあります。
ここで前回書いたプログラムをみてみると、図の赤丸部分がコントローラの部分、青い部分がVCO、緑の部分がVCAと見なすことができます(フィルタを作っていなかったのでVCFはなし)。
今回はせっかく新しい機能を追加するので、よりシンセサイザーの処理の流れに沿ったプログラムに書き直そうと思います。書き直す際に、Pdのプログラミングでよく使うテクニックも色々使って行こうと思います。
コントローラーをつくる
シンセサイザーの処理の流れに沿ったプログラムにするために、個々の機能をサブパッチに分けてプログラムを書いて行きます。まずはキーボードの入力をVCOやVCAに伝えるコントローラー部分をつくります。サブパッチ“pd keyboard”を作成し、その中身を図のようにプログラミングしましょう。
今回のプログラムのコントローラに必要な機能は、押されているキーに対応した周波数はいくつか? キーが押されている状態はどうなっているか?の2点です。基本的には前回書いたプログラムとほぼ同じです(若干音階を増やしました)。ここで一カ所今までに無い、“s keyfreq”と“s keystate”という部分があると思います。この“s”というコマンドは“send”の略で”Pdではとてもよく使うコマンドの一つです。このコマンドを使うことで、いままで線をつないで行っていた数値の受け渡しを、変数を通して行うことができます。“s keyfreq”というボックスに数値を送ると、keyfreqという箱にデータが送られるイメージです。ここからデータを引き出すには“receive”というコマンドを使います(こちらも略して“r”だけで使えます)。ここではデータを送る部分だけですが、後ほど受け取る部分をつくります。
VCOをつくる
続いて音の波形の元をつくりだすVCOの部分をプログラミングしていきます。シンセサイザーでは正弦波以外にも、ノコギリ波や矩形波と呼ばれる波形がよく使われますので、この3種類の音を切り替えて出力出来る様なプログラムにしましょう。先程のキーボードと同様にVCOのサブパッチをつくりますが、その中身は後に回して、まずは音の種類を選択する部分を作りましょう。
左図の中央上側にある“Source”と書いたボックスが音の種類を選択するためにつくったボックスです。配置→水平ラジオボタンと選択するとこのようなボタンをつくることができます。このボックスを右クリックしてプロパティをクリックすると右図のような画面が現れます。ここでは3種類の音源を選択したいので、“number”の項目を3に設定しましょう。さらにここで重要な点が一つあります。“メッセージ”の“Sendシンボル”という項目に変数を指定することで、このボックスのどの部分が選択されているかを変数に送ることができます。先程の“send”という機能をボックスに持たせることが出来るのです。この場合は、ボックスの左端が選択されると変数sourceに0が送られ、中央ならば1、右端なら2という数が送られます。この値をサブパッチ“VCO”の中で受け取って波形を作って行きましょう。ちなみに右図の“ラベル”はボックスの上に表示される文字を指定出来るので、見分けがつくように何か指定しておきましょう。
さてこちらがサブパッチ“VCO”の中身です。全体の流れとしては、キーボードから周波数を受け取り、音源の選択ボックスから、音源の種類を受け取り、それに応じた音源を作って出す、という感じです。今回使う新しいコマンドは以下のものです
画面左上から順を追ってみてみると、“r keyfreq”でキーボードで押されたキーに対応する周波数を受け取ります。具体的には、サブパッチ“keyboard”内の“s keyfreq”で送った信号を受け取ることになります。左側の“osc~”は前回と同じ正弦波をつくるボックスなので、この部分で受け取った周波数の正弦波が作られます。つづいて“osc~”の右横の部分、“phasor~”の列はノコギリ波をつくる部分です。“phasor~”の出力は振幅が0〜1のノコギリ波なので、“-~ 0.5”、“*~ 2”と演算することで、振幅が-1〜1までの範囲のノコギリ波になるよう整えています。最後にその横の”phasor~”の部分ですが、ここが矩形波をつくる部分です。矩形波は位相が異なる二つのノコギリ波からつくることができます。
さて、次は音源を切り替える部分です。画面の右側を見てください。“r source”はラジオボタンの状態を受け取る部分です (ボタンの左側が選択されると0、真ん中が1、右側が2となります)。ここで“t f b” (“trigger f b”でもよい)というコマンドが登場します。こちらもPdでよく使うコマンドの一つです。このコマンドは入力された値を引数で指定された型に変換して、右アウトレットから左アウトレットに向けて順番に出力するコマンドです。“t f b”では引数fはfloat 、引数bはbangを表わします。いま0, 1, 2のいずれかの数値が“t f b”に入力されると、まず右アウトレットからbangが出力され、続いて左アウトレットから入力された数値そのものが出力されます。したがって、ラジオボタンが押されると、まず始めにbangが出力され数値0を3つのナンバーボックスに入れます。続いて0, 1, 2のいずれかの値が“sel 0 1 2”に入力されるので、その数に応じたアウトレットからbangが出力され、3つのナンバーボックスのひとつだけ数値1が入ります。3つのナンバーボックスは、そのまま各音源とかけ算されるます。0をかけ算された信号は全て0となり、1をかけ算された信号はそのまま出力されるので、ラジオボタンで選択した音源だけが残るという仕組みです。
少し説明がながくなりましたが、ちゃんと動いているか確認してみましょう。上図のように波形を表示するアレイを配置して図示してください。ラジオボックスを選択すると波形の形が変化するでしょうか?異なるキーを押すと波形の周期が変化するでしょうか?うまくプログラムが書けるとこの時点で“VCO”の出力が正弦波・ノコギリ波・矩形波が出力されると思います。
今回はここまでとして、次回から“VCF”、“VCA”の部分を作って行こうと思います!シンセサイザーが出来るまで、もう少しだけお付き合いください。
田園都市線三軒茶屋、セミナー・研修・講座のSoraoto。様々なセミナーやサイエンスカフェなどのイベントを開催しています。また英会話教室を始めとする、大人の学習講座もありますので、ぜひご参加ください。