Skip to content

Reference Loopcloud

Daisuke Tsukada edited this page Sep 5, 2026 · 3 revisions

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 のタグ照合込み)
  • 以前の名前(パック名そのまま)で残っているセットは新しい名前に改名されます

分類表と overrides

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 を再実行します。

フォルダ名の分類規則

順序が大事です: 対象外 → 明示 → 弱い手がかり。

  1. 対象外 REX / SAMPLER / MIDI / PRESET / SERUM / KONTAKT / _DATA
  2. 明示(ループ) LOOPS / LPS / CONSTRUCTION / SONGS / STEMS
  3. 明示(ワンショット) HITS / ONE SHOTS / DRUM KITS / SOUNDS / FX / SFX / MULTIS
  4. 弱い(ループ) 楽器名(BASS / GUITAR / SYNTH …)、KIT(曲単位のコンストラクションキット)、140_D_Song のような BPM_キー
  5. 弱い(ワンショット) KICK / SNARE / HAT / VOX / RISER / 808

葉のフォルダまで下りて分類し、親子で食い違ったら 子の明示 > 親の明示 > 子の弱い > 親の弱い。ドラム系パック(Loopcloud Drum など)の KIT だけはワンショットです。

ファイル単位のループ / ワンショット判定(sample-kind.js

フォルダの分類は「傾向」で、混在したパックでは 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 DB(loopcloud-db.js

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。

セット名(set-name.js

パック名からレーベル名・カタログ番号・(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 6Vol06
  • EDM / FX / DJ / LA / II などの略語は大文字のまま
  • 同名になるパックはレーベル名を前に付けて区別する。手作りのセットと衝突するときは overrides の setName で固定する

生成物の中身

als-generate.js の配置規則(フォルダごとのトラック、Drum Rack、曲キット型、テンポ)は .als スクリプト を参照。

参照が切れたとき

Loopcloud の再同期でパックのハッシュが変わると参照が切れます。als-repair.js がファイル名で索引を引いて向け直します(.als スクリプト)。

Clone this wiki locally