develop開発と成長この広告は、90日以上更新していないブログに表示しています。Processing「Processingで楽器をつくろう」の最後の記事です。最後は、倍音を含んだ音を加工して音をつくる減算式シンセサイザーをつくろうと思います。次の図は、今回作成するシンセサイザーの構成を表しています。太い矢印が音声信号、細い矢印が制御信号の流れを表しています。各部分の役割は次のとおりです。キーボード:発振周波数を入力するVCO:基本波形をつくるVCF:波形を加工するVCA:音量を制御するEG:音量に時間的な変化を与えるLFO:音量や音程に周期的な変化を与えるスピーカー:音を出力する各部分について、順番に作っていきたいと思います。キーボードとVCOをつくるまずは、図の赤枠で示したキーボードとVCOをつくって、それをもとにスピーカーから音を出したいと思います。WAVE」で波形を矩形波とノコギリ波から選択することができます。矩形波とノコギリ波は倍音を多く含んでおり、VCFで加工すると音色が変化しやすいので、減算方式のシンセサイザーではよく用いられます。「OCTAVE」で鳴らす音程を変更することができます。キーボードの対応した部分を押すと、対応した音を鳴らすことができます。}プログラムの基本は、第4回の「Processingでキーボードを鍵盤にする」で作成したものです。そのときはキーボードの代わりにInstrumentインターフェースを利用しましたが、今回は利用しませんでした。その代わりに、keyPressed()とkeyReleased()を使いました。これにより、キーを押している間は音を鳴らし続け、キーを離すと音が止まるようにしました。VCFをつくる次に赤枠で示したVCFをつくります。作成した箇所は黒の太枠で示しています。VCFでは、VCOで作成した波形をフィルターにより加工します。これにより、出力する音の音色を変えることができます。VCFで最もよく用いられるフィルターは、ローパス・フィルターです。次のプログラムは、前に作成したVCOプログラムにローパス・フィルターのVCFを追加したものです。FREQUENCY」ノブでフィルターのカットオフ周波数を変更することができます。「RESONANCE」ノブでフィルターのレゾナンスを変更することができます。}ローパス・フィルターには、第5回「Processingでエフェクターをつくる」でも利用したMoogFilterクラスを利用しました。MoogFilterの使い方はそちらを参考にしてください。VCAとEGをつくる次にVCAとEGを作りたいと思います。VCAで音量を、EGで音量の変化を設定します。この部分により、シンセサイザーに楽器のような音量の変化を加えることができます。シンセサイザーの一般的なEGは、ADSRを設定します。今回作成しているシンセサイザーもADSRを使いたいと思います。各ノブで次の値を制御できます。}VCAにはMultiplierクラスを、EGにはADSRクラスを利用しました。それぞれ、第5回「Processingでエフェクターをつくる」、第3回「Processingでキーボードを鍵盤にする」で解説しています。使い方はそちらを参考にしてください。LFOをつくる最後に、残ったLFOを作りたいと思います。Oscilator」の略で、低い周波数で音程や音量を変調するために用いられます。LFOでVCOの音程を変調するとビブラートに、VCFのカットオフ周波数を変調するとワウに、VCAを音量を変調するとトレモロになります。今回作成するシンセサイザーでは、一つのLFOでVCO、VCF、VCAをそれぞれ変調させます。WAVE」で正弦波と矩形波から選択でき、「RATE」ノブで発振周波数を変更することができます。INTENSITY」で制御することができます。}変調の方法は、第5回「Processingでエフェクターをつくる」でトレモロを作ったときと同じです。今回は、VCOでは音程を変調するためにoscil変数のfrequencyプロパティに、VCFではカットオフ周波数を変調するためにfilter変数のfrequencyプロパティに、VCOで音量を変調するためにmultiplier変数のamplitudeプロパティに、それぞれLFOをパッチしています。この記事はProcessingで楽器をつくろうの第7回目です。13:49ProcessingでシンセサイザーをつくるTweet広告を非表示にするもっと読むコメントを書く2016-11-22ProcessingでイージングProcessing少し前に、fladdictさんの乱数にコクを出すという話がネットで盛り上がっていました。Togetterまとめ私もかれこれ1年以上、Processingで作品を作ってきましたが、自分の作品のクオリティをもっと上げていくには、こういう細かい動きや配色にこだわっていかないのかなーと思っています。www.openprocessing.orgそうぼんやりと思っているときに、jQueryを使う機会があり、アニメーションの動き方を設定するイージングというものを知りました。早見表Processingでも、今までだったらオブジェクトを線形に動かしていたところを、イージングで動きに変化をつけると面白いのではないかと思い、とりあえずProcessingに上の早見表に載っている30のイージングを移植してみました。b;}イージングを使うと、動きがこんな感じになります。Processingで楽器を作ろう今回は、ProcessingのMinimとControlP5を使ってリズムマシンを作りたいと思います。リズムマシンは、ドラムパターンを自動で演奏する楽器です。メトロノームをつくるまずは、これから作るリズムマシンの基本を理解するためにメトロノームを作ってみたいと思います。次のプログラムは4/4拍子のリズムを刻むメトロノームです。「BPM」ノブでテンポを変更することができます。}}このプログラムでは、Instrumentインターフェースを継承したMetronomeクラスを作成しています。このMetronomeクラスのインスタンスをsetup関数のplayNoteメソッドで作成しています。作成したMetronomeインスタンスのnoteOnメソッドがまず呼ばれて、音を鳴らします。その後、指定した継続期間が終了後に、noteOffメソッドが呼ばれます。このnoteOffメソッドの中で再び自分自身を呼び出すことにより、自動で繰り返し音が鳴るようにしています。テンポはAudioOutputクラスのsetTempoメソッドで変更します。ここで設定した値はplayNoteメソッド内での時間指定に利用されます。デフォルトでは、BPMが60に設定されているので、playNoteメソッドの引数は単位を1秒とみなして処理されます。BPMを30に設定すると、playNoteの引数は単位が2秒刻みになり、BPMを120にすると単位が0.5秒刻みになります。このプログラムでは、変数beatにより拍子を管理し、小節の頭に音程が変わるようにしています。16ビートを刻む次のプログラムは先程のメトロノームプログラムを16分音符刻みで音がでるようにしたものです。}}BPMで指定した1ビートのさらに4分の1の間隔で音を鳴らせば、16ビートを刻むことができます。そのために、playNoteメソッドの第2引数に「1」ではなく「0.25」を指定しています。16ステップ・シーケンサーをつくるここまででリズムを刻むことはできるようになりました。このリズムに合わせて、鳴らす音を変えることにより、シーケンサー作ることができます。次のプログラムは、ControlP5のGUIを使って各ビートについて音を鳴らすかと鳴らす音の音程を選択できるようにしたものです。}}配列で各ビートに対応したToggleインスタンスとKnobインスタンスを管理しています。noteOnメソッド内でその値を参照して鳴らす音程を設定しています。リズムマシンをつくるこのシーケンサーの鳴らす音をドラム音にすると、リズムマシンにすることができます。次のプログラムでは、キック、スネア、ハイハットについて、それぞれ各ビートで鳴らすかを選択できます。}}サウンドファイルを再生するのには、Samplerクラスを利用しています。Samplerクラスについては、第4回目の記事「サンプラーをつくる」を確認してください。サンプラー付きリズムマシンをつくる最後に、第4回で作ったサンプラーを組み合わせて、自分でサンプリングした音でリズムを作れるようにしてみました。次のプログラムでは、最大3つの音をサンプリングしてリズムを作ることができます。各サンプルについて、「RECORD」ボタンを押すと録音を開始し、もう一度「RECORD」ボタンを押すと録音を終了します。「RATE」ノブで、サンプルの再生スピードを変更することができます。}}この記事はProcessingで楽器をつくろうの第6回目です。Processingで楽器を作ろう今回は、Processingでエフェクターを作ろうと思います。エフェクターは入力した音に音響効果を加えて出力するもので、特にエレキギターやエレキベースといった楽器で音を加工するために使われています。エフェクターの種類は多々ありますが、そのうちのいくつかをProcessingのMinimとControlP5で作ってみたいと思います。入力した音をそのまま出力するまずは、第1回で紹介した入力した音をそのままスピーカーから出力する方法を確認しましょう。}}Minimではマイクからの入力を利用するためにLiveInputを使います。このプログラムの入力と出力にPCのマイクとスピーカーで利用するとハウリングが生じる場合があります。そのときは、イヤフォンやヘッドフォンを使ってください。ディストーションまずは、ディストーションを作ってみましょう。ディストーションは、音を歪ませるエフェクターです。入力した音を増幅してから、過大部分をクリッピングすることにより、音を歪ませています。オーバードライブやファズも基本的には同じ処理を行うエフェクターです。MinimとControlP5で作ったディストーションのプログラムは次のようになります。「DISTORTION」ノブで値を大きくするほど、歪みが大きくなります。音を入力すると、上端と下端が平らになっている(クリッピングされている)のが確認できると思います。}}今回はディストーション処理を行うために、WaveShaperクラスを利用しています。WaveShaperクラスはWaveShaperという音響合成のための加工をするクラスです。Shaperは、あらかじめ入力に対する出力の対応関係と入力の増幅度を決めておき、それもとに入力音を増幅してから出力に変換する処理を行います。SoftwareWaveShaperクラスのコンストラクタの引数は、それぞれ次の値を指定しています。出力音」となるようにして、増幅して限界値を超えた値は限界値となるというWaveShaperクラスの特性を利用してクリッピングを行っています。WaveShaperクラスはもともとクリッピングではなく音響合成のためのものなので、工夫次第でこれをもとに面白い音を作り出すことができます。Wikipediaディレイディレイは、入力した音を遅れて出力するエフェクターです。単発ディレイ次のプログラムを入力した音を一度だけ遅れて鳴らすディレイプログラムです。TIME」で遅れ時間を指定します。AMP」で遅れた音の音量を指定します。}}ディレイには、MinimのDelayクラスを指定します。Delayクラスのコンストラクタの第1引数が遅れ時間、第2引数が遅れた音の音量を表しています。Delayフィードバック・ディレイフィードバックディレイは、出力した音を再びディレイに入力する(フィードバック)することにより、音を段々と減衰させていくディレイです。}}Delayクラスでフィードバックを行うには、コンストラクタの第3引数にtrueを設定します。フィードバックをかけた状態で、遅れた音の音量を1より大きくすると、ポジティブフィードバックが発生し、音量が無限大に発散するので注意してください。フィルターフィルターは、入力音のうち特定の周波数帯域のみを出力音にするエフェクターです。フィルターには、次のものがあります。BP)ローパス・フィルターは入力音のうち特定の周波数以下の帯域のみを通します。ハイパス・フィルターは入力音のうち特定の周波数以上の帯域のみを通します。バンドパス・フィルターは入力音のうち特定の周波数の帯域のみを通します。この境界値となる周波数をカットオフ周波数と呼びます。フィルターでは、レゾナンスを設定できることがあります。レゾナンスを設定することにより、カットオフ周波数付近の音を強調することができます。Minimでのフィルターは次のようになります。TYPE」でフィルターの種類を選択できます。0がLP、1がHP、2がBPに対応しています。FREQUENCY」でカットオフ周波数を指定します。「RESONANCE」でレゾナンスの値を指定します。レゾナンスを1に近づけすぎると共鳴が始まり、フィルター自体が音を発してしまいます。}}MinimではMoogFilterクラスを利用することでフィルタリング処理を簡単に行うことができます。MoogFilterトレモロトレモロは音量を周期的に上下させ揺れているような効果を与えるエフェクターです。次のプログラムは、サイン波で入力音を揺らすプログラムです。「RATE」で音を揺らす早さを指定することができます。「DEPTH」で変化する音量の幅を指定することができます。}}このプログラムでは、OscilクラスとMultiplierクラスを利用してトレモロを実現しています。Multiplierは入力音の音量を制御するためのクラスです。Oscilクラスの変数であるtremoloは、音量を揺らすための波を表しています。これをMultiplierインスタンスの音量にパッチしてから、Multiplierインスタンスに入力をパッチしています。この記事はProcessingで楽器をつくろうの第5回目です。Processingで楽器を作ろう前回はキーボードを鍵盤にしました。今回はMinimとControlP5を使って簡単なサンプラーを作りたいと思います。サンプラーとは、いろいろな音を録音して、それを音源として利用する楽器です。音を録音することをサンプリングと呼びます。ファイルを再生するサンプラーを作るにあたって、まずはMinimのSamplerクラスの使い方を確認しましょう。次のプログラムでは、キック、スネア、ハイハットの3つのサウンドファイルをSamplerクラスを使って再生することができます。hihat.trigger();}このプログラムを実行して、ボタンを押すと対応する音源を鳴らすことができます。Minimでサウンドファイルを再生する方法として、第1回目ではAudioPlayerクラスを紹介しました。SamplerはAudioPlayerと比べて再生時間が短いファイルに適しており、再生後に巻き戻す必要もありません。Samplerクラスのコンストラクタには第1引数にファイル名、第2引数にボイス数、第3引数にMinim型変数を渡します。ボイス数とは、同時にサウンドファイルを再生できる数を表しています。今回は「4」を指定しているので、最大4つ同じ音を重ねることができます。音を再生するにはtriggerメソッドを利用します。今回は、BangというGUIパーツを初めて利用しました。Bangは値を持たないGUIパーツで、押すとイベントとして関数を呼び出すことができます。再生速度を制御するサンプラーでは、サンプリングした音を加工することもできます。次のプログラムは、ここまでのプログラムにサウンドファイルの再生速度の変更機能を追加したものです。再生速度を遅くすると音が低くなり、再生速度を早くすると音が高くなることが確認できると思います。value));}再生速度を指定するために、各音源に対してノブを追加しました。再生速度はSamplerインスタンスのrateプロパティにより設定されています。このrateプロパティのsetLastValueメソッドに引数として再生速度を渡すことで、再生速度を変更することができます。ノブの値は線形的に変化しますが、pow関数を使って再生速度が指数的に変化するようにしました。ノブの値が-2から2までなので、0.01倍から100倍まで再生速度を変更することができます。ノブの値が0のときが1倍速です。マイク入力をサンプリングするここまでは、すでに用意してあるサウンドファイルを利用してきました。次は音を実際にサンプリングしてみましょう。次のプログラムではマイク入力の音を録音して、それをSamplerクラスで再生します。Recordボタンを一度押すと録音を開始し、もう一度Recordボタンを押すと録音を終了します。録音した音源はPlayボタンを押すと再生することができます。}}マイク入力音を録音するのに、AudioRecorderクラスを利用しています。最初にRecordボタンを押すと、createRecorderメソッドでAudioRecorderインスタンスを作成し、beginRecordメソッドで録音を開始します。一度、Reordボタンを押すとisRecording()で録音中だと判定され、endRecord()で録音を終了します。その後、saveメソッドで録音した音源が「sample.wav」ファイルに保存されます。この保存したファイルをもとにSamplerインスタンスを作成し、Playボタンが押されたら音が鳴るようにしています。サンプリングした音の再生速度を制御する最後にこれまでのプログラムを組み合わせて、録音した音の再生速度を変更できるようにしてみました。}}この記事はProcessingで楽器をつくろうの第4回目です。Processingで楽器を作ろう第1回目ではMinimを、第2回目ではControlP5について解説しました。ここから、本格的に楽器づくりを始めていきたいと思います。手始めとしてPCのキーボードを楽器の鍵盤のように叩くと音がでるようにしたいと思います。キーボードを鍵盤にする次のコードはキーを押すと、対応するピッチの音が1秒間鳴るプログラムです。}キーと音の対応関係は以下のようになっています。文字だけだとわかりずらいですが、キーボードの位置と鍵盤上のドレミの位置が一致しています。シ(B)プログラムについて解説したいと思います。キーボードを押したときの処理は、keyPressed()内に記述しています。switch文で押したキーに合わせてピッチを決め、playNoteメソッドで音を鳴らしています。playNoteメソッドの第1引数は音が鳴るまでの時間(秒)、第2引数が音の長さ(秒)です。今回は第1引数を「0」、第2引数を「1」にしているのでplayNoteメソッドを読んだ直後に1秒間、音を鳴らしています。第3引数にはInstrumentインターフェースを継承したKeyboardクラスのインスタンスを渡します。Keyboardクラスのコンストラクタの引数には周波数を渡します。ここでは、FrequencyクラスのofPitch()メソッドとasHz()メソッドを使って、ピッチ名から対応した周波数を求めています。Frequencyクラスを使うとピッチ名以外にMIDIノート番号からも周波数を求めることができます。詳しくは、公式のリファレンスを確認してください。Instrumentインターフェースの解説は第1回を確認してください。このプログラムがキーボードの基本形になります。ここから、もう少し楽器っぽくなるように改良していきます。ADSRを設定するまずはキーボードプログラムに音量の変化をつけたいと思います。キーボード楽器にかかわらず、すべての楽器には音量の変化があります。ピアノの場合は、キーを押すとすぐに音量が大きくなり、段々と音が減衰していきます。オルガンの場合は、ピアノよりもゆっくりと音量が大きくなっていきます。電子楽器では、この音量変化を再現するためにADSRを設定します。ADSRは、Attack、Decay、Sustain、Releaseの頭文字で一般的にそれぞれ次のものを表しています。一般的にADSRを設定するとき、Attack、Decay、Releaseは時間を指定しますが、Sustainは音量を指定します。「ADSR」でGoogleの画像検索をすれば、わかりやすい模式図を確認できます。次のプログラムは先程のキーボードプログラムにGUIでADSRを設定できるようにしたものです。}setup関数内では、ControlP5でADSRの値をコントロールするためのノブの作成をしています。ADSRを設定するため、ADSRクラスをKeyboardクラスの中で利用しています。ADSRクラスのコンストラクタの引数はそれぞれ次のものを表しています。releaseの時間(秒)このように作成したADSR型変数adsrを、oscとoutの間に挟んでパッチすることで音量をADSRに沿って変化させることができます。Keyboardメソッド内では、unpatchAfterRelease()というメソッドを利用しています。これを利用することにより、releaseが終了してからパッチを外すことを指示することができます。ちなみに、playNote()メソッドを呼び出すときに音の継続時間を1秒間にしています。この1秒の中でattack、decay、sustainが行われ、1秒後にreleaseが始まります。GUIと音程と音量を制御する最後に、音程と音量もGUIのノブで変えられるようにしてみましょう。}特に難しいことはしていないので解説はしませんが、これでより広い範囲の音がでるようになったと思います。この記事はProcessingで楽器をつくろうの第3回目です。Processingで楽器を作ろう今回はProcessingでGUIを扱うためのライブラリであるControlP5の使い方を解説します。processing.orgControlP5のインストールControlP5はProcessingにデフォルトではインストールされていないので、はじめにインストールを行います。Managerを開き、「ControlP5」で検索してインストールしてください。Library...」にControlP5が表示されるようになります。ノブを使うまずはControlP5の基本的な使い方を説明します。次のコードは上図のように3つのノブをスケッチ上に配置しています。これをマウスで操作すると、それぞれ対応した四角形の大きさが変化します。box}このコードについて解説していきたいと思います。ControlP5(this);まずControlP5のライブラリをインポートし、ControlP5クラスのインスタンスを作成します。.setRadius(50);ノブを作成するにはaddKnobメソッドを使います。このノブの値は、addKnobメソッドの引数と同じ名前の変数に格納されます(この場合、変数knobValueに値が格納されます)。パラメータはメソッドチェーンの形式で設定します。以下、各メソッドで設定できるパラメータです。.setDragDirection(Knob.VERTICAL);真ん中のノブはKnob型変数に作成したノブを代入し、draw関数内でその値をgetValueメソッドを使って取得しています。ここで新たに出てきたメソッドは、次のパラメータを設定しています。3つ目のノブは操作するとaddKnobメソッドの引数と同名の関数knobFunc()を呼び出します。ここで新たに出てきたメソッドは、次のパラメータを設定しています。目盛りの値でステップさせるか(デフォルトはfalse)以上がノブの使い方の説明です。他のGUIパーツも同様に「add○○」でGUIパーツを作成し、メソッドチェーンでパラメータを設定します。GUIからの値の取得も同じように行います。以下では、楽器作成で使うトグルスイッチとスライダーについて説明します。トグルスイッチを使うトグルスイッチは、Boolean型の値を操作するためのGUIです。以下のコードでは、トグルスイッチで四角形の中の色を変えることができます。100);}基本的にはノブのときと同じですが、setModeでノブの種類を変えられるのと、Toggle型変数から値を取得するのにgetBooleanValue()を使っている点に注意してください。スライダーを使うスライダーもノブと同様に連続した数値を設定するために使います。次のコードではスライダーを操作すると対応した四角形の大きさを変えることができます。box}スライダーは、横幅が縦幅より大きいときは横向き、縦幅が横幅より大きいときは縦向きに操作できるように勝手になります。これら以外のGUIパーツを使うことがあれば、その都度解説します。この記事はProcessingで楽器をつくろうの第2回目です。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。