AKI-H8

長嶋 洋一


AKI-H8 98/04/27 22:05


このところ、ちょっと暇があるので、ついに念願のAKI-H8で遊ぶことに
しました。(^_^)

キットはだいぶ昔に買ってあったのですが、某出版社某編集長のルート
で、日立の分厚いマニュアルもいただいたので、満を持して開封です。
ところが、FDが98用のもので、家にある数台のパソコンで試みたところ、
どうもうまく読めません。(^_^;)
結局、同じ東芝のパソコンの2台のうち一方が、かろうじて数倍の時間を
かけてリトライして読み出しに成功しました。これが一番、時間がかかり
ました。

AKI-H8のボードは、AKI-80よりちょっと作るのに部品が多いのですが、
まぁ手間はかかりません。製作は10分ぐらいなもんです。
そして、最初だけは、内蔵フラッシュROMに焼くためのROMライタを
作らないといけないのですが、これがなんとユニバーサル基板に勝手に
組め(^_^;)、というものでした。
そこで、キットの指示は無視して、勝手に12Vのスイッチングの上に
ユニバーサル基板を付けて、AKI-H8がちょうどスッポリと乗るような
ROMライタを作りました。それも、秋月の指示だと、いちいち焼いたら
ROMライタから抜いて、再び別の基板に差し替えて電源を入れないと
テストできないのですが、それはカッタルイので、ROMライタボード
でもそのまま簡易テストできるようにしたものです。(^_^)

ということで、ソフトの環境もなんとかできて、着手してから半日で、
ようやく付属してきた最初のサンプルソフトをアセンブルしてフラッシュ
に焼いて、無事に走らせたところです。
ここまで一巡すればあとはソフトの世界ですから、峠は一つ、越えたと
いうところでしょうか。(^_^)

しかし、このアセンブラは、ちょっとまったく新しいものなので、僕の
頭にこれから入るかは厳しいですね。(^_^;)(^_^;)
また、シリアルの1ポートはフラッシュの書き込みのために使われて
いるだけでなく、もう1ポートもCPUからつながっている(さらに、
MAX232の下にパターンがある(^_^;))ので、ミニフラットのICの足を
2本切断しないと、MIDIに使えないようです。まぁ、このぐらいは何とか
なりますが。

ということで、あまり何日もハマッている余裕はないものの、目標として
は「MIDIツール」としての入口まで、なんとか行ってみようかな、と
思っています。

なお、ROMライタに取り付けるソケットの関係で、どうも実装上は、
基板の下に余分なスペースができそうで、AKI-80ほど小さくならない
ような嫌な予感があります。AKI-80ではEPROMの高さがネックだった
のですが、こちらは下の方に延びそうです。
...ま、使いこなしてからの悩みですが。(^_^;)

RE:AKI-H8 98/04/29 19:29


AKI-H8ですが、なんとか使えてきました。(^_^)
約2日間で、
 ・MIDI入力を割り込みで1024バイトのFIFOに積む
 ・これをポートBのLEDで表示しつつ、MIDI送信FIFOに積む
 ・メインルーチンでLEDのMSBを点滅(ソフトタイマ)
 ・メインルーチンで送信FIFOからMIDI出力
というような、もっとも基本的なMIDIスルー装置を完成させました。
まぁ、あとはタイマ割り込みとA/Dぐらいでしょうか。

あと一押しすれば、内蔵8チャンネル10ビットのA/Dを使って、AKI-80の
時の外付けA/Dをナシにして、AKI-80と同じサイズでA/D−MIDIコンバータ
を作れることになります。(^_^)
ただし、もう疲れたので、明日は別のことをしますので、しばらくおあずけ
でしょう。(^_^;)

秋月のCコンパイラも買ってあるのでこちらもちらっと遊べば、「Javaで
AKI-H8」(^_^;)というのも近いところにあるのですが、まぁ暇ができたら
やりましょう。

...しかし、アセンブラはオペランドの順番が反対だし(^_^;)(^_^;)、
まぁなんというか、豊富なレジスタと直交性がなかったら、ヤル気に
ならないですねぇ。(^_^;)
開発環境としては、まぁ秋月のキットに付属してきたツールでいちいち
フラッシュに焼く、ということで進めています。トラ技の記事にあった
モニタは、虎の子のMIDI用シリアルポート0を使うというものなので、
まったく論外で使えませんでした。(^_^;)

これからAKI-H8をやる人のために、コメントしておきます。
シリアルポートの1は、ライタでフラッシュROMに焼くのに使うので、
MIDIはポート0となります。この場合、基板の上にMAX232がついている
ので、このミニフラットICの11番と12番を、ICの根元でカットする
ことになります。難しいことではありません。忘れるとMIDI機器を壊す
可能性があります。(^_^;)

性能はAKI-80よりもPICよりも上、というスグレモノです。皆さんで、
楽しんで遊んでいきましょう。(^_^)

C & AKI-H8 98/04/30 12:40


今日は、AKI-H8用に秋月で2000円で売っているCコンパイラを使って、
C言語のための開発環境を作ってみました。
結論としては、AKI-80に比べて、かなりいいセン行きそうです。(^_^)

ただし、この廉価版Cコンパイラは、AKI-80の時と違って途中経過の
アセンブルソース(リストファイル)を出さない仕様にしてあるようなの
で、C版からJava版の開発環境に移行するのは、ちょっと面倒かも
しれません。(^_^;)

とりあえず環境をいろいろと構築して、以下のようになりました。
まず、テキストエディタ(秀丸)で、Cソースを書きます。たとえば、

==========================================================

#include                     /* Original Interfaces */

