Closed argentum384 closed 3 years ago
FlMML on HTML5 を利用するツールの中にはシーケンサの出力を wav, mp3 などのオーディオファイルに出力できるよう改変しているものが見受けられる。 ただ、かなり大がかりな改変を各々のツール作成者に強いることになってしまっているので、本分であるMML再生機能への影響が小さく、またソースコードサイズが大きくなりすぎない範囲で類似のオーディオファイル出力機能を追加する。
wav ファイル、mp3 ファイルの出力を可能とする。 出力後ファイルを加工することを考慮し、直接ブラウザにダウンロードさせず、ファイルのバイナリデータを取得するようにする。
flmml.export***(mml, ...)
Promise<ArrayBuffer[]>
ArrayBuffer[]
new Blob(...)
flmml.getNowMSec()
flmml.pause()
flmml.stop()
Promise
flmml.play(mml)
flmml.exportWav(mml)
flmml.exportMp3(mml, bitrate)
bitrate
new FlMML(...)
importScripts(...)
オーディオ出力処理中に停止した場合に reject して例外を投げてしまうのはやり過ぎだし、途中まで処理した分を出力するのはそう難しくないので、処理中に停止した場合は途中までの分を出力して処理完了とする。
概要
FlMML on HTML5 を利用するツールの中にはシーケンサの出力を wav, mp3 などのオーディオファイルに出力できるよう改変しているものが見受けられる。
ただ、かなり大がかりな改変を各々のツール作成者に強いることになってしまっているので、本分であるMML再生機能への影響が小さく、またソースコードサイズが大きくなりすぎない範囲で類似のオーディオファイル出力機能を追加する。
仕様
wav ファイル、mp3 ファイルの出力を可能とする。
出力後ファイルを加工することを考慮し、直接ブラウザにダウンロードさせず、ファイルのバイナリデータを取得するようにする。
flmml.export***(mml, ...)
の形式のメソッドを実行して出力開始Promise<ArrayBuffer[]>
とし、出力が完了したら resolve されArrayBuffer[]
として出力ファイルのバイナリデータを取得できるArrayBuffer[]
はそのままnew Blob(...)
の第一引数に指定できるflmml.getNowMSec()
等で取得可flmml.pause()
) は無効とするflmml.stop()
を実行すると出力処理を中断し、戻り値の中断時点までの分だけ出力して処理完了するPromise
は reject されるflmml.play(mml)
を実行した場合、 出力中の処理が中断,reject される中断時点までの分だけ出力して処理完了する。その後通常再生が始まるflmml.export***(mml, ...)
を再度実行した場合、後から実行した方は reject されるflmml.exportWav(mml)
で出力flmml.exportMp3(mml, bitrate)
で出力bitrate
は指定可。省略時は 192 (kbps) とするnew FlMML(...)
のオプションで lamejs のスクリプトのURLを指定させ、importScripts(...)
で読み込むようにする