ごちゃログぴこっ

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

メガドライブの音を有名FM音源(FM8)で出したい!結果は?

DAWを使ったいまどきのDTMでもメガドライブの曲を奏でたい! できれば機能性が抜群の大手のメーカーの有名FM音源を使って! という理由で Native Instrument FM8 (と DEXED)への音色移植を試みました。

結果、音源の系統が違うせいかメガドライブそのままの音は出ませんが、OPN2 の TFI ファイルを OPM 経由で SYX ファイルに変換することで、DX7 系の音源で互換機のように「雰囲気の似た音」は鳴らせました。

TFI ファイルを DX7 の SYX ファイルに変換する

メガドライブFM音源パラメーターは TFI ファイルに保存することができます。これについては関連記事で詳しく書きました。

今回のターゲット FM8 は YAMAHA DX7 という名機をモデルにしているそうです。Wikipedia - FM音源 によると、DX7OPS 系すなわち「メガドライブの OPN2 の直系ではない親戚であり後発」くらいの立ち位置の音源らしく、機能面では結構互換がありそうな印象を受けます。

FM8 のモデルである DX7 のバンクファイルが SYX ファイルです。

まずは OPM ファイルに変換する

変換にあたり、まずは TFI ファイルを vopmxtfi で OPM ファイルに変換します。

最終的に、TFI ファイル名の先頭10文字が SYX ファイルにボイス名として記録されるので、あらかじめわかりやすいファイル名をつけておきましょう。

vopmxtfi output.opm input1.tfi input2.tfi ...

OPM は OPN の後継にあたるようです。mxdrv @ ウィキ - FM音源パラメータ のページに短く書かれた OPN 用音色データを OPM で流用する方法からも、両者の差はどうやら少ないことが伺えます。なお、OPM ファイルの内容はテキストファイルなので、変換後の内容は非常に簡単に検証できます。

OPM ファイルを SYX ファイルに変換する

紹介するツールの起動には Python 2.x または 3.x が必要なので、事前にインストールします。

SYX ファイルへの変換には DXconvert を使用します。CUIGUI の両方が利用可能ですが、ここでは dxconvert-gui.py をダブルクリックして起動します。

f:id:GOCHA:20170107184500p:plain

Input file と Output file を選択して DXconvert! ボタンを押すと、SYX ファイルが出力されます。SYX ファイルは1バンクに32プリセットを持つらしく、128プリセットのOPMファイルを読み込むと4つのファイルに分割されて出力されます。

FM8 に DX7 の SYX ファイルをインポートして鳴らす

メニューから Import Sysex を選択して SYX ファイルをインポートすれば、なんとなく雰囲気が近い音が鳴ります!

f:id:GOCHA:20170107184935p:plain

パッチ名やタグを修正する Tips は後日加筆します。

関連記事

gocha.hatenablog.com

gocha.hatenablog.com

メガドライブの音が鳴る FMDrive + SPSG VST が最高!(無料音源紹介も一応あるよ)

DAWを使ったいまどきのDTMメガドライブの曲を奏でたい!

そんなあなたには、多少のお金が必要ですが、Aly James Lab の FMDriveSPSG が大変おすすめです。FM音源(YM2612)とDCSG音源(SN76489)を高品質で再現できます。「あの古代祐三さんも使ってる! 実際スゴイ!」とのことです。

FMDrive + SPSG VST再現度の高いメガドライブ音源

www.youtube.com

独特のGUIに慣れるのに小一時間かかかりますが、機能性も高く扱いやすいです。SPSG のほうは試していないのですが、同様に信頼できそうです。

FMDrive と SPSG の入手にはそれぞれ 10 EUR 以上の寄付が必要ですが、変にフリーの選択肢で苦労するよりもおすすめです。

執筆時点で FMDrive + SPSG は 64bit 非対応のため、32bit VST を読み込めない環境ではブリッジが必要です。わたしは jBridge (14.99 EUR) で 64bit VST を生成して使用しています(Separated GUI Mode で安定動作しています)。VEP でも使えます。

参考:jBridgeを使えば64bit環境で動作しない32bit Pluginが使えるようになる | jMatsuzaki

無料でメガドライブ音源を再現するには?

でもやっぱり無料が良い……という方に、他のフリー音源を参考までに挙げておきます。

再現度は悪くありませんが、UIや音源としての機能性がやや劣ります。

FMDrive ワンポイントアドバイ

サンプルレート高音質化

Sample Rate を HQ Crystal にするとクリアな音になります。お好みでどうぞ。