static char disp;
static int ctr;
static long j;

c_initial(){
        PB.DDR = 0xff;                  /* Port [B] all output */
        ctr = 0;
        j = 0;
}

c_main(){
        j++;
        if(j==80000){
                j = 0;
                ctr = (++ctr)%256;
                disp = (ctr&1)<<7;
                PB.DR.BYTE = disp;      /* port [B] output */
        }
}

c_midi_rx(){
        int i;
        i=status&0xf0;
        if((i==0xc0)||(i==0xd0)){
                tx_midi(status);
                tx_midi(data);
                PB.DR.BYTE = data + disp;
        }
        else{
                tx_midi(status);
                tx_midi(keyno);
                tx_midi(data);
                PB.DR.BYTE = keyno + disp;
        }
}

========================================================

というカンジです。お馴染みのものですよね。(^_^)
これは、省略ナシのものです。ここで登場する関数や変数は、全て
midi_io.hで定義されています。CPUの特有の定義(数十キロバイトの
ヘッダーファイル(^_^;))も、その中にincludeしています。
たったこれだけで、以下のような動作をしてくれます。

あとは、これをセーブして、DOS窓から、このために作った「cc.bat」という
バッチを起動するだけです。たとえばこのソースが「test.c」なら、
「> cc test (return)」です。

すると、リセットベクトルやMIDI割り込み、MIDIの送受信それぞれ1024
バイトのFIFOバッファ処理、メインループなどを記述したオリジナルの
ライブラリと、このCとがアセンブル、コンパイル、リンク、バイナリ変換
されて、さらに秋月のフラッシュROM焼き込みプログラムが起動します。

そこで、ROMライタボードに挿してあるAKI-H8はそのままで(開発中はずっと
挿している状態でテストできます(^_^))、書き込みスイッチをONにして
リターンキーを押します。すると、まずダウンローダのプログラムが
転送され、次に共通名としてモトローラSフォーマットの(^_^;)バイナリ
ファイル(FlashROM.mot)を指定してリターンすると、今度はそれをダウン
しつつ焼き込み、終了します。

そこで書き込みスイッチをOFFにして、隣の実行スイッチをONにすると、
もうそれだけでテストの実行です。(^_^)

このプログラムは、ポートBの8個のLEDのうちMSBを点滅させつつ、
MIDI入力はバックグラウンドでFIFO受けしつつ、メッセージとして
完結するとCのc_midi_rx()を呼び出します。Cの中ではこの下位の
7ビットデータをLEDに表示しつつ、アセンブラサービスモジュールの
中のtx_midi()にスルーとして渡します。これはバックグラウンドでFIFO
処理で勝手にMIDI出力されてくれます。(^_^)

最初の初期設定時に、c_initial()の関数を呼びます。またメインルーチン
はバックグラウンドの中に無限ループがあり、ここで送受信のFIFO
チェックとともに、c_main()をコールしています。これで、MIDI回りの
うっとうしいアセンブラは全て隠蔽されて、必要な処理はCで書けます。
しかも、AKI-80と違って、かなりCは(というかCPU自体が)速いので、
これはたぶん、ほぼ実用レベルです。AKI-80ではCを実用で使うのは
恐かったのですが、こちらはOKという感触です。(^_^)

これは、なかなかかもしれません。(^_^)
皆さんが何かMIDI小物を作る場合、AKI-80と違って、ROMライタやEPROM
とイレーサが不要となります。最初に買ったAKI-H8のキットに付属して
いるROMライタだけ、作ればいいわけです。ある動作をするソフトが
完成している場合(僕の作ったものは公開する予定です(^_^))、
ソースからアセンブルとかコンパイルする必要はなくて、モトローラ
S形式のテキストファイルを入手して、キットに付属してくるFLASH.EXE
を使って焼き込んだら、もうオシマイ、完成です。(^_^)

情報(源)求む... (^_^;) 98/05/30 10:10


AKI-H8を使った、汎用MIDIセンシング用カードを作ることに
なりそうです。以前にこの会議室で公開している、AKI-80版に
比べると、8チャンネルの0-5Vアナログ入力をA/Dするところから
MIDIとして出力するところまでAKI-H8でいくので、外付部品は
05だけになります。(^_^)
EPROMにいちいち焼かなくていいので、ライタで送るデータとして
公開すれば、皆さん使えると思います。

近日中に公開予定ですので、お待ち下さい。(^_^)

それから、またまたフランスから、初めての人のメイルが舞い込み
ました。向こうで活躍する日本人芸術家のようなのですが、MIDIがらみ
の機器を自作したい、というネタ(^_^;)で、どこからか僕のページを
発見してきたようです。このネタも、せっかくなのでここで紹介
したいと思っています。いずれ登場するかもしれません。

MIDI自作派シリーズ(^_^) 98/05/30 16:01


>ハードの部分はすでにすでにある資料(回路図などを元にして)組立られる程
>度です。設計なんて言われると今の知識では頭抱えてしまいますが。

これは、とりあえず作るには十分です。これ以前だと、サポートしきれなく
なるのです。僕だって、全ての回路を素から全部設計しているのではなく
て、ありものを組み合わせている、というのがポイントです。(^_^;)

>> でも、照明の電力制御の回路とAKI-80からのインターフェース、
>> あるいは音量制御の回路とAKI-80からのインターフェース、と
>> いうのは別の回路技術です。これは知っているのでしょうか。
>> この基礎がなかったら、自作は不可能です。
>
>具体的にどのような知識なのでしょうか?(と聞くところを想像できるように知識がな
>いです。)一応学校の機械は箱あけて中身を覗いて見たことがあるのですが。MIDI制御
>用のCPUなどの部分とこいつが電圧なんかをコントロールしてるんだろうなーって言う
>想像する事しかできませんでした。って事は不可能なのか。。。

