Raspberry Piを使ったシンセ「minisynth」を動かしてみた

「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を用いたいところですね。
音質的にも性能的にも工夫の余地は大いにありそうです。

コメント