音楽スキル は何をしますか?
スクリプトはこのファイルと同じディレクトリの scripts/ にあります。以下では $S と表記しますが、各コマンド内では絶対パスを直接記述してください。シェル変数はBash呼び出し間で引き継がれません。
あなたは音を聞けないので、すべてのステップで音楽を読み取れるものに変換します:パターンをテキストとして、確認する数値、そして見るための1枚の画像。 トラック制作は種(シード)→ スコアを読む → レンダリング → lookで確認 → 修正、という流れです。オーディオの理解は look → タイムラインとシートを読む → 判断、です。納品は check で、「適切なラウドネスでクリッピングしていない」ことを確認します。
uv と ffmpeg が必要です。すべてのコマンドは uv run --no-project --with numpy --with scipy --with pillow python -I <スクリプト> … として実行します。以下ではこれを RUN と表記します。
トラック制作: banger.py
RUN $S/banger.py --seed 4242 --out <scratch>/b4242
72小節のハウスまたはテクノトラックは約10秒で生成されます:track.wav(48kHz ステレオ、-14 LUFS)、track.mid、score.txt、score.json。同じシードとオプションからは常に同じファイルが生成されます。
| 設定項目 | オプション |
|---|---|
| スタイル | --style deep-house(120-124 BPM)、tech-house(124-128)、peak-techno(130-136)、melodic-techno(122-126) |
| テンポ、キー | --bpm 124、--key A、--mode minor(または dorian、phrygian) |
| 長さ | --bars 24(8以上の偶数)、または --seconds 30:小節数を選び、最後の小節が2.5秒早く終わりリバーブが時間通りに鳴り終わるようテンポを調整 |
| ボーカル用BGM | --lufs -22 --mute lead(clapのミュートも試す) |
| DAW用パーツまたはミックスチェック用 | --stems で stems/<レイヤー>.wav を書き出し;track.mid は常に書き出し |
小節数で構造が決まります:8-10はループ、12-22はイントロ、ドロップ、アウトロ、24-46は2つのドロップの間にブレイクダウンとビルドアップを追加、48以上はグルーヴセクションと8小節パートを持つフルフォーム。
レンダリングする前にスコアを読んでください。 スコアはパターンをテキストで表示します:
seed 4242 Melodic techno 122 BPM G minor swing 1% chords: pluck
1...2...3...4...
kick X...X...X.X.X...
clap .o..X.......X...
hat x.X...X.x.X...X.
bass .....ORO.O.O3RRR
chords ...X............ i7 Gm7 | bVII7 F7 | bVI7 Ebmaj7 | iv7 Cm7
lead 47244.42.22..442 .3315.553.5.3557
perc fit 74% 1293 patterns tried weakest: Evenly spread 52%, Clear mix 20%
. は休符、o はソフト、x はミディアム、X はラウド。ベース:R はルート、5 は5度、O はオクターブ、3 は3度。リード:2小節にわたるスケール度数0-9。fit はそのパートがルールにどの程度適合しているか、weakest は満たせなかったルールを示します。
シードを選ぶには、まずテキストで試聴します:python3 $S/groove.py --seed N は探索のみを実行します(0.5秒、音声なし、依存関係なし)。いくつか試して、コードとリードを読み、自分が守れるものをレンダリングしてください。あなたは「いい音かどうか」を判断できません:その旨を伝え、ファイルを人に渡してください。
トラックの生成方法
この手法は Banger Lab に基づいています。モデルではなく探索であり、すべてのルールはリズムまたはピッチ知覚の研究に基づいています。
- ロール決定。 シードがスタイル、テンポ、キー、スケール、およびターゲット(1小節あたりのハット数、シンコペーションの量、異なるコードの数)を決定します。
- 初期生成。 各楽器はランダムな16ステップパターンで開始します。
- テスト。 1ステップずつの変更(追加、削除、スライド、強く、弱く)すべてを、その楽器のルールに基づいてスコアリングし、さらにランダムな2ステップジャンプもいくつか試します。最高スコアのものが採用されます。
- ロック。 変更によってスコアが上がらなくなったら、そのパートは完了し、次の楽器をその上に書き込みます。順序:キック、クラップ、ハット、オープンハット、パーカッション、ベース、コード、リード。各レイヤーは4回ランダムに開始し、最良のものを保持します。
- リスニング。
banger.pyが各楽器を単独でレンダリングし、そのエネルギーが6つの帯域のどこにあるかを計測します。次に、ハット、パーカッション、ベース、コード、リードを再調整し、複数のパートが同じステップで同じ帯域を占有しないようにします。 - アレンジ。 パートがセクションになり、4小節と8小節ごとにフィルイン、ブレイクダウンで開くローパスフィルター、ビルドアップでのスネアロールとライザー、1拍の無音、そしてドロップ、という構成になります。
グルーヴを生むもの:ルール
これらのルールは、手書きパターン、MIDI、または音楽モデルへのプロンプトなど、あらゆる方法で音楽を作成または編集する際に使用してください。score.json には、トラックの各ルールのスコアと出典が含まれています。
| パート | ルール | 出典 |
|---|---|---|
| キック | 各拍に配置;0-2個の追加音まで、拍の直前に配置;決して2つ連続しない | Butler 2006 |
| クラップ | 拍2と4でラウド、拍1と3ではオフ;追加音は小さく弱い16分音符に | Butler 2006; Witek 2014 |
| ハット | オフビートに、キックの間に配置;均等に分散;小節の前半と後半で同じパターン;ラウドとソフトが交互に | Butler 2006; Toussaint 2005 |
| オープンハット | 2つのキックの中間、キックやクラップと同じタイミングには決して配置しない | Butler 2006 |
| パーカッション | キックとクラップが鳴っていないところに均等に分散し、25-50%は小さなゴーストノート | Toussaint 2005; Witek 2014 |
| ベース | キックが鳴っていないところで演奏;ルート(またはそのオクターブ)を60-90%の確率で、5度または3度をアクセントとして使用 | Plomp & Levelt 1965; Krumhansl & Kessler 1982 |
| コード | 1小節目はホームコード;ルートは順次進行、3度または4度で移動;各声部は次のコードへ最短距離で移動 | Krumhansl & Kessler 1982; Tymoczko 2011 |
| リード | 強拍ではコードトーン;コードトーンの半音上は禁止;小さなステップ;小節1は疑問形(ホームノートで終わらない)、小節2は類似リズムで応答(ホームノートで終わる);コードヒットの隙間で演奏 | Plomp & Levelt 1965; Huron 2001; Caplin 1998 |
| 全体 | 中程度のシンコペーション:強い拍をスキップする弱いステップにいくつかの音符。少なすぎると硬く、多すぎるとビートが不明瞭になる | Witek et al. 2014 |
| タイミング | スイングとプッシュ/プルは楽器ごとに12ms未満に抑える(ハットは遅め、クラップは早め)。より大きなずれはグルーヴ評価を下げる | Davies et al. 2013 |
| ミックス | 同じステップで同じ帯域の2つのパートは互いをぼやけさせる;1ステップに4パート以上ヒットさせない | Plomp & Levelt 1965 |
| フォーム | ブレイクダウン、ビルドアップ、ドロップ:キックとベースを外し、テンションを上げ、それらを戻す | Solberg & Dibben 2019; Butler 2006 |
すべての音符は1つのスケールから生成され、キックはホームノートにチューニングされるため、どのシードでもキーは維持されます。ルール間の重みは簡略化されたものであり、聴取データに適合させたものではありません。そのため fit はトラック内でパターンをランク付けするものであり、トラック間の品質スコアではありません。
聴く: look
RUN $S/listen.py look TRACK --sheet <scratch>/sheet.png
ffmpegがデコードできるあらゆるもの(動画の音声や生成モデルからの音楽を含む)で動作します。テンポ、キー、ラウドネス、トゥルーピーク、バランス、ステレオ幅、警告、およびタイムラインを表示します:
track.wav 2:24.1 122.0 BPM (strength 7.9) G minor (score 1.62; next Eb major 1.61)
loudness -14.0 LUFS true peak -1.3 dBTP range 9.3 LU peak-to-loudness 12.7 dB
balance, dB under the loudest band sub -2 bass 0 low mid -8 mid -17 high -24 air -27
timeline, 15.7 s windows (8 bars): loudness, then each band in dB against its level over the whole track
start LUFS sub bass low mid mid high air
0:47.2 -12.6 +2 +2 +1 +2 +1 -2
1:03.0 -21.1 -29 -12 +1 -7 -7 -6
1:18.7 -20.5 -33 -12 +1 -1 +3 +6
1:34.4 -12.6 +2 +2 +1 +2 +1 -0
タイムラインから構造を読み取ります。サブとベースが20-30 dB低下しているのはブレイクダウン(キックとベースが抜けている)です。ハイとエアが上昇しサブが抜けたままなのはビルドアップ。すべてが同時に戻るのがドロップです。次にシート(波形、スペクトログラム、6つの帯域レーン、ラウドネスカーブ)を読みます:ライザーは斜めの線、キックは下部の明るい点の縦の列、隙間のない平らな色のブロックはダイナミクスのないミックスです。瞬間を説明するときはシートの軸から時間を引用してください。
信頼性(既知の正解を持つ24トラックで測定):
- テンポ:24/24で0.2 BPM以内。70-190 BPMを優先するため、他のマテリアルでは倍または半分のテンポが可能性あり。強度2未満は安定したビートがないことを意味する:BPMは推測であると伝える。
- キー:ホームノートは24/19で正解、短いまたはまばらなオーディオでは信頼性が低下。メジャー/マイナーの判断はより弱く、モードの区別は不可。上位2スコアが近い場合はその旨を表示し、両方を報告する。
- ラウドネスとトゥルーピーク:
ffmpeg -af ebur128=peak=trueと同じ数値を0.1の精度で。
ステム同士の比較: mix
RUN $S/listen.py mix <scratch>/b4242/stems
各ステム:ラウドネスとそのエネルギーの位置。次に、最も重複しているペア(同じ帯域、同じ瞬間)と、最大音量のステムと比較して非常に静かなステムを表示。ペアが60%を超える場合、2つのパートが1つの空間を争っていることになります:時間、ピッチ、またはレベルでいずれかを移動してください。
目標数値とチェック
| 目標 | 数値 |
|---|---|
| 単体のトラック(ストリーミングはこの付近でノーマライズ) | 統合**-14 LUFS** |
| Web動画またはポッドキャストの完成ミックス | -16 LUFS |
| ボーカル用BGM | 約-22 LUFS |
| トゥルーピーク、常に | -1 dBTP以下:ロスレスエンコードはオーバーシュートする |
| ピーク対ラウドネス比7 dB未満 | リミッターかけすぎ:フラットで疲れる |
| 120Hz以下のステレオ相関が0.6未満 | ベースがモノラルで消える可能性あり(電話、クラブ) |
RUN $S/listen.py check TRACK --lufs -14 --peak -1 --seconds 30 --bpm 124
ファイルを渡す前には check が成功しなければなりません。失敗した場合は終了コード1で終了します。クリッピングや開始時の無音も検出します。生成モデルからの音楽はこれが最も重要です:ある生成BGMは+3.2 dBTPで2,121のクリップサンプルがありました。ffmpegで修正し(loudnorm=I=-14:TP=-1.5:LRA=11)、再度チェックしてください。
納品
- 小さなコピー:
ffmpeg -i track.wav -c:a aac -b:a 160k track.m4a(または-c:a libmp3lame -q:a 2)。コピーに対してもcheckを実行してください:エンコードによりトゥルーピークが変化します。 - 映像の下に:
--seconds <映像の長さ>と--lufs -22でレンダリングし、video-skill に渡します。video-skillが最終ミックスをチェックします。 - ループ:
--bars 8でレンダリングし、2.5秒のテールをカット(-t <8小節の秒数>)してクリーンに繰り返すようにします。 score.txtをファイルと一緒に保持してください:その最終行はそれを生成した正確なコマンドです。
このツールが適さない場合
banger.py はオシレーターとノイズからフォー・オン・ザ・フロアのエレクトロニックミュージックを生成します。サンプル、ボーカル、他のジャンルはなく、そのミックスはマスタリングされたリリースよりも暗く狭いです(デモのミッドはベースの17 dB下にあります)。アコースティック楽器、歌、または名前付きのムードには、音楽モデルまたはライブラリトラックを使用し、その後 look と check を実行してください。このツールが提供するもの:正確なテンポ、キー、長さ、同じシードからの同一結果、ステム、MIDI、ライセンス不要、そしてすべての音符に対する理由。
よくある間違い
| 間違い | 修正 |
|---|---|
| トラックが「素晴らしい音」と言う | あなたはそれを聞いていません。数値とシートが示すものを報告してください;人が音を判断します |
| 選択するために20個のシードをレンダリングする | groove.py --seed N で0.5秒でスコアが表示されます;選んだものをレンダリング |
トラック間で fit を比較する | これは1つのトラック内でのみパターンをランク付けします |
| 10秒のクリップのキーを信頼する | 上位2候補を両方提示 |
WAVを check なしで渡す | check し、エンコードされたコピーもチェック |
| モデルからの音楽をそのまま使用する | まず look:クリッピングと+dBTPピークが一般的 |
| BGMがボーカルと競合する | --lufs -22 --mute lead を使用し、1-4 kHzをクリアに保つ |