センサだと、キットとしてたとえば電圧とかになっているので、あとは
ブラックボックスとしてのA/Dで取り込んで、ブラックボックスとしての
AKI-80でMIDIにできるのです。リレー出力の「コッツ軍団」もそうです。

ところが、電力制御だと、いいブラックボックスがないのです。サイリスタ
とかパワーFETを使って個別に組まないといけないのです。キットとして、
うまくディジタル調光制御するのはありましたっけ。
秋月電子に「デジタルトライアック万能調光器キット」1000円というのが
あって、プッシュスイッチで階段的に40Aまでの白熱灯の電力制御が
できるようなので、AKI-80でこのプッシュスイッチの部分をたとえばリレー
制御すれば、MIDIから制御できます。
以前にやりとりした、MIDI制御で多数のリレーを制御する回路がそのまま
使えます。制御の細かいところは、MIDIの情報としてMAX側でやれば
いいわけです。(^_^)

また、オーディオミキサの音量制御をMIDIでやるには、AKI-80でMIDIの
出力をD/A変換したものを、VCA(ゲインを電圧変化させるアンプ)に
入れれば、そしてこれを多数並べればいいわけです。理屈としては。
ただし、アナログ信号のミキサにAKI-80のディジタルがからむし、
もともとVCAを並べたアンプでノイズの少ない、音質のいいものを作ると
いうのは、AKI-80などのディジタルに比べてずっっっっとノウハウの
必要なアナログ技術の世界で、なかなか自作は難しいです。たとえば
僕は、正直言って、売り物に勝る性能を自作で出す自信がないので、
原理は簡単でも、これを作るつもりはないのです。(^_^;)

>一応、僕自身で自作する方向でやるつもりでいます。確かに詳しい
>人に作っていただくか市販の物を買うってのが一番確実な方法だと思うのですが、僕
>自身、ふところが寒いって言う現実的な理由もあるのですが、自分の知識としての興
>味とこれからの可能性と言う事を考えて自分でやってみたいと思っています。

この姿勢は重要です。自作すると仕掛けも自分のものとなり、同じ原理を
生かしたインスタレーションが作れたり、製品を改造して使えるように
なります。ですから、基本的には応援したいのですが、今回はたまたま
えらいテーマが揃っているのです。(^_^;)(^_^;)

>学校が買った16チャンネルのMIDI制御のライティングコン
>トローラーは日本円で10万ちょっとぐらいの値段でした。僕が自作したいのは4チャン
>ネル(実際に今回使うのは1チャンネルのみ)ぐらいの小さな物なのですが、自作すると
>結構かかるのでしょうか?最初の設備投資(ROMライターなどが必要なようですが)など
>で結局同じぐらいになるとしたら、何とかお金を作って自作してみたいと考えている
>のですが。

チャンネルが10から4になっても、コストは半分どころか、ほとんど変わらない
のです。(^_^;)
最初の設備投資をすると、そのあとはかなり良好に回転する、というのは
その通りです。(^_^)

>学校のMIDI照明用と音量制御の機械も結構怖い部分があります。僕の今
>回の作品は特に急激なランダムなMIDI信号で、光量の変化を要求するのですが、この
>機材なぜかある一定の変化を越えるとMIDIを受け付けてくれなくなってしまいました
>。ちょっとこれは使えないって事で作った会社に送り返してパワーアップしてもらい
>ました。

サイリスタの電力制御の場合、まず白熱灯タイプでないと駄目です。
蛍光燈は駄目。(^_^;)
急激な変化も、その原理から無理なのです。

>音量調整の機械はこれはYes Audioとか言うフランスの今はなき小さい会社が
>作ったMCA-16とか言うメインパネルにオーディオインとオーディオアウトのジャック
>がそれぞれ16個ついている物なのですが、すでにいくつかのジャックが使い物になら
>なくなっています。。。学校も直したくても、直せる人が見つからなくてこまってい
>ます。

うーーん、既にあるのなら、これを修理改造するというのがいいのですが。
ちなみにIRCAMの場合も、一度、うまく動かなくて日本にマシンが
帰国したのですが(^_^;)、僕のところで調べるとノートラブル。
どうも、フランスの電源事情というか、電圧が高いからなのです。
そこで220V-100Vトランスとともに送ったら、もう以降はバッチリになりました。
このあたり、電力関係は日本で作ってもフランスではちょっと心配です。

MIDIミキサは、あちこちで出ていますよね。ヤマハでは、たしかスライド
ボリュームがMIDIでぐりぐり動く(モーターが入っている)のもありました
よね。イメージラボでは、フォステックスのMIDIミキサを使っていました。
ちょっと手元に型番とかカタログとかないのですが、日本の楽器屋のホーム
ページとかで調べられると思います。

資料としては、秋月の「おしながき」が便利です。キット等が全部、載って
います。(^_^)
一度、通販で買うと、ブツと一緒に送ってきます。ただしこれだけを送っては
くれません。(^_^;)
あとは、「日本電子工作キット回路図全集」という本もあります。それぞれの
データシートをまるまるコピーして並べただけ。(^_^;)
普通の本屋にはないのですが、秋葉原の本屋にはあちこちあります。

とりあえず、こんなところでしょうか。皆さんの関連情報もお待ちしています。

AKI-H8版8ch汎用A/D入力MIDIセンサ 98/05/31 15:17


製作期間約3時間、そこそこのものができたので公開します。(^_^)

