ATtiny10 用プログラム (12)

ATtiny10 版の MIDI to CV プログラムができました。
ソースリストは長くなるので次回に掲載します。
Arduino につないだままではなく、「応用回路」中に差し替えた場合の回路図を下に示します。
シリアル MIDI / レガシー MIDI インターフェース回路部分については省略してあります。
ひとつのプログラムでシリアル MIDI (38.4 kbps) / レガシー MIDI (31.25 kbps) 両方に対応しており、通常は GATE 出力として使われる PB1 (3 番ピン) の状態をプログラムの起動時に読み取り、10 kΩ 程度でプルダウンされていればレガシー MIDI、オープンあるいはプルアップならシリアル MIDI と判断しています。

PB0 (1 番ピン) から PWM で CV が出力されます。
PWM の繰り返し周波数は、シリアル MIDI (38.4 kbps) の場合 15.625 kHz、レガシー MIDI (31.25 kbps) の場合 12.695 kHz になります。
シリアル・ボーレートの切り替えは、OSCCAL レジスタの値をデフォルト値から増減して、内部 8 MHz RC オシレータの周波数を変更して行っています。
そのため、正確には、各個体ごとに発振周波数を測定して合わせこむ必要がありますが、サンプルとして 3 個を調べた結果では特に問題ありませんでした。
この調整値を変更するには、ソースに変更を加えて再コンパイルする必要があります。
CV の出力は MIDI ノート番号 0 が 0V、ノート番号 127 が Vcc に対応するレンジに設定してあり、9 ビット PWM を利用しているので、CV の分解能は 1/4 半音 (25 セント) になります。
PWM 出力に LPF をかけてアナログ電圧に変換します。
上の回路図では、レイル・ツー・レイル入出力の OP アンプを 1 個使用した、Sallen-Key 構成の 3 次ベッセル・トムソン・フィルタ特性の LPF の例を示しています。
フィルタで帯域制限する結果、CV 出力側に「遅延」が生じるため、ゲート信号の方を 16 PWM 周期分の約 1 ms 遅らせてから出力しています。
対応している MIDI チャンネルは「1」(ステータス・バイト中の数値としては 0x0) で、他のチャンネルに変更するためには、ソースに変更を加えて再コンパイルする必要があり、プログラム実行時に動的に変更することはできません。
対応している MIDI メッセージは、

  • ノート・オン (0x90)
  • ノート・オフ (0x80)
  • オール・ノート・オフ (0x7B) など
  • ピッチ・ベンド (0xE0)
  • RPN#0000 (Pitch Bend Sensitivity) (CC#100、CC#101)
  • データエントリ MSB (CC#06)

です。
他のメッセージには対応していません。
ノート番号の記憶場所がひとつしかないので、常に最新のノート番号に書き換えられる、つまり「後着優先」で発音します。
2 個のノート・オンがオーバーラップしながら到着し、後着のノートがノート・オフになっても、前着のノートの音程には戻りません。
ノート・オンの回数をカウントしており、ノート・オフしないまま次の音のノート・オンが来た場合には、ゲート信号は「1」のまま保持し続けます。
いったん「0」にしてから新たにゲート信号を立ち上げるようなことはしません。
ピッチ・ベンド情報は 14 ビット・フルに保持していますが、CV 出力は 1/4 半音の分解能なので、ピッチ情報はそのレベルに合わせて丸めて出力しています。
lds/sts 修正ずみの HEX ファイルを下に示します。
フラッシュ領域は 998 バイト、グローバル変数領域 は 18 バイト使用しています。
「m2c_tn10_fixed.hex」

:100000000AC019C075C117C016C015C014C013C0EE
:1000100012C011C037C111271FBFCFE5D0E0DEBF2E
:10002000CDBF10E0A0E4B0E001C01D93A235B10740
:10003000E1F735D0D6C1E4CF0998199A8FEF85A999
:10004000000087A9000080E095D187A100008150C1
:1000500087A900008823B9F780B181FF05C088ED2A
:100060008CBF89B78A5F89BF80B181FD05C088EDEB
:100070008CBF89B7805289BF88ED8CBF16BF199895
:1000800082E08EBD89E08DBD8EB580688EBD81B168
:10009000836081B917BD16BD44D178940895F89452
:1000A0008FE590E09EBF8DBFC7DF82E085A900008D
:1000B0008FE786A900001AA900001CA900001BA94F
:1000C000000080A3000087FF14C080A300008F778A
:1000D00080AB000081A3000087FF04C081A3000063
:1000E000B2D007C081A3000088A9000058D08113B6
:1000F00018D00AB500FFE5CF8AB581608ABD8BA113
:10010000000080FF02C0119A01C011988BA100006D
:100110009CA10000959587959CA900008BA90000E3
:10012000D0CF8DA10000843631F1853638F4823687
:1001300001F18336F0F4863071F511C0883741F053
:10014000893718F4853639F51CC08A57843018F57C
:100150001AA900001CA900001BA900001CC086A150
:1001600000008823D1F48FA1000085A9000081E060
:1001700008958FE70EC086A10000807F9FA1000038
:1001800006C08FA100008295807F96A100009F701D
:10019000892B86A9000080E0089580E0089589A158
:1001A000000087FD4AC0882319F481E089A9000076
:1001B00089A100008130A1F488A100008DA9000070
:1001C0008EA10000982F907F903CA9F1903D99F16D
:1001D000813F89F1833F79F182E089A900002DC038
:1001E000823049F519A9000087A10000882329F56C
:1001F00068A100006FA900008EA10000807F8039F7
:1002000031F4662331F08DA10000E2D016C08038B1
:1002100021F48DA1000099D010C0803B81F0803E78
:1002200081F4605464A900008DA10000880F83A9A7
:100230000000CCD002C019A9000080E0089581E040
:10024000089580E0089588A9000087FF19C0982FBD
:10025000987F983FB1F08EA90000282F2F7027A912
:100260000000903F49F4803F11F48FEF06C0873FB4
:1002700041F419A90000089581E089A900000895BA
:100280008EDF08951F930F930FB70F9310E08F9396
:1002900080A100008F5F80A9000080A1000080FF86
:1002A00021C081A10000869581A9000080B182FF54
:1002B00005C081A10000806881A9000080A1000024
:1002C0008E3080F0EF9881A1000081AB000080A308
:1002D0000000806880AB000011A9000010A9000098
:1002E000889A909A8F910F910FBF0F911F91189537
:1002F0001F930F930FB70F9310E08F9380B182FD80
:100300000AC08FE08A95F1F780B182FD04C0909811
:100310008DB3806C8DBB8F910F910FBF0F911F918B
:10032000189583E08BBB1CBB8BE28DBB0A981A9A95
:1003300084E080BBEF98889A909A10A9000080A36F
:1003400000008F7780AB000008958AA10000882309
:1003500019F081508AA900008AA10000882349F47D
:100360008BA100009CA100009F779CA900008BA995
:1003700000000895E3E4F0E051916191550F661F8C
:10038000770B95A10000FF27EE273327550F661F37
:10039000771F969518F4350FE61FF71F9923B1F7CD
:1003A000E05EFF4F32A10000F30F7727EE0FFF1F33
:1003B000771FEE0FFF1F771F77BDF6BD882329F04B
:1003C0008CA1000080688CA9000008958827D2CFF6
:1003D00082A900008AA100008F5F8AA900008FEF28
:0603E000C9CFF894FFCF25
:00000001FF