inu goya - 一覧 - mdcomp32 ( 紹介 - 履歴 - fmcomp出力仕様 - 楽曲見本 )

mdcomp32紹介(Standard MIDI File Compiler) v1.01 [2017年10月13日から公開中]

昔BASICで音楽を作成した時に使用したMMLを使ってmidiデータを作成します。もともと、FM音源ドライバーを製作していた時、データの作成と確認用に作ったソフトでWindows上で音楽を完成させたあと同じソースでFM音源ドライバー用コンパイラに通すとそれのデータが出てくるようにしていました。特徴としては、マイコンBASICマガジンやMSXFANに掲載されていたBASICで作成されていたMMLを極力触らずに midiデータに変更できるようにしています(単に変換が面倒なため)。
■対応OS Windows 7 , 10 [32bitと64bit版も対応(64bit版はWOW64上で32bitソフトウェアとして)]
※ヘルプの内容が空白になる場合はmdcomp32.chmを右クリックして「ブロックを解除」ボタンをクリックしてください。
mdcomp32

mdcomp32実行画面

mdcomp32実行画面

例えば、ch1 { "o4L4cde8" }
でコンパイルすると オクターブ4の四分音符 c(ド) d(レ) と 八分音符の e(ミ)になる。

音階はC(ド),D(レ),E(ミ),F(ファ),G(ソ),A(ラ),B(シ),R(休符)
長さはLで指定し、次のLが出現するまではそれを保持する。
また、音階の横に数値を付けた場合はその音階のみ数値の長さになりLの値は無視する
Oでオクターブ、@で音色、を変更できる

PC-88VAのBASICマニュアルに書いてあるMML文法に準拠するように設計していますので、特殊・固有命令を除いてそのまま再現するようにしています。
その特徴から、MIDIに特化した命令がほとんどないのが欠点といえるかな。
(試したことは無いのですが、mdcompで作成したMMLの部分をBASICで入力して演奏できるはず)

※詳しくはmdcomp32添付の説明書および技術解説書をご覧ください

動作確認(2017年10月7日現在)v1.01

■現在わかっている問題点
*Vistaのコマンドプロンプトでmdcomp(16bit)を実行後,表示が英語モードのまま(Vistaの仕様)
*Windows 10はコンソール版のみPowerShellから起動確認
*Windows 10(32bit版)でmdcomp(16bit)を実行する場合NTVDMのインストールが必要です(OSからメッセージ出現)
OS↓mdcomp→ mdcomp32(GUI)
v1.01
mdcomp(DOS16)
v1.01
mdcmp32c(32bit)
v1.01
Windows 10 ○(64),◎(32) ×(64),○(32) ○(64),◎(32)
Windows 8.1
Windows 8
Windows 7 ◎(32),○(64) ○(32),×(64) ◎(32),○(64)
(Windows Vista) ◎(32) ▲(32) ◎(32)
(Windows XP) ◎(32) ○(32) ◎(32)
(Virtual BOX上 Windows 2000) ◎(32) ○(32) ◎(32)
(Virtual PC上 Windows NT4.0) × ○(32) ◎(32)
(Virtual PC上 Windows 95) × ○(32) ◎(32)
(Virtual BOX上 FreeDOS 1.2) ◎(16)
(ubuntu 17.04上 wine 2.18) ○(64) × ○(64)
(ubuntu 17.04上 dosbox 0.74) ○(32) ×
※(64)は64bit , (32)は32bit , (16)は16bit OSで確認
※◎は確認済,○は互換機能上で確認,▲一部機能に支障有,?は未確認,×は非対応,-検証しない
※( )で囲んでいるOSは参考用

曖昧回避のための項目

※ 1:商用利用可(重要事項および約束をご覧ください)
※ 2:商用利用には学校・塾・企業・パソコンスクールでの使用、雑誌・書籍の付録を想定しています(連絡不要)
※ 3:画面のハードコピー・キャプチャも使用可(連絡不要)
※ 4:mdcomp32 説明書に使用している楽曲は転用不可
※ 5:犯罪になることはダメです
□バンドル(プリインストール)
ないとは思うけれども、mdcomp32 をインストールして販売や配布しても良い(※ 1,5厳守)(連絡不要)。
*この項目は都合により変更する場合があります

説明書に載せていない重要でないこと(ご覧になるほどの内容はありません)