AKI-H8を使って、0V-5Vのアナログ電圧を同時に8チャンネル、A/D変換
して、MIDIの1-8チャンネルのチャンネルプレッシャーの値として
0-127で送る、というマシンです。電圧に変化が無い、またはごく微小な
値のゆらぎの場合には無視します。結果として、データは2以上の変動が
あった時に、各チャンネルを1系統のMIDIにマージ出力されます。

なお、抵抗とかICとかの部品はテキスト画面では表現できないので(^_^;)、
■であらわします。「等幅フォント」でご覧下さい。
図中の「+」「+」は、接続する、という意味です。

回路図には、MIDI入力用のフォトカプラも入っていますが、今回の仕様では
これは使っていないので、省略しても結構です。
ということは、このセンサでは、外付部品はICたった1個です。(^_^)

電源とGNDのピンは省略しています。以下のものです。かならず+5Vラインと
最寄りのGNDとの間に、全数、105のパスコンを入れましょう。(^_^)
<+5V電源>
 ・AKI-H8の「+5V」(Powerではありません)のpinいずれか
 ・TLP552の8pin
 ・74HC05の14pin
<GND>
 ・AKI-H8の「GND」のpinいずれか
 ・TLP552の5pin
 ・74HC05の7pin
ちなみにTLP552と74HC05のピン番号は、上から見てへこみのある部分の左隣端
が1pinで、あとは反時計回りにインクリメントされます。AKI-H8は基板に
書いてあります。

AKI-H8ですが、マニュアルに従って製作しますが、唯一、MIDIで使う場合には、
以下の改造が必要となります。ちょっとだけ細かい作業ですので注意して
行って下さい。

##############################################
●AKI-H8をMIDIに使う場合の改造
 シリアルポート0をRS-232CのICから切り離して、直接、CPUの
 ポートとして使います。このため、MAX232(相当品)のフラット
 パッケージの11,12ピンを、ICの根元でカットして、プリント
 パターンと分離します。プリントパターンはそのまま使うこと
 になりますので、基板上のパターンを傷つけないように、ICの
 足だけ切除してしまって下さい。足は浮いたままでいいです。
##############################################


A/D入力の8ピンのそれぞれとGNDとの間には、100Kohmあたりの抵抗を
それぞれ付けて下さい。ただし、それでも入力を浮かしていると
隣のA/Dポートの電圧に影響されてデータが出るようなので、使わない
A/D入力ピンはGNDにつないでしまった方がいいかもしれません。(^_^;)
きちんとした電圧が入力されていれば、他チャンネルは問題ありません。

AKI-H8のプログラムは、最初にはROMライタキットまで入ったものを買って
マニュアルに従って製作し、以下のプログラムをRS232Cから転送します。
プログラム(FLASH.EXE)も付いています。PC98用の1.2MBディスクなので
注意して下さい。僕はここが一番苦労しました。(^_^;)
プログラムは、MIDI入力をマージするルーチンを消さずに入れてある(call
するところだけコメントアウト)ので大きいのですが、本来の仕様だけなら
この半分です。(^_^;)
インテルHEXでなく、モトローラS形式のファイルです。これをFLASH.EXE
で転送して焼いたら、もう完成です。(^_^)
以下の===============で挟まれた部分を切り出して、転送して下さい。
2台目以降は、基板だけの安いキットで量産できることになります。(^_^)

============================================================
S00E0000466C617368524F4D4D4F5426
S107000000000100F8
S10B00D0000002EC000002F63F
S11301007A07000FFF0F7A02000FEF1079010FE05B
S1130110F80068A80B721B5146F85E000216F80837
S113012038E87FE97270F8FF38D45E0002867FE812
S11301307050F87038B25E0001465E0002AA5E009D
S113014002365A0001366B01EF140B516B81EF1429
S113015079210100587000025470790100006B810D
S1130160EF147EE873705860000254706A08EF253C
S11301700C8CA8005870002AA80458700024A80109
S113018058700024A8055870001EA8025870001E5D
S1130190A80658700018A80358700018A8075870CC
S11301A0001223E05800001223E25800000C23E45D
S11301B05800000623E6580000000A08E8076A888A
S11301C0EF257FE8727038E87FE870307FE8705081
S11301D01754177411030C3B78406A22000FEF2663
S11301E01C2B58B0000A182BAB0258A0000C5470FB
S10701F018B2A2029A
S11301F458A00002547078406AA3000FEF26F0D091
S113020408C05E00026C0C305E00026C5E0003F8F2
S11302145470F80038B2F80038B0F80F38B17900E8
S113022401F41B5046FC28B4F80038B4F80838F835
S113023454706B01EF1A6B06EF1C1D165860000215
S113024454707EB47370586000025470790E0000C9
S113025478606A28000FF80038B37FB472700B56C5
S113026472266B86EF1C54706B06EF1A790E00002E
S113027478606AA0000FF8000B5672266B86EF1A9B
S113028454707A01000001F45E00029A7A3100008E
S1130294000146F454707A02000008007A32000028
S11302A4000146F854706B01EF100B516B81EF1092
S11302B45870000254706B01EF120B516B81EF12F3
S11302C47921005058600008790100006B81EF1216
S11302D46A08EF230A086A88EF236A08EF2471780F
S10902E46A88EF2438D6FE
S11302EA54707FB472507FB4724056706DF001003F
S11302FA6DF57EB473607FB472606B05EF16790D8A
S113030A000028B578506AA8000FF4000B5572252F
S113031A6B85EF1601006D756D7056706B01EF16E4
S113032A6B05EF181D15586000025470790D000013
S113033A78506A20000FF4000B5572256B85EF186D
S113034A7370587000340C08E8F8A8F85860000273
S113035A5470E8F0A8F058600008F8006A88EF1EA5
S113036A54700C08E80F6A88EF1F0C08E8F06A88D3
S113037AEF1EF8006A88EF2054706A08EF1E58606F
S113038A00025470A8C05870001AA8D058700014FC
S113039A6A09EF205860002A0A096A89EF206A80ED
S11303AAEF2154706A80EF226A09EF1F14980C80B8
S11303BA5E00026C6A00EF225E00026C5E0003F8C4
S11303CA5470F1006A81EF206A80EF226A09EF1FF5
S10703DA14980C80E4
S11303DE5E00026C6A00EF215E00026C5E0003F8A1
S11303EE6A00EF225E00026C54706A08EF240C8AD6
S11303FEEA800C02E27F14A26A82EF2432D6547092
S9030100FC
============================================================

