ミキシングデモのプロジェクト JSON
ミキシングスタジオは、ミックス全体の状態を libsonare-mix-project.json に保存します。クリップを含むトラック、ストリップ、センド、出力先、オートメーション、2 本の AUX バス、2 本のサブグループバス、マスター、VCA ゲイン、ループ範囲が入り、デコード済み音源は含みません。プロジェクト JSON を保存で書き出し、プロジェクト JSON を開くで読み込みます。開いた直後のトラックは音声待ちの状態で、追加したファイルは同じ名前のトラックへ、なければ次のトラックへ順に割り当てられます。アプリの構成と参考にするソースは、ブラウザでミキシングアプリを作るを参照してください。
これはミキサーシーンの形式ではありません
これは ミキシングシーン JSON リファレンスとは別の交換形式です。シーンはストリップ・バス・VCA グループ・接続からなるミキサーグラフ全体を記述し、Mixer.toSceneJson() / fromSceneJson() で往復します。以下のデモのプロジェクトファイルは、構成が固定されたコンソールの状態で、ブラウザデモだけが読みます。エンジンの fromSceneJson(...) は受け付けず、デモもシーンファイルを拒否します。
下のデモは /ja/mixing ページではなくエンジン自身のレーンミキサーですが、プロジェクトのトラックが記述しているものを鳴らしています。フェーダーとミュートを持つトラックが 3 本あり、各バンドが tracks[] の 1 要素にあたります。フェーダーはその要素の faderDb、ミュートは muted で、デモはこの 2 つをシーン形式のストリップ(strips[].faderDb)と setSoloMute でエンジンに渡しています。デモに対応物がないのは clip.startSec です。デモのクリップはすべて 0 秒から始まります。エンジンがすでに扱えるストリップ設定に対して、プロジェクトファイルが追加しているのは、トラックをタイムライン上で後ろにずらす情報です。
固定の構成
どのトラックも同じストリップを持ちます。6 バンドの EQ、続いて trim、gate、comp、deess、duck、width の順に並ぶ 6 つのインサートスロット、そして reverb と delay の 2 本のバスへのセンドです。マスターのスロットは glue と limiter の 2 つです。バイパスしたスロットもファイルに残るので、スロットの位置は変わりません。ファイル内の位置は秒で、エンジンは 60 bpm で動くため 1 秒が 4 分音符 1 つに当たります。
形(バージョン 2)
以下の例は省略版です。実際のファイルには 6 バンドすべての EQ と、各スロットのパラメータがすべて入ります。
{
"version": 2,
"tracks": [
{
"id": 1,
"name": "Lead Vocal",
"sourceDurationSec": 42.5,
"clip": { "startSec": 1.5, "trimStartSec": 0, "lengthSec": null, "fadeInSec": 0.02, "fadeOutSec": 0.5 },
"faderDb": -3,
"pan": 0,
"panLaw": 0,
"panMode": 0,
"dualPanLeft": -1,
"dualPanRight": 1,
"channelDelayMs": 0,
"polarityLeft": false,
"polarityRight": false,
"muted": false,
"soloed": false,
"soloSafe": false,
"vcaGroup": null,
"outputBus": null,
"eq": [
{ "type": "HighPass", "frequencyHz": 30, "gainDb": 0, "q": 0.707, "enabled": false }
],
"slots": {
"trim": { "bypassed": false, "params": { "levelDb": 0 } },
"comp": { "bypassed": true, "params": { "thresholdDb": -18, "ratio": 2 } },
"width": { "bypassed": false, "params": { "width": 1 } }
},
"duckKeyTrackId": null,
"sends": {
"reverb": { "levelDb": -18, "timing": "postFader" },
"delay": { "levelDb": -60, "timing": "postFader" }
},
"automation": {
"fader": [{ "id": "p1", "timeSec": 8, "value": -6, "curve": "linear" }],
"pan": [],
"width": []
}
}
],
"buses": {
"reverb": { "gainDb": 0, "params": { "decay": 0.566, "damping": 0.5, "preDelayMs": 20, "dryWet": 1 } },
"delay": { "gainDb": 0, "params": { "delayTimeLMs": 250, "delayTimeRMs": 250, "feedback": 0.25, "pingPong": 0, "dryWet": 1 } }
},
"groups": { "group1": { "gainDb": 0 }, "group2": { "gainDb": 0 } },
"master": {
"faderDb": 0,
"slots": {
"glue": { "bypassed": true, "params": {} },
"limiter": { "bypassed": false, "params": { "ceilingDb": -1, "releaseMs": 50 } }
}
},
"vcaGains": { "A": 0, "B": 0, "C": 0 },
"loop": { "enabled": false, "startSec": 0, "endSec": 0 }
}idは正の整数で、ファイル内で重複できません。-60dB 以下のセンドはルーティングされません。lengthSec: nullはソースの残りをすべて再生します。eqはちょうど 6 バンドです。typeはエンジンの EQ バンド種別(Peak、LowShelf、HighShelf、LowPass、HighPass、BandPass、Notch、TiltShelf、FlatTilt、AllPass)のいずれかです。curveはlinear、exponential、hold、s-curveのいずれかで、次のポイントまでの区間の形を決めます。レーンはfader(dB)、pan、widthの 3 種類です。outputBusは"group1"、"group2"、またはマスターを表すnullで、それ以外の値は拒否します。groupsは各サブグループバスのgainDb(既定 0)を持ちます。サブグループバスはインサートのない加算用フェーダーです。どちらも省略できるので、これらを含まない v2 ファイルも開け、その場合は全トラックがマスターへ出力されます。vcaGroupは"A"、"B"、"C"、nullのいずれかです。duckKeyTrackIdはduckスロットのキーにするトラックを指し、nullならそのトラック自身の入力をキーにします。- ファイルに入るトラックは最大 8 本です。
省略したフィールドにはデモの既定値が入ります。型の違うフィールド、そのスロットにないスロットパラメータ、重複したトラック ID、存在しないトラックを指す duckKeyTrackId、キーをたどると自分自身に戻る duckKeyTrackId、6 バンドでない eq 配列があると、何も変更せずファイル全体を拒否します。数値は有限の数でなければならず、"-6" のような文字列は拒否されます。
v2 のファイルを開くと、プロジェクト全体が置き換わります。この操作は取り消せます。
バージョン 1 のファイルを読む
v1 のファイルは、"version": 1(または version なし)の、トラックごとのフラットな設定ファイルです。デモはこれを、いま読み込まれているトラックに変換して適用するので、先に対応する音声を読み込んでおきます。変換したことは通知で知らせます。
{
"version": 1,
"masterFaderDb": 0,
"tracks": [
{ "id": "track-id", "name": "Lead Vocal", "offsetSeconds": 1.5, "inputTrimDb": 0, "faderDb": -3, "pan": 0, "width": 1, "muted": false, "soloed": false }
]
}v1 のファイルには masterFaderDb、reverb、vcaGains、tracks のうち少なくとも 1 つが必要です。tracks の各要素には id か name が必要で、指定したコントロールはすべて期待する型でなければなりません。エンジンのシーン(strips、buses、connections)は拒否します。有効な v1 でも v2 でもないファイルは読み込めません。
変換は次の規則に従います。
- トラックは
idまたはnameで照合します。読み込み済みのトラックに一致しない v1 のトラックは破棄し、その名前を通知に挙げます。省略したトップレベルの設定は現在の値のまま残り、指定したトラックで省略した項目には既定値が入ります。 offsetSecondsはclip.startSecになり、タイムラインに収まる範囲に丸められます。inputTrimDbはtrimのレベル、widthはwidthスロットになります。- トーンはストリップ EQ になります。チルトが t dB なら、1 kHz の低域シェルフ −t/2 と高域シェルフ +t/2 の組です。Air は 12 kHz の高域シェルフで、2 つ目の Peak スロットに入ります。
eqEnabled: falseのトラックは、既定の無効な EQ になります。 reverbSendDbはreverbバスへのポストフェーダーセンドになります。v1 のreverb.enabled: falseはそれらのセンドをオフにします。reverb.decaySecとreverb.preDelayMsはプレートのディケイとプリディレイを決めます。- v1 のオートメーションは、全パラメータを
paramで区別して 1 つの配列に入れていました。これをfader、pan、widthの 3 レーンに分け、時間順に並べます。未知のカーブはlinearになります。 - 値は v1 の範囲に丸められます。
faderDbは −60〜+12 dB、masterFaderDbと各vcaGainsは −24〜+12 dB、inputTrimDbは ±24 dB、panは ±1、widthは 0〜2、channelDelayMsは 0〜50、センドは −60〜0 dB です。
関連
- ミキシングシーン JSON:エンジンのミキサーシーン交換形式(
fromSceneJsonで読み込むのはこちら) - ミキシングエンジン:API ガイドと信号フロー