-
Notifications
You must be signed in to change notification settings - Fork 0
Reference Loopcloud
購入済みの Loopcloud パック(145 パック・約 59,000 ファイル)を、Live を使わずにジャンル別プロジェクトの .als へ起こす仕組みです。パック 1 つが 1 セット(例外は split)。生成物は ~/Music/Ableton/User Library/Project/<ジャンル> TRACK Project/<セット名>.als に置かれ、サンプルは Loopcloud のライブラリを直参照します(コピーしません)。
経緯と検証結果は Loopcloud ライブラリの整理(記録)。
loopcloud-survey.js ──→ data/loopcloud-packs.json(正) + docs/loopcloud-packs.md(レビュー用)
↑ data/loopcloud-overrides.json(人の判断)
loopcloud-build.js ───→ als-generate.js(パックごと)──→ <ジャンル> TRACK Project/<セット名>.als
├ sample-kind.js … ファイル単位のループ / ワンショット判定
├ loopcloud-db.js … Loopcloud のタグ・BPM・解析値
└ set-name.js … セット名
→ data/loopcloud-kinds.json + docs/loopcloud-kind-review.md(判定の記録)
# 1. 分類し直す(Loopcloud で新しいパックを同期したとき)
node scripts/loopcloud-survey.js [--library <dir>] [--out <json>] [--md <md>] [--overrides <json>]
# 2. 生成(既存のセットは上書きしない)
node scripts/loopcloud-build.js # 全パック
node scripts/loopcloud-build.js --only Metalstep # パック名の一部で絞る
node scripts/loopcloud-build.js --genre Metal # ジャンルで絞る
node scripts/loopcloud-build.js --dry-run # 何を作るかだけ
node scripts/loopcloud-build.js --force # 作り直す(Backup/ へ退避してから)
node scripts/loopcloud-build.js --force --no-backup # 誰も触っていない生成物を作り直す(Backup/ を増やさない)
node scripts/loopcloud-build.js --limit 5- Live で開いているセットは見送られます(閉じてから再実行)
- 全パックの作り直しは約 3 分(Loopcloud DB のタグ照合込み)
- 以前の名前(パック名そのまま)で残っているセットは新しい名前に改名されます
data/loopcloud-packs.json はスクリプトが作る「正」で、各パックのフォルダを loops / oneshots / skip / unknown に分け、ジャンルを付けます。人の判断は data/loopcloud-overrides.json に書き、survey のたびに重ねられます。
{
"パック名(フォルダ名からハッシュを除いたもの)": {
"genre": "Metal",
"folders": { "Piano": "loops", "Disco Bleeps": "oneshots" },
"files": { "Kicks/HD_Kick_Long.wav": "loop" },
"setName": "SingomakersEDM2020",
"layout": "songs",
"split": ["Deathrash", "Groove Metal 01", "Metalcore"],
"note": "判断の理由"
}
}| キー | 内容 |
|---|---|
genre |
プロジェクトの振り分け先。House / Ambient / Techno / Pops / Metal / HipHop / Cinematic / EDM / Drums / Misc / Bass / Vocals
|
folders |
フォルダの種別を固定する(ラベル全体か末尾のフォルダ名で指定)。指定したフォルダはファイル単位の判定をしない |
files |
ファイル単位で種別を固定する |
setName |
セット名を固定する(既存の手作りセットと衝突するときなど) |
layout |
songs で曲キット型(シーン = 曲、列 = パート) |
split |
1 段目のフォルダごとに別セットにする。共通フォルダ(One Shots 等)は各セットに入る。パック全体のセットは Backup/ へ |
docs/loopcloud-packs.md はレビュー用の写しです。直したい行は overrides に書いて survey を再実行します。
順序が大事です: 対象外 → 明示 → 弱い手がかり。
-
対象外
REX/SAMPLER/MIDI/PRESET/SERUM/KONTAKT/_DATA… -
明示(ループ)
LOOPS/LPS/CONSTRUCTION/SONGS/STEMS -
明示(ワンショット)
HITS/ONE SHOTS/DRUM KITS/SOUNDS/FX/SFX/MULTIS -
弱い(ループ) 楽器名(
BASS/GUITAR/SYNTH…)、KIT(曲単位のコンストラクションキット)、140_D_Songのような BPM_キー -
弱い(ワンショット)
KICK/SNARE/HAT/VOX/RISER/808…
葉のフォルダまで下りて分類し、親子で食い違ったら 子の明示 > 親の明示 > 子の弱い > 親の弱い。ドラム系パック(Loopcloud Drum など)の KIT だけはワンショットです。
フォルダの分類は「傾向」で、混在したパックでは 1 本ずつ決めます。
node scripts/sample-kind.js <file|dir>... # 判定を 1 行ずつ
node scripts/sample-kind.js --calibrate <packDir> # Loopcloud のタグ(無ければフォルダ名)との一致率Loopcloud のタグ(Content Types: Loops / One Shots)があればそれで決めます(音声の 99.5% にタグあり。自前判定との一致 95〜100%)。無いものは次の証拠を点数で合算します(+ がループ、− がワンショット)。
| 証拠 | 点 |
|---|---|
acid チャンクの種別ビット(ベンダーが書いた正解) |
ワンショット −0.9 / ループ +0.6 |
ファイル名の語 Loop
|
+0.5 |
ファイル名・フォルダ名の Riser / FX / Sweep … |
−0.7(長さと拍の証拠は見ない) |
ファイル名の One Shot / Hit / Stab … |
−0.5 |
ノート名(_C3)やマルチサンプルのフォルダ |
−0.5 |
| 長さ 0.6 秒未満 / 1.2 秒未満 / 6 秒超 / 10 秒超 | −0.8 / −0.4 / +0.2 / +0.5 |
| BPM が分かり、長さが 4 拍以上の整数拍 / 整数拍 / 端数 | +0.7 / +0.2 / −0.3 |
| 波形の末尾が無音(減衰して終わる) / 末尾にも音がある | −0.5×重み / +0.5 |
| 波形の先頭にトランジェント(2 秒未満) | −0.2 |
フォルダの傾向を事前確率として足します(明示 ±0.4 / 弱い ±0.2 / folders で固定したものは判定しない)。最終値の絶対値が 0.3 未満は「迷い」として docs/loopcloud-kind-review.md に載ります。波形は末尾 1 秒・先頭 0.2 秒・全体 16 窓だけ読みます。
Loopcloud アプリが全ファイルに付けたメタデータを 読み取り専用で使います。コピーもロックもしません。
| 場所 | 内容 |
|---|---|
~/Library/Loopcloud/<アカウント>/local.db |
SQLite。CLOUDITEMS(名前・BPM・親子)、AssignedTags + TagIdMap(タグ割り当て)、audio_attributes(Loopcloud 自身の波形解析: 長さ、無音を除いた長さ、アタック / 減衰時間、トランジェント強さ、リズム密度、スウィング) |
~/Library/Loopcloud/<アカウント>/tags.cache |
XML。タグ uuid → 名前と階層(System Tags > Content Types / Instruments / Key / Genres / Labels / Formats) |
node scripts/loopcloud-db.js <file>... # ファイルのタグ・BPM・解析値を表示const { LoopcloudDb } = require("./scripts/loopcloud-db");
const db = LoopcloudDb.shared(); // 無ければ null(LIVEMCP_NO_LOOPCLOUD_DB=1 で無効化)
db.lookup("/Users/.../library/FL205_Hard Drops (hash)/Oneshots/Kicks/HD_Kick_1.wav");
// → { name, bpm, contentType: "oneshot" | "loop" | null, instrument: ["Drum", "Kick"], key, genres, label, tags, attrs }
db.packItems("FL205_Hard Drops"); // パック配下の全項目- パックのフォルダ名に付くハッシュ
(126c8ee25cd5)は DB 側に無いので外して照合します - Loopcloud 非同期のファイル(ユーザー録音など)は DB に無いため、自前判定が残っています
- 名前に BPM が無いループは DB の BPM を使います
-
node:sqlite(Node 22.5+)が必要です
楽器タグ・キー・解析値を Drum Rack の並びやトラック分けに使う計画は Issue #28。
パック名からレーベル名・カタログ番号・(Full_Zip) のような付属語を外し、PascalCase にします。
| パック名 | セット名 |
|---|---|
Singomakers_Emotional_Piano_Themes_Vol_6_(Full_Zip) |
EmotionalPianoThemesVol06 |
Freaky Loops - FL224 - Metalstep Vol. 2 |
MetalstepVol02 |
TTS_ROCKDrum&Bass |
RockDrumNBass |
- レーベル名は Loopcloud の Labels タグから取り、先頭にあるときだけ外す(
Loopmasters/Loopcloudは残す) - 末尾の
MAIN/WAV/FULL/ZIP/24BITなどは落とす - 1〜2 桁の番号は 2 桁に揃える(
Vol 6→Vol06) -
EDM/FX/DJ/LA/IIなどの略語は大文字のまま - 同名になるパックはレーベル名を前に付けて区別する。手作りのセットと衝突するときは overrides の
setNameで固定する
als-generate.js の配置規則(フォルダごとのトラック、Drum Rack、曲キット型、テンポ)は .als スクリプト を参照。
Loopcloud の再同期でパックのハッシュが変わると参照が切れます。als-repair.js がファイル名で索引を引いて向け直します(.als スクリプト)。