■経過
◇FM音源ドライバの製作を考慮してfmcompデータ形式で出力のメニューを追加(2017年9月)
◇Dominoで読み込めるようにsmf出力のデータを修正(2017年9月)mdcomp32のバグです
◆残念ながらエンベローブや特殊な命令は通りませんが、88VA説明書のMML文法に準拠するように製作しています。この mdcomp32ですべてを実現するのではなく、シーケンサーソフトへの橋渡しとして使っていただけるとよいかなと。
mdcomp32が出力するmidiファイルはFORMAT1です。
◆ベクターで検索してもN88BASICやMSXBASICで使われていたMMLがいけそうなやつが見つからなかったので誰かの役にたつかな。それとも見つけられなかっただけですごいソフトがあるのかもしれんが。
◆秋月でYMZ294(音がPSGに似ているやつ)を買ってきてPC/AT互換機のプリンターポートに接続した制御回路の上に搭載してSSGプレイヤーを作成した時にデータの作成はWindows95で行い(当時は95対応)DOS用のfmcompで作成したデータをSSGプレイヤーに読ませて演奏させていました。10年以上前のことですが。そのころSH2が雑誌の付録についたのでこのマイコンにもYMZ294をつけて制御してました。SH2のプログラム開発はC言語だったんですが、近所に電子部品を売っている店がないので寄せ集めで作ったような。
◆1994年頃、音源ドライバーを製作したことがあったのでなんとなく作れているのですが、FM音源(YM2203)のドライバーはすごく面倒くさかったですな。当時の資料をみてもPC-9801のI/O制御の手順が多くてソースが複雑になっていました。しかも、資料には日本楽器製造(現ヤマハ)と印刷されていました。このFM音源は非常にいい音が出ていたと記憶しています。近年は簡単に操作できるFM音源ICは手に入らないので雑誌の付録にマイコンボードと一体型のFM音源が搭載されてプログラミング開発ができるとおもしろいのだが。
◆Wineでmdcomp32(テスト版)を実行して演奏したら、MIDIは再生できないらしく音が出ないです(たぶんソフト音源はubuntuに入っていない)。
■v1.01について(2017年9月開発開始,10月公開)
Arduino等で使用できるFM音源YMF825が2017年8月下旬より販売されるので、今後それ用の装置を趣味で開発するかもしれないためあらかじめmidiより単純なfmcompデータを出力するmdcomp32を開発することにしました。2003年頃のソースをみたらこれでよくsmfが出力できていたなあと。最近作曲することがあるので使用しているのはDomino(TAKABO SOFT)だったりするのですが、mdcomp32v1.00の出力するsmfをDominoに読ませるとメッセージがでて読み込めないですな。エラーメッセージをもとにsmfをバイナリエディタで見ると各トラックの最初にB0 78 00というオールサウンドオフという命令を入れているのが原因だとわかりました。ようするにトラック2でも3でもB0というチャンネル0をオールサウンドオフと言うことでチャンネル0に対する命令が複数のトラックに出現しているというものです。これを出力トラックに合わせてB1 B2 B3 ... という風に変更することで読み込めるようになりました。あと、1小節目を設定のみにして2小節目から演奏データとしたかったのですが、1小節目を短くして2小節目から通常の長さにするという方法がわからず、Dominoの出力するデータを調べたら、8/1にして設定後4/4にしていることがわかりました。早速mdcomp32にも導入してみたらうまくいきました。改めてDominoはすごいソフトだなと思ったのでした(これからDTMをはじめる方はDominoがよいかも)。
あと、四分音符のティックを32→480に変更したりGMリセットと思っていたらGMシステムオンが正しかったり(説明書も誤っているので読み替えてください)、&命令を連結しまくったときに256を越えるとおかしくなったりしていたので修正など、15年たってバグがたくさん見つかっていますな。現在(2017年)はDTMソフトも安くて良いものが出回っていますのでmdcomp32の意味は無いのですが、完成次第公開してみます。
◆mdcomp32のソースについて
v1.01にはmdcomp32のソースを添付しています。これについては都合上参照専用とさせていただきます(引用・抜き出しは可)。ソースから実行ファイルの作成にはTurbo C++ 2006 Exp以降が必要です。
今年(2017年)は、開発に時間を割くことができたので従来公開のソフトウェアでバージョンアップが必要なものやソースを公開可能なものは権利関係を確認して添付できるようにしました。今後、私自身が開発できないこともあるかもしれないので参考にしていただければと思います。