また、全てのソフトウェアの開発とデバッグ、フラッシュへの書き込みですが、
PowerBookで行いました。(^_^)
Mac用のソフト「VirtualPC」でWindows95を走らせて、COM1をモデムポート
でエミュレーションして、ソースは秀丸エディタで書き、DOSプロンプト内
の自作バッチでアセンブルし、WindowsのソフトFLASH.EXEで書き込みました。
シリアルケーブルはもちろん、自作です。なかなか軽快な開発環境です。

RE:MIDI自作派シリーズ(^_^) 98/06/09 19:35


> あとAKI-H8と言うのは、AKI-80とはどのような違いがあるのでしょう?

直接の参考になるかどうかわかりませんが、こちらからおおよその情報はたどる
ことができます。

http://www.tomakomai.or.jp/akizuki/inform.htm

AKI-H8 に関する情報はこちらです。この中にこのキットを使ってあれこれ作って
いらっしゃる方々のリンクもあります。

http://www.tomakomai.or.jp/akizuki/h8_board.htm

いやいや、なかなか盛り上がり(^_^) 98/06/12 23:01


>27C256や水晶振動子8MHzはフランスの電子部品のカタログにも出ている
>のでこっちでも手に入りそうですが、27C256の場合、-以下の数字が出てい
>ません。過去のログに-70でないとやっかいそうな事が書いてあったので、
>フランスで探すのは今回はちょっと敬遠します。

僕の本のとおりに8MHz水晶であれば、150でも200でも動きます。
ても、最近の27C256はたいてい100とか70ですよね。僕はたまに、数十本
単位の特価品を仕入れています。いずれ消えることに備えて。(^_^;)

>とここまで書いて気がついたのですが、AKI-H8の方は実際、"Java&AKI-80"で
>出てくるROMエミュレーターなるものはいらないのでしょうか?

えーと、あれは皆さん、僕のあの本の回路で自作しているようですよ。
あれはキットでは出ていないのです。便利なんですけど。(^_^;)
(秋月で出してくれたら嬉しいのですが...)
(いっそのこと共立から出たりして(^_^;))
(回路図の権利と転送ソフトとを、喜んで無償提供するのですが(^_^))

>あと、このVCAなんですけど、もう少し掘り下げて教えていただけないでしょうか?
>実際どのような部品を手に入れたらよいとかを。。僕の知識だとちょっと、まだ
>ついてこれないです。お手数かけます。

電圧制御でゲインの変わるアンプというわけです。
AKI-80の出力をIC一つでD/A変換して与えれば、オーディオ信号のゲイン
をMIDI制御できるわけです。
ただしこれは、ノイズで満足いくものを作るのは、もっとも素人が困難な
領域です。僕の実感です。(^_^;)
カンタンなVCAのICというのは、あまりポピュラなものはないのです。
秋葉原から取り寄せで入手したICもいくつかありますが、要するにディジタル
制御のアナログミキサなので、音楽に使うのに満足なノイズ対策がなかなか
できなくて、僕は今のところ断念しています。(^_^;)
本命はむしろ、入力ジャックのところで全チャンネルをA/Dしてしまい、
あとの処理は全てDSPでやる、というものだと思います。製品はたいてい
この流れですよね。(^_^)

>LEDを使用した舞台照明装置があるそうですが色の異なるLEDを組み合わせ
>で無段階の色変更と高効率、たま切れなし、ハイレスポンスでこれから
>増えてくるのでしょう とにかくコンピュータと相性がいいですからね!
>MIDI信号直受けのインテリジェントライトなんてどうでしょうか?

うーーむ、ソソラレますね。時間と資金があれば挑戦したいテーマ
ですが、想像するだけで、まずは膨大な単調作業があるので、思わず
立ちすくんでしまいます。(^_^;)
青色LEDで、ここらはプロの世界でも本格化するでしょうね(^_^)。

それではソース公開(^_^;)[1] 98/06/13 08:23


>AKI−H8版8ch汎用A/D入力MIDIセンサを制作しました。
>私の購入したAKI−H8キットのライター部分はマザーボードキ
>ットが入っていたので、ライターの作成もとくに苦労はしませんで
>した。ちなみにスイッチング電源もおまけにつけてもらいました。

なるほど、まぁROMライタのボードは時間の問題でしたが、付きましたか。
これでますます簡単ですね。ちなみにそのキット、AKI-H8を差し込んだ
ままでフラッシュROMを書き込んで、抜かずにそのままテストランして、
また改訂プログラムを焼いて、...と繰り返せるでしょうか。それとも
いちいち抜き差しする必要があるのでしょうか。僕のライタは、スイッチ
を二つつけて、抜き差しなしに開発できるようにしてみましたが。

