8bit BGM generator は、「作曲スキルがないけど、Pyxel の自作ゲームに BGM を入れたい」という方のための BGM 自動生成ツールです。
Pyxel をお持ちの方でなくても、ブラウザ版で体験いただくことができます。また、生成した曲を mp3 などの音声ファイルとして録音したり、MIDI ファイルとして出力した上で加工することで、Pyxel 以外のレトロゲーム開発や動画の BGM 等に使っていただくことも可能です(詳しくは後述)。
問題点を発見したり、要望がある方は、Twitter frenchbread (@frenchbread1222) まで DM 等でお知らせください。
8 小節、3 または 4 パートの曲を生成します。パート編成は以下から選べます。
- メロディ+リバーブ(ディレイ)+ベース
- メロディ+ベース+ドラム
- メロディ+サブメロディ+ベース
- メロディ+サブメロディ+ベース+ドラム
3 チャンネル編成で生成した曲を Pyxel で取り込んだ場合、残りの 1 チャンネルを効果音用に自由に使えます。(4 チャンネル編成にする場合も、効果音の再生時に一時的に曲を止めることによって BGM と効果音を両立できます。)
テンポ、コード進行、ベースとドラムのリズムなどは登録されているパターンから指定します。メロディは自動生成ですが、パラメータによりある程度調整することもできます。
よくわからないという方は、とりあえず「きほん」タブの「プリセット」を適当に選択してみてください。その後でテンポを変えたり、リズムを差し替えることで、好みの曲調に近づけることができると思います。
- ブラウザ上で動かす場合: https://retro-bgm-generator.web.app/ (スマートフォンでも動きますが、画面が小さく操作しづらいのと、作成した曲をエクスポートするのが困難なので、お試し用途以外は PC からアクセスください。)
- ローカル環境で動かす場合: このリポジトリをダウンロードして、
pyxel play 8bit-bgm-gen
を実行してください。また、MIDI ファイルの出力をしたい場合、事前にpip install mido
コマンドを実行して mido をインストールしてください。
※ブラウザ版では MIDI ファイルの出力ができません。MIDI ファイルを出力したい場合、Python および Pyxel をインストールした上でローカル環境で動かしていただく必要があります。
Pyxel のサウンド仕様に沿ったテキストデータが json ファイルとして出力されるので、これをゲーム本体のスクリプトで読み込んで再生する形になります。(リポジトリ内の play.py 参照。)
以下の 2 つの方法があります。
- 8bit BGM generator で MIDI ファイルを出力します。この MIDI ファイルを直接プログラムから再生したり、お使いの DAW などで オーディオ形式のファイル(mp3, wav etc)を生成することで、多様な環境でお使いいただけます。ただし、8bit BGM generator で設定した音色は MIDI ファイルには反映されませんので、お使いの環境にあわせて音源を設定したり、音域をオクターブ単位で調整したりすることを推奨します。
- たとえば Chrome の拡張機能「Chrome Audio Capture」 などを使うことで、ブラウザ上で鳴らしているシステムサウンドを mp3 ファイルなどに録音することができます。実際にゲームなどで使う場合は、無音部分のトリム編集などが必要になってきます。
※この動画は ver1.00 時点のものなので現在のバージョンと少し仕様が異なっています。ご了承ください。
generator.json をカスタマイズすることで、登録されているコード進行・リズム(ベース・ドラム)以外のパターンの曲を生成することもできます。
ローカルダウンロードの上、自己責任でご使用ください。(形式が正しくない場合、正常動作しない可能性が高いです。)
"chords": [
{
"description": "Ⅰ - Ⅶ♭",
"progression": [
{ "loc": 0, "notes": "209019030909" },
{ "loc": 16, "notes": "901093090920" },
{ "loc": 32, "notes": "209019030909" },
{ "loc": 48, "notes": "901093090920" },
{ "loc": 64, "repeat": 0 },
{ "loc": 80, "repeat": 1 },
:
- "description" は画面上に表示する説明です。曲には影響しません。
- "progression.loc" は曲のロケーションを指します。16 ごとに 1 小節ですので、1 小節ごとにコードを変える場合は、上の例のように 0, 16... と指定します。
- "progression.notes" はコードやメロディの構成音を示します。12 個の数字は、C, C#, D .. に対応します。
- "0" は使わない音です。
- "1" は「コードを構成するベース以外の必須音」です。"1"の音はコード内で必ず使います。
- "2" はベース音です。メロディでも使いますが、必須にはなりません。
- "3" は「コードを構成するが省略可能な音」です。この音はメロディに登場しない場合もあります。
- "9" はコード構成音以外で、メロディに使える音です。
- たとえば C メジャースケジュールのコード C の場合、C が"2"、E が"1"、G が"3"、DFAB が"9"となり、"notes"として指定する文字列は"209019030909"です。
- 上の例において、G を"1"と指定することも可能ですが、特にコードの長さが少ない場合、"1" の数が多いと曲の生成に時間がかかったり、フリーズする場合があります。"1" の数は 2 つまで、1/2 小節ごとにコードを切り替える場合は 1 つのみとすることを推奨します。
- "progression.repeat" は、progression 要素の n 番目(1 つ目は n=0)と同じコード・メロディを繰り返す指定です。"repeat"を指定する場合、"notes"は指定しないでください。
"base": [
:
{
"basic": "0.2.4.2.0.2.4.2.",
"final": "0.2.4.2.2.4.2.4."
},
:
- "final"は 8 小節目、"basic"はそれ以外の小節に適用するパターンで、フォーマットは同じです。
- 1 つの文字が 16 分音符に相当しますので、文字列の長さは必ず 16 文字にしてください。
- "0"は休符です。
- "1"は 5 度の音、"2"はルート音、"3"は"1"より 1 オクターブ高い 5 度の音、"4"は"2"より 1 オクターブ高いルート音を示します。
- "."で前の音を伸ばします。たとえば "4.4." や "2.2." であれば、8 分音符 x 2 を示します。"00"と"0."は同じ結果になります。
"drums": [
:
{
"basic": "1033203310332033",
"final": "1033203310332220"
}
],
- "final"は 4, 8 小節目、"basic"はそれ以外の小節に適用するパターンで、フォーマットは同じです。
- 1 つの文字が 16 分音符に相当しますので、文字列の長さは必ず 16 文字にしてください。
- "0"は休符です。
- "1"はバスドラム、"2"はスネアドラム、"3"はハイハット、"5"はロータム、"6"はミドルタム、"7"はハイタムです。(patterns.json の"key"に対応しますので、音色を追加・変更することも可能です。)
2023/10/14 Ver1.21 mido インストール時にエラーとなる問題を修正
2023/10/10 Ver1.20 MIDI 出力機能をサポート
2023/09/23 Ver1.10 メロディ生成アルゴリズム改善、サブメロディ生成に対応
2023/09/09 Ver1.02 ブラウザ版のエクスポートに対応
2023/06/01 Ver1.01 Windows でローカル実行時にファイル保存できないバグを修正
2023/05/08 Ver1.00 初版リリース