この方のWaveTable電子オルゴールにて、自分の作った電子オルゴールには無い特徴を発見しました。
オルゴールの金属バネが弾ける感じを再現するのに実際にサンプリングデータを用いています。
さらに、低音は響きが長く、高音は短くなるように減衰をかけているようです。
作成しているマイコンが違うので命令セットもだいぶ異なり簡単に移植はできませんが、サンプリングデータと仕様がわかるので取り入れてみようかと思いました。
これまでの私の作ったオルゴールプログラムは単にサイン波を最初から出していたので少し木琴のような音でした。
改修後は、若干金属が弾ける感じがわかります。
アタック期間に使われるサンプリングデータが256バイトx3.5=896バイト、サステイン期間に使われるサイン波テーブルが128バイト、計1024バイトでした。
今までサイン波テーブルは1周256バイトで作成していたので、ピックアップテーブルとエンベロープテーブルは作り直しで、さらにPIC12F1822のプログラムエリアは2048バイトなので、ぎりぎりまで切り詰めないとなりませんでした。
エンベロープカウンタの進み具合を調整する変数をひとつ設け、ここに音の高低に比例したカウンタ増分値を設定しました。いままでは、音の高低にかかわらず1インクリメントするだけだったのを、1オクターブ高いと2増分のような加算形式にしたということです。
ベートーベンの田園を、前のプログラムと改修後のプログラムで聞き比べると少しだけ違いがわかるはずです。
ちなみにムービーに使った写真は、五光牧場と、リニアモーター試験場、です。
減衰正弦波のみ
アタック期間+サステインループ音程比例減衰正弦波
ついででラピュタの「君をのせて」
画像は朝霧ジャンボリーキャンプ場で撮った明けの明星と富士山