◆mdcomp.c(v1.01.00)のバグ(2017年10月25日追記) ※オプション指定 /f で fmd出力時のみ発生
int wrtfmcomp()関数の以下の部分に問題があります。ch1の出力が無い場合でもch1のデータ開始番地を0x20として書き込んでしまいます。v1.01.01相当に修正するには以下のように変更してください。
int wrtfmcomp( )関数内の該当箇所を修正してください
v1.01.00(バグ) mdcomp.c 618行から623行   v1.01.01相当修正
w1 = 0x20; /* データ格納開始番地 */ 未変更 w1 = 0x20; /* データ格納開始番地 */
chxofs[0]= w1; 削除  
w1 += chxcnt[0]; 削除  
w1 += 2; /* endコード分を追加する(0xff 0xffの2byte) */ 削除  
for(i=1; i< MAX_CH;i++) i=0にする for(i=0; i< MAX_CH;i++)
{ 未変更 {
forの部分を調整したことを忘れて手前でch1の処理を単独で行う部分を残していたのが原因ですな。
このバグはch1を作成せずch2やch5などを作成したとき、ch1の有無を確認せずに必ずch1を0x20と入れていたのが出力データのおかしな原因となっていました。
ちなみにmdcomp32は出力処理方法が異なるのでこのバグは発生しません。
mdcomp.cをC/C++コンパイラで再コンパイルして実行ファイルを作成すれば完了です。
お手数をおかけします。
◆mdcomp.c(v1.01.00)のgccでコンパイルした実行可能ファイルのエラーについて
gccでコンパイルすると警告がいくつか出ます。たとえば359行目のprintf(copyrdat);はprintf("%s",copyrdat);という風にしなければだめとか。あとファイルをオープンしていないのにクローズしているので実行可能ファイルでエラーがでるなどがあります。これらをすべて修復したmdcomp.c(v1.01.02)をダウンロードできるようにしましたので下のリンクからダウンロードして各環境でコンパイルして実行可能ファイルを作成してください。
mdcomp_c_v10102.zip
◆mdcomp.c(v1.01.02)をlinuxコンソールで使用する場合の注意(20201129追加)
rd1line関数は、CR LFを読み込む前提で作成しているので修正が必要です。rd1lineの処理終盤で1行読み込んだあとLF(0x0a)をCR(0x0d)に強制変換すると他の関数で1行を正しく認識できます。
※mdcompはmsdos系の改行CRLFを前提に設計しています
◆rd1line関数を以下のように変更すると改行コードがLF(0x0a)のテキストに対応できます。
※この改造によりCRLFとLFの両対応になります

int rd1line()
{
    char *p;
    int f_rd;
    int c=0;

    p= rdwork;   /*work area addr*/
    *p = 0;   /*一番はじめを初期化する(誤動作防止)*/

    /*printf("p:%d\n",p);*/

    while(1)  /* LF(CRLF)でないときは読み込む*/
    {
        f_rd = fread(p,1,1,rd_hand);   /*1byte read*/
        if(f_rd == 0){ /*c=0;*/  *p = 0x0d;p++; break; }
        if(*p == 0x0a || *p == 0x1a){break; }  /* <20010117p> */
        p++;  /*格納場所を次へ*/
        c++;  /*counter up.*/
        if(c > (LINEMAX-1))
        {
            printf("work area over!\n");
            return (-1);  /*error*/
        }
    }
/*------------------------*/
/*linux系バグ封じ20201128 */
    if( *p == 0x0a )
    {
        if(c >= 1)
        {
            if( *(p-1) != 0x0d )
            {
                *p = 0x0d;
                c++;
                p++;
            }
        }
        else
        {
            *p = 0x0d;
            p++;
            c++;
        }
    }
/*-----------------------*/
    *p = 0;
/*====================
//
//読み込んだ行inc
*/
    if(rd_linecount < MAXLINECNT)  /* <20010115a> */
    {
        rd_linecount++;
    }
    else
    {
        printf( "**** line over(MAX:%ld line) ****\n"
                "**** compile stopped. ****\n",MAXLINECNT);
        return (-1); /* error */
    }

/*debug*/
/*  printf("rd : %s\n",rdwork);*/

    return (c); /*no error*/
}

■ymf825とymz294
それぞれ、別の音源なのですがRaspberry Pi 3 model B+でハードウェアの調整とRaspberry Pi OS Lite上で作動するプレイヤーを製作しました。一応演奏できるのですが、あくまでも演奏できるだけでハードウェアの機能をフルに使用しているわけではありませんが製作の参考にしていただければ良いかと。
ssgplayerの記事(ssgplayer(YMZ294) for Raspberry Pi3B+(C言語)1) wnc develop 記録 ブログ
fmplayerの記事(YMF825をRaspberry Pi 3B+で使用) wnc develop 記録 ブログ
※この頁は都合により停止・削除または内容を変更する場合があります(契約先優先のため)

開発に使用したソフトウェア

v0系 Borland C++Builder スタンダード キャンペーン版 , Borland C++Builder 3 Professional
v1系 Borland TurboC++2006 Explorer
v1系 16bitDOS版 Digital Mars C/C++ Compilers v8.57 + DOS 16 libraries v8.50
v1系 32bitコンソール版 Digital Mars C/C++ Compilers v8.57
最新のC++Builderはエンバカデロ・テクノロジーズが開発販売しています(2017年10月現在)
商品名および会社名は各社の登録商標および商標です。
◇従来mdcomp技術解説書をこの頁で公開していましたがv1.01では説明書と技術解説を収録していますのでここでの公開は終了しました。
mdcomp32 (Standard MIDI Fileコンパイラ)[ベクターのmdcomp32へリンク]
mdcomp32 ( 紹介 - 履歴 - fmcomp出力仕様 - 楽曲見本 )
一覧
先頭頁に戻る
[20230331]
©wnc develop