RJBさんのPICによるMIDICVのハードウェアに新しくソフトを載せてみようという試みです。
使っているCPUはPIC16F648A。これのCCPモジュールを利用してPWMを発生し、フィルター、オペアンプを通してアナログシンセ制御用のCVの発生します。同時にGATE信号も生成。また、ADのVREFを利用してモジュレーションにも対応しています(16段階)。
CCPでのPWMの精度は8bitでなく、10bit。そこで、ピッチベンドとノート番号からCVを合成しています(ピッチベンドの解像度は1/8半音程度)。
単純なハードウェアとは言え、1CHのモノラルシンセの制御となるので、それなりに、複雑な問題が出てきます。MIDIでモノラルシンセを制御する場合の大きな問題は、キーの優先順位の問題。
一番簡単な処理は、単純な後着優先処理。一番最後に来た音程をそのまま常にCVに出力するもの。この場合でも、さらに、GATEの処理をどうするかを考える必要があります。「ド」を押している最中に「ミ」を押した場合、GATEを一旦オフにしてから再度GATEをオンにするリトリガー処理と、GATEはそのまま継続させるレガート処理の二通りが考えられます。
リトリガー処理の場合の問題点はGATEをオフする時間の長さ。新しい音が入ったときに、GATEをオフ、その直後にGATEをオンにすると短すぎて、シンセ側のEGが反応しない可能性があります。このため、GATEオフ後、一定時間(多分数ミリ秒)待ってから新しい音の処理をしなければなりません。この待ち時間がMIDIの1音の受信間隔(最小で0.6ミリ秒程度)より長いと、次々に音が入った場合にバッファに保持できなくなる可能性があります。
この単純な後着優先処理だとモノラルのシンセを演奏した場合に、不満が出ます。トリルなどの演奏が難しくなることです。「ド」を押して、「ミ」を押し、「ミ」を離して、最後に「ド」を離す。こうしたときに、「ド-ミ-ド」となると、トリルの演奏が簡単になるわけです。アナログシンセの鍵盤では鍵盤の回路方式によって、低音優先か高音優先となっています。これを利用してトリルなどが簡単に演奏できるわけです。高音優先の場合は、「ド−ミ−ド」はここで書いたとおりに動作しますが、低音優先の場合は音程が「ド」のままです。逆に「ミ−ド−ミ」のトリルは低音優先がうまく働きます。
そこで、せっかくソフトで処理するのだから、トリルが低音側、高音側のどちらでもうまく働くようにしたい。つまり、トリルを想定した後着優先処理が望ましい処理となります。この処理は、現在押されているキーを覚えておいて、常に現在押されているキーのうち一番新しいものの電圧を出力するという方法で実現できます。メモリが十分かつ高速なCPUならば、全部のキー(128)まで覚えるようにすればいいのですが、ここで想定しているPICでは、ちょっと荷が重そうです。そこで覚えるキーの数を例えば8個程度に制限して、それを越えて入ると、古いものから順に忘れてしまうという男性的な仕様が実用的かと思われます。
と、ここまで書きながら… RJB さんのインプリメントの高音優先処理(アナログシンセですね)は、コンパクトだし、使いやすそう。当座、こちらがいいかな。
ひとまずは、ブレッドボード上で回路を作成。回路は RJB さんのほぼコピー。CPUは PIC16F648A です。少しだけ、手持ち部品の関係で変更しました。
端子関係を整理してみます
|
|
RJBさんのピンアサインとぶつからないように割り振りました。
当初はプルダウン抵抗を使用するつもりでした。スイッチはVCCとの間に入れます。たぶん、チャンネル0とか1しか使わないだろうから、ほとんどのスイッチはオフ。このときには電流がほとんど流れません。
ところが、回路節約のために、内蔵のWeakPullupを使うことに方針転換。スイッチは端子とグランドの間に設け、オフでレベルH,オンでレベルLとなります。プログラムではビット反転してチャンネルを決めます。さて、WeakPullupがうまくいくかどうか…
チャンネル固定の場合には、オープンがそのビットを0に、,GNDに落とせば、そのビットが1になります。
また、RB7:RB5をオープンにして、RB0にスイッチをつければ、チャンネル1とチャンネル2の切り替えが出来ます。
単電源のオペアンプを使うと、+15VをスイッチングACアダプタで供給して、+5Vはレギュレータで作ればそれで間に合う。ただ、グランド近辺のリニアリティと、出力が負に引っ張られたときの破損がちょっと心配です。
回路は大差ないので、作るときに選択できるようにしておけばいいですね(無責任)。
実はCPUをPIC16F88に変更すれば、チャンネル指定はボリュームで出来るじゃないか、とも考えもあるのですが…
手配線で一号機を製作しました。
部品の主要部分は秋月のC基板(15x25穴)。LED、DIPSW、ゲート極性スイッチは、パネルに置くつもりなので、一応、小さなパネル基板に配置。LEDは、配線の都合上、RJBさんの基板と逆で、グランドに落とすようにしました(これは、ソフトでRJBさん版にも対応予定)。ゲートスイッチ、チャンネルスイッチは省略も可能です。全部配線しなければ、正極性ゲートで、チャンネル1固定となるようになっています。
パネル基板と主基板は、ジャンパー飛ばして繋いでしまったのが醜いところ。他はコネクタを使いました。MIDI OUTを装備しているので将来の拡張にも余裕です(???)。オペアンプの1ピンと5ピンを繋ぐジャンパーが異様に長いのは、将来、ここにハサミを入れて、ポルタメント回路を挿入するためです。
ブレッドボード版で作成したプログラムを載せてみたところ、ハードウェアはうまく動作しているようです。
必要な調整は一箇所のスケール調整ボリューム。ここは、ケチをして半固定抵抗を使いましたが、スペースを考えても、多回転トリマーにすればよかったと後から反省。シーケンサからC3(60)を出して3Vに調整。以降、C0(24)が0V、C1が1Vと順に確認して、全体にバランスよくなるようにします。
とりあえず、オペアンプはLM358Nにして、電源は+15V単独。-15V電源端子はコネクタでグランドに落としておきます。
両電源タイプのオペアンプ(TL072など)を使う場合には、電源を±15V供給すればそのまま動きます。
作り終えてみると、特に単電源のとき、保護回路入れなくちゃいけないなと思ったりします。たぶん、KeyCVに-15Vが繋がるとオペアンプを破損。-15V(単電源でのGND)とKeyCVの間にダイオードを入れればいいと思うのですが、電流のリークなどもあるので検討が必要かな。こういう危なっかしいところも、自作の楽しみで、まぁ、いいかな。
主な仕様は次の通り。
MODULATION-CV/VELOCITY-CVはEEPROMオプションで切り替え。デフォルトでMODULATION-CV。
端子RA5オープンで正極性、ショートで負極性。
RPNを利用したメッセージ入力は次の通りです。
Control Change | 番号 | 値 | メッセージ(16進) | |
---|---|---|---|---|
RPN LSB | CC#100 | 0 | Bn 64 00 | レジスタード・パラメータ番号は MSB、LSBともに0 |
RPN MSB | CC#101 | 0 | Bn 65 00 | |
DATA ENTRY(MSB) | CC#6 | ベンド幅(0-12) | Bn 06 vv | 半音単位で指定 |
スイッチの動作
ハードウェアとの関係で指定する通常使わない機能をEEPROMの0番地で指定する。デフォルトの値は0xFF。
秋月のライターでは、EEPROMの内容を手で変更できるので、この機能を使用して変更すると便利です。
名称 | 値=1 | 値=0 | ||
---|---|---|---|---|
b0 | LED_DRIVE | 1:正極性ドライブ | 0:負極性 |
二つのLED(GATE、ERROR)のPICのピンでの極性。 ここで紹介した回路では、正極性。RJBさんの回路では、負極性を選択。 |
b1 | PITCHBEND | 1:使用する | 0:使用しない | KeCVにピッチベンド電圧を加えるかどうか。この機能は、現行版、および、V1.02betaでは機能しないことが発覚しています(常にピッチベンドが有効)。 |
b2 | VREF | 1:MODULATION | 0:VELOCITY | VREF端子の用途。 |
b3 | CHANNEL SW | 1:オリジナル RB7_RB6_RB5_RB0 (b3b2b1b0) | 0:takeda式 RB0_RB7_RB6_RB5 (b3b2b1b0) | 受信チャンネル番号とDipSwの対応。 |
b4 | SX-150 SW | 1:汎用 | 0:SX-150対応 | 学研シンセ「SX−150」のCVレンジに合わせる場合に0を指定。内部のキーシフトが無効になる。V1.05以降でのみ指定可能。 |
端子 RA5(外部でプルアップすること)に接続したスイッチでGATE出力の極性を指定します。
極性 | |
---|---|
オープン | 正極性。GATEON:+15V GATEOFF:0V |
クローズ(GND) | 負極性。GATEON:0V GATEOFF:+15V |
16のチャンネル指定に4ビットのポートが用意されています。各スイッチはオープンで値1、クローズで値0を表します。従って、16チャンネル全部を使用しない場合には必要な端子にだけスイッチを使用すればよいことになります。
ポートのビット解釈は、EEPROMスイッチにより、標準とtakeda式の二通りを切り替えます。
|
|
仕様の拡張と、バグ対策を続けています。
動作中のチャンネル切り替えに対応。ついでに、予約済みのポートに、Sustain(ダンパーペダル)とポルタメントのOn/Offを割り付けました。
高音域でマイナス側のピッチベンドの処理にバグがあったので対処しました。
CVをSX-150のレンジに合わせるオプションを追加した版。汎用版としては未検査です。
せっかくつけたシリアル出力を生かしたいと思います。ちょっと、思いついたのはチャンネルフィルター&コンバータ。
PIC-MIDICVでの受信チャンネルに一致したチャンネルメッセージをTXからチャンネル1に変換して出力。こうすれば、2台目以降のMIDICVは受信チャンネル固定で使えます。TX出力はMIDI出力を想定しているので、220オームの抵抗が直列に入っていますが、それを2台目のRXに入れても、多分動作するでしょう。となれば、2台目以降はフォトカプラーも省略できる。
2台目以降を例えば、コントローラ系のCV専用とすれば、主要な部分は8ピンのPIC+オペアンプでのコンパクトなモジュールに出来そうです。コントローラ系ならば出力電圧はアバウトでよいと考えれば、調整回路も不要だし、場合によってはオペアンプを省略しても(安全ではありませんが)良いかもしれません。コントローラの出力を正負に振るとすれば、2電源でオペアンプでのレベルシフトが必要になるかも。
ケース、作らなくちゃ。
こればかりは、夜中に作業というわけにはいかないし、ケースに入れるとCPUのプログラミングが面倒になりますね。(ソフトをいじっている間は、ケースがあっても、結局、外に出していたり…)
ここまでは、とりあえず、動作することを目標にクローン回路を組み立てましたが、何点か検討したいこともあります。
アクティブフィルタでもっと急激に処理するのも可能かもしれません。RJBさんの新しいほうのMIDICVではアクティブフィルタを使っていらっしゃいます。
現在の対応範囲は、C0(24)より上の音しか出ません。CPUの出力がGND-5Vで、これをストレートに増幅するために、範囲を限定しています。この範囲の限定を取り外したい。このためには、後ろのオペアンプでレベルシフトも処理して、負の電圧も出るように回路を変更する必要があります。シフト電圧を正確に計算して作り出すのが、ちょっと、面倒。
また、他の目的でCVを作るときにもこの処理は必要です。KEY-CVとシフト量が変わるのがちょっと、悲しいです。
それに、この場合は、単電源でオペアンプを使えなくなるので、回路を、現在のものと二通りに分ける必要がありそう。
この検討は、まだ、すこし、時間を置いて行いたいです。
PIC-MIDICVでは少ない機能とは言え、扱わなければならない、MIDIのコントロールチェンジについてまとめてみます。
まずはお決まりの一覧表から。
0 | バンクセレクト(MSB) |
1 | モジュレーション・ホィール |
2 | ブレス・コントローラ |
3 | 未定義・予約 |
4 | フット・コントローラ |
5 | ポルタメント・タイム |
6 | データ・エントリー(MSB) |
7 | チャンネル・ボリューム |
8 | バランス |
9 | 未定義・予約 |
10 | パンポット |
11 | エクスプレッション・コントローラ |
12 | エフェクト・コントロール 1 |
13 | エフェクト・コントロール 2 |
14 | 未定義・予約 |
15 | 未定義・予約 |
16 | 汎用コントローラ 1 |
17 | 汎用コントローラ 2 |
18 | 汎用コントローラ 3 |
19 | 汎用コントローラ 4 |
20 | 未定義・予約 |
21 | 未定義・予約 |
22 | 未定義・予約 |
23 | 未定義・予約 |
24 | 未定義・予約 |
25 | 未定義・予約 |
26 | 未定義・予約 |
27 | 未定義・予約 |
28 | 未定義・予約 |
29 | 未定義・予約 |
30 | 未定義・予約 |
31 | 未定義・予約 |
32 | バンクセレクト(LSB) |
33 | LSB of cc 1 |
34 | LSB of cc 2 |
35 | LSB of cc 3 |
36 | LSB of cc 4 |
37 | LSB of cc 5 |
38 | LSB of cc 6 |
39 | LSB of cc 7 |
40 | LSB of cc 8 |
41 | LSB of cc 9 |
42 | LSB of cc 10 |
43 | LSB of cc 11 |
44 | LSB of cc 12 |
45 | LSB of cc 13 |
46 | LSB of cc 14 |
47 | LSB of cc 15 |
48 | LSB of cc 16 |
49 | LSB of cc 17 |
50 | LSB of cc 18 |
51 | LSB of cc 19 |
52 | LSB of cc 20 |
53 | LSB of cc 21 |
54 | LSB of cc 22 |
55 | LSB of cc 23 |
56 | LSB of cc 24 |
57 | LSB of cc 25 |
58 | LSB of cc 26 |
59 | LSB of cc 27 |
60 | LSB of cc 28 |
61 | LSB of cc 29 |
62 | LSB of cc 30 |
63 | LSB of cc 31 |
64 | ホールド |
65 | ポルタメント オン/オフ |
66 | ソステヌート |
67 | ソフトペダル |
68 | レガート・フット・スイッチ |
69 | ホールド 2 |
70 | サウンドコントローラ 1 (サウンド・バリエーション) |
71 | サウンドコントローラ 2 (ティンバー/ハーモニックコンテンツ) |
72 | サウンドコントローラ 3 (リリース・タイム) |
73 | サウンドコントローラ 4 (アタック・タイム) |
74 | サウンドコントローラ 5 (ブライトネス) |
75 | サウンドコントローラ 6 |
76 | サウンドコントローラ 7 |
77 | サウンドコントローラ 8 |
78 | サウンドコントローラ 9 |
79 | サウンドコントローラ 10 |
80 | 汎用コントローラ 5 |
81 | 汎用コントローラ 6 |
82 | 汎用コントローラ 7 |
83 | 汎用コントローラ 8 |
84 | ポルタメント・コントロール |
85 | 未定義・予約 |
86 | 未定義・予約 |
87 | 未定義・予約 |
88 | 未定義・予約 |
89 | 未定義・予約 |
90 | 未定義・予約 |
91 | エフェクト1デプス (外部エフェクト) |
92 | エフェクト2デプス (トレモロ) |
93 | エフェクト3デプス (コーラス) |
94 | エフェクト4デプス (セレステ) |
95 | エフェクト5デプス (フェイザー) |
96 | データ・インクリメント |
97 | データ・デクリメント |
98 | NRPN LSB |
99 | NRPN MSB |
100 | RPN LSB |
101 | RPN MSB |
102 | 未定義・予約 |
103 | 未定義・予約 |
104 | 未定義・予約 |
105 | 未定義・予約 |
106 | 未定義・予約 |
107 | 未定義・予約 |
108 | 未定義・予約 |
109 | 未定義・予約 |
110 | 未定義・予約 |
111 | 未定義・予約 |
112 | 未定義・予約 |
113 | 未定義・予約 |
114 | 未定義・予約 |
115 | 未定義・予約 |
116 | 未定義・予約 |
117 | 未定義・予約 |
118 | 未定義・予約 |
119 | 未定義・予約 |
120 | オール・サウンド・オフ |
121 | リセット・オール・コントローラ |
122 | ローカル・コントロール |
123 | オール・ノート・オフ |
124 | オムニ・オフ |
125 | オムニ・オン |
126 | モノ・モード・オン |
127 | モノ・モード・オフ |
まず、最初に注意しておかなければいけないのは、大きなメッセージの枠組みと違い、ゆるやかな規定であることです。歴史的な経緯を経ながら、現実に合わせて、次第にコントロール番号の用途が決まってきました。基本的にはどのコントロールで何をしようが、楽器の勝手なのですが、そこはそれで、ある程度、お互いに合わせた方がいい。そのガイドラインのようなものです。古い楽器が登場した頃には決まっていなかったものも沢山あり、時代が進むに従って、だんだん、対応するコントロール番号が増えてきたのです。また、コントロール番号での動作の詳細もそれぞれの楽器によって当然ながら異なります。
大きな枠として、0-119の本来のコントロールチェンジと120-127のチャンネルモードの区分があります。
チャンネルモードは、動作の大枠を決めるもので初期設定や、緊急停止的な特殊なメッセージです。124-127が発音モードその他を決めるのですが、現在のマルチティンバーのシンセでは、時代遅れな感じで、これらのメッセージをそのまま、インプリメントしているものはほとんど無いと思います。122は、鍵盤付き音源で鍵盤と音源の接続を決めるもの。120、121、123は緊急停止的に音を止めたりするリセットのようなものです。123で止めた場合にはゲートオフされるだけで余韻は残るが、120で止めた場合には余韻も含めて無音にするなど違いが示されていますが、現実に対応するかどうかは、楽器によって異なります。特に、120と121は、かなり、後になってから決められたので、この番号を通常のコントロールチェンジとして使用している楽器もあります。ここでは深く触れません
ここからが本来のコントロールチェンジについて。
コントロールチェンジのメッセージは、コントロール番号と、値の二つの組合せで出来ています。指定の制御番号にある値を送る。それだけですが、基本的な値の表し方について決まりがあります。例えばホールド(サスティン)つまり、ピアノのダンパーペダルのメッセージのようにオン/オフの二値しか取らない場合、送り出し側は、オンで0x7f(127)、オフで0x00(0)を送ります。受け取り側は、0x40(64)以上ならばオン、未満ならばオフとします。
連続値を扱う場合には二通りあります。コンピュータで言うところの符号無しの値は、そのまま、0x00 - 0x7f で扱います。符号付の値、つまり、正も負もとりうる場合には、0x40(64)を0にした下駄履き表現を使います。 0x7f は +63 を表し、0x00 は -64 を表します。日常の表現からコントロールチェンジの符号表現に変換する場合には、0x40(64)を加えます。コントロールチェンジの符号表現を日常の表現に戻す場合には、0x40(64)を引きます。
コントロールチェンジでは値の幅が7ビット(128段階)ですが、二つのコントロールチェンジを組み合わせて14ビット(16384段階)の精度で表す方法が決められています。コントロールチェンジ番号の0-31に対して、それに32を足した32-63が拡張部分として定義されています。もともとの0-31番のコントロールチェンジで上位バイト(MSB)を指定し、32-63で下位バイト(LSB)を指定します。
モジュレーション(CC#1)を例に挙げます。モジュレーションでは、MSBがコントロール番号1.LSBがコントロール番号33となります。二つを組み合わせて、MSB x 128 + LSB が値となります。
新しい音源が2バイト精度のモジュレーションに対応しているとき、1バイト精度しか対応しない鍵盤を繋いでも、LSBは常に0として処理するのでうまく動作するように考えられています。
実際は、二つのメッセージのタイミングによっては、不正な動作をすることが考えられるので、2バイト精度のメッセージは難しい問題をはらんでいます(論理的な動作だけなら問題は無いのですが…)。
本来はコントロールチェンジとは言えないコントロールチェンジが一つ混ざっています。バンクセレクト(CC#0)がそれです。プログラムチェンジが0-127の128通りの音色しか扱えないので、これをバンク切り替えでサポートしようという考え方です。MSB -- CC#0 -- だけを使えば、128バンク。LSB -- CC#32 -- を併用すれば、16384バンクの音色切り替えが出来るという仕掛けです。バンク切り替えのメッセージを置く場所が無かったので、ここに割り込んだ形です。
ポルタメント・コントロール(CC#84)は、シーケンサ専用ともいえるコントロールで、異色のものです。値としてはノート番号を指定し、このメッセージの後の(同一チャンネルでの)最初のノートオンで発音する音は、ここで指定したノート番号からポルタメントがかかります。音源によっては、指定した元の高さの音が発音中ならば、そこからレガートにポルタメントがかかるものもあるようです。サポートしていない音源も多いので、使いにくいコントロールの典型です。
一般的なコントローラを駆け足で書き出してみます。
モジュレーション・ホイール(CC#1)、ブレス・コントローラ(CC#2)、フット・コントローラ(CC#4)。初期のシンセのコントローラ・デバイスをそのまま踏襲したもの。何に使うかは、それぞれ、シンセ次第ですが、LFOの深さが普通です。
チャンネル・ボリューム(CC#7)、エクスプレッション・コントロール(CC#11)。両方とも音量制御に使われることが多いです。慣習的には、ミキサーのボリュームに相当するのがCC#7、演奏者が盛り上がったりするのがCC#11といったところ。
パンポット(CC#10)はミキサーでのパンポット。つまり、音量的に左右のどこにおくかを決めます。これは、大抵、左が0で、中央が64、右が127。実は左右の段階数が等しくないので、0がランダム、1が左端…という面白いものもあります。
ポルタメント・タイム(CC#5)、ポルタメント・オン/オフ(CC#64)、ポルタメント・コントロール(CC#84)はいずれもポルタメント制御。ポルタメントの時間をCC#5で指定。CC#64でオン/オフするか、CC#84で細かく制御。いずれにしても、音源方式や、機種に非常に依存します。
バランス(CC#8)は、インプリメントされている割に、知られていないもの。何のバランスだと突込みがはいりますよね。二つの音色の音量バランスだそうです。ストリングスとブラスをレイヤーで割り振っておいて、バランスで両方の割合を調節する。そういうイメージで使われていました。案外、驚きの機能がインプリメントされている機種もあります(説明無しです!)。
ペダル・コントロール、つまり、ピアノのペダルを意識したメッセージは、ホールド(CC#64)、ソステヌート(CC#66)、ソフトペダル(CC#67)、レガート・フット・スイッチ(CC#68)、ホールド2(CC#69)。ホールド(CC#64)はピアノのダンパーペダルで、オンにするとダンプが効かなくなる。つまり、キーを離してもミュートされずにリリースが残る機能。ソステヌート(CC#66)はソステヌートをオンした瞬間にキーが押されている音だけリリースが残る。ドミソを押しているときに、ソステヌートを踏み込むと、ドミソはソステヌートを離すまで鳴り渡るけれど、この間にレファラを打鍵しても普通にミュートされる。ソフトペダル(CC#67)は踏むとピアノのメカが左右に移動して(だったかな?)、ハンマーが叩く弦の数が減り、音がソフトになるというもの。後の二つは、一般的ではありません(説明がきちんと書いていない音源もあります)。
制御するコントロールの数が128じゃ足りないだろうというときのために、RPN、NRPNという仕組みがあります。どちらも、パラメータ番号をコントロールチェンジで送って、さらに、値を送るという大げさなもの。RPNが番号を共通で決めておく仕掛け。NRPNは楽器毎に適当に決めて言いという仕掛け。RPNとNRPNは番号指定のコントロールチェンジが違うけれど、値の送り方は同じ方法です。出力した値は、RPNかNRPNか、直近のどちらか一方の値と解釈されます。
RPN/NRPNともこれだけだと128種類の拡張にしかなりませんが、例のLSBを指定する仕掛けが考えられているので、都合16384種類指定できます。また、値の方も、同様に2バイト精度まで用意されています。
パラメータ番号を指定して、それから、値を送るのが使い方。番号が変わらなければ、値だけを送れます。
番号の指定は、RPNならば、RPN LSB(CC#98)、RPN MSB(CC#99)。NRPNならば、NRPN LSB(CC#100)、NRPN MSB(CC#101)。順番は上下問わないことになっています。
値を送るのは、RPN/NRPNともに共通で、基本的には、データ・エントリー(CC#6)。二バイト精度ならば、さらに、データ・エントリー LSB(CC#38)を併用します。このほかに、データ・インクリメント(CC#96)、データ・デンクリメント(CC#97)があります。名前の通り、現在の番号のRPNなり、NRPNを増加、減少させるのですが、その単位その他についての規定はありません。(このDATAENTRY、DATAINC、DATADECってDX7の音色編集用コントローラなんですよね)
プログラムを作るとき、気をつけるのは、番号未定義状態では、データを無効にすること。知らない番号のデータも無効にすること。今回のようにNRPNを使わないときでも、NRPNが来たら、知らないものとして以降のデータを無効にしなければいけません。
番号未定義にするのは、起動時のほか、オールノートオフなどのモードメッセージのとき。細かいことは色々あるけれど、とりあえず意識しておかないと、面倒なことになります。
延々と何を書いたかというと、ピッチベンド幅をRPNで指定するためには、ここまで、インプリメントが面倒だということなのでした。
今回作成したハードウェアのインタフェースはチャンネル指定にDIPSWを使用していましたが、チャンネル選択をロータリスイッチで行い、さらに、7セグLEDでのチャンネル表示をする準備をしています。こちらは、「PICピカピカ」の中で試作が終わっています。
16F648A(18pin)が出来上がっていないのに、何だといわれそうですが、最小構成のハードウェアで動かしたいと思っています。1CV、1GATE(場合によってはGATEなし)でモジュール的に使えないかと考えているわけです。ソフトウェアは16F648A版でのMIDIシステムを修正して使用。
USARTがないので、ソフトウェア・シリアルで対応。外部クロックで動かすとすれば、発振器で2ピン使って、残りが4ピンです。CV出力(CCP)、GATE出力、シリアル用入力ポート(ソフトウェアシリアルですね)で、3ピン。端子がバッティングしなければ何とか足りそう。
もし、内蔵RCで出来れば、さらに、セラロックが不要になるし、ピンも余裕が出ます。速度が遅くなるので、どこまでカバーできるか。といったところ。
デバイスは、手持ちの8ピンPICから選ぶと、12F683となりそうです。これを前提に、機能を検討してみます。
ソフトウェアでMIDI入力を扱うと、1ビットが32μS。内蔵発振では最大8MHzなので、この間に処理できる命令の数が、64命令。外付けの20MHzにすれば、160命令。
この間に処理できないと、受信こぼれが出るので、どちらを取るか、微妙なところです。とりあえずは、外付けでプログラムを書いてみて、余裕があれば、内蔵に切り替えたい。
よくある、ソフトウェアシリアル処理のように、他の処理を実行中に受信できないようだと、使い物になりません。大まかには、ピンチェンジ割り込みで、シリアル処理開始のトリガーに。ピンチェンジ割り込みはここで取りやめ、1ワード受信するまでは、タイマー割り込みでポートスキャン。読み込んだデータはFIFOにセット。タイマー割り込みをやめ、再び、ピンチェンジ割り込みで次のデータを待つ。
タイマー割り込みの時間をきちんと作れるかが、一つの問題になりそうです。
また、ピンチェンジ割り込みも、条件面で気がかりな点があるのですが…。
648A版と大きく異なるのは、MIDIのデータ処理自体は、割り込み中で行わなず、地面でFIFOからデータを取りながら処理する。このため、割り込み内のFIFO詰め込みと、地面でのFIFOからの取り出しの時間がペナルティになる部分。
CCPによるPWMとゲート出力は648Aと同様の処理で十分。ただし、割り込み処理内ではなく、地面で実行する。
pin番号 | pin機能 | 用途 |
---|---|---|
1 | VDD | 電源 |
2 | GP5:CLK | セラロック接続 |
3 | GP4:CLK | セラロック接続 |
4 | GP3: | シリアル入力 |
5 | GP2:CCP1 | CV出力 |
6 | GP1:VREF/AN1 | VREF電圧出力 または、チャンネル指定ボリューム |
7 | GP0: | ゲート出力 |
8 | VSS | グランド |
回路図とプログラムです。
現在の時点での推奨プログラムは、V1.04です。ソースファイルは、V1.04のものです。
回路図 | picmidicv684.pdf | 二番目の版(07/06/22)。MODULATION回路のトランジスタの電源を直しました。 |
---|---|---|
試験中のプログラム | midicv648v105.hex | SX−150のCVレンジに合わせるオプションを追加したもの。汎用版。 |
最新版プログラム | midicv648v104.hex | バグを取ったもの。 |
最新版プログラムソース | midicv648v104.asm | 上記(V1.04)のソースファイル。 |
旧版プログラム | midicv648_v102.hex | V1.02。実行時のMIDI受信チャンネル切替版(07/07/15)。EPROMオプションのPITCHBEND指定が動作しないが、実用上は問題ない。 |
旧版プログラム | midicv648_060726.hex | V1.00。 |
議論を集約するために、質問苦情エントリーを設けました。ご意見、ご要望、苦情、ご質問等、ございましたらこちらへ書き込んでください。
書き込み済みCPUの配布などお問い合わせも、こちらでお願いいたします。