カテゴリ
リンク

当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内

情報セキュリティおよび個人情報の取り扱いについて


コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。

 (1)、(2)回の前編では、玄箱(pro)にアクセスされる(あるいは接続されたネットワークを流れる)プロトコルについて、その種類(ポート番号)を表示するところまで作ってありました。また、一番始め、玄箱(pro)としては MIDI 音楽の再生実験すら終わっていなかったので、出来合いの MIDI データの再生を確認することも必要でした。
 下の手順で言えば1番が終了ことになりますので、引続き、後編の説明を続けます。

  1.    出来合いの MIDI データが確実の再生できること。
  2.    自分で MIDI データ(単音)を生成できること。
  3.    プロトコルを判別して、MIDI を"曲"として生成できること。
  4.    生成された MIDI データ(曲)を連続して流し続けること。 
【全体的な機材の様子】
s3P1000796.jpg
MIDI データの生成
 MIDI データを単音として生成するにしても、一足飛びでプログラム作成までは進めませんでした。まずは、MIDI の規格や MIDI 音のファイル構造を検索エンジンであたってみました。
 少し寄り道となるのですが、なぜ、単音(たとえば"ソ"だけ)のファイルが必要になってしまったかの発端もお話ししておきたいと思います。前編において aplaymidi の動作は確認をしていますが、そこでは次の形式でも演奏が可能でした。
cat eva_op.mid | aplaymidi -p 16:0 -
 そうとなれば、(cat eva_op.mid に相当する部分を) C プログラムにて MIDI データファイル(.mid)を上述の如くパイプで結合すれば、うまく行くだろうと踏んでいました。そのために、CATコマンド に相当するプログラムを作ってもみました。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define  FILENAME "eva_op.mid"

int main(void) {
    FILE *fp;
    int  c;
    char a[2];

    if ((fp=fopen( FILENAME, "rt"))==NULL) {
        printf( "file open error:%s\n", FILENAME );
        exit(1);
    }

    while(( c = fgetc(fp)) != EOF ){
      a[0] = (char)c;
      a[1] = 0;
      fprintf(stdout,"%c", a[0]);
    }
    close (fp);
}
 当然、CAT 相当のプログラムですから置換しても問題なく動作しました。ところがしかし、「バイナリ・エディタ」で音符の数を適当なデータに書き換えてみると、まったく動きません。
 しばらく悩んでいる内にハタと気づきました。MIDI ファイル中には転送バイト数が埋め込まれていたため、音符の数を変えてしまうとデータ・エラーになっていたのでした。
 この段階での発想としては間違っていなかったと思うのですが、MIDI データ・フォーマット(後述のSMF)では、転送バイト数のほうがファイルの頭にあるので、後々に不特定数の音符を生成が予定されていれば(バイト数が確定しないので)、無理な注文をしてしまったことになります。
 こうして、SMF というファイル規格を理解しなくてはならなくなりました。

SMF(Standard MIDI Files) というもの
 玄箱(pro)からシリアル通信を利用して MIDI 音源に向かって規格に沿ったデータを送り出せば、音が出ることはわかっていました。ただし、そのインターフェースに(ボーレートの関係から) UX16 を使うのであれば、aplaymidi のようなアプリケーション・ソフトの力を借りることになり、それゆえ、MIDI ファイルを生成しなくてはなりません。この MIDI ファイルを規定していのが、SMF フォーマットです。
 これのわかりやすい解説としては、http://www2s.biglobe.ne.jp/~yyagi/material/smfspec.htmlなどが参考になります。
 しばらくここの情報を眺めて、ヘッダ部分、転送バイト数、トラックの中身(発音のオン/オフ)の三つに分けて理解を進めました。それと同時に、実際の単音データと比較することで、自分の理解が合っているかどうかを確認してみました。
 これを手助けしてくれたのが、Web ページで MIDI を作曲するというサイトで、ここではホームページ上で単純な MIDI 曲が作曲できてしまいます。