f:id:GOCHA:20170107193742p:plain

Mono/Poly 設定

実機の各チャンネルはモノ(同時発音数1)なので、次のノートを発音すると、前のノートのリリースはカットされます。音源の設定もモノにしておくと良いです。

実際のゲーム音楽では、1つのチャンネルで頻繁に音色の切り替えが行われますので、「スネアの音色がキックの発音でミュートされる」なども考慮に入れましょう。

「スネアのリリースの音が止まらない」という現象に悩んだことがありましたが、原因は他のプリセットによるミュートを考慮しなかったためでした。実際に1つのインスタンスでプログラムチェンジを使って音色を切り替えたり、無音に至るまでリリースに移行しないようにノートの長さを最大限伸ばすなどの工夫をすることで解決しました。

関連記事

下記の記事では、メガドライブの音色を FMDrive でインポート可能な TFI ファイルに出力する方法を紹介しています。

gocha.hatenablog.com

下記の記事は、再現度は劣るものの大手FM音源に音色を移植しようと試みました。

gocha.hatenablog.com

メガドライブの音源の音色設定(レジスタ値)を確認・ダンプする

メガドライブの音源の音色設定(レジスタ値)を確認・ダンプするのに役立つ技術方法をいくつか紹介します。

FM音源部である YM2612 (OPN2) を対象にしていますが、DCSG音源部である SN76489 の情報取得にも応用できる内容が含まれています。

  • Kega Fusion で VGM ログを採取する
  • vgm2pre で VGM ファイルからプリセットを抽出する
  • 音楽プレイヤーで VGM ファイルを再生する(チャンネルミュート可能)
  • VGM Player で VGM ファイルをメガドライブのROMに逆変換する
  • Exodus でリアルタイムにレジスタ値を確認する

Kega Fusion で VGM ログを採取する

Kega Fusion を使うと、プレイ中の音声を VGM ファイルに記録することができます(メニュー Sound → Log VGM File)。

f:id:GOCHA:20170107072104p:plain

VGM フォーマット) はゲーム機の音声を記録するためのフォーマットで、その内容は音源チップへのデータ書き込み内容を逐次ログとして記録したものとなっています。

VGM フォーマットには MP3 のようにタグデータを書き込むこともできます。VGM ファイル作成に関するガイドラインProject2612 ripping tutorial - vgmrips が詳しいですが、今回必要なのはただダンプすることだけです。

vgm2pre で VGM ファイルからプリセットを抽出する

vgm2pre は VGM ファイルから音色のプリセットを抽出するツールです。

f:id:GOCHA:20170107123148p:plain

Preferences(メニュー Tools → Preferences)で出力ファイルフォーマットを選択できます。

f:id:GOCHA:20170107123159p:plain

私は FMDrive やその他のツールで使用するために「TFI」のみを出力することが多いです。ご使用のツールなどに応じて選択してください。

「Dump」ボタンを押すと無事にファイルが出力されます。ファイルに対応した音源(VST)を持っていれば DAW 上で音を鳴らすことができます。

また、TFI ファイルのフォーマットは極めて単純なので、バイナリエディタで閲覧することで各レジスタの値を確認することができます。

音楽プレイヤー(foobar2000)で VGM ファイルを再生する(チャンネルミュート可能)

本題には直結しませんが、VGM ファイルは音楽ファイルなので当然再生が可能です。

私は foobar2000foo_input_vgm をインストールしています。Preferences から Chips Options を開くと、特定のチャンネルをミュートすることもできます。

f:id:GOCHA:20170107124952p:plain

VGM Player で VGM ファイルをメガドライブのROMに逆変換する

VGMPlayer は VGM ファイルをメガドライブの ROM ファイルに変換するツールです。

f:id:GOCHA:20170107130230p:plain

起動画面で「Rom Builder」ボタンを押すと、メインウィンドウが表示されます。

f:id:GOCHA:20170107130316p:plain

「Add Tracks」ボタンでファイルを追加して、「Build Rom」ボタンを押すと、vgmPlay.bin に ROM ファイルが出力されます。

Exodus でリアルタイムにレジスタ値を確認する

鳴っている音楽のレジスタの値が今まさにどうなっているか知りたい。そんなときはデバッグ機能が充実していたエミュレーター Exodus を使うのが便利です。

ROM を起動して、メニュー Debug → Mega Drive → YM2612 からデバッガを開くと、レジスタの値をリアルタイムで確認することができます。

f:id:GOCHA:20170107130612p:plain

関連記事

