{
  "markdown": "# Loom\n\n**Loom** is a measurement-based production system for Ableton Live by\n[Şenol Şahan / SubverseLab](https://subverselab.com/loom): a local MCP server\nthat reads your own `.als` projects and library, answers with counts instead of\nguesses, and writes MIDI, device chains, automation and arrangement markers into\na running Live session, verifying every write by reading it back.\n<!-- mcp-name: io.github.senolsahan037-oss/loom -->\n<!-- The MCP Registry proves package ownership by finding this line in the\n     README that PyPI shows as the package description. It must match `name` in\n     server.json exactly; the namespace is the reverse-DNS form of the domain,\n     authenticated through the GitHub account. com.subverselab/loom is the\n     on-brand name and stays open: it needs a TXT record on the apex of\n     subverselab.com, whose DNS lives at the registrar. -->\n\nCanonical home: **https://subverselab.com/loom** · Cite: [`CITATION.cff`](CITATION.cff) ·\nAttribution terms: [`NOTICE`](NOTICE). Copies and derivatives must keep the attribution.\n\n[![checks](https://github.com/senolsahan037-oss/loom/actions/workflows/checks.yml/badge.svg)](https://github.com/senolsahan037-oss/loom/actions/workflows/checks.yml)\n\nAbleton Live için ölçüme dayalı bir üretim sistemi ve onu tek bir araç ad\nalanı altında toplayan MCP sunucusu. Live bağlantısı **tek**: Live 12.4 beta\niçinde çalışan Loom extension. Control Surface, otomatik fallback ya da ikinci\nbir yazıcı yolu yok.\n\n## Loom ne yapar\n\n| Katman | İş |\n|---|---|\n| **Sensei** | Kilitli veri kümesinden MIDI varyasyonu (drum / bass / chord) |\n| **ArrangementGPS** | Prompt'tan proje planı: tempo, ton, tür, kanallar, bölümler (Node) |\n| **AIMixMaster** | `.als` inceleme, gain staging, klip hizalama, drum buss, otomasyon yazma (dosya üzerinde) |\n| **Presetor / AISoundDesigner** | Kullanıcının kendi projelerinden ölçülmüş cihaz zincirleri ve ses paleti |\n| **MusicalIntelligence** | Gerçek kayıtlardan ölçülmüş tür kanıtı; proje anahtarına göre part önerisi |\n| **Mix Check / SampleAgent** | Ses ölçümü ve profil karşılaştırması; YouTube → dilimlenmiş sample paketi |\n| **Loom extension** | Live'ın içinde çalışan Ableton Extension: MCP'nin Live'a tek bağlantısı |\n| **mcp_server** | 45 araç, resources, prompts, ilerleme, iptal |\n\nHiçbir katman tahmin üretmez: kanıt yoksa öneri dönmez, SDK'nın yapamadığı iş\nemüle edilmez, yazan her araç varsayılan olarak kuru çalışır.\n\nMimari, resmi çağrı akışı ve protokol: [`Docs/ARCHITECTURE.md`](Docs/ARCHITECTURE.md).\n\n## Kurulum (tek yol)\n\n```bash\npython3 install.py            # kurar\npython3 install.py --check    # hiçbir şeyi değiştirmez, durumu raporlar\n```\n\n`install.py`:\n\n1. Bulduğu her MCP istemcisine (Claude Desktop, Antigravity, Claude Code)\n   Loom'u kaydeder; config'in yedeğini alır, tekrar çalıştırılabilir.\n2. Extension paketini (`extension/dist/loom.ablx`) hazırlar (toolchain varsa\n   derler) ve Live'da kurulu olanın sürümünü ve köprü protokolünü bu\n   checkout'unkiyle karşılaştırır. Live'ın gördüğü ad **Loom**, kimlik\n   `subverselab.loom`. Eski paket (`loom.sensei-midi-writer`) kuruluysa bunu\n   söyler: MCP eskisine mutasyon göndermez (`LEGACY_EXTENSION`).\n3. Katalogları sizin stok Ableton kütüphanenizden üretir.\n\nLive'ın kendi adımı tek: `.ablx` dosyasını Live 12.4 beta'nın Extensions\nayarından ekleyin ve Live'ı yeniden başlatın. Extension kendi depolama\ndizininde bir dosya köprüsü açar; MCP her çağrıda o köprüyü bulur.\n\nSürüm tek yerden yazılır: `manifest.json` (paket sürümü). `package.json` onunla\neşleşmek zorundadır (build bunu doğrular) ve köprü protokolü\n(`loom.bridge/3`) ayrı bir kavramdır; SDK API sürümü (1.0.0) üçüncüsüdür.\n\n## Bağlantı teşhisi (tek yol)\n\nMCP aracı **`live_bridge_status`**: hangi köprüye konuştuğunu ve neden,\ndurumun yaşı, oturum kimliği, extension'ın yayımladığı yetenekler,\n`mutations_allowed` ve protokol kararı (`OK` / `UPGRADE_REQUIRED` /\n`PROTOCOL_MISMATCH` / `STALE_STATE` / `NO_STATE`), günlüğün durumu,\nkuyrukta ve işlemde bekleyenler. Aynı bilgiyi `python3 install.py --check`\nterminalde verir.\n\nEski bir extension (protokol yayımlamayan 0.1.0 / 0.2.0) **okunur ama\ndeğiştirilmez**: her mutasyon `UPGRADE_REQUIRED` ile, istek dosyası yazılmadan\nreddedilir. Eski kimlikle kurulu paket (`loom.sensei-midi-writer`) da öyle:\n`LEGACY_EXTENSION`; yenisi kurulup eskisi Live'dan kaldırıldıktan sonra eski\ngünlük `live_command op=journal_import` ile yeni köprüye taşınır (unutulmaz,\nsilinmez). Birden fazla Loom köprüsü görülürse `AMBIGUOUS_BRIDGE`.\n`LOOM_BRIDGE_ROOT` yalnız testler içindir.\n\n## Desteklenen MCP araçları\n\n| Durum | Araçlar | Test |\n|---|---|---|\n| **Live üzerinden (extension)** | `live_state`, `live_bridge_status`, `live_command` (set_tempo, set_mixer, set_device_parameter, list_device_parameters, create_locator, create_midi_track, import_audio_clip, render_pre_fx, drum_pads, **build_drum_kit**, journal_import), `midi_write_arrangement`, `midi_write_to_live` (session clip), `crate_to_live`, `mix_from_live`, `project_build`, `midi_generate` (auto_write) | `mcp_server/tests/test_bridge_consumer_real.py` (gerçek bridge.ts), `test_extension_path.py`, `extension/tests/bridge.test.ts` |\n| **Live'sız motorlar** | `project_*`, `automation_*`, `drumbuss_*`, `chain_*`, `render_*`, `palette_read`, `library_search`, `genre_evidence`, `part_suggest`, `plan_create`, `plan_verify`, `projects_arrangement_shapes`, `mix_measure/analyze/profiles`, `crate_fetch/read/spots/chop/agent`, `setup_scan`, `gap_record` | `mcp_server/tests/test_mcp_tools.py` (45 araç, stdio), motorların kendi pytest paketleri |\n| **OS düzeyi, kullanıcı isteğiyle** | `live_project` (Live'ı aç / kapat / durum; Live'ın kendi logundan doğrular; set değiştirmek extension host'u düşürür) | `test_live_project.py` |\n| **Makineye bağlı** | `mix_capture` (`method=\"tap\"`: Core Audio süreç musluğu, LaunchServices üzerinden `LiveTap.app` olarak başlar; macOS'ta \"Ekran ve Sistem Sesi Kaydı\" izni **LiveTap** girişine verilir, MCP'yi çalıştıran uygulamaya değil; 2026-09-06'da çalan Live'dan ölçüldü) | yalnız gerçek makinede |\n\nExtension'ın kendi içindeki tek kullanıcı komutu **\"Loom: Generate\"**\n(sağ tık, Session slot) aynı `write_clip` uygulamasından ve aynı sahiplik\ndefterinden geçer: Loom'un yazmadığı klip üzerine yazılmaz.\n\n### Kit ve preset akışı\n\nSDK preset (.adg/.adv) yüklemez; Loom bunu \"yapamaz\" saymaz, yolu ayırır:\n\n- **Hazır kit**: `project_build(kit=\"Boom Bap Kit\")` ya da bir `.adg` yolu.\n  Kit, preset'in kendi XML'inden okunur (pad, nota, ad, sample dosyası;\n  Sensei'nin `.adg` okuyucusu), dosyalar bu makinede çözülür ve pad'ler\n  extension'da chain + Simpler + sample olarak yeniden kurulur. Cevap neyin\n  taşındığını ve neyin **taşınmadığını** söyler: pad başına efektler, macro'lar,\n  choke grupları, Simpler parametreleri, dönüş zincirleri. Bu, preset'i olduğu\n  gibi yüklemek değildir ve öyle sunulmaz.\n- **Sample'lardan kit**: `live_command op=build_drum_kit pads=[{note, sample}]`.\n- **Enstrüman preset'i** (bass/chord): SDK yüklemez. Ya `device_map` ile\n  yerel cihaz (`Operator`, `Electric`, `Wavetable`…) ya da preset'i Live'da\n  kendin yükleyip aynı planı yeniden çalıştırırsın; kanal benimsenir, cihazı\n  durumdan okunur. Cevapta `needs_preset` iki yolu da yazar.\n- **Davul notaları kit'in pad'lerine**: Sensei'nin davul kanıtı GM pad\n  düzeninde; 77–92 gibi bir kitte notalar pad rolüne (kick/snare/hat) göre\n  eşlenir (`pad_mapping: by_role`), eşlenemeyen rol düşürülür ve yazılır;\n  hiç nota kalmazsa klip yazılmaz (`no_notes_for_pads`).\n- **Sadeleştirme açık**: `tracks=[...]` ve `device_map` verilirse cevaptaki\n  `simplification` bloğu hangi kanalların neden düşürüldüğünü ve hangi cihazın\n  hangi preset'in yerine geçtiğini yazar. Şablonla gelen boş kanallara\n  dokunulmaz.\n- **Dosya yolu (B)**: `.als` üzerinde çalışan yazıcılar (`automation_write`,\n  `drumbuss_build`, `chain_apply`) diskteki seti değiştirir; açık set\n  değişmez, set yeniden açılmalıdır. Preset XML'i elle sete dönüştürülmez;\n  bu Live'ın işidir.\n\n## SDK nedeniyle desteklenmeyenler\n\nExtensions SDK 1.0.0-beta.1 şunları vermez; Loom bunları **emüle etmez**,\nistek dosyası yazılmadan `UNSUPPORTED_BY_SDK` ve gereken yetenek adıyla\ncevaplar:\n\n- transport (play/stop/position) → `live_command op=transport`, `mix_capture follow_transport`\n- song key yazma → `live_command op=set_key`; `project_build` adımı `UNSUPPORTED_BY_SDK` olarak raporlanır\n- preset/browser yükleme → `create_midi_track` yalnız yerel cihazı varsayılan preset'iyle ekler (`not_loadable_in_extension`); kit için `build_drum_kit kit=` yeniden kurar (yukarıda), enstrüman için `device_map` ya da kullanıcı adımı\n- ölçü işareti → bar→beat çevirimi açık `beats_per_bar` ister, `.als` verilmişse oradan okur, yoksa 4/4 varsaydığını `beats_per_bar_source` ile söyler\n- meter, kayıt (record mode / resampling) → `mix_capture method=\"resample\"`, `capture_*` op'ları\n\nCentercode'a 2026-09-03'te bildirildi.\n\n## Köprü sözleşmesi (kısa)\n\nHer Live cevabı yapılandırılmış bir `outcome` taşır:\n`{kind: applied|refused|failed|indeterminate, code, applied, verified, side_effects, next_step}`.\nMCP durumu bundan türer: `OK`, `REFUSED_IN_LIVE` (Live'a dokunulmadı),\n`FAILED_IN_LIVE` (denendi, eski içerik geri kondu), `INDETERMINATE`\n(uygulanmış olabilir; yan etki ve güvenli sonraki adım cevapta), `NOT_CONSUMED`,\n`INVALID_RESULT`. Belirsiz sonuç hiçbir yerde otomatik yeniden denenmez.\n\nAnahtarlı istekler (build adımları, `idempotency_key`) mutasyondan **önce**\ngünlüğe yazılır; aynı anahtar + aynı içerik → saklanan sonuç, farklı içerik →\nçakışma, başka oturum → ret, yarım kalmış → `INDETERMINATE`. Günlük kaybolmuş\nya da bozuksa anahtarlı mutasyonlar reddedilir ve cevap ne yapılacağını söyler;\ngünlüğü silmek hiçbir yerde önerilmez. Ayrıntı: `Docs/ARCHITECTURE.md`.\n\n## Test\n\n```bash\n./scripts/check_ci.sh    # Ableton ve kişisel veri gerektirmeyen paket; CI bunu koşar\n./scripts/check_all.sh   # tamamı; gerçek bir Ableton kurulumu ister\n```\n\n`check_ci.sh` her paketi passed / failed / skipped olarak sayar; bağımlılığı\neksik paket geçmiş sayılmaz. Extension'ın kendi kuyruk kodu (`bridge.ts`)\nhem kendi başına (`npm run test:bridge`) hem de MCP'nin karşısında gerçek\ntüketici olarak (`test_bridge_consumer_real.py`) çalıştırılır; Python sahtesi\nyalnız hız için vardır ve tek başına protokol kanıtı sayılmaz.\n\nTestler geçici dizin ve izole fixture kullanır; gerçek Live'a, kurulu\nextension'a ve kullanıcı verisine dokunmaz.\n\nGerçek Live kabul betiği: `extension/tools/measure_bridge.py`\n(çalışan Live'ın açık setine yazar; boş bir sette çalıştırın).\n\n## Veri politikası\n\nBu depo kod ve fixture yayınlar, ölçüm yayınlamaz. Presetor'un cihaz zinciri\nkanıtı, AISoundDesigner'ın ses paleti ve Sensei'nin katalogları kullanıcının\nkendi projelerinden ve Ableton kurulumundan üretilir; hiçbiri depoda yoktur.\nTemiz klonda testler sentetik fixture ile çalışır ve her yanıt kaynağını\n`data_source` alanında söyler: `measured` ya da `synthetic_fixture`.\n\n```bash\npython3 scripts/extract_device_chains.py --out Presetor/data/measured_device_chains.json\npython3 scripts/extract_sound_sources.py --out AISoundDesigner/data/measured_sound_sources.json\npython3 scripts/setup_scan.py --check      # kataloglar: ne var, ne eksik\n```\n\n## Bilinen sınırlar\n\n- **Gerçek Live kabulü 2026-09-07'de geçti.** Boş bir set'ten başlayıp gerçek\n  `.adg`/`.adv` preset'leri açtı, pad'leri çözdü (16/16), MIDI ve locator yazdı;\n  set kaydedilip yeniden açıldığında hepsi yerindeydi. Extension o gün 0.4.x idi.\n  **Açık kalan kenar:** 0.4.4'ün getirdiği `delete_track` / `delete_locator`\n  (2026-09-11) yalnız headless test edildi; onlar için gerçek Live kabulü henüz\n  yapılmadı.\n\n  Bu madde 2026-09-07'den 2026-09-12'ye kadar \"kabul henüz yapılmadı, kurulu\n  extension 0.1.0\" diyordu — kabulü geçiren commit'in kendisi tarafından\n  yazılmış ve geçtikten sonra geri dönülmemişti. Depo herkese açık olduğu için\n  beş gün boyunca projeyi çalışmıyor gösterdi. Sürüm ve kabul iddiaları\n  `extension/manifest.json` ile birlikte güncellenir.\n- Render Live'ın ses motorunu gerektirir; `render_plan` ne çıkması gerektiğini,\n  `render_verify` çıkanın uyup uymadığını söyler.\n- Otomasyon yazma (dosya üzerinde) mikser ve cihaz parametrelerini kapsar;\n  klip zarfları yok.\n- Araç zaman aşımı sert değildir (Python'da iş parçacığı öldürülemez); zaman\n  aşımına uğramış çağrı bir daha Live'a istek yazamaz.\n- SDK klibin otomasyon / renk / launch ayarlarını okuyamadığı için\n  `replace_owned` yalnız aynı nesneyi yerinde değiştirir; silme gerektiren\n  değiştirme reddedilir. Tam koruma garantisi verilmez, dar politika budur.\n- Günlük exactly-once değildir: uygulandığı bilinmeyen iş uygulanmış da\n  sayılmaz, sayılmamış da; durumu okumak çağırana kalır.\n- `render_verify` ve ses ölçümü `soundfile`/`numpy` ister; diğer araçlar\n  macOS'un kendi Python'uyla çalışır.\n\nGap kaydı: `Docs/MISSING_CONTROLS_LOG.md` (başındaki not tarihsel girişleri ayırır).\n\n## Telif ve atıf\n\n© Şenol Şahan / SubverseLab. Tüm hakları saklıdır. Kanonik adres:\nhttps://subverselab.com/loom . Kopyalayan, uyarlayan ya da bu koddan türeyen her\niş bu atfı ve `NOTICE` dosyasını korur; sunucunun her yanıtındaki `_source` alanı\nsilinmez. Akademik ya da yazılı atıf için `CITATION.cff`.\n",
  "bytes": 13235,
  "sha": "df83b9de47e92d8c286523ab70b267e97cdaceee44790ccbad2aea0ccf73b5d6",
  "repo_slug": "senolsahan037-oss/loom",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_senolsahan037_oss_loom_989453ba/readme"
}