【Web ページ上で MIDI データを作成してみる】
3ParaMidi.jpg
 早速、ここで"ソ"の音(so.mid)だけを作ってみました。生成した MIDI ファイル(=SMFフォーマット)はダウンロードできますから、まずは、これを「WinAmp」で確かめておきました。
 さらに具体的に、ヘッダ部やMIDI 音源に対する発音と消音(ここからは、ノート・オン、ノート・オフと書きます)の目視確認が必要だったので、そのファイルを「バイナリ・エディタ」にかけました。この様子が下の図になります。

【 MIDI データを16 進で確認する】
3Stirling-SO.jpg

 同様に転送バイト数計算のチェックも目視を行った訳ですが、16 進での計算となりましたので「C電卓」のお世話になりました。
 ここまでで、"ドレミ"と発音させるための MIDI データ・ファイルの理解は終了したのですが、"どの楽器を使うのか"がまだ不明なままです。それについては、MT-32 のメーカである ROLAND の Web サイトから入手ができました。 MT-32の仕様書(pdf)を見付けてダウンロードして、楽器指定コードの調べがつきました。"楽器を持ち変える(=音色を変える)"コードは、 MIDI 音源ユニットによって異なるかもしれません。いずれにして、楽器の"持ち替え"(コントロール・チェンジ)を調べて、「ssh アクセスであれば電話のベル音」に設定することも見えてましたが、音楽とMIDI プログラムに造詣がなかったものですから、"和音を作る"部分についても時間を要したところです。


MIDI 曲のサンプルを作ってみる
 自分が MIDI データのフォーマットを理解したとはいえ、tcpdump からの出力を受けてサクサクと MIDI データを生成するプログラムを開発するには、ちょっと"距離がある"ように思えました。そこで、まずは低レベルのルーチン開発を兼ねて、下述のプログラムを作りました。
 これは、プログラムのコメントからも読み取れるように、いくつかの音の組み合わせ(の極小曲)を作りだせるものです。コラムの Makefile (次回掲載)を参考にして so.c をコンパイルしてみてください。この so というプログラムで発生されるデータ・サンプルは、 .mid ファイルと 16 進表示です。(下表サンプルではファイル名が別々ですが、どのオプションにおいても so.mid というファイルが生成されます)。

【実験サンプル(MIDIデータ)】
オプション指示 生成される曲内容
指定なし "ソ"だけの曲
-b 音色変更
-h 和音生成
-a 複数チャネル

【実験サンプル(16進表示)】
実行 生成内容の表示(16進)
./so 4d 54 68 64 0 0 0 6 0 0 0 1 0 20 4d 54 72 6b 0 0 0 c 0 91 43 55 40 81 43 11 0 ff 2f 0
./so -b 4d 54 68 64 0 0 0 6 0 0 0 1 0 20 4d 54 72 6b 0 0 0 f 0 c1 7b 0 91 43 55 40 81 43 11 0 ff 2f 0
./so -h 4d 54 68 64 0 0 0 6 0 0 0 1 0 20 4d 54 72 6b 0 0 0 1c 0 91 3c 55 0 91 40 55 0 91 43 55 40 81 3c 11 0 81 40 11 0 81 43 11 0 ff 2f 0
./so -a 4d 54 68 64 0 0 0 6 0 0 0 1 0 20 4d 54 72 6b 0 0 0 17 0 c2 7f 0 92 43 55 0 91 43 55 40 81 43 11 0 82 80 11 0 ff 2f 0