gocha.hatenablog.com

gocha.hatenablog.com

ピコカキコ向けに高音質なDPCMを用意する手順(私的メモ)

いろいろ試した結果、個人的にはだいたいこうなりました。

リサンプリング等の手順を何度か行うと思いますが、その際の値はピッチ補正値を決めるのに必要になると思うので、メモをしておきましょう。

  1. 変換元サンプルのループポイント以前のサンプルを削除する(先頭サンプルからしかループできないため)
  2. サンプルレートをバイナリエディタで書き換え、変換後の音程(o4程度の低めの音)に設定する
  3. 33143 Hz にリサンプリングする(foobar2000 の Resampler は品質もそこそこで何より手軽に使える)
  4. サンプル数が 32648 サンプルを大幅に超える場合、NiceLoop 等で短いサンプルになるようにトリミングする(アップサンプリング)
  5. DPCMのサンプル長になるよう再度リサンプリングする(※リサンプリングを繰り返してもDPCMの品質に大きく影響する劣化はおそらくない)
  6. 調整の末、とにかくDPCMで扱えるサンプル数にすることと、サンプリングレートを 33143 Hz にすること(MakeDPCM でリサンプリングさせないため)
  7. MakeDPCM で読み込んで変換する。音量(ダイナミックレンジ)が大きいと思うように変換されないので、音量50%あたりに設定する
    • DPCMの仕様上、波形の急激な変化を記録できないので、周波数の高い波形やダイナミックレンジが大きい波形は不利である
    • 音量を下げるほど良いわけでもない。DPCMの仕様上、波形は常に上下を繰り返してノイズを発しているので、信号レベルが下がることはS/N比が下がることにつながる(と思う)
  8. DMC ファイルを base64 に変換して WAV9 定義にする(わたしは 010 Editor という高機能バイナリエディタ(有料)を使用していますが、無料の方法はいくらでもあります)
  9. おしまい(鳴らすついでに音階の限界も調べておくと良いです)

なお、逆に行わないことにしたのは以下です。

  • 変換前のサンプルを予めローパスフィルターで処理することも特に行わない。高域のサンプルはディザリングの代わりにいいように使われてくれると思う(たぶん)
  • 単純波形のようなサンプルであれば、ディザリングが有効かもしれない?(ただ、そのようなサンプルを WAV9 で鳴らすのはそもそもおすすめできない)

そのほか

  • Lコマンドによる補正値を各波形で一律に揃えたい人は、33143 Hz でチューニング済みの音が鳴るようにリサンプリングする。サンプル数の融通が効かないのでループ作成が大変ですが、クロスフェード等でうまく対処しましょう(という感じだと思うのだけど、わたしにはその方針でやる気力はないので、一律にしている人は尊敬します)
    • もっとも、本当にファミコンで使うようなDPCMはそうするほかありません。

関連

Bizhawk - Multitrack recording とは

ホットキー設定の一覧を眺めていると「Multitrack」で始まる項目がいくつかあることに気づきます。これは複数のプレイヤーの入力を個々に入力するための機能です(1フレームずつではなく、もっとまとまった単位で)。ただ、どこにも使い方の説明がなかったので、IRCで聞いてみました。

簡単な例**

  1. 2プレイヤーで NES のムービー記録を開始する。(スロット0とかに)ステートセーブして toggle multiple track キーを押したら、increment/decrement を使ってプレイヤー1に設定して、適当に操作する。
  2. プレイヤー2にインクリメントしてステートをロードする。プレイヤー1のボタンを使うと今度はプレイヤー2が操作されて、プレイヤー1はさっき記録した入力が繰り返される。
  3. increment/decrement はあんまり賢くなくて、5プレイヤーまでハードコードされてるよ。利用可能でないプレイヤーを記録しようとしないでね。

らしいです。

Lua for Windows の LUA_PATH 設定(EmuLua からモジュールを使う)

Lua for Windows には多数のライブラリが含まれていますが、それらをTAS用エミュレータ組み込みの Lua から使おうとしてもロードに失敗します。これはパス設定が適切ではないためです。ロードが成功するようにパス設定を見直しましょう。

このようなタイトルですが、他の環境でライブラリがうまく検索されない場合も同じ解決策を取ることになるでしょう。

環境変数の設定

以下、Lua for Windows v5.1.4-46 についての設定です。

gd.dll などのバイナリモジュールは package.cpath から検索されます。環境変数 LUA_CPATH を設定することで任意のパスを追加できますが、Lua for Windows のインストールでは設定されないようです。よって自前で設定することになります。

