「circle」というRaspberry Piのベアメタルプログラミング用ライブラリがあります。
rsta2/circle: A C++ bare metal environment for Raspberry Pi with USB
このライブラリを使ったRaspberry Pi用のソフトシンセがあったので動かしてみました。
(このライブラリの作者さん自身が作られています。)
マルチコアに対応しており、Pi2やPi3では同時発音数が増える(24音)そうです。
リポジトリはこちらです。
rsta2/minisynth: A virtual analog synthesizer for Raspberry Pi
音の出力先はHDMIではなくオーディオ出力端子なので、オーディオ出力が無いPi Zeroでは動きません。私はPi2で動かしてみました。
git clone https://github.com/rsta2/minisynth.git minisynth cd minisynth git submodule update --init
で一式をダウンロードした後、
./configure 2 arm-none-eabi- ./makeall clean ./makeall
でビルドします。1行目の「2」はRaspberry Pi2を表します。初代PiおよびPi3では、それぞれ「1」「3」を指定します。
src/kernel7.imgがビルドされたバイナリです(Pi, Pi3はkernel.img、kernel8.imgになります)。
このファイルおよび定番のファームウェア(start.elf、bootcode.bin、fixup.dat)をSDカードへコピーします。
また、音色(patch0.txt)とベロシティカーブの設定ファイル(hard, linear, notouchのいずれか)がconfig/にありますので、これもSDカードへコピーしておきます。
音色は1ファイル1音色で、今のところ1つしか用意されていないようです。
HDMIにディスプレイ、USBポートにマウスとキーボード、Raspberry Piのオーディオジャックにヘッドホンかスピーカーを接続して起動します。マウスはパラメータ設定の変更、キーボードは音出しのために必要です。USB MIDIキーボードがあれば、それも接続できるようです。
シンセサイザー自体はシンプルな1VCO、1VCF、1VCAのバーチャルアナログシンセです。
画面を見れば一目瞭然ですが、それぞれ専用のLFOを持ち、VCFとVCAはADSR型のエンベロープが付きます。
VCOはSin、矩形波、SAW、三角波およびデューティ比の異なるパルス波2つが使えます。
VCFはレゾナンスつきのローパスフィルタです。
出音は、昔のソフトシンセみたいな感じです。
矩形波とSAWの出力波形を見てみます。
フィルタはカットオフ最大、レゾナンス最小ですが、どちらの波形も立上がり・立下りがローパスを通したみたいな感じになっています。
音声出力がPWMですので、出力にローパスフィルタがあります。
回路を見ると0.1μF+100Ωの構成ですので、カットオフ周波数は15KHzくらいです。波形のなまりは、この影響を受けている可能性もあります。
VCOの実装をちょっと見てみましたが、波形生成はSin波については単純なウエーブテーブルで、生成する周波数に応じて読み出し位置を変えています。それ以外の波形は計算で波形を生成しています。
このあたり、たとえば有名なフリーのソフトシンセであるSynth1は、エイリアスノイズを出さないように、ウエーブテーブルであっても周波数ごとに調整したテーブルを持っていたりします。
ハードウェアの面では、PWMでなくI2S+DACを用いたいところですね。
音質的にも性能的にも工夫の余地は大いにありそうです。
コメント