>プログラムで稼動確認ができたので、自分でCでA/D
>の入力をMIDIコントロールチェンジで出力するプログラムを作
>成たところすんなりうごいてしまいました。

よかったですね。(^_^)
ちなみに僕のあれは、アセンブラです。Cでは、とりあえずFIFOバッファ
でMIDI入力を受けて貯めて、メインルーチンでMIDI受信割り込みフラグを
監視してループし、イベントがあればMIDI送信FIFOに貯めて、また
バックグラウンドでここからMIDI送信する、というソフトスルーを
作るところまで実験しました。

>それで、質問。MIDI_INのTLP552の7Pin
>には何もつながなくても良いのですか?

はい、いつもopenで使っています。東芝のデータブックの「MIDIへの応用」
のページの回路そのままです。(^_^;)

>それと、Cのソースを拝見して勉強したいなーと思ってる
>のですが、ホームページで公開したりしないのでしょうか?

えーと、これは別に秘密にするとかいうつもりはありませんでした。
未完成なので恥ずかしいから(^_^;)、という程度でした。でも、こうして
皆さんが続々と作られてきたので、とりあえず上記のMIDIスルーをここで
公開してしまいます。(^_^)

なお、このプログラムを使う場合のトラブルの責任は負って下さい。

/****************************************************************/
/*	AKI-H8 C comiler test : April 1998			*/
/****************************************************************/

#include 			/* Original Interfaces */

static char disp;
static int ctr;
static long j;

c_initial(){
	PB.DDR = 0xff;			/* Port [B] all output */
	ctr = 0;
	j = 0;
}

c_main(){
	j++;
	if(j==80000){
		j = 0;
		ctr = (++ctr)%256;
		disp = (ctr&1)<<7;
		PB.DR.BYTE = disp;	/* port [B] output */
	}
}

c_midi_rx(){
	int i;
	i=status&0xf0;
	if((i==0xc0)||(i==0xd0)){
		tx_midi(status);
		tx_midi(data);
		PB.DR.BYTE = data + disp;
	}
	else{
		tx_midi(status);
		tx_midi(keyno);
		tx_midi(data);
		PB.DR.BYTE = keyno + disp;
	}
}

これがメインのCプログラムです。閑散としていますね。
ここでは、ポートBに8個のLEDをつけて、MIDIスルーしている内容の、
ステータスバイトを同時に表示しているわけです。

そして、midi_io.hというのがincludeされていますが、この中身は

/****************************************************************/
/*	AKI-H8 C comiler Oroginal Header : April 1998		*/
/****************************************************************/

#include <3048f.h>

extern char tx_d,status,keyno,data;
extern void tx_fifo_set();

tx_midi( int x ){
	tx_d = (char)x;
	tx_fifo_set();
}

...と、ますます簡単なものです。ここに、MIDI回りの色々な共通
サブルーチンというか関数を格納していく構想だったわけですが、まだ
何もやっていないというわけです。ここらを拡充したところで、何か
次の本のネタになっていくものと期待して下さい。(^_^)

3048f.hは、もともと提供されているファイルです。ポート等を定義して
います。

そして、Cの場合には、スタートアップモジュールが必要です。これを、
秋月のキットについているものと変える必要があります。以下のプログラム
が、いわばここでのノウハウの核心です。このstartup.srcをアセンブラ
でstartup.objにアセンブルして(元のものもリネームして保管しておいて
下さいね(^_^;))、それが置かれた環境で最初のCプログラムをコンパイル
するわけです。

それではソース公開(^_^;)[2] 98/06/13 08:24


;-------------------------------------------------
;	AKI-H8 startup module for C : April 1998
;		( MIDI transmit/receive FIFO )
;-------------------------------------------------

;##### Common Defines for C interface #####
	.import	_c_initial, _c_main
	.import	_c_midi_rx
	.export	_tx_d, _status, _keyno, _data
	.export	_tx_fifo_set

;##### SCI/Int Port Defines #####
smr	.equ	h'0fffb0
brr	.equ	h'0fffb1
scr	.equ	h'0fffb2
tdr	.equ	h'0fffb3
ssr	.equ	h'0fffb4
rdr	.equ	h'0fffb5
iprb	.equ	h'0ffff8

;##### Work RAM Data Defines #####
	.section ram,data,locate=h'0fef10
rx_top	.res.w	1
rx_end	.res.w	1
tx_top	.res.w	1
tx_end	.res.w	1
rsb	.res.b	1
dcb	.res.b	1
channel	.res.b	1
_tx_d	.res.b	1
_status	.res.b	1
_keyno	.res.b	1
_data	.res.b	1
	.org	h'0ff000
rx_fifo	.res.b	1024
	.org	h'0ff400
tx_fifo	.res.b	1024

;##### Vector/Routines Area #####
	.section program,code,locate=h'000000
	.org	h'000000
	.data.l	start
	.org	h'0000d0
	.data.l	int_rx_error
	.data.l	int_rx_full
	.org	h'000100
int_rx_error:
	bclr	#5,@ssr
	bclr	#4,@ssr
	rte
int_rx_full:
	push.w	r0
	push.l	er5
	btst	#6,@ssr
	bclr	#6,@ssr
	mov.w	@rx_top,r5
	mov.w	#0,e5
	mov.b	@rdr,r0l
	mov.b	r0l,@(rx_fifo,er5)
	inc.w	#1,r5
	bclr	#2,r5h
	mov.w	r5,@rx_top
	pop.l	er5
	pop.w	r0
	rte
