88Pro 音色表作成の試み

88Pro 音色表作成の試み

(注: GW中は実家に帰省するため、作業が滞ります)

これまでの軌跡

    • 5月16日
    • CC0=126,127(CM64,MT32音色)をすっかり忘れていたことに気づいてしまった。
      • これらを機械的に別個の表にするのは簡単だが、通常この手の表は、
        • 何か適当な音色(たとえばstrings系)を探したい
        • →「なんちゃらstrings」という音色を辞書引きする
        • →そこに載っている音色を一つ一つ片っ端から 試聴しつつ適当な音色を選ぶ
    • というステップで用いられるため、実用の点でいけば GSのStrings系の音色表の横にCM64,MT32のStrings系の音色表も ついているというのが便利。しかし、 こればっかりは手作業でちまちま作っていく以外方法がない。 というわけで、先送り。
    • 5月3日
    • 実家の98ノートでちまちま作業継続。Perlも入れたしPathも通した。 さすがに今度は10分で完了した(^_^;
      • ちょいちょいと以下の変更を追加した;
        • 表の頭に一覧表を追加し、そこから詳細部へリンクを張るようにした
        • PCの項にキャピタル名を追加
      • そのほか、別バージョンで次のようなものも作ってみた;
        • PCの列を左端ではなく、その都度横一列にとる
        • PCの列は背景色を変える
        • 88,55のCC0欄は削除
    • どちらが見やすいかは一概にはいえないように思う。 使ってみて不満がなければ、音色表はこの辺で一段落つけたい。
    • 4月30日
    • 後は体裁を整えるのみなので、1時間半ほどデザインに凝ってみた。 とりあえずマニュアルに準じて、
        • 55,88,Proで同じCC0の音色は横に並べる。Pro音色が一番最初に 来た方が見やすくて便利そう
        • キャピタルの音色は色を変える(最終的にはリンクを張る)
        • 8音色毎に表を分ける
        • とりあえずCC0=126,127は削る
    • てな感じで作ってみた。 [Perlスクリプト](結構いい加減)、 音色表、 zip(約10k)
      • おお、そろそろ印刷すれば使い物になるレベルかも知れない。 後は
        • 適切なリンクを張る
        • 88map, 55mapのCC0表示は余計なので削る
        • Pro, 88, 55のそれぞれで背景色を変える
        • 若干の情報追加
    • くらいか。
      • ちなみに、以下の項目はダンプできないため必ず手入力となる。
        • 使用ボイス数
        • 88/55と同じ音色かどうかの情報
        • 打楽器系か、音階楽器系かの区別
      • 今日の収穫:
    • 4月29日
    • 昨日の変換操作だと、 MS-DOSにありがちな0A→0D 0A変換が生じて使い物にならないことが判明。 出力をバイナリモードにする方法を探し続けて1時間・・・ なんだ、専用命令があったのね。
      • binmode STDOUT; while (<>) { foreach (split(/\s/)) { print pack("c",hex); } }
      • で、今度こそ正しくバイナリになったところでフォーマットをチェック。
      • エクスクルーシブ宣言があった後に1音色あたり16バイトで
      • typedef struct { char CC0; char MAP; char PC; char padding; /* always 0 */ char name[12]; } TONEDATA;
    • てな構造が数回続き、最後にチェックサムとF7で締めると言った感じ。
      • F0 41 10 42 12 0C 00 01 00 01 00 00 50 69 61 6E 6F 20 31 20 20 20 20 20 00 01 01 00 50 69 61 6E 6F 20 32 20 20 20 20 20 00 01 02 00 50 69 61 6E 6F 20 33 20 20 20 20 20 00 01 03 00 48 6F 6E 6B 79 2D 74 6F 6E 6B 20 20 00 01 04 00 45 2E 50 69 61 6E 6F 20 31 20 20 20 00 01 05 00 45 2E 50 69 61 6E 6F 20 32 20 20 20 00 01 06 00 48 61 72 70 73 69 63 68 6F 72 64 20 00 01 07 00 43 6C 61 76 2E 20 20 20 20 20 20 20 00 F7
    • こんなデータがひたすら続く。
      • 後々のことも考えて、 先の16バイトフォーマット部だけ切り出して保存しておくことにした。
      • binmode STDIN; binmode STDOUT; undef $/; # 入力の区切り文字をなくす $buf = <>; # 全部一気読み $pmax = length($buf); $p = 0; while ($p < $pmax) { $p += 8; # F0...な部分をスキップ do { print substr($buf,$p,16); # 音色部分を切り出して出力 $p += 16; } until (ord(substr($buf, $p + 1, 1)) == 0xF7); # まだ音色部が続く? $p += 2; # チェックサムとF7のスキップ }
      • これで、perl striptone.pl < 8ptone.bin > 8ptone2.bin とでもすれば、音色部分だけのバイナリが切り出せる。
      • ここまで来れば、簡単な表を作るのは難しくない。 早速、安直君全開モードで、ベタデータの表を作ってみた。
      • binmode STDIN; format STDOUT_TOP = Roland SC-88 Pro tone names list CC0 MAP PC name ----------------------------- . format STDOUT = @>> @>>>> @>> @>>>>>>>>>>> $cc0, $map, $pc, $name . @model = ("","55","88","88Pro"); undef $/; $buf = <>; $pmax = length($buf); $p = 0; for ($p = 0; $p < $pmax; $p += 16) { ($cc0,$map,$pc,$name) = unpack("CCCxa12",substr($buf,$p,16)); $cc0++; $pc++; $map = $model[$map]; write; }
      • で、安直なベタデータができあがった。 元のフォーマットをそのまま縦にずらずらと並べただけなので、 実使用に耐えないのは明らかだが、まあ最初はこんなもんでしょう。
      • しかしさすがにこれではねぇ・・・といったわけで、 ちゃんとPC順でソートして、項目の順序もまっとうにしたものも作ってみた。 ついでに、CC0はインクリメントしなくてよかっただとか、 改頁コードはいらないとか、そもそもページ設定はいらないとか、 そういうのも修正した。
      • binmode STDIN; format STDOUT_TOP = Roland SC-88 Pro tone names list PC CC0 MAP name ----------------------------- . format STDOUT = @>> @>> @>> @>>>>>>>>>>> $pc, $cc0, $map, $name . $^L = ""; # 表の改頁コードなし $= = 99999; # ページ行数設定(要はページ設定させない) @model = ("","55","88","Pro"); undef $/; $buf = <> $pmax = length($buf); for ($p = 0; $p < $pmax; $p += 16) { ($cc0_,$map_,$pc_,$name_) = unpack("CCCxa12",substr($buf,$p,16)); $k_ = substr("00".$pc_, length($pc_) - 1, 3) . substr("00".$cc0_, length($cc0_) - 1, 3) . substr("00".$map_, length($map_) - 1, 3); $pc{$k_} = $pc_; $cc0{$k_} = $cc0_; $map{$k_} = $map_; $name{$k_} = $name_; push(@ky, $k_); } @ky = sort {$a <=> $b} @ky; foreach (@ky) { $cc0 = $cc0{$_}; $pc = $pc{$_} + 1; $map = $model[$map{$_}]; $name = $name{$_}; write; }
      • これだと、多少マシなベタデータができる。 まだ実使用には使えないが、さっきのよりは数段マシ。
      • 試しにこのレベルの表のHTML版も作ってみた。 [Perlスクリプト] [できた表] [表のzip]
      • 案の定、表示重すぎ。縦に長すぎ。次回からは出力を PC=40までくらいに抑えよう。
      • 今日の収穫:
        • バイナリのバルクダンプデータ(音色部分切出済) (8ptone2.bin, 約32k)
        • ベタな表(chart1.txt,約50k,言うまでもないが使用に耐えない)
        • ベタな表その2(chart2.txt,約46k, これもちょっと使用に耐えない)
        • ベタな表その2のHTML版 (とのそzip, 約14k, 同上)
    • 4月28日
    • みなさんよくご存じのように Z-MUSIC(V2)のバルクダンプデータはテキストで扱われるため、 プログラムで加工しようとするとテキストのパーサを作らなくてはならなくて結構面倒。 一般的にこの手のデータはまずバイナリで存在すべきものなので、 テキスト→バイナリ化の検討を開始。
      • V3なら最初からバイナリで落としてくれるんじゃないの? という話もあるが、V3だとバイナリを通り越してSMFにまでしてくれるので、 色々ヘッダやらデルタタイムやら挿入されて面倒なパーサ作成が必要になるため、 最初から却下としていた。
      • こーいうヘラヘラ処理にはPerlだわねということで、各種雑誌の おまけCD-ROMを 家捜しすること1時間、なんとかPerlが入ったCDを見つけだしてインストール。 しかしその後DOS窓のPATHが通らないことでかなり苦戦し、結局準備だけで 3時間以上使ってしまった。
      • 一方で、Perlのコードそのものはエラく簡単なもので、 準備に3時間、コーディング&動作に5分という大変お間抜けな結果となった。
      • while (<>) { foreach (split(/\s/)) { print pack("c",hex); } }
      • かくして、perl tobin.pl < 8ptone.mdd > 8ptone_.bin でもって、バイナリデータの完成。あほらしくなったのでその日は そこで寝てしまった。
      • 今日の収穫:バイナリのバルクダンプデータ・・・ だが翌日作り直すことになるため登録抹消
    • 4月27日
    • ふとしたことがきっかけで、何となく作業開始。 とりあえずX68kからZ-MUSICで音色ダンプのリクエスト用のzmsファイルを作成した。
      • (AMIDI1,1)(M1,1000)
      • (t1)
      • @x$41,$10,$42,$11,$0c,$00,$01,$00,$00,$00,$73 /RQ1なのでxの代わりに@xを使用
      • (p)
      • 次に、
        • zmusic -w512 (ワークテーブルを多めに確保した状態でZ-MUSIC(V2)を常駐)
        • zp -a (録音待機)
        • zp tonedump.zms (先のzmsを演奏させる。 バルクダンプデータがX68kのメモリに取り込まれる)
        • zp -atone.mdd (データをファイルに落とす)
    • てなプランを計画。かんぺき~。
      • だったはずが、何度やってもうまく取り込めない。取り込み中に 必ずビープ音が鳴ってエラー終了してしまう。
      • どうも演奏と録音を同時にできないっぽい雰囲気だったので、 該当mmlをAT機で演奏させ、出力だけX68kでいただくことにしてみる。 問題なく成功。かくして AT機→88Pro→X68k なる壮大なバルクダンプ回収 大作戦は第一幕終了。調子に乗って、ドラムキットの名前リストや、 EFXのリストなども出力させておいた。ドラムキットの音の名前になると いちいちバンクとプログラムを指定してやる必要があるようなので とりあえず断念。(20回近く先の操作を手動で続けるのは拷問に近い)
      • 今日の収穫:テキストのバルクダンプデータ (8ptone.mdd(約100k)をzipにしたもの)
  • 某月某日
    • かねてより「88Proの音色表、HTMLの表で欲しーなー」と思っていた。 「バルクダンプで音色吸い出して、適当にフィルタリングするだけやん」 とも思っていた。

E-mail: