筑波大学情報学群の実験講座「組み込み技術キャンパスOJT」(以下、COJT)における最後のカリキュラム「自由課題」で、僕はFPGA上にシンセサイザーを実装しました。

 シンセサイザーとは、電気的に音を生成する電子楽器の一種です。音の合成方式にはさまざまな種類があり、世には多種多様なシンセサイザーが存在しています。今回僕が作成したのは、非常に基本的なウエーブテーブル式のシンセサイザーです。

最初からシンセを作ると決めていた

 僕はハードウエアのシンセサイザーを作るという明確な目標を持ってCOJTに臨みました。

 僕は音楽が大好きで、長年ピアノと作曲を趣味にしています。その趣味の延長で、大学に入ってからはシンセサイザーを含む、音を扱うソフトウエアを書いてきました。その中で感じていたのが、CPU上で動くプログラムの高速化の難しさについてでした。

 2年生の時、僕はMIDIキーボードなどから入力をもらって演奏ができるようなソフトウエアシンセサイザーを開発しました。シンセサイザーの仕組み自体は、合成方式にもよりますが、そこまで複雑なものではありません。開発の際に課題となったのは、むしろ処理内容とは別の部分でした。プログラムの処理時間です。

 鍵盤を押してから実際に音が出るまでの応答時間を、レイテンシーと呼びます。ただ音を合成して書き出すだけであれば、処理にはどんなに時間がかかっても特に問題はありません。しかし、楽器として演奏するとなると、レイテンシーは弾き心地に強く影響してきます。レイテンシーがあまりにも大きいものは、たとえ音が鳴ったとしても、楽器としては使いものになりません。

 従って、プログラムの高速化が必要になります。合成方式が複雑になるほど、また、一度に鳴らさなければいけない音の数が増えるほど、1サンプル当たりの処理には多くの計算が必要となり、時間がかかります。プログラムの高速化は、コードがどのようなアセンブリーに落ちるのかを意識しながらコードを書き直していくという専門性の高い作業です。

 2年生での開発を通して、実用的な電子楽器や、サウンド・エフェクターとしてのソフトウエアの開発には、アルゴリズム自体を記述できる能力に加えて、高速化を行うための、低レイヤーに関する知識も不可欠であるということが分かりました。

 そこで、3年では、ハードウエアでシンセサイザーを開発すると決めて、COJTを受講しました。

 他のメンバーと違って、自由課題以前に作った描画回路やキャプチャー回路は使い回さないでほとんど一から開発を行うため、僕は他の人より、だいぶ早い段階で設計を開始しました。どのように開発を進めていくかということも、かなり悩んで決定しました。

 開発期間は限られているため、「最終発表までに動くものができませんでした…」では笑い物になってしまいます。そこで、(1)取りあえず音が出る、(2)音を鍵盤で制御できる、(3)余裕があれば複数同時に鳴らせる、といったマイルストーンを立て、開発に取り掛かりました。