前のページに戻る◆注意◆このページの文及び図表はSXマイコンの各種資料(最後に示す参考文献等)を参考にして私が独自にまとめたもので、内容に間違い等があるかもしれませんが、ご容赦ください。今回制作したものはEIA-232C接続の簡易MIDI楽器ボードです。Windows95のメディアプレーヤーなどのMIDIデータを再生するアプリケーションにより自動演奏が行えます。31,250bps、データ長8ビット、パリティ無し、ストップビット1)が用いられていますが、最近は図1のようにパソコンのEIA-232Cポートに直接接続する方法も増えてきました。(1)EIA-232Cでは伝送速度が38,400bpsに変更されています。EIA-232C用のMIDIドライバも各社から配布されています。ハードウェア今回制作したボードの外観を写真1に、回路図を図2に示します。ボードの外観SXマイコンは28ピンのSX28AC/DPを、発振子には50MHzのセラミック発振子(セラロック、コンデンサ内蔵)を使用しました。この場合、帰還抵抗(1MΩ)が必要でした。ポートCの8ビット全部とポートBの上位4ビットを使い抵抗アレイによる12bitのDACを作りました。DACの出力はトランジスタにより増幅されスピーカを鳴らします。電源について電源にはアルカリ単三電池4本を使用しました。SXマイコンの動作電圧の上限は6.25Vですが、プログラミング時には5V程度とする必要があるためダイオードの順方向降下を利用して電源を落としてあります。プログラミング時にはSX-Keyが300mAを消費するため、電池の消耗が大きいので、ACアダプタと三端子レギュレータによる電源のほうが適していると思います。シリアルデータ受信回路EIA-232C用ドライバ/レシーバにはAMD232を使用しました。図2にはPC/AT互換機のシリアルポートのピン番号が記入されていますが、PC-9801/9821シリーズでも該当するピンに接続すれば使用可能です。(ソースファイルをダウンロードする)。SXマイコンのデバイス設定はFUSEワードのTURBO、OPTIONX、STACKXの各ビットを0、FUSEXワードのCFを0としました。簡易MIDI楽器のフローチャートを図3に示します。メインルーチンはポート設定、割込み許可など初期セットが終わると無限ループに入り、RTCC割込み待ちの状態となります。割込み処理ルーチンではシリアルデータ受信処理、MIDIデータ解析、正弦波発生の処理を行っています。割込み周期1秒あたりの割込み回数はシリアル伝送速度38,400bpsの3倍で115,200回としました。よって、割込みを発生させる間隔は50,000,000÷115,200≒435クロック毎となります。435クロック毎に割込みを発生するにはプリスケーラをRTCCに割り当て(OPTIONレジスタのPSA=0)、分周比を1:2(OPTIONレジスタのPS2/1/0を000)とする必要があります。これでRTCCは2クロック毎にカウントされますから、RTCCが435÷2≒217カウントされるたびに割込みをかければよいことになります。シリアルデータ受信処理シリアルデータの受信処理は、図4�@のように割込み毎(割込み周期T)にスタートビットをチェックし、�Aのようにスタートビットを検出したら4T後のデータをラッチします。これがデータビット0となります。以後3T周期でデータビット1〜7をラッチします。MIDIメッセージデータMIDIメッセージデータはステータス・バイトとそれに続くデータ・バイトからなります。(1)(2)(3)ステータス・バイトはMSBが常に1、データ・バイトは0となり区別されます。今回利用したステータスは図5に示すノート・オン及びノート・オフです。チャンネル(ch)番号は各楽器に割り当てられた番号で0h〜Fh(1ch〜16ch)まで指定できますが、本MIDI楽器は0h(1ch)を割り当てました。ノート・オンとオフはピアノの鍵盤が「押された」と「離された」ことを示すシグナルで、ノート番号とベロシティの二つのデータが続きます。ノート番号は鍵盤の番号、ベロシティは鍵盤を弾く強さを表しています。図6にMIDI解析ルーチンのフローチャートを示します。ノート番号は0h〜7Fhですが本MIDI楽器では32h〜5Dhまで発音するようにしました。ベロシティは無視しました。ベロシティが0hの場合はノート・オフと同じ意味なのでチェックしています。ノート・オンを受信すると8つ用意した正弦波発生ユニットの空きユニットにノート番号をセットし、発音を開始します。ノート・オフを受信すると正弦波発生ユニットの中から対応するノート番号のユニットを停止します。ユニットは指定されたノート番号に対応する音の周波数を持つ正弦波を発生させるものです。sin{(n-1)x}の式を用いています。これはsin(x)とcos(x)の値を与えれば、sin(nx)の値が乗算と加算で得られることを示しています。周波数νの正弦波をT秒間隔で計算する場合はsin(n×2πνT)となり、先ほどの式からnT秒後の値がsin(2πνT)とcos(2πνT)を初期値として与えることにより得られることになります。ここでTは割込周期の10倍としました。実際の演算では±1の実数データを図7に示すようにな16ビットの符号付き固定小数点フォーマットで表して乗算及び加算を行いました。このような16ビット長の演算を多用するときにはキャリーフラグを加算結果に加える機能が役立ちます。各ノート番号に対応する正弦波の周波数に対するcos(2πνT)とsin(2πνT)の値は事前に計算しておき、プログラムメモリにテーブルとして書き込みました。計算精度が低いためでしょうか初期値としてsin(2πνT)を与えると計算結果が安定しないため、実際にはsin(2πνT)×0.9程度の値を用いています。各正弦波発生ユニットは乗算を含むため1回の割込み処理時間内では1つのユニットだけを処理するようにしています。各正弦波発生ユニットの出力は加算されポートC(上位8ビット)とポートB(下位8ビット)に出力します。MIDIシリアル・ドライバ本装置を使用するためにはパソコンにMIDIシリアル・ドライバをインストールする必要があります。Windows95を利用しました。http://www.yamaha.co.jp/xg/utility/utlility.htmlから入手しました。演奏してみよう本簡易MIDI楽器をシリアルポートに接続し、Windows95であればメディア・プレーヤーなどMIDIデータを演奏できるアプリケーションにより再生します。演奏できるのはチャンネル番号1のみですから注意して下さい。今回作成したものは正弦波を発生させるものですから、オルガンのような音色となります。発音範囲も限定されているので音が途切れることもあります。このように欠点を洗い出せばきりがありませんが、SXマイコンが演奏する曲に耳を傾けるのはとても楽しいものです。