# @leumas/sing

Leumas Sing — the karaoke game ("Just Dance for karaoke"). A HEADLESS game engine (src/engine: MPM pitch tracker, score engine, game clock, session state machine, library reader — zero...


**Leumas Sing** — the karaoke game ("Just Dance for karaoke"). Pick a song, sing into the mic over
the instrumental, and get scored on timing, steadiness, and (with scoring v2) pitch, while a 3D
dancer reacts on a cinematic stage. Leaderboards + live rooms make it a micro-community in Leumas
Social. Roadmap: `ops/todos/sing-roadmap.md`.

## Layout

- `src/engine/**` — the **headless** game core. No React, no DOM, no three, no CSS.
  - `pitch/` — the pitch pipeline: `detectPitchMPM` (McLeod Pitch Method over the NSDF),
    `createPitchTracker` (AnalyserNode + rAF → pitch frames), `createMicSource` (the shared mic with
    the permission latch), `pitchMath` (freq⇄MIDI⇄note helpers).
  - `constants.js` — tracker defaults, storage keys.
- `src/react/**` — React bindings + screens (`MicLab`, `SingProvider`, `useMicPermission`).
- `src/surfaces/**` — the mountable shell (`SingApp`) + `singRoutes()` for hosts.

## Entries

- `@leumas/sing` — React barrel (grows per phase).
- `@leumas/sing/engine` — the headless core (usable in tests / a tuner / node).
- `@leumas/sing/sing.css` — base skin, scoped under `.lms-sing`, tokens only.

## Rules

- `sing → music` only via `@leumas/music/karaoke` (timing utils). Music never imports sing.
- Exactly one file may import `@leumas/react-3d-viewer` (the lazy 3D dancer), behind a quality gate.
- Tokens only (`@leumas/theme`); CSS scoped under `.lms-sing`.


---
Source: shared/packages/sing/README.md
Canonical: https://docs.leumas.tech/p/packages/sing