MIDI 曲の見本生成プログラム

 基礎実験プログラムは、so.cです。

 和音の発音について、ちょっと補足しておきます。和音は同時に複数の音を鳴らす(ノート・オン)ことを意味しますから、実現する方法としては二つ考えられます。一つは1チャネル内で複数発音させる、二つ目としては別チャネルも鳴らすということですね。後者はリズム音(パート)に相当するでしょう。
 たとえば、"ドミソ和音"であれば、1チャネル内での発音シーケンスは、

  1.    (すぐに) "ド”を発音(ノート・オン)
  2.    (すぐに) "ミ”を発音
  3.    (すぐに) "ソ”を発音
  4.    (発音時間だけ待つ)
  5.    (すぐに) "ド”を停止(ノート・オフ)
  6.    (すぐに) "ミ”を停止
  7.    (すぐに) "ソ”を停止

になります。その部分だけを下に抜き書きしました。
 ソース中のでは、この部分("すぐに")は zero() という関数に相当しています (作曲手法という点からすれば、ノート・オンとノート・オフのそれぞれの"すぐに"が、ゼロ秒とは限らないと思いますが)。
 この"すぐに"については、MIDIイベントと呼ばれるほかのコマンドにも適用されるので、そのコマンド指示の前には zero() が現れています。
  case 2:
    /* 和音を発音 */
    zero();                     /* すぐ次に */
    tone_do();                  /* "ド"を発音 */
    zero();                     /* すぐ次に */
    tone_mi();                  /* "ミ"を発音 */
    zero();                     /* すぐ次に */
    tone_so();                  /* "ソ"を発音 */
    wait();                     /* 待つ */

    tone_stop_do();             /* "ド"を停止 */
    zero();                     /* すぐ次に */
    tone_stop_mi();             /* "ミ"を停止 */
    zero();                     /* すぐ次に */
    tone_stop_so();             /* "ソ"を停止 */

    zero();                     /* すぐ次に */
    b = sizeof(end);            /* トラック終了 */
    hexset(end, b, 1);
    hexout();
    break;
最終段階のプログラム作り
 「tcpdump からプロトコルを希望のフォーマットで取り出せる」こと、それに「任意の MIDI 曲が作成できる」ことが確認できましたから、残すところ、最終段階としてまとめ上げる部分の説明です。
 もう一度全体の流れを振り返りつつまとめてみると、最終的な動作は次のようなものになっていきました。

  1.    tcpdump コマンドでネットワークに流れるプロトコル(ポート番号指定)を拾い出す。
  2.    awk により、フィルタを書けて文字整形をする。
  3.    プロトコルに従って、音を出す(MIDIデータを作り出す)プログラムに引き渡す。
  4.    生成された MIDIデータ(.mid ファイル)を連続再生する。

 3番目をデバッグする際、実際に玄箱(pro)にサンプリングさせて実験するには効率が悪過ぎます。そこで、模擬的に tcpdump の結果を作り出すスクリプト(sd.bsh)を作成しておきました。
 すでにおわかりと思いますが、
./sd.bsh | 作ろうとしているプログラム(下述の m.c)
のように使います。

【模擬的に tcpdump の結果を作り出すスクリプト】
#! /bin/sh

while true
do
    sleep 1; echo "17:22:38 20"
    sleep 1; echo "17:22:38 21"
    sleep 1; echo "17:22:38 22"
    sleep 1; echo "17:22:38 23"
    sleep 1; echo "17:22:38 25"
    sleep 1; echo "17:22:38 80";
    sleep 1; echo "17:22:38 110"    
    sleep 1; echo "17:22:38 5000"    
    sleep 3
    sleep 1; echo "17:22:38 21"; echo "17:22:38 23"; echo "17:2:38 25"
    sleep 3
done

# 20  ftp/data
# 21  ftp
# 22  ssh
# 23  telnet
# 25  smtp
# 80  http
# 110 pop3
# 5000 test
 次回は最終回で、プログラムを完成し、音を聞いてみます。

<和田 好司>

 カテゴリ 

 

トラックバック(0)

このブログ記事を参照しているブログ一覧: MIDI で遊ぶ 《tcpdump を音で見る》(3)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/2177

コメントする

おすすめ書籍
Powered by
Movable Type 4.1