sci0_init:
	mov.b	#b'00000000,r0l
	mov.b	r0l,@scr
	mov.b	#b'00000000,r0l
	mov.b	r0l,@smr
	mov.b	#15,r0l
	mov.b	r0l,@brr
	mov.w	#500,r0
_sci0_wait:
	dec.w	#1,r0
	bne	_sci0_wait
	mov.b	@ssr,r0l		; (dummy read)
	mov.b	#0,r0l
	mov.b	r0l,@ssr
	mov.b	#b'00001000,r0l
	mov.b	r0l,@iprb		; SCI0-int priority UP !
	rts
wait_500msec:
	mov.l	#500,er1
_wait_1:
	jsr	@wait_1msec
	sub.l	#1,er1
	bne	_wait_1
	rts
wait_1msec:
	mov.l	#2048,er2
_wait_2:
	sub.l	#1,er2
	bne	_wait_2
	rts
tx_midi_check:
	mov.w	@tx_top,r1
	mov.w	@tx_end,r6
	cmp.w	r1,r6
	bne	_tx_exist
	rts
_tx_exist:
	btst	#7,@ssr			; test TRDE
	bne	_tx_seq
	rts
_tx_seq:
	mov.w	#0,e6
	mov.b	@(tx_fifo,er6),r0l
	mov.b	r0l,@tdr
	bclr	#7,@ssr			; Transmit !
	inc.w	#1,r6
	bclr	#2,r6h
	mov.w	r6,@tx_end
	rts
_tx_fifo_set:
	mov.w	@tx_top,r6
	mov.w	#0,e6
	mov.b	@_tx_d,r0h
	mov.b	r0h,@(tx_fifo,er6)
	inc.w	#1,r6
	bclr	#2,r6h
	mov.w	r6,@tx_top
	rts
rx_midi_check:
	mov.w	@rx_top,r1
	mov.w	@rx_end,r5
	cmp.w	r1,r5
	bne	_rx_exist
	rts
_rx_exist:
	mov.w	#0,e5
	mov.b	@(rx_fifo,er5),r0h	; received data = [r0h]
	inc.w	#1,r5
	bclr	#2,r5h
	mov.w	r5,@rx_end
	btst	#7,r0h
	beq	running
	mov.b	r0h,r0l
	and.b	#b'11111000,r0l
	cmp.b	#b'11111000,r0l
	bne	_lower_f8
	rts
_lower_f8:
	and.b	#b'11110000,r0l
	cmp.b	#b'11110000,r0l
	bne	_lower_f0
	mov.b	#0,r0l
	mov.b	r0l,@rsb
	rts
_lower_f0
	mov.b	r0h,r0l
	and.b	#b'00001111,r0l
	mov.b	r0l,@channel
	mov.b	r0h,r0l
	and.b	#b'11110000,r0l
	mov.b	r0l,@rsb
	mov.b	#0,r0l
	mov.b	r0l,@dcb
	rts
running:
	mov.b	@rsb,r0l
	bne	_normal
	rts
_normal:
	cmp.b	#b'11000000,r0l
	beq	_2byte
	cmp.b	#b'11010000,r0l
	beq	_2byte
	mov.b	@dcb,r1l
	bne	_3byte
	inc.b	r1l
	mov.b	r1l,@dcb
	mov.b	r0h,@_keyno
	rts
_2byte:
	mov.b	r0h,@_data
	mov.b	@channel,r1l
	or.b	r1l,r0l
	mov.b	r0l,@_status
	jsr	@_c_midi_rx
	rts
_3byte:
	mov.b	#0,r1h
	mov.b	r1h,@dcb
	mov.b	r0h,@_data
	mov.b	@channel,r1l
	or.b	r1l,r0l
	mov.b	r0l,@_status
	jsr	@_c_midi_rx
	rts

;##### Main Program #####
start:
	mov.l	#h'0fff10,er7		; stack pointer set
	mov.l	#h'0fef10,er2
	mov.w	#h'0fe0,r1
	mov.b	#0,r0l
_ram_clear:
	mov.b	r0l,@er2
	inc.l	#1,er2
	dec.w	#1,r1
	bne	_ram_clear
	jsr	@sci0_init		; SCI initialize
	jsr	@_c_initial		; C initialize module
	jsr	@wait_500msec
	mov.b	#b'01110000,r0l		; tx/rx start !
	mov.b	r0l,@scr
	andc	#b'01111111,ccr		; interrupt enable
loop:
	jsr	@_c_main
	jsr	@tx_midi_check
	jsr	@rx_midi_check
	jmp	@loop

	.end

ここでやっている事ですが、システムの初期設定、MIDI受信割り込みの
定義(FIFOに積む)、MIDI送信FIFOの関係、リセットしての初期設定、
送受信割り込みのスタート、メインループです。
この10行ほどすぐ上の(^_^;)無限ループで、Cのプログラムで記述する
任意のc_main関数を呼び出しています。このmainの中に無限ループを
作ってはいけません。判りますね。(^_^)
何か処理したら終了するサブルーチンをc_mainとするのです。
初期化の追加は、c_initialの方に書きます。

これはもうフリーでこうやって公開するので何をしていただいても結構
なのですが、僕の希望を以下に書かせて下さい。

このstartupモジュールは、できればこのまま改良改変して欲しくない
のです。今のところ、このバージョンでは、という事です。というのも
これはまだ未完成だからです。そして、
このstartupは、なるべくならあまり多くのバージョンが出回らない方が
いいと思います。混乱しますので。

ということで、初期化、メインともに、このstartupはいじらずにCの
プログラムの方で皆さんがなんとでもできます(極端にはシリアルポート
の初期化を再定義だってできるように、後にしてあります(^_^))ので、
ちょっと時間を下さい。年内には、新しい本のネタもかねて、もう少し
きちんとしたstartupを作って、そして正式に公開したいです。
えーと、A/Dも入れたりしますので、midi_io.hも、です。

