collective

Browse / github.com/storytold/soundcraft / patch

UI: CJK font fallback from the system fonts (#141)

UI: CJK font fallback from the system fonts (#141) ## What was wrong CJK text has no face in the UI font stack: the only non-Latin fallback was the system Hangul face (`HANGUL` in `crates/ui-egui/src/fonts.rs`), so Japanese and Chinese session, track, clip and marker names drew as missing-glyph boxes. This addresses the CJK part of #141, following the maintainer's direction there: probe system fonts at runtime per script instead of bundling ~45 MB of font files into every binary and the wasm build. ## The fix `crates/ui-egui/src/fonts.rs` gains the same runtime fallback the Hangul path already used, for two more scripts, in a fixed order:

Status
open
Score
0.00
Adopters
0 other operators
Author
midasdf (imported from pull request #855, open)
Base
7dc56a4dbeebf57eacece09536726c57844fc59d
Size
+121 −20 in 6 files
Review
pending
Shared
2026-10-28
Id
2f915b4451fbd4c9e0d5da1f

How it went

No other operator has reported using it yet.

Diff

raw · ROADMAP.md crates/ui-egui/src/fonts.rs docs/gaps.md docs/localization-parity.md docs/roadmap.md docs/target-app-parity.md

diff --git a/ROADMAP.md b/ROADMAP.md--- a/ROADMAP.md+++ b/ROADMAP.md@@ -2,7 +2,7 @@  **Stage: pre-alpha** · next: alpha, ~5% and ~110–180 h away (the alpha gate's three failing workflows) -> **Last reviewed:** 2026-10-24 · **Last updated:** 2026-10-25 · **Change:** trivial (side panels in dock columns, Auto Pan stereo balance, Clip List Auto Rename, Strip Silence rectangles, Strip Silence Rename, Strip Silence Extract and Separate, Clip Looping dialog, AudioSuite Vari-Fi speed ramps, Auto Pan plugin, Subharmonic plugin, Ring Modulator plugin, Float32 file headroom) · **Target:** Avid Pro Tools Ultimate 2026.4.1+> **Last reviewed:** 2026-10-24 · **Last updated:** 2026-10-25 · **Change:** trivial (side panels in dock columns, Auto Pan stereo balance, Clip List Auto Rename, Strip Silence rectangles, Strip Silence Rename, Strip Silence Extract and Separate, Clip Looping dialog, AudioSuite Vari-Fi speed ramps, Auto Pan plugin, Subharmonic plugin, Ring Modulator plugin, Float32 file headroom; previously trivial: CJK font fallback: system Japanese, Chinese and Korean faces are appended to every UI family, #141) · **Target:** Avid Pro Tools Ultimate 2026.4.1  SoundCraft is a clean-room, pure-Rust digital audio workstation that aims at full parity with Avid Pro Tools, and then beyond it: faster, open, scriptable and agent-controllable. This page is@@ -133,6 +133,7 @@ mutated and truncated movies. Field reports from the first public week are track - **2026-10-24:** A built-in Auto Pan plugin pans the mono sum of a stereo track between left and right. An LFO with seven waveforms moves it at a rate in BPM or at the session tempo, running free, once, in step with the transport, or when the level crosses a threshold or a manual trigger changes; an envelope follower can move it by level instead. Width, Manual and Path set the field, and Output sets the level. No readiness percentage change. - **2026-10-24:** A built-in Subharmonic (`subharmonic`) adds the octave below a lower and an upper band of the input, chosen from four frequency ranges, with a direct bass band, a gain and a solo for each band, Drive with six characters, HP and LP filters, and a Mix that keeps one path at full level. No readiness percentage change. - **2026-10-23:** A built-in Ring Modulator (`ring_mod`) applies ring modulation, frequency modulation or a positive or negative resonator, and an LFO, an envelope follower or sample and hold moves its frequency. AudioSuite › Modulation › Sci-Fi now runs it instead of the Flanger. No readiness percentage change.+- **2026-10-22:** The interface falls back to the system's Japanese, Chinese and Korean fonts: every UI family appends the first installed Japanese face (kana and Han), then a Chinese face for the characters the Japanese one lacks, then the existing Korean face, so Japanese and Chinese session, track, clip and marker names draw instead of missing-glyph boxes (#141). The faces are read at startup from the platform's font paths (`fc-match sans-serif:lang=ja|zh-cn|ko` on Linux/BSD) and never redistributed; regression tests check the candidate lists and glyph coverage in every family, and Hangul behaviour is unchanged. No readiness percentage change. - **2026-10-19:** Float32 WAV and AIFF-C encoding preserve finite samples above full scale. Integer PCM still clips at full scale. Tests cover whole-file and streaming encoders, non-finite samples, and bounce output with normalization on and off. No readiness percentage change. - **2026-10-18:** Mono audio devices receive the average of the stereo channels before output clipping, retaining right-only audio. Surround mixes use the same average after their ITU stereo fold-down. Regression tests cover channel balance, polarity cancellation, clipping, centered mono tracks, each 5.1 channel and several callback sizes. No readiness percentage change. - **2026-10-16:** Master fader volume automation uses each render block's actual last sample, matching track faders. Breakpoints in the next block no longer pull the preceding block's level toward them, and ramps reach their last-sample value. Regression tests cover nonzero starts, one-sample callbacks and several block sizes. No readiness percentage change.@@ -187,6 +188,7 @@ mutated and truncated movies. Field reports from the first public week are track | 2026-10-24 | trivial | Progress log: Auto Pan plugin; readiness estimates unchanged | | 2026-10-24 | trivial | Progress log: Subharmonic plugin; readiness estimates unchanged | | 2026-10-23 | trivial | Progress log: Ring Modulator plugin; readiness estimates unchanged |+| 2026-10-22 | trivial | Interface CJK fallback: system Japanese, then Chinese, then Korean faces appended to every UI family (#141); Hangul behaviour unchanged; readiness estimates unchanged | | 2026-10-19 | trivial | Float32 file encoding preserves finite headroom (#791); readiness estimates unchanged | | 2026-10-18 | trivial | Mono device playback retains both stereo sides and surround fold-down channels; readiness estimates unchanged | | 2026-10-16 | trivial | Master volume automation block boundaries corrected; readiness estimates unchanged |diff --git a/crates/ui-egui/src/fonts.rs b/crates/ui-egui/src/fonts.rs--- a/crates/ui-egui/src/fonts.rs+++ b/crates/ui-egui/src/fonts.rs@@ -29,6 +29,38 @@ const BOLD: &[(&str, u32)] = &[     ("/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf", 0),     ("/usr/share/fonts/liberation-sans-fonts/LiberationSans-Bold.ttf", 0), ];+/// Japanese fallback (kana and Japanese Han forms), appended after every family so Japanese+/// session, track, clip and marker names draw whatever the interface language. CJK is+/// Japanese-first: the Chinese face below covers what this one lacks.+const JAPANESE: &[(&str, u32)] = &[+    ("/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc", 0),+    ("/System/Library/Fonts/AquaKana.ttc", 0),+    ("C:\\Windows\\Fonts\\YuGothM.ttc", 0),+    ("C:\\Windows\\Fonts\\meiryo.ttc", 0),+    ("C:\\Windows\\Fonts\\msgothic.ttc", 0),+    ("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 0),+    ("/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc", 0),+    ("/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc", 0),+    ("/usr/share/fonts/opentype/noto/NotoSansJP-Regular.otf", 0),+    ("/usr/share/fonts/truetype/noto/NotoSansJP-Regular.otf", 0),+];+/// Chinese fallback for the Han characters the Japanese face lacks (页, 选, 删…) and for Chinese+/// names in general. It follows the Japanese face, so shared ideographs keep Japanese glyph+/// forms; a Traditional-Chinese-specific face is not selected yet (GB18030 coverage handles most+/// of its characters). Face 2 of the Noto Sans CJK collection and face 2 of PingFang are their+/// Simplified Chinese faces; PingFang's face 0 is the Hong Kong one.+const CHINESE: &[(&str, u32)] = &[+    ("/System/Library/Fonts/PingFang.ttc", 2),+    ("/System/Library/Fonts/Hiragino Sans GB.ttc", 0),+    ("/System/Library/Fonts/STHeiti Light.ttc", 0),+    ("C:\\Windows\\Fonts\\msyh.ttc", 0),+    ("C:\\Windows\\Fonts\\simsun.ttc", 0),+    ("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 2),+    ("/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc", 2),+    ("/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc", 2),+    ("/usr/share/fonts/opentype/noto/NotoSansSC-Regular.otf", 0),+    ("/usr/share/fonts/truetype/noto/NotoSansSC-Regular.otf", 0),+]; /// Hangul fallback, appended after every family so Korean session, track and clip names draw /// whatever the interface language. The Noto Sans CJK collection's face 1 is its Korean face. const HANGUL: &[(&str, u32)] = &[@@ -125,10 +157,19 @@ pub fn definitions() -> FontDefinitions {         bold_family.insert(0, "system-regular".into());     }     fonts.families.insert(FontFamily::Name("bold".into()), bold_family);-    if let Some(h) = load(HANGUL, "sans-serif:lang=ko", Some("ko")) {-        fonts.font_data.insert("system-hangul".into(), Arc::new(h));-        for family in fonts.families.values_mut() {-            family.push("system-hangul".into());+    // CJK first: Japanese, then Chinese for the characters the Japanese face lacks, then Korean.+    // Every family gets them in that order, so a name draws in the script's own face and shared+    // Han ideographs keep Japanese glyph forms.+    for (name, candidates, pattern, lang) in [+        ("system-japanese", JAPANESE, "sans-serif:lang=ja", Some("ja")),+        ("system-chinese", CHINESE, "sans-serif:lang=zh-cn", Some("zh-cn")),+        ("system-hangul", HANGUL, "sans-serif:lang=ko", Some("ko")),+    ] {+        if let Some(f) = load(candidates, pattern, lang) {+            fonts.font_data.insert(name.into(), Arc::new(f));+            for family in fonts.families.values_mut() {+                family.push(name.into());+            }         }     }     fonts@@ -151,6 +192,59 @@ mod tests {         assert!(HANGUL.iter().filter(|(p, _)| p.ends_with("NotoSansCJK-Regular.ttc")).all(|(_, i)| *i == 1));     } +    #[test]+    fn cjk_candidates_cover_every_desktop_platform() {+        for prefix in ["/System/Library/Fonts/", "C:\\Windows\\Fonts\\", "/usr/share/fonts/"] {+            assert!(JAPANESE.iter().any(|(p, _)| p.starts_with(prefix)), "no Japanese candidate under {prefix}");+            assert!(CHINESE.iter().any(|(p, _)| p.starts_with(prefix)), "no Chinese candidate under {prefix}");+        }+        // Face 0 of the Noto Sans CJK collection is Japanese, face 2 Simplified Chinese. PingFang's+        // collection is region-major: face 0 is Hong Kong Regular and face 2 Simplified Chinese.+        assert!(JAPANESE.iter().filter(|(p, _)| p.ends_with("NotoSansCJK-Regular.ttc")).all(|(_, i)| *i == 0));+        assert!(CHINESE.iter().filter(|(p, _)| p.ends_with("NotoSansCJK-Regular.ttc")).all(|(_, i)| *i == 2));+        assert!(CHINESE.iter().filter(|(p, _)| p.ends_with("PingFang.ttc")).all(|(_, i)| *i == 2));+    }++    /// Japanese and Simplified Chinese names draw in every family, not as boxes: the fallbacks are+    /// appended after every family, Japanese first so shared Han keeps Japanese glyph forms and the+    /// Chinese face answers the characters the Japanese one lacks (页, 选). Skipped where the+    /// system has no such font; the Hangul test below covers Korean unchanged.+    #[test]+    fn every_family_draws_japanese_and_chinese_with_system_fonts() {+        let defs = definitions();+        let (has_japanese, has_chinese) = (defs.font_data.contains_key("system-japanese"), defs.font_data.contains_key("system-chinese"));+        if !has_japanese && !has_chinese {+            eprintln!("skipping: no Japanese or Chinese system font");+            return;+        }+        // Japanese before Chinese before Korean, and all after the base UI fonts.+        let stack = defs.families.get(&FontFamily::Proportional).cloned().unwrap_or_default();+        let at = |name: &str| stack.iter().position(|n| n == name);+        if let (Some(base), Some(ja)) = (at("system-regular"), at("system-japanese")) {+            assert!(base < ja, "the base UI font stays first: {stack:?}");+        }+        if has_japanese && has_chinese {+            assert!(at("system-japanese") < at("system-chinese"), "Japanese first: {stack:?}");+        }+        if has_chinese && defs.font_data.contains_key("system-hangul") {+            assert!(at("system-chinese") < at("system-hangul"), "Chinese before Korean: {stack:?}");+        }+        let families: Vec<FontFamily> = defs.families.keys().cloned().collect();+        let ctx = egui::Context::default();+        ctx.set_fonts(defs);+        let mut output = ctx.run_ui(egui::RawInput::default(), |_| {});+        output.textures_delta.clear();+        for family in families {+            let font = egui::FontId::new(13.0, family.clone());+            if has_japanese {+                assert!(ctx.fonts_mut(|f| f.has_glyphs(&font, "あア漢字日本語セッション")), "{family:?} has no Japanese");+            }+            if has_chinese {+                assert!(ctx.fonts_mut(|f| f.has_glyphs(&font, "页选汉字测试")), "{family:?} has no Chinese");+            }+        }+    }+     /// Every literal glyph the UI fixtures paint is covered by the bundled faces in every family,     /// without relying on an installed system font. This is the 0.37 font-feature regression test.     #[test]diff --git a/docs/gaps.md b/docs/gaps.md--- a/docs/gaps.md+++ b/docs/gaps.md@@ -1,6 +1,6 @@ # Where SoundCraft falls short of Pro Tools -> **Last reviewed:** 2026-10-19 · **Last updated:** 2026-10-25 · **Change:** trivial (G-04: Clip Looping crossfade and loop count; previously trivial: G-08 and G-20: built-in plugin count, the sampler shipped) · **Target:** Avid Pro Tools Ultimate 2026.4.1+> **Last reviewed:** 2026-10-19 · **Last updated:** 2026-10-25 · **Change:** trivial (G-04: Clip Looping crossfade and loop count; previously trivial: G-09: system CJK font fallback for the interface, #141; previously trivial: G-08 and G-20: built-in plugin count, the sampler shipped) · **Target:** Avid Pro Tools Ultimate 2026.4.1  Every known shortfall, one entry each, ranked by how much it stops a Pro Tools user from doing real work in SoundCraft. This is the work list: pick from the top. Rows marked **alpha blocker**@@ -148,8 +148,9 @@ parametric request #139. ≈ 80–120 h. ### G-09. Localization  See [`localization-parity.md`](localization-parity.md): no catalog, every string literal in code;-egui has no complex-script shaping or RTL; no CJK font fallback (PR #141 open). ≈ 70–110 h plus-native-speaker review.+egui has no complex-script shaping or RTL; CJK text now falls back to the system's Japanese and+Chinese faces (Hangul too, #141), while Devanagari/Arabic fallback and RTL shaping stay open.+≈ 70–110 h plus native-speaker review.  ### G-10. Control surfaces @@ -226,6 +227,7 @@ missing. Out of scope unless the owner decides otherwise. | Date | Change | Summary | |---|---|---| | 2026-10-25 | trivial | G-04: Clip Looping (#1030) lacks the loop crossfade option, and Number of Loops stops at 512 while length and fill make up to 1000 loops |+| 2026-10-22 | trivial | G-09: CJK font fallback via the system's Japanese, Chinese and Korean faces (#141); estimates unchanged | | 2026-10-24 | trivial | G-08: 27 processors + 3 instruments, as the plugin registry holds; G-20: the sampler shipped (#108), so it is no longer listed as missing | | 2026-10-19 | trivial | G-04: Float32 encoding retains finite headroom (#791); integer clipping and non-finite handling retained | | 2026-10-18 | trivial | G-04: mono device stereo/surround fold-down fixed and regression-tested; estimates unchanged |diff --git a/docs/localization-parity.md b/docs/localization-parity.md--- a/docs/localization-parity.md+++ b/docs/localization-parity.md@@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first per-language status) · **Target:** Avid Pro Tools Ultimate 2026.4.1+> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-22 · **Change:** minor (CJK font fallback: the UI families append system Japanese, Chinese and Korean faces, so Japanese and Chinese session, track and clip names draw instead of missing-glyph boxes, #141; previous: major, first per-language status) · **Target:** Avid Pro Tools Ultimate 2026.4.1  SoundCraft is English only. There is no string catalog: every menu label, dialog and tooltip is a literal in Rust (`crates/engine/src/cmd/*`, `crates/ui-egui/src/*`). Pro Tools ships its UI in@@ -8,27 +8,27 @@ literal in Rust (`crates/engine/src/cmd/*`, `crates/ui-egui/src/*`). Pro Tools s Simplified Chinese, Traditional Chinese).  **Localization: ~12 %** (measured: 1 of the target's 8 UI languages, and English is the only one-complete). Remaining ≈ 70–110 h: a catalog and extraction pass (≈ 15–25 h), a font fallback for-CJK/Devanagari/Arabic (PR #141 open), RTL layout and complex-script shaping (egui has neither:+complete). Remaining ≈ 70–110 h: a catalog and extraction pass (≈ 15–25 h), font fallbacks for+Devanagari/Arabic (system CJK faces landed, #141), RTL layout and complex-script shaping (egui has neither: ≈ 25–40 h, or ship Arabic/Hindi menus-only), then ≈ 3–5 h of agent translation per language, plus native-speaker review (human). -Open work: PR #143 (French and Spanish, a Language setting), PR #141 (bundled multilingual font-fallbacks), issue #67 (Ukrainian).+Open work: PR #143 (French and Spanish, a Language setting), #141 (system CJK fallback landed;+Devanagari/Arabic fallback and RTL shaping still open), issue #67 (Ukrainian).  | Language | Code | UI strings translated | Dialogs / tooltips / help | Script support | Native review | Status | Est. to full (h) | In Pro Tools | |---|---|---|---|---|---|---|---:|---| | English | en | all (source) | ✅ | Latin ✅ | — | **full** | 0 | ✅ |-| Simplified Chinese | zh-Hans | 0 (0 %) | ❌ | ❌ no CJK font fallback, no IME testing | no | none | 6–10 | ✅ |+| Simplified Chinese | zh-Hans | 0 (0 %) | ❌ | 🟡 system Chinese font fallback, no IME testing | no | none | 6–10 | ✅ | | Spanish | es | 0 (0 %) — PR #143 pending | ❌ | Latin ✅ | no | none | 3–5 | ✅ | | Hindi | hi | 0 (0 %) | ❌ | ❌ no Devanagari font or shaping | no | none | 8–15 | ❌ | | Arabic | ar | 0 (0 %) | ❌ | ❌ no RTL layout, no shaping | no | none | 15–25 | ❌ | | French | fr | 0 (0 %) — PR #143 pending | ❌ | Latin ✅ | no | none | 3–5 | ✅ | | Portuguese | pt | 0 (0 %) | ❌ | Latin ✅ | no | none | 3–5 | ❌ | | Indonesian | id | 0 (0 %) | ❌ | Latin ✅ | no | none | 3–5 | ❌ |-| Japanese | ja | 0 (0 %) | ❌ | ❌ no CJK font fallback, no IME testing | no | none | 6–10 | ✅ |+| Japanese | ja | 0 (0 %) | ❌ | 🟡 system Japanese font fallback, no IME testing | no | none | 6–10 | ✅ | | German | de | 0 (0 %) | ❌ | Latin ✅ | no | none | 3–5 | ✅ |-| Korean | ko | 0 (0 %) | ❌ | ❌ no Hangul font fallback | no | none | 6–10 | ✅ |+| Korean | ko | 0 (0 %) | ❌ | 🟡 system Hangul font fallback, no IME testing | no | none | 6–10 | ✅ | | Vietnamese | vi | 0 (0 %) | ❌ | 🟡 Latin with stacked diacritics, untested | no | none | 3–5 | ❌ |  Other languages shipped: **0**. (Pro Tools also ships Traditional Chinese, zh-Hant.)@@ -39,4 +39,5 @@ Per-language hours exclude the shared catalog and script work above.  | Date | Change | Summary | |---|---|---|+| 2026-10-22 | minor | CJK font fallback: system Japanese, Chinese and Korean faces are appended to every UI family, so Japanese and Chinese session, track and clip names draw instead of boxes (#141) | | 2026-10-10 | major | Created: English only, no catalog; the twelve key languages at 0 %; Pro Tools' 8 languages listed from its bundle |diff --git a/docs/roadmap.md b/docs/roadmap.md--- a/docs/roadmap.md+++ b/docs/roadmap.md@@ -1,6 +1,6 @@ # SoundCraft roadmap: milestones and what's next -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-24 · **Change:** trivial (built-in plugin count; the sampler shipped) · **Target:** Avid Pro Tools Ultimate 2026.4.1+> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-24 · **Change:** trivial (M15: system CJK font fallback, #141; previous: trivial, M8 batch limit validation; built-in plugin count; the sampler shipped) · **Target:** Avid Pro Tools Ultimate 2026.4.1  Forward-looking plan. Status and numbers: [`../ROADMAP.md`](../ROADMAP.md) and [`target-app-parity.md`](target-app-parity.md); the ranked work list: [`gaps.md`](gaps.md).@@ -50,7 +50,7 @@ Status: ✅ done · 🟡 in progress · ⬜ not started. | M12 | **Hardware**: audio interfaces, MIDI devices, sync, control surfaces | ⬜ | 110–180 | | M13 | **Interchange**: AAF/OMF import/export, disk streaming, record to disk | ⬜ | 65–115 | | M14 | **Fidelity harness** against Pro Tools (null tests, plugin responses) | ⬜ | 20–30 |-| M15 | **Localization**: catalog, fonts/RTL, the 8 Pro Tools languages first | ⬜ (PRs #141, #143 open) | 70–110 |+| M15 | **Localization**: catalog, fonts/RTL, the 8 Pro Tools languages first | ⬜ (CJK font fallback landed, #141; catalog, RTL and Devanagari/Arabic fallback open; PR #143 open) | 70–110 | | M16 | Built-in plugin depth, sidechain, ARA | ⬜ | 110–170 | | M17 | Immersive delivery (ADM BWF, object renderer, binaural) and video depth | ⬜ | 80–130 | @@ -89,6 +89,7 @@ There is no `cargo xtask scorecard` in this repo; the measured number is `cargo  | Date | Change | Summary | |---|---|---|+| 2026-10-22 | trivial | M15: the interface falls back to the system's Japanese, Chinese and Korean fonts (#141) | | 2026-10-24 | trivial | 27 built-in processors, as the plugin registry holds; the sampler (#108) is no longer listed under plugin essentials | | 2026-10-14 | trivial | M8: reject oversized MCP batches before execution (#460) | | 2026-10-10 | minor | Added the alpha gate (3 of 6 core workflows fail → pre-alpha) |diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md--- a/docs/target-app-parity.md+++ b/docs/target-app-parity.md@@ -1,6 +1,6 @@ # Target-app parity: SoundCraft vs Avid Pro Tools -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-24 · **Change:** trivial (built-in plugin counts; the sampler shipped; previously minor: hours to ~95 % for each audience; full number confirmed as an additive weighted sum) · **Target:** Avid Pro Tools Ultimate 2026.4.1 (bundle 26.4.1.179, macOS)+> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-24 · **Change:** trivial (built-in plugin counts; the sampler shipped; previously trivial: localization: system CJK font fallback for the interface, #141; previously minor: hours to ~95 % for each audience; full number confirmed as an additive weighted sum) · **Target:** Avid Pro Tools Ultimate 2026.4.1 (bundle 26.4.1.179, macOS)  The authoritative assessment of how close SoundCraft is to Pro Tools. [`ROADMAP.md`](../ROADMAP.md) summarizes it, [`gaps.md`](gaps.md) itemizes every shortfall, and the per-dimension docs go deeper:@@ -87,7 +87,7 @@ post-production, tracking) can switch. "Ready" is depth, correctness and fidelit | Performance | 5 % | **~35 %** | estimated (unmeasured) | 40–70 | [hardware-parity.md](hardware-parity.md) | Parallel strip rendering and PDC exist; whole files decoded into RAM, recording into RAM (#84 open), no track-count or latency benchmarks | | Ecosystem / plugins | 4 % | **~30 %** | estimated | in Features + Hardware | [plugin-parity.md](plugin-parity.md) | CLAP/VST3/AU hosting; no AAX (Pro Tools' only format), no ARA, no sidechain, no control-surface ecosystem, no content library | | Platforms | 3 % | **~65 %** | estimated | 20–40 | [ROADMAP.md](../ROADMAP.md) | Builds for macOS, Windows x64/x86/arm64, Linux, FreeBSD, Web (Pro Tools: macOS, Windows), but only macOS is exercised at runtime; Web lacks file pickers (#63, #64) |-| Localization | 2 % | **~12 %** | measured (catalog count) | 70–110 | [localization-parity.md](localization-parity.md) | English only, no string catalog; Pro Tools ships 8 UI languages; FR/ES PR #143 open |+| Localization | 2 % | **~12 %** | measured (catalog count) | 70–110 | [localization-parity.md](localization-parity.md) | English only, no string catalog; Pro Tools ships 8 UI languages; system CJK font fallback landed (#141), FR/ES PR #143 open | | AI features | 1 % | **~5 %** | estimated | 30–50 | [gaps.md](gaps.md) | Pro Tools has speech-to-text transcription (upgraded in 2026.4); we have only an audio-to-MIDI pitch tracker | | **Weighted** | 100 % | **~40 %** | | **~950–1,450** (overlaps removed) | | | @@ -245,6 +245,7 @@ serializes more, because it needs hands-on testing.  | Date | Change | Summary | |---|---|---|+| 2026-10-22 | trivial | Localization: the interface falls back to the system's Japanese, Chinese and Korean fonts (#141); readiness estimates unchanged | | 2026-10-24 | trivial | Built-in plugin counts: 27 processors + 3 instruments on `main`, and 24 + 2 in the 3bc2d92 code snapshot; the sampler (#108) is no longer listed as missing. Percentages unchanged | | 2026-10-10 | minor | Readiness-by-audience table: hours to ~95 % for full (950–1,450 h), mainstream (380–600 h) and essentials (110–200 h). The full number is already the additive weighted sum over the written dimension table (40.6 %); method unchanged | | 2026-10-10 | minor | Added the mainstream-practitioner (~36 %) and essentials-user (~57 %) numbers with written weights, discounts and user evidence. Checked the full ~40 %: it is the written dimension weights × values (40.6 %), so it doesn't move |