デジタル・シンセサイザーの製作 2025.3.29

    1.はじめに

     以前に、PICマイコンを使ったシンセサイザーシンセ用ICを使ったアナログシンセサイザーを作ってきましたが、またも懲りずにシンセサイザーを作ってしまいました。

     3年程前にデジタルフィルタのプログラミングの学習用にと、秋月電子でSTM32NucleoBoardを購入したのですが学習は全く進まずに眠らせたままでした。

     ある時、Youtubeでマイコンを使ったFMシンセの製作動画を見つけました。 動画の内容が面白く自分も作ってみたいなと思い、眠っていたSTM32NucleoBoardでFMシンセのプログラム作りを始めました。

     Board単体では、4オペレーター、同時6発音の音出しまで進み、続けてFM音源の音作りのためのスィッチやボリュームの操作回路の検討やそのためのプログラム設計を始めましたが、なかなかうまく纏めることが出来ませんでした。

     良いアイデアも出せずFMシンセ作りがちょっと面倒くさくなり、製作方針を変更してアナログシンセをシュミレートするデジタルシンセサイザーを作ってしまったという訳です。

     今回製作したシンセサイザーです。  背面、左から電源コネクタ、SDカードスロット、USBタイプCコネクタ、スピーカーとなっています。  USBインタフェースのMIDIキーボードを接続して演奏します。パソコンを繋げばMIDIデバイス(音源)としても動作します。
     シンセサイザー内部です。ケースは100均の木材等を使って製作しました。  操作パネルとの接続ケーブルの配線の様子です。  ユニバーサル基板にSTM32Nucleoボードをスタックしています。
     ユニバーサル基板によるベース基板です。
    ボリュームの入力を切り替えるアナログスィッチ(uPD4066BC)やアナログアンプ基板(左上)、SDカードインタフェース、USBタイプCコネクタを搭載しています。
     裏面半田付けの様子です。0.6mmスズメッキ線、0.29mmのポリウレタン銅線で配線しています。

    2.回路構成

     以前に製作したアナログシンセサイザーはMS-20をモデルにしていましたが、今回は、TEISCO-100Fの機能構成をモデルにしてみました。

     OSCx1,  LPFx1, HPFx1,  VCAx1,  LFOx2,  EG(AR+ASR)x2 で構成しました。


    3.回路概要

    3.1 OSC

     オシレータは、正弦波、鋸歯状波、パルス波、ノイズ波を発振できるようにしました。
     波形は[WAVE SELECT]のスィッチを上に倒す毎に切り替わります。

     [TUNE]を右に廻すとピッチが上がり左に廻すとピッチが下がります。
     上下ともに最大1オクターブの変化としました。

     ピッチは更にEGやLFOで変調をかけることが出来ます。EGやLFOはそれぞれ2つ搭載していますので、[EGmod],[LFOmod]の各つまみが中央で変調なし、左右に廻すことでEG1やEG2、LFO1やLFO2の出力でピッチを変調できます。

     正弦波を選択した時は、[FMmod]にてFM変調をかけることが出来ます。
    2オペレータ(キャリヤx1, モジュレータx1)の簡単なものですが、色味の無い正弦波から少し金属的な音へと変化させることが出来ます。

     [PORTAMENT]を右に廻すとポルタメント効果が働きます。


    3.2 LFO

     多彩な音色作りが出来るように2個搭載しました。

     LFOも、正弦波、鋸歯状波、パルス波から波形を選択できます。

     波形は[WAVE SELECT]のスィッチを上に倒す毎に切り替わります。

     発振周波数は、0から数十Hzまで[FREQ]を右に廻すと変化します。


    3.3 ENVELOPE GENERATOR

     OSCの変調とLOW PASS FILTERの変調を別々に行えるようにEGは2つ搭載しました。

     EGパターンはAtackReleaseAtackRelease+KeyOffAtackSustainReleaseの3パターンとしました。これはTEISCO-100Fをマネたものです。
     パターンはスィッチで選択します。

     アタック時間やリリース時間は[ATACK][RELEASE]のつまみで調整します。右に廻すと時間が長くなります。

     EGのトリガは、LFO1、LFO2、KEYBORDから選択できます。中央のスィッチで切替ます。


    3.4 LOW PASS FILTER

     [CUTOFF]でフィルタのカットオフ周波数を調整できます。

     [RESONANCE]にてカットオフ周波数付近のゲインを調整できます。

     カットオフ周波数は、キーボードやEG,LFOの出力で変調をかけることができます。

     それぞれ[KBDmod][EGmod][LFOmod]のつまみで変調度合を調整します。






    3.5 HIGH PASS FILTER

     [CUTOFF]でフィルタのカットオフ周波数を調整できます。

     [RESONANCE]にてカットオフ周波数付近のゲインを調整できます。

     EGやLFOによるカットオフ周波数の変調はできません。




    3.6 EFECT

     エコーとトレモロ、コーラスの機能を付けました。

     エコーはオンまたはオフのみです。残響時間の調整などの機能は設けていません。

     トレモロは、LFO1またはLFO2でかけることができます。

     コーラスは、ピッチが上下にずれた2つの波形を加えてみました。[CHORUS]つまみでピッチのずれを調整します。


    3.7 AMP

     アンプのゲイン調整を、キーボード、EG1、EG2 から選択できます。

     出力の全体的な音量調整を[VOLUME]で行います。







    3.8 REC/PLAY

     現在選択されているオシレータやLFOの波形情報、USBのモード(HOSTまたはDEVICE)などを小さなOLEDに表示するようにしました。

     現在設定している各つまみの値などをSDカードやマイコンのROMに記憶し、それを読み出す機能を設けました。

     またキーボード演奏時のMIDIノート情報をSDカードに記録し、自動再生できる機能も組み込んでいます。

     [SET][UP][DOWN]の3つのボタンを使ってこれらの操作を行います。

     これらの付加機能については後述します。




    4.USBのモード切替

     シンセサイザーを演奏するためには、USBケーブルでパソコンに接続するか、USBのMIDIキーボードを接続します。

     パソコンに接続した時は、MIDI音源として動作します。シーケンサーソフトなどを使って演奏できます。

     USBのMIDIキーボードを接続した時は、MIDIキーボードが本装置の鍵盤となります。

     パソコンとの接続には、USB-A(オス)コネクタとUSB-CコネクタのあるUSBケーブルを使用します。
     この時、本装置は、USBデバイスとして動作します。

     MIDIキーボードの接続には、USB-A(メス)コネクタとUSB-CコネクタのあるUSB(OTG)ケーブルを介して接続します。
     この時、本装置は、USBホストとして動作します。

     本装置背面のUSBコネクタはタイプCです。  MIDIキーボードの接続では、このようなケーブルや変換コネクタを使います。

     デバイスモード、ホストモードの切替は、接続ケーブルによって自動で切替を行います。
     OTGケーブルでは、CコネクタのCC1,CC2端子がGNDにプルダウンされていますのでこれを検出した時にはホストモードに、そうでない時にはデバイスモードに切替ています。


    5.操作メニュー

     PLY/RECの[SET}[UP][DOWN]のいずれかのボタンを押すと次のような操作メニューがOLEDに表示されます。

       === MainMenu ===
       Midi Chanel Mute
       Save Setting
       Load Setting
       Play normal mode
       Recording
       Playing
       Dump Pot/Key

     表示直後は[Midi Chanel Mute]が反転表示しています。[UP][DOWN]ボタンを押して機能を選択し[SET]で確定します。

     以下、各機能の概要です。

     Midi Chanel Mute
      MIDIのチャネル1からチャネル16まで各チャネル毎にミュートのオン・オフ設定を行います。起動直後は、全チャネルともミュートオフ(発音)になっています。
      本装置は、5音まで同時発音できますが音色は各つまみによって設定したひとつだけの音色です。
      そのため、パソコンのMIDI音源として動作させた時、特にチャネル10のリズムパートなどは音色がまったく合いません。このような時にチャネルミュートを使います。
      チャネル10に限らず、好きなチャネルをミュートできます。

     Save Setting/Load Setting
      シンセサイザーによくある機能として、ノイズ音源を使ってSLの走行音や風、波、雷などの効果音を作成することが出来ます。
      EGやLFOやLOW PASS FILTERの設定を微妙に調整することによってこれらの効果音を作り出す訳ですが、一度作った音を再度作ろうとするとなかなかうまく行きません。
      そこで、本装置では各つまみやスィッチの状態をROMに記録しそれを読み出すことが出来るようにしました。これにより、一度作った音を後から簡単に再現出来ます。
      Save Setting で記録、Load Setting で読み出しを行います。記録出来る数は10個までです。(もっと増やせますが取り合えず10個にしています)

     Play normal mode/Play fixed mode
      Play normal modeというのは、各機能のつまみによる調整が有効な状態をいいます。通常の状態です。
      Play fixed mode というのは、そのmodeに切り替わった時の調整状態を維持したままの状態をいいます。このmodeでは、演奏中につまみを操作しても無効となります。
      Load Settingを行うと自動的に fixed mode に切り替わります。

     Recording/Playing
      MIDIキーボードでの演奏を背面にセットしたSDカードに記録します。後で、自動再生することができます。
      Recordingで記録を開始します。適当な所で、操作メニューを表示すると記録を停止します。
      Playingで再生します。自動的に fixed mode に切り替わり再生します。記録・再生できる数は30個です。(もっと増やせますが取り合えず30個にしています)

     Dump Pot/Key
      現在のつまみ(ポテンショメータ)の値やスィッチのオン・オフ状態を表示します。
      プログラムの開発過程において、ポテンショメータの値を読み取るA/D変換結果をダンプ表示するために作った機能です。
      演奏には必要ないものですが、完成した今でも時折、発音や動作がおかしくなることがあり、確認のために残しています。
      STM32のHALライブラリを多用していますが、今一ライブラリの動作が不安定な気がしてなりません。


    6.回路図

     全体の回路図です。ボリュームやスィッチの記載は省略しています。

     各つまみに使用したボリュームは、全て10KΩです。アンプの[VOLUME]はAタイプですが、その他は全てBタイプです。

     トグルスィッチには、ON-ONの1回路2接点のものとON-OFF-ONの中点付きの1回路2接点のものを使っています。

     Nucleo64ボードへの電源は、外部のACアダプタからVIN端子にDC(+6V〜+9V)を供給しています。ボード上のジャンパーピンJP5でE5Vの設定にしています。

     基板上のUSBタイプC(メス)コネクタには、秋月電子のDIP化基板を使いました。VBUSへの+5Vの供給にはダイオードを入れています。
     パソコンに接続した時は、パソコンからVBUSに+5Vが供給されますので電圧のぶつかりを嫌って入れてみました。



    7.プロジェクトファイル1式

     STM32F446RE-Nucleo64のプログラム作成は、STM32CubeIDEで行いました。ファームの書き込みには、STM32CubeProgrammerを使いました。

     DigitalSynthですが、プロジェクト名は AnalogSnthになっています。

     プロジェクトファイル: AnalogSynth.zip
     ソースファイル:    AnalogSynth

     STM32 HALライブラリ等を多用してます。

     USB-MIDIホストの処理usbh_MIDI.cは次のプロジェクトから借用しました。
      https://github.com/rogerallen/stm32disc_midisynth1

     USB-MIDIデバイスの処理usbd_midi.cは次のプロジェクトから借用しました。
      https://github.com/Hypnotriod/midi-box-stm32

     low pass/high pass filter の処理アルゴリズムは、次のサイトや記事を参考にしました。
      https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html
      インタフェース 2021年8月号「リアルタイム処理のために軽量化!シンセサイザの製作」

     エコーの処理アルゴリズムは次の記事を参考にしました。
      トランジスタ技術 2023年10月号
      「モダンArm開発環境ではじめる音声信号処理実験 第2回 残響発生の信号処理プログラム」