最後に少しだけカスタマイズ最初にこのページではプログラミング初学者の人が簡単なミュージックシーケンサを作成するまでをまとめたウェブサイトになります。自作デバイス上でArduinoを動かすことを想定していますが、教材用にProcessingで動作するソフトウェアとして紹介します。配列の宣言の仕方など、Arduinoの場合と少し異なりますので、適時読み替えてください。設計まず、今回作成するシーケンサですが、4×4のマトリクス上にスイッチを配したものを想定します。簡単にいうとPocoPocoみたいなものです。このようなシーケンサのベース部分を作るために、まずモジュールベースで作成していきます。重要なのは想定する一つ一つの部品や機能をソフトウェア上でclassとして作成していってください。いわゆるオブジェクト指向で考えていきます。シーケンサの機能としては、レイヤー階層になっており、各レイヤーごとに4×4のボタンが用意されています。ボタンを押すごとにそのボタンのonとoffを切り替えることができます。onになったボタンはタイムラインに従って自動で発音します。実際に完成するソフトウェアは下記のようなものです。一緒にやってみましょう。最初のコードまず最初のコードですが、単純な画面上に16個のボタンが表示されるプログラムを作成したいと思います。draw(){}窓サイズ500×500の画面を作成するだけのものです。ここからはじめていきます。ボタンを16個描画する必要があります。このボタンは一つのオブジェクトになっているので、classとして表現します。ここで、16個のボタンを描画したいわけですから、Buttonというクラスを作り、その中のdraw()を呼びだすことでそれぞれ正しい位置にボタンが描画されればいいわけです。classにはそれぞれの場所を示す座標情報や円の大きさ等の情報を持っている必要があります。以上のことから記述追加したプログラムは次のとおりです。}}ボタンのON/OFF切り替えでは次はボタンを押すことでON/OFFの切り替えを行ってみます。Class内に記述します。現時点ではボタンクラスはdraw関数にて描画するだけですが、ボタンのステータスを更新する為にupdate()メソッドを追加します。いうメンバー変数を作成しておき、マウスクリックを「今マウスボタンが押されていて、且つ一つ前のときにはマウスが押されていなかった場合」としてif分にて条件を記述しています。}}ここらで少しButtonクラスの記述が増えて来たので、別ファイルにクラスの記述を移します。クラスの記述部分をすべてButtonというタブに移します。タイムライン(自動演奏のための時間)機能を追加では次にタイムラインを追加します。タイムラインは決められたテンポで順番にボタンのON、OFFに従って自動演奏を行います。そこでまず決められたテンポを算出するクラスとして、Metroクラスを作ります。常時このMetroをupdate()することで、指定テンポでtrueを返す設計にします。次のようなクラスを作成します。下記コードは先程のButtonクラスと同様に、新規タブからMetroとして作成してください。ms_stamp;}次に、このmetro.update()を利用して、シーケンスに合わせて光の移動を行ってみます。宣言して、少々修正を加えたプログラムを下記に示します。実際に実行して動作を確かめてください。古いシーケンス場所として保存しておく。Metro.pdeにて3つのファイルによって動作するプロジェクトになりました。発音それでは、ボタンを押した箇所だけ発音するプログラムまで進めてみましょう。ここまでですでにどのボタンがONになっているか、シーケンスの位置はどこにあるのかがわかっているので、あとはそのタイミングで適切な音を鳴らせばOKです。音を鳴らす代わりにprintで動作をチェックします。sounds”とprintするように修正したほか、play_pos_previousの色設定にも、スイッチのON,OFFによる条件分岐を加えました。古いシーケンス場所として保存しておく。soundsと文字列がデバッグ画面に表示されたかと思います。次にこのprint文の位置に対して実際に音がなるコードを追加します。MIDIを利用すると広がりがありますが、このページでは学習目的でなるべく簡素にしておきたいので、音声ファイルを再生するだけにしておきます。SD.wav(スネアドラム)ファイルをそのまま利用します。下記においておきます。libraryを利用して、それらを読み込み、シーケンスのタイミングに合わせて発話するようにします。今回はCHH.wavを利用します。古いシーケンス場所として保存しておく。}}Layerクラスを考えるさあ、ハイハットのチチチでなんとなくリズム刻めてきました。先程ダウンロードした音声ファイルにはこの他バスドラ、ハイハットがあるので、これらもシーケンス内で再生したいと考えます。この場合、ハイハットの音に対してどのように他の音を割り当てるかを考えなければいけません。シーケンサでは通常このようなものに対してレイヤー機能を利用します。これまで作成してきたものはハイハットレイヤーであり、この他に、バスドラ、スネアレイヤーを追加します。内の処理をLayerクラスに移築し、Layerクラス内でButtonクラスを扱うようにします。いうわけで、Layer.pdeを作成します。これまで通り、新規タブからLayerファイルを作成し、sq.pdeのsetup()での内容をLayerに移行してみます。layerを配列にせず、一枚だけのレイヤーでbuttonを包括するように記述し直します。新規に作成するLayer.pdeの他、sq.pdeも修正します。修正したコードは下記に示します。sq.pdeがスッキリしたのがわかると思います。古いシーケンス場所として保存しておく。play_pos_previous;}上記をもう少し、クラスとしてしっかりまとめてみます。修正したい箇所は以下の2点です。呼び出さず、layer.draw()で一括して呼び出したい。statusだけ変更したいため)ただし、layer.update()は現在Metroのtrueなタイミングに合わせて更新しているため、素早い更新が必要なbutton.update()との整合が取れていません。ここで、layer.update()の仕様を少し変更します。MetroのtrueタイミングをLayer.update()内で判断できるようにします。古いシーケンス場所として保存しておく。play_pos_previous;}layer.update()関数にmetro.update()を渡すだけですべての更新ができるようになったほか、レイヤー描画もdraw()関数で一度にできるようになりました。sq.pdeのdraw()関数が非常にスッキリしました。Layerの配列化さて、ここまで来たところで、現在のlayerを配列で宣言し直すことで、複数の楽器を割り当てることができます。現状のままではどの配列のレイヤーにしても必ずハイハットの音になってしますので、layer.setup()の際に引数として読み込むファイル名を指定できるようにします。layerを配列として、それぞれ別の音を読み込みむように設定します。キーボードの1,2,3にそれぞれのレイヤー切り替えを割り当てて置きます。sq.pdeとLayer.pdeです。古いシーケンス場所として保存しておく。play_pos_previous;}最後に少しだけカスタマイズ以上で基本的な機能を実装することができました。最後に少しだけカスタマイズを行ってみます。Layerクラス内にcolorを保持しておく必要があります。カスタムできるようにしておく必要があるわけです。古いシーケンス場所として保存しておく。color_sq;}最後に出来上がったファイル一式を置いておきます。International。