RE: RE^2:MIDI自作派シリーズ(^_^) 98/06/19 08:28


> 74HC393又は74HC74 x4
> TLP552 x8
> ってのが手に入らないようなのです。一応探しているのは大阪(日本橋)なの
> ですが、売っている店または代用出来る部品ってのがあったら教えていただき
> たいのですが。

74HC393or74HC74ですが、これは74LS393or74LS74でも
いいです。要は分周するだけなので、161とかのカウンタ類でも、
なんとなったら00だけでもフリップフロップは組めますが。
回路図はいい課題なので、書きませんけど。(^_^;)

TLP552も、高速フォトカプラであればいいので、昔のであれば
シャープのPC900(^_^;)、東芝のTLPだとなんだったかなー、
いくつもありますが、ここ大阪では資料がないです。
ただし、フォトカプラはピン配置どころかピン数もいろいろなの
で、データシートで調べないと、僕の書いた回路図は使えないです。

RE:それではソース公開(^_^;)[1] 98/06/19 21:04


> コンパイル、リンクがうまくいきません。
> 僕のやり方が何かおかしいのでしょうか?
> 余裕ができたらで結構なので、みていただけますか?
> 
> 1)Cのコンパイルエラー。MIDIN01.Cとする。
>  MIDIN01.C     5 2005 (E)  CANNOT OPEN INCLUDE
>  MIDIN01.C    12 2225 (E)  UNDECLARED NAME: "PB"
>  MIDIN01.C    12 2203 (E)  ILLEGAL MEMBER REFERENCE
>  MIDIN01.C    12 2220 (E)  MODIFIABLE LVALUE REQUIRED
> 以下略
> これは、
> #include を
> #include "midi_io.h"に変更、同様にmidi_io.h内のINCLUDEも
> 変更する事により、エラーはなくなりました。
> 
> 2)STARTUP.SRCでコンパイルエラー
> c:\akih8>A38H.EXE startup.src
> H8/300h ASSEMBLER (Evaluation software) Ver.1.0
> 0 933 (F) LACKING CPU SPECIFICATION
> で、objができませんでした。
> CPUが指定されてないというエラーなので
> 最初の行に
>         .CPU    300HA
> を追加すると、コンパイルされOBJはできるが、
> 今度は以下のようなワーニングがでてしまう。
> H8/300h ASSEMBLER (Evaluation software) Ver.1.0
> startup.src 48 835 (W) ILLEGAL VALUE IN OPERAND
> startup.src 49 835 (W) ILLEGAL VALUE IN OPERAND
> 中略(同様のメッセージが54,55,103,110行ででる)
>   *****TOTAL ERRORS      0
>   *****TOTAL WARNINGS    6
> ワーニングはシリアルステータスレジスタをビット操作
> する行ででる。
>         bclr    #5,@ssr 48行目
>         bclr    #4,@ssr 49行目
>         btst    #6,@ssr 54行目
>         bclr    #6,@ssr 55行目
> これがマニュアルをみても何が駄目なのかがわからない
> 
> 3)ワーニングを無視してリンクをすると以下のメッセージー
> ** 117 ADDRESS SPACE DUPLICATE
> それでも、リンクは終了しファイルもできている。
> 
> ちなみにリンクのバッチファイルの中身は
> c:
> cd c:\akih8
> L38H.EXE -SUBCOMMAND=%1
> 
> これに与えるSUBファイルは
> OUTPUT MIDIN01
> PRINT MIDIN01
> INPUT startup,MIDIN01
> LIB c38hab
> START P(200)
> EXIT
> です。
> 
> 4)駄目だろうなと思いつつもモトローラSフォーマット
> に変換しAKI−H8に書き込むが...
> 案の定まともにうごいてくれません。
> 入力とは関係ないごみデータばかりが出力されます。
> 
> ぶっ壊したかと心配になり、AD>CCのプログラム
> を再度かきこむと正常に動いたので、ちょっと安心。

とりあえず、僕の作業環境との違いがあるようですので、手元の
関係しそうなファイルのソースも以下に置きます。それで検討してみて
いただけますか。いずれもAKI-H8のために僕が新たに作ったものの
ようです。
それぞれのファイルは、コンパイルオプションとか環境とかの不整合に
関係していると思いますが、いまは思い出している余裕がないので、
解説は省略です。

---------[asm.bat]------------------------------------
a38h %1.src -cpu=300ha:20
l38h %1.obj -output=FlashROM.abs
c38h FlashROM
pause
del FlashROM.abs
del %1.obj
del %1.lis
flash

---------[cc.bat]------------------------------------
echo off
copy %1.c system.c
a38h startup -cpu=300ha:20
del startup.lis
cc38h -include=c:\msdos\aki-H8\tools,c:\msdos\aki-H8 system.c
del system.c
pause
l38h -subcommand=system.sub
del startup.obj
del system.obj
c38h FlashROM
del FlashROM.abs
del zzMAPzz.map
pause
flash
echo on

---------[system.sub]------------------------------------
INPUT startup,system
OUTPUT FlashROM
PRINT zzMAPzz
LIB zc38hab
START P(2000),C(10000),B(0FF800)
EXIT

asmはアセンブルからROMライタ転送までのバッチ、ccはコンパイラ
でのものです。いずれかを使うことになります。
たぶん最後のテキストファイルが、コンパイラに何かを指示している
のではないでしょうか。(かつて自分で解析して理解したのに...(^_^;))