SXマイコンを使った簡易MIDI楽器ボードの製作


▲▲ トップページに戻る    ▲ 前のページに戻る

注意
このページの文及び図表はSXマイコンの各種資料(最後に示す参考文献等)を参考にして私が独自にまとめたもので、内容に間違い等があるかもしれませんが、ご容赦ください。

概要

 今回制作したものはEIA-232C接続の簡易MIDI楽器ボードです。
 Windows95のメディアプレーヤーなどのMIDIデータを再生するアプリケーションにより自動演奏が行えます。
 通常のMIDIでは電流ループによる単方向シリアル・インターフェイス(調歩同期式、伝送速度31,250bps、データ長8ビット、パリティ無し、ストップビット1)が用いられていますが、最近は図1のようにパソコンのEIA-232Cポートに直接接続する方法も増えてきました。(1)

図1

 EIA-232Cでは伝送速度が38,400bpsに変更されています。また、EIA-232C用のMIDIドライバも各社から配布されています。

ハードウェア

今回制作したボードの外観を写真1に、回路図を図2に示します。

写真1
写真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に示します。

図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をラッチします。

図4

MIDIメッセージデータ

 MIDIメッセージデータはステータス・バイトとそれに続くデータ・バイトからなります。 (1)(2)(3)

 ステータス・バイトはMSBが常に1、データ・バイトは0となり区別されます。今回利用したステータスは図5に示すノート・オン及びノート・オフです。

図5

 チャンネル(ch)番号は各楽器に割り当てられた番号で0h〜Fh(1ch〜16ch)まで指定できますが、本MIDI楽器は0h(1ch)を割り当てました。ノート・オンとオフはピアノの鍵盤が「押された」と「離された」ことを示すシグナルで、ノート番号とベロシティの二つのデータが続きます。ノート番号は鍵盤の番号、ベロシティは鍵盤を弾く強さを表しています。
 図6にMIDI解析ルーチンのフローチャートを示します。

図6

 ノート番号は0h〜7Fhですが本MIDI楽器では32h〜5Dhまで発音するようにしました。またベロシティは無視しました。ただし、ベロシティが0hの場合はノート・オフと同じ意味なのでチェックしています。ノート・オンを受信すると8つ用意した正弦波発生ユニットの空きユニットにノート番号をセットし、発音を開始します。一方、ノート・オフを受信すると正弦波発生ユニットの中から対応するノート番号のユニットを停止します。

正弦波発生原理

 正弦波発生ユニットは指定されたノート番号に対応する音の周波数を持つ正弦波を発生させるものです。正弦波発生の原理は三角関数の加法定理から導かれる、

sin{(n+1)x} = 2sin(nx)cos(x) - sin{(n-1)x}

の式を用いています。ここでnは整数です。これはsin(x)とcos(x)の値を与えれば、sin(nx)の値が乗算と加算で得られることを示しています。周波数νの正弦波をT秒間隔で計算する場合はsin(n×2πνT)となり、先ほどの式からnT秒後の値がsin(2πνT)とcos(2πνT)を初期値として与えることにより得られることになります。ここでTは割込周期の10倍としました。
 実際の演算では±1の実数データを図7に示すようにな16ビットの符号付き固定小数点フォーマットで表して乗算及び加算を行いました。

図7

 このような16ビット長の演算を多用するときにはキャリーフラグを加算結果に加える機能が役立ちます。各ノート番号に対応する正弦波の周波数に対するcos(2πνT)とsin(2πνT)の値は事前に計算しておき、プログラムメモリにテーブルとして書き込みました。また、計算精度が低いためでしょうか初期値としてsin(2πνT)を与えると計算結果が安定しないため、実際にはsin(2πνT)×0.9程度の値を用いています。
 各正弦波発生ユニットは乗算を含むため1回の割込み処理時間内では1つのユニットだけを処理するようにしています。各正弦波発生ユニットの出力は加算されポートC(上位8ビット)とポートB(下位8ビット)に出力します。

MIDIシリアル・ドライバ

 本装置を使用するためにはパソコンにMIDIシリアル・ドライバをインストールする必要があります。今回は、YAMAHA CBX Driver for Windows95を利用しました。これはYAMAHAのホームページ http://www.yamaha.co.jp/xg/utility/utlility.htmlから入手しました。

演奏してみよう

 本簡易MIDI楽器をシリアルポートに接続し、Windows95であればメディア・プレーヤーなどMIDIデータを演奏できるアプリケーションにより再生します。
 演奏できるのはチャンネル番号1のみですから注意して下さい。今回作成したものは正弦波を発生させるものですから、オルガンのような音色となります。また、発音範囲も限定されているので音が途切れることもあります。このように欠点を洗い出せばきりがありませんが、SXマイコンが演奏する曲に耳を傾けるのはとても楽しいものです。

参考文献

  1. 特集パソコン周辺インターフェイスのすべて;トランジスタ技術SPECIAL No.63,pp.112-120,CQ出版, 1998年.
  2. 枇薫;コンピュータ&MIDIテクニカルブック,音楽之友社,1988.
  3. Jeff Rona(藤井美穂訳);MIDIブック,リットーミュージック,1994.


▲▲ トップページに戻る    ▲ 前のページに戻る