
なぜこれを作ったのか
ロータリーエンコーダで周波数を調整する機器(シンセサイザ、ファンクション・ジェネレータ)は多くあります。それらのほとんどは、定量回すとリニアで周波数変化するタイプです。粗調整、微調整、桁を切り替えるものや、速く回せば変化が大きくなるものなどあります。
音楽や周波数の研究をする上で、例えば現在の周波数から長3度上に周波数を変化させたいことがありますが、その場合 f x 1.26 などと計算した上で周波数表示画面を見ながら調整ダイヤルを回すような操作をすることになります。
また1オクターブ上げ下げする際にもダイヤル回転量が不定です。1,000 Hz ⇨ 2,000 Hz の回転量と、4,000 Hz ⇨ 8,000 Hzの回転量は異なります。
電磁気振動や音響振動が引き起こす影響は倍音関係になっても影響しますし、特定の周波数差も異なった影響を引き起こすという研究があります。直感的に「1周=1オクターブ」で調整できる周波数ダイヤルの必要性を感じていました。
最近は周波数範囲が 1uHz ~ 100MHzまで広範囲に設定できるようなファンクション・ジェネレータも販売されており、外部制御で周波数を設定すれば数十オクターブを広く扱えて、周波数の研究も捗ること間違いなしです。
課題設定 これが解決したら面白い
- 1回転=1オクターブ の対数変化を実現する
- 回転角度を高精度にする
- 見やすい表示(ディスプレー & ダイヤル目盛り)
- ファンクション・ジェネレータ制御のためのインターフェース
- 音響領域はスピーカーを鳴らしてデモする
- 周波数を各スケールの音階に量子化(クォンタイズ)する機能
解決手段 試作の概要
ハードウェアの構成です。
- ロータリーエンコーダ 600PPRタイプを選定。1周を2400分割できて精度は十分です。
- M5Stack
- M5Stack用オーディオモジュール スピーカー出力のために追加
- アルミパネル MISUMI Meviyで加工しました。
- その他のパーツはFreeCADで設計して3Dプリンタで作りました。



ロータリーエンコーダーは電子工作で簡易的に使うようなものは16PPRとか角度精度が不十分なので、それなりのものを選ぶ必要があります。精度と価格と相談して600PPRタイプを選びました。0.15°の分解能があるので精度十分です。(課題2の解決)
マイコンはM5Stackを使います。
開発環境はVSCode + PlatformIO です。M5Unified.hを使います。
ロータリーエンコーダ用のライブラリESP32Encoder.hが用意されているので制御は簡単です。
M5Stackのポートをハードウェアカウンタに設定できるので、ソフトウェア処理の遅延に悩まされることなく、エンコーダからのカウント値を取得することができます。
以下の式でリニアのカウント値を周波数 foct に変換します。
エンコーダを1周回すごとに、周波数が、1,000 ⇨ 2,000 ⇨ 4,000 と上がっていきます。(課題1の解決)
double foct = pow(2.0, (double)count /2400.0);
画面表示は基準周波数との比較モードでは、現在の周波数( f )、基準周波数( fs )、周波数差( f – fs )、周波数比( f / fs )、差分角度( A )を一覧で表示するようにしました。どの周波数領域でも完全5度は f / fs = 1.50、A = 210°と表示されます。
周波数ダイヤルの下の目盛りテーブルは自由に回すことができます。
▼マークを現在の周波数指示針に合わせると、そこからの音階の位置が一目でわかるようになっています。
内側から、cent (1オクターブ = 1200 cent)、12-EDO(平均律)、JI (純正律)、PYTH (ピタゴラス音律)、黄金比音律となっています。この目盛盤は目的や用途に応じていろいろなパターンが考えられます。(3)


外部のファンクション・ジェネレータを制御するのが開発の趣旨ですが、この装置単体でも楽しめるように音を出せるようにしました。
M5Stack内蔵スピーカーは音質も悪いので、Audio-Moduleを追加し外部スピーカーに出力できるようにしました。ES8388 audio-codec chipを制御することになります。I2C, I2S, サウンドパラメータの設定などが必要になります。音を出す部分は、こんな感じのコードを書きます。ダイヤルを回せばそれに応じた周波数の音がスピーカーから出るようになりました。(5)
M5.Speaker.tone(432);
連続的に変化する周波数を聞くだけではデモンストレーション的につまらないので、12音階に周波数クォンタイズする機能を入れました。ダイヤルを1周回すと、12音階に階段状の変化で周波数が変わるようにしました。さらに12音階の一部を抜いて、各種スケールでの音階変化もできるようにしました。
12-EDO, Major, Minor, Phrygian, Dorian, Arabic1, Arabic2, Japanese, Ryukyu, Miyako
アラビック、琉球、都調スケールはダイヤルを回すだけで、雰囲気が出て聞いていて楽しいです。(6)
開発品

こうして、1周=1オクターブで周波数指示ができる装置が完成しました。
ある周波数が人体やオーラ領域に影響するという研究もあり、このダイヤルを回しながら何か引っかかるポイントを探していくことで、興味深い発見が得られるかもしれません。
