無限音階オルガン (1)

220 円の PIC32MX による USB MIDI ホストと組み合わせるのにふさわしいローコストな音源を、ふたつの「はやり」

  • 無限音階オルガン
  • MIDI からの電源供給

に乗っかって作成することにしました。
ターゲットのチップとしては、110 円の LPC1114FN28/102 を考えていて、プログラム作成は同じ 48 MHz クロックの Cortex-M1 コアを使用している Nuvoton NUC120 を使って行っています。
既に作成済みの (未公開の) NUC120 用の FM 音源プログラムの機能を削ってプログラム容量を削減する方向で作業していて、NUC120 上でのプログラムはできました。 (MIDI からの電源供給については対象外)
同時に、Arduino / ATtiny2313 用のプログラムも作成しており、LPC1114 版より先に完成したので、まず、こちらを公開します。
ATtiny2313 版は「タピオカ鍋」さん (「sweacco」さん) の「nanorgan」とハードウェア的にコンパチブルになるように考慮してあります。
今回の記事の最後に Arduino (ATmega168/328P) 用の HEX ファイルを添付してあります。
AVR 版の主な仕様を下に示します。

  • クロック周波数 16 MHz (Arduino に合わせた)
  • オーディオ出力はタイマ 0 の 8 ビット「Phase correct PWM」出力を使っており、PWM 繰り返し周波数は 31.373 kHz
  • サンプリング周波数は PWM 周波数を 1/2 デシメートした 15.686 kHz
  • PWM 繰り返し周波数 (31.373 kHz) での 1 次シグマデルタ変調処理
  • 同時発音数 12 (CPU 負荷は 50 % 前後)
  • ウェーブテーブル・サイズは 8 ビット・リニア × 1024 エントリ
  • ウェーブテーブル波形は 7 個の正弦波の重ね合わせ (最低オクターブの周波数 32.7 〜 61.7 Hz、最高オクターブの周波数 2093 〜 3951 Hz)
  • タクトスイッチによる 1 オクターブの簡易キーボード入力と、MIDI 入力とに同時に対応 (MIDI はノートオン/ノートオフのみに反応、ピッチベンド、ビブラートには非対応)
  • キーを押しながら電源投入 / リセットすることにより、MIDI 受信チャンネルの設定可能 (「C」〜 「A#」キーがそれぞれ MIDI チャンネル 1 〜 11 に対応、デフォルトは「1」)
  • 「B」キーを押しながら電源投入 / リセットすることにより、シリアル MIDI (38.4 kbps) への切り替えが可能 (デフォルトは (レガシー) MIDI (31.25 kbps))
  • ライン出力のみでパワーアンプおよびスピーカーなし
  • プログラム・サイズは Arduino 用 (ATmega168/328P) で 2054 バイト、ATtiny2313 用で 2008 バイト

プログラム開発は AVR Studio 上で行っており、C およびアセンブラで記述しています。
Arduino IDE では、アセンブラ・ソースを受け付けないので、Arduino の「スケッチ」として実現するためには、アセンブラ部分は C プログラム中で「インライン・アセンブラ」として記述する必要があります。
そのため、まだ「スケッチ」の形にはなっておらず、Arduino としては、ハードウェア・プラットフォームとしての利用と、「avrdude」と内蔵ブートローダによるプログラム書き込みの機能だけを利用しています。
Arduino (ATmega168/328P) 専用であれば、もっと機能を増やしたり、プログラム・サイズ増大と引き換えにプログラム実行スピードを上げたりすることができますが、ATtiny2313 と共通化するために機能を絞っています。
秋月「B」タイプ・ユニバーサル基板を使って Arduino 用のシールドとして作成した回路の写真を下に示します。

ATtiny2313 の回路も組み込んであり、電源、タクトスイッチ、PWM 出力 LPF、シリアル入力を共有しています。 Arduino と ATtiny2313 は同時に動作し、それぞれ独立に PWM 出力が得られますが、LPF はひとつなので、LPF への入力をトグルスイッチで切り換えています。
タクトスイッチを (複数) 押すのに力が掛かるため、シールドである秋月「B」基板自体に「足」を付けて支えています。
そのため、Arduino 本体はシールド基板の下側に吊り下げるような形で接続し、「地面」には接していません。
上の写真で下側に一部見えているのが Arduino-2009 互換タイプの秋月 AE-ATMEGA 基板です。
Arduino (互換) 基板を外せば、ATtiny2313 のスタンドアロン基板として動作します。
その場合、写真左上に見えている黒い DIN 5P コネクタからの MIDI 入力からの電力のみで動作し、外部電源を必要としません。
Arduino の「シールド」としての回路を下に示します。

タクトスイッチのコモン側を直接 GND に落とさずに 100 Ω の抵抗を介しているのは、Arduino 側にポートを出力に設定するようなプログラムが書き込まれていた場合でも、出力が直接 GND にショートされる事態になるのを避けるためです。
LPF に後で示すようなパッシブ・フィルタを使えばシールド側に電源供給の必要はなく、ボード片側の D0 〜 D13 のディジタル出力側のコネクタに接続するだけですみます。
ただし、D13 出力には 1 kΩ の抵抗を介して LED が接続されており、ATmega 内部のプルアップ抵抗だけでは十分な「H」レベルを得ることができず、そのままではプルダウンされて「L」レベルが入力されることになり、音が出っ放しの状態になります。
これを解決するには、もっと「強く」プルアップしてやればいいのですが、ディジタル側のコネクタには、電源端子が含まれていません。
そこで、「AREF」端子を利用して 1 kΩ の抵抗でプルアップすることにしました。
AD のリファレンス選択を「AVCC」 にすると、外部のコンデンサでデカップリングするために、 MOS トランジスタを介して「AVCC」端子と「AREF」端子とが接続されます。
これは「デカップリング」のためであり、外部に対して電源を供給する目的ではないので、AD を使用する場合に AREF 端子から外部に電流を取り出すと変換精度が得られなくなります。
ここでは AD は使っていないので、その心配はありません。
Arduino でも「UNO」以降では OP アンプによるバッファが入っていて、D13 出力を低インピーダンスで GND 側に引っ張ることはなくなりました。
もちろん、Arduino ではない ATmega168/328P 単独の回路で、D13 プルダウン問題がない場合には、1 kΩ の抵抗を介して AREF 端子と接続する必要はありません。
なお、当然、「A」のキーを押すと D13 端子に「L」が入力されるので、D13 に接続されている LED は消灯します。
(レガシー) MIDI 入力は D0 端子に入れますが、そのままでは Arduino のシリアル・インターフェースと干渉するので切り替えスイッチが必要です。
上の図では MIDI 入力関係の回路は省略してあります。
同様に、D1 端子に MIDI 出力回路がつながり、その回路の入力インピーダンスが低く「プルダウン」として作用する場合には、プルダウンに負けない程度の値の外部プルアップ抵抗を付ける必要があります。
LPF として、電源の必要ないパッシブ LC フィルタの例を下に LTspice に入力する回路図の形で示します。

LPF としては、PWM の繰り返し周波数を減衰させる目的、ナイキスト周波数以上を減衰させる目的に加え、シェパード・トーンの高域側を減衰させる目的を持っています。
そのため、カットオフ周波数は約 2.5 kHz と低めになっています。
インダクタンスの大きいインダクタは高価になりますが、秋月で 100 mH を 40 円で販売しているので、それを使うことを前提にした回路になっています。
低域側をカットする HPF については、パッシブ回路ではインダクタンスが大きくなりすぎて実用的ではないので、1 μF のコンデンサ 1 個を挿入して簡単な 1 次 HPF を構成するだけにしています。
LTspice でシミュレーションした周波数特性を下に示します。

最後に、Ardduino (ATmega168/328P) 用の HEX ファイルを示します。
「avrdude」を使ってブートローダ経由で書き込みます。
Arduino 固有の部分はないので、前述の「シールド」相当の回路と、16 MHz 水晶で動作するようにフューズが設定されていれば、Arduino の形になっていない裸の ATmega168/328P 回路に書き込んでも動作します。

:100000000C9447020C9459020C9459020C94590216
:100010000C9459020C9459020C9459020C945902F4
:100020000C9459020C9459020C9459020C945902E4
:100030000C9459020C9459020C9459020C945902D4
:100040000C945B020C9459020C9459020C945902C2
:100050000C9459020C9459020C9459020C945902B4
:100060000C9459020C945902290002290004290019
:1000700008290010230001230002230004230008A4
:100080002300102300202900402900808095A9B971
:10009000C4CBCCC9C4BDB6B1AFB0B4BBC2C9CFD15B
:1000A000D0CBC3B8ADA39A96969BA5B1BFCEDAE3E9
:1000B000E7E7E2D8CDC0B4AAA3A0A1A4A9AEB2B389
:1000C000B2ADA59B91898381848C98A8BACCDCE8D9
:1000D000F0F3F1EAE1D7CDC5BFBDBEC2C6CACDCDF2
:1000E000C9C1B7AA9C8F857F7D818994A1AEB9C211
:1000F000C5C4BEB5A99C9087807E7F82888E93956B
:1001000095918B827A726E6E727C8A9CAFC3D5E3B6
:10011000EDF1F1ECE5DCD4CDC9C9CBD0D6DBDFDF26
:10012000DDD6CCC0B3A79D979699A1ACB9C6D1D85E
:10013000DBD9D3C8BBADA0958D89888A8E92959561
:10014000928D84796F655E5B5E65718092A3B2BEAD
:10015000C6C8C5BFB5ABA09892909194989D9F9F3B
:100160009B94897D6F63595351555D69768490984E
:100170009D9C978E83766B625C5A5C61676E73762A
:1001800077746E675F5955555B6675879CB0C3D2AF
:10019000DDE2E3DFD8D1C9C4C1C1C4CAD0D7DBDD39
:1001A000DBD5CCC1B4A9A09B9A9EA7B3C0CDD9E1A1
:1001B000E5E3DDD3C7B9ACA29A9696999DA1A4A513
:1001C000A29D948A7F756F6C6E768191A2B3C2CE28
:1001D000D5D7D4CDC4B9AEA59F9C9D9FA3A7A9A8F0
:1001E000A49B908375675D5654575E6975828D94A4
:1001F000989690867A6C60564F4C4D50555B5F6276
:10020000615D564D443D38373C455365788B9DAB19
:10021000B4B9B8B3ACA39A94908F91969BA0A4A5BF
:10022000A29B9185786C625C5B5E66717E8B969D0D
:10023000A09E988D8073655A534F4E5054585B5C06
:100240005A544B41362D2624262E3A4A5B6D7C8922
:100250009093918A81776D65605E5F62676C6F6F66
:100260006B645A4E41352B262529313D4B59666F1B
:1002700073736E665B4F443C3735373C434A50548A
:1002800055534D463F3936373D48586B8095A8B891
:10029000C3C9CAC7C1BAB3ADABACB0B6BDC4C9CB94
:1002A000C9C4BCB1A59A928D8D919AA7B5C3CFD779
:1002B000DBDAD5CBBFB2A69C95919194999EA1A271
:1002C000A09B93897F766F6D70778493A5B6C6D215
:1002D000DADCDAD3CABFB5ACA6A4A5A8ACB0B2B17B
:1002E000ADA69B8D8073686260636A75828F9AA2E7
:1002F000A5A49E94887B6F655E5B5C60656A6F7188
:10030000706C665D544D48474C556375889BADBB1A
:10031000C4C9C8C3BCB3AAA39F9EA1A5ABB0B3B4C4
:10032000B1AAA094867A706A686C737E8B97A2A932
:10033000ACAAA3998B7D70655C5857595D61636465
:10034000615B52473C332C292B323E4D5E6F7F8AD6
:100350009294918B81766C635E5B5C5F63676A6A83
:10036000665E5447392D231D1B1F2733404D5962AC
:10037000666560574C3F342B2523252930363C3F9A
:100380003F3C372F28211D1E232E3D5064798B9A28
:10039000A5ABABA7A199928C898A8D92999FA4A6AF
:1003A000A49E958A7D7269646368707C8A97A3AB0A
:1003B000AFADA79D9183776C65616163686C6F7069
:1003C0006E6860554B413B383A424E5D6E808F9B64
:1003D000A2A5A29B91877C736E6B6B6E7276787709
:1003E000736B605345382D2725282F3A47545F6794
:1003F0006A6963594D40342A232121252A30353733
:1004000037332C241B140F0F131D2B3D516476849E
:100410008E92928E867E756F6B6B6D72787E818206
:1004200080797064574B423C3B3E47525F6C777F0C
:1004300083817B716456493F373333363A3E4243BA
:10044000413B33291F160F0D101824344658687489
:100450007C7F7D776F655B534E4D4E52575C5F607E
:100460005D564C4033281E19191D2632414F5B65DD
:100470006A6A665D53483D35302F31373E454C50F2
:10048000514F4A433C3734353C47576B8000112469
:100490001FBECFEFD4E0DEBFCDBF21E0A0E0B1E0D2
:1004A00001C01D92AD33B207E1F70E94FC030C942A
:1004B00001040C9400001F920F920FB60F921124AA
:1004C0002F938F939F93809103019091040120912A
:1004D0000001820F911D80930001905898BD90916A
:1004E0000101992319F081E080933B0181E0892784
:1004F000809301019F918F912F910F900FBE0F90CC
:100500001F901895589A86E08093C20080E18093EE
:10051000C10080913901882311F089E101C08FE188
:100520008093C4001092390108951F93CF93DF93F5
:1005300080E090E048E853E171E09C01220F331F16
:10054000280F391FF901E659FF4F649128593F4F91
:10055000F90125913491D901362F309511962C91BE
:100560001197232311962C93119712962C91129781
:10057000262B12962C931297EA012197F1F72C91D2
:10058000262339F48B3019F08093020102C0709356
:10059000390101968C30910581F6DF91CF911F9141
:1005A000089581E284BD81E085BD90E897BD98BD46
:1005B000559A80936E00089580E480937C000E9499
:1005C00095020E9482020C94D102CF93DF93809116
:1005D0003B01882309F493C0809136019091370143
:1005E000909304018093030110923B0185E091E018
:1005F0000E94940390933701809336018091C0004C
:1006000087FF4AC04091C60047FF17C0842F887FEC
:10061000883F09F441C02091020130E020583F4F4B
:10062000842F8F7E90E02817390721F4407F409374
:1006300035012DC0109235012FC0909135019923BD
:1006400059F180913A018F5F80933A01823011F520
:10065000E0913801E03318F0E05301C0EC50EC3089
:10066000E8F7F0E0EE0FFF1FEE0FFF1FE85FFE4F11
:100670008081442311F0903841F4982F969539F0F9
:100680009158990F8170892B01C08E5F80831092E1
:100690003A0102C04093380180913C018F5F809302
:1006A0003C018F3060F110923C0120913901A22F62
:1006B000B0E0CD01880F991F8A0F9B1FFC01E659FE
:1006C000FF4F349188599F4FFC0185919491C82F19
:1006D000D92F8881AA0FBB1FAA0FBB1FA85FBE4FCF
:1006E000832391E009F090E08C9190FB80F98C934A
:1006F0002F5F209339012C3010F01092390183B70D
:10070000816083BF889583B78E7F83BFDF91CF9150
:10071000089510920401109203010E94DC0283B735
:10072000817F83BF78940895DC01882799274CE85E
:1007300050E070E038E822EA42D070E030E921EC85
:100740003ED070E039E92DE53AD070E032EA2CE78E
:1007500036D070E03CEA25E232D070E036EB22E69B
:100760002ED070E031EC2AE32AD070E03CEC27EB8D
:1007700026D070E038ED24EE22D070E035EE29EC82
:100780001ED070E033EF23E71AD071E031E02DEE98
:1007900016D061E0883F960714F088EF962F6EEF31
:1007A0008830960714F488E0962F9795879597954B
:1007B00087959795692F982F862F807C08956C9147
:1007C000620F6D93FC91F31FFD93EC91E71FED9386
:1007D0000D900694011C79F0FF1FEE1FFF1FEE1F06
:1007E000FF1FF370E40FF51F7591870F911D80585F
:1007F00090400A94D1F708950E9489030E94E5026F
:06080000FDCFF894FFCFCC
:00000001FF