LUA_CPATH=;;C:\Program Files (x86)\Lua\5.1\clibs\?.dll

冒頭の ";;" はデフォルトパスを展開するための記述なので、消してはいけません。

Lua モジュールは同様に package.path から検索され、環境変数 LUA_PATH で設定します。一見するとインストール時に設定されるように見えるのですが、拡張子が ?.clua となっているため、*.lua を読み込もうとすると失敗します。よって、こちらも値を変更しなければなりません。

# ?.lua と ?.luac を両方含むように設定する
LUA_PATH=;;C:\Program Files (x86)\Lua\5.1\lua\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?.luac

これで無事にモジュールが使えるようになります。個々のエミュレータディレクトリを汚す必要がなくなるのですっきりしますよ。

MIDI(SMF)→MML変換ツール「PetiteMM」の紹介・アルゴリズム

このたび、ごちゃと loveemu さんで PetiteMM という変換ツールを発表しました。開発着手時に「既に優れたツールがあれば開発する必要はないのでは?」と思い各種MIDI2MMLプログラムを比較してみたものの、納得のいくものが見つかりませんでした。

PetiteMM と類似プログラムの性能は比較記事で紹介していますが、PetiteMM は譜面の簡素化と演奏精度の保持を両方がんばっちゃおうという欲張りコンバータです。

インストール・使用方法

PetiteMM からアーカイブファイルをダウンロードして適当なフォルダに展開します。

PetiteMM.bat に MIDI ファイルをドラッグアンドドロップすることで変換が可能です。「'java' は内部コマンドまたは外部コマンド~として認識されていません」と表示される場合、Java のインストールとパス設定が行われていない状態なので、無料Javaソフトウェアをダウンロードしてください。

コマンドオプション

より高度な変換を行う場合、オプション指定を伴うと効果的です。オプションの一覧はバッチファイルをダブルクリックして起動すると表示されます。

PetiteMM.bat の動作時にオプションを有効にしたい場合、PetiteMM.bat をテキストエディタで開き、最初の方にある PMMOPTS 変数にオプションを記述します。

@set PMMOPTS="--dots 2 --no-quantize"

現時点で利用可能なオプションは下記の通りです。

オプション 引数 説明
-o <filename> 出力ファイル名の指定(バッチファイルからは使用しない)
--dots <count> 付点の最大数制限、-1で制限なし(デフォルトは-1)
--timebase <TPQN> MMLの分解能、0でMIDIファイルに合わせる(デフォルトは48)
--input-timebase <TPQN> MIDIファイルの正しい分解能、0なら入力どおり(デフォルトは0、nsf2midiなど特殊用途向け)
--quantize-precision <length> クオンタイズ時の最小ノート長(2のn乗で指定)*1
--no-quantize クオンタイズによるノート長の調整を行わない。タイミングが正確になる代わりに複雑な音符が多くなる。
--octave-reverse オクターブ記号を大小反転する
--use-triplet 三連符らしき箇所を三連符記法に置換する(賢くなく、実用性に乏しい)*2

使い方は以上です。以降は PetiteMM の技術的アプローチに関する説明です。知らなくても特に問題ありませんが、中身を知っているとお望みの変換がしやすくなるかもしれません。

開発動機

既存のツールの出力に満足できなかったので開発しました。

わたしが時々使用していたのは tinymm という簡素なツールだったのですが、連符や細かいタイミングに対応していないため精度は低く、ソースコード非公開のため修正もできませんでした。別のツールを探していくつも試してみたのですが、同じような問題を抱えていたり、複雑なMMLが出力されたりして、満足感が得られませんでした。

  • タイミングのずれを最大限起こさないよう変換する
  • 演奏精度への影響を最小にしつつ、ノートを簡素化して出力する
  • MMLの内部仕様や方言に極力依存せず、幅広く利用できる
  • ソースコードが公開されており、誰でも改変できる

これらを満たしたツールを新たに創造しようとして作られたのが PetiteMM です。

PetiteMM の変換フロー

処理の詳細は後述しますが、以下が変換の主な流れです。

*1:あくまでクオンタイズ時の基準を示すもので、--quantize-precision で16分音符を指定しても、発音タイミングが細ければさらに短い休符等が出現することはある。細かい音符を完全に排除したい場合は --timebase で調整を行う。

*2:--use-triplet を使わない場合でも c12 などの三連符相当の音符は出現する。これを防ぎたい場合は --timebase で3の倍数を指定しなければ良い。

続きを読む