Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
392 commits
Select commit Hold shift + click to select a range
3311fed
phase31: wire MIDI status callbacks without globals
doublemover Feb 22, 2026
4a73b2e
phase31: drop runtime global fallback helpers
doublemover Feb 22, 2026
cb51029
phase31: enforce runtime global cutover guardrails
doublemover Feb 22, 2026
d18779e
Implement binary cold-block codec for replay history
doublemover Feb 22, 2026
916ccf2
Require explicit lemming ctor wiring for replay apply
doublemover Feb 22, 2026
1bc91fe
Add seek and replay parity gates for history binary layout
doublemover Feb 22, 2026
05cc1e8
Add tiled terrain dirty updates for stage compositing
doublemover Feb 22, 2026
fb05fc4
phase33: add dedicated overlay plane for selection and hover
doublemover Feb 22, 2026
7c330f8
phase33: optimize scaled blit loops with cached coordinate maps
doublemover Feb 22, 2026
5b12863
phase33: add tile overlay and scaled-blit hotpath benches
doublemover Feb 22, 2026
30288a0
phase34: drop legacy MCP tool aliases and dotted shims
doublemover Feb 22, 2026
f7cdda2
phase34: split state and spectator MCP handlers
doublemover Feb 22, 2026
aed15df
phase34: use pointer fingerprints for watch onChange
doublemover Feb 22, 2026
00ee117
phase34: make lemming summary top-k single-pass
doublemover Feb 22, 2026
12dd0c2
phase35: remove jQuery from boot resize flow
doublemover Feb 22, 2026
edb6afe
phase35: decouple procgen resize from window.lemmings
doublemover Feb 22, 2026
ac27cc1
phase35: consolidate MIDI UI control listener bindings
doublemover Feb 22, 2026
3debbf8
phase35: add versioned migration for midi and editor storage
doublemover Feb 22, 2026
b7edfc7
phase36: extract shared test support harnesses
doublemover Feb 22, 2026
57380d0
phase36: split oversized midi coverage suites
doublemover Feb 23, 2026
116e7d9
phase36: tighten fast benchmark smoke defaults
doublemover Feb 23, 2026
71d2a21
phase36: align bench script semantics and docs
doublemover Feb 23, 2026
628ccc4
phase37: make undefined-call checks scope-aware
doublemover Feb 23, 2026
437dfbe
phase37: add invariant guardrail tests for stage history and triggers
doublemover Feb 23, 2026
546cd82
roadmap: mark phases 31 through 37 complete
doublemover Feb 23, 2026
5dd2990
Fix phase 31-37 audit regressions and harden perf paths
doublemover Feb 23, 2026
0d46911
Implement phase 38 lifecycle and static safety hardening
doublemover Feb 23, 2026
5eee67f
Implement phase 39 sound-event test overlap reduction
doublemover Feb 23, 2026
88ff998
Absorb root planning docs into roadmap phases 40-46
doublemover Feb 23, 2026
6ea5c50
Refine phases 40-47 with sequencing, risk gates, and rollout safeguards
doublemover Feb 23, 2026
7f139b0
Complete phase 40 MCP semantic editor objects and compatibility
doublemover Feb 23, 2026
91c495a
Complete phase 41 history retention and replay compression guardrails
doublemover Feb 23, 2026
be1a5b8
Complete phase 42 render throughput instrumentation and damage aggreg…
doublemover Feb 23, 2026
6efb624
Complete phase 43 MIDI UI expressive controls and intent model
doublemover Feb 23, 2026
b0267fd
Complete phase 44 runtime correctness and profile hardening
doublemover Feb 23, 2026
f0a053f
Complete phase 45 test suite condensation tier 3
doublemover Feb 23, 2026
6119212
Complete phase 46 privacy-first analytics
doublemover Feb 23, 2026
213f70e
Complete phase 47 cross-cutting risk retirement
doublemover Feb 23, 2026
1450df2
Harden MCP routing and add branch-wide regression coverage
doublemover Feb 23, 2026
b1d4089
Fix runtime regressions and expand branch-wide module coverage
doublemover Feb 23, 2026
8aee320
Harden runtime fallbacks and expand branch regression guards
doublemover Feb 23, 2026
eee5e75
Fix rendering/input regressions and expand guard coverage
doublemover Feb 23, 2026
441644d
Harden UI/runtime paths and add exhaustive regression coverage
doublemover Feb 23, 2026
3c1e72f
Harden MIDI/device refresh logic and tighten provider caching
doublemover Feb 23, 2026
ae02da9
Harden watch/scheduler/provider edge cases and extend coverage
doublemover Feb 23, 2026
37448c0
Fix watch fingerprints for Map/Set state pointers
doublemover Feb 23, 2026
9a99c82
Harden MCP polling/resource teardown and MIDI UI refresh logic
doublemover Feb 23, 2026
f9f87f7
Harden MCP/MIDI runtime edges and expand regression coverage
doublemover Feb 23, 2026
6126cb7
Fix render viewport/listener edge cases and add regressions
doublemover Feb 23, 2026
377f2e3
Harden render and MCP edge cases with regression tests
doublemover Feb 23, 2026
c9dab22
Harden MCP/session flows and expand runtime regression coverage
doublemover Feb 23, 2026
7f4f5f2
Guard GameView canvas listener wiring without window APIs
doublemover Feb 23, 2026
e3bd383
Harden pointer parsing and soak bench helpers with tests
doublemover Feb 23, 2026
989fe2e
Harden bench, MIDI, input, and watch lifecycle edge cases
doublemover Feb 23, 2026
38533c8
Harden procgen bindings and scheduler/polling edge paths
doublemover Feb 23, 2026
047fc6a
Fix editor palette hydration and style option edge cases
doublemover Feb 23, 2026
8e41540
Fix spectator/resource/procgen edge cases and add regressions
doublemover Feb 23, 2026
6399b6d
Validate --surface arguments for mcpb bundle builder
doublemover Feb 23, 2026
1af100e
Harden state-tool serialization and mcpb CLI arg validation
doublemover Feb 23, 2026
c261fc3
Clear pending MIDI UI refresh timers when disabling MIDI
doublemover Feb 23, 2026
c7bcaab
Tighten delta prev-field handling in state tool output
doublemover Feb 23, 2026
fe0ef3f
Default MCP surface registry to all surfaces when unset
doublemover Feb 23, 2026
d162cde
Trim requested MCP tool names before route candidate resolution
doublemover Feb 23, 2026
1b5bc43
Harden MCP event queue fallback cloning for circular payloads
doublemover Feb 23, 2026
e1a4ee3
Ignore empty spectator key payloads before keyboard injection
doublemover Feb 23, 2026
04ce159
Clamp spectator click offsets for tiny canvas metrics
doublemover Feb 23, 2026
4b98603
Document MCP surface parsing and registry helper contracts
doublemover Feb 23, 2026
7504703
Harden MCP summary filtering and resource meta clone fallbacks
doublemover Feb 23, 2026
0177370
Differentiate binary view fingerprints in watch pointer tracking
doublemover Feb 23, 2026
e894a20
Normalize MCP resource session ids during put and clear
doublemover Feb 23, 2026
f8cf8dd
Treat non-positive summary rect dimensions as invalid filters
doublemover Feb 23, 2026
142f02b
Add JSDoc for MCP fallback clone and session-id helpers
doublemover Feb 23, 2026
afd2efd
Rebalance buffered human summaries when retention shrinks
doublemover Feb 23, 2026
44c7392
Harden MCP handlers and typed-value edge cases
doublemover Feb 23, 2026
7d7c34e
Clamp MCP delta fanout and normalize session deletion
doublemover Feb 23, 2026
b33c741
Parallelize session teardown across active MCP sessions
doublemover Feb 23, 2026
c2525b7
Normalize malformed event resource URI payloads
doublemover Feb 23, 2026
a18735f
Normalize spectator port input before server listen
doublemover Feb 23, 2026
f17a6ac
Cap oversized state snapshot lemming fanout
doublemover Feb 23, 2026
76f1bbf
Harden numeric coercion and lemming rect filtering
doublemover Feb 23, 2026
0b4cf84
Harden spectator port parsing and state id snapshots
doublemover Feb 23, 2026
f48b93e
Harden bench numeric parsing against non-coercible inputs
doublemover Feb 23, 2026
bdad01d
Harden bench and test-runner numeric coercion paths
doublemover Feb 23, 2026
9c1fa2e
Fix whitespace hygiene regressions
doublemover Mar 13, 2026
993f2bf
Improve changed-file test selection defaults
doublemover Mar 13, 2026
4784643
Route maintained test scripts through runner
doublemover Mar 13, 2026
8500256
Add baseline-aware text hygiene guard
doublemover Mar 13, 2026
e1b17d3
Invalidate stage redraws on overlay visibility changes
doublemover Mar 13, 2026
3c16974
Make Playwright host configuration explicit
doublemover Mar 13, 2026
fc74edf
Fix text hygiene baseline drift
doublemover Mar 13, 2026
13127c7
Fix release readiness path handling across platforms
doublemover Mar 13, 2026
549b874
Fix release readiness path detection on Linux
doublemover Mar 13, 2026
c8d1fe6
Merge origin/master into aurora-touchpoint-atlas
doublemover May 5, 2026
58ebfdc
Complete PR 896 roadmap issue fixes
doublemover May 5, 2026
da1fe6f
Optimize hot path performance
doublemover May 5, 2026
a1290b1
Clean temp artifacts and fix audit issues
doublemover May 5, 2026
d67c3c5
Modularize history MCP and MIDI runtime
doublemover May 5, 2026
d8c3375
Complete large-file modularization
doublemover May 5, 2026
b7dda28
Replace custom undefined analyzer with ESLint guard
doublemover May 5, 2026
ec034bb
Complete hard cutovers and module cleanup
doublemover May 6, 2026
84cd2f1
Replace text hygiene baseline with git diff check
doublemover May 6, 2026
ed61a14
Generate localhost certs in CI
doublemover May 6, 2026
8c17dee
Rewrite active roadmap
doublemover May 6, 2026
0289aa3
Add generic E2E visual capture tooling
doublemover May 6, 2026
1f5c4a2
Fix time travel minimap replay state
doublemover May 6, 2026
3d42d70
Clean up docs source of truth
doublemover May 6, 2026
31bb186
Build MIDI sequencer workspace
doublemover May 6, 2026
589abf8
Add MIDI project import export templates
doublemover May 6, 2026
aeda7df
Add MIDI learn note capture
doublemover May 6, 2026
c4d1e0c
Add MIDI step clip recording
doublemover May 6, 2026
8a26ced
Add MIDI sequencer list keyboard navigation
doublemover May 6, 2026
41da688
Add MIDI step grid keyboard navigation
doublemover May 6, 2026
44ee844
Remove old MIDI panel leftovers
doublemover May 6, 2026
eaa1eba
Add MIDI source changed filter
doublemover May 6, 2026
17b39b7
Add MIDI source availability filter
doublemover May 6, 2026
0b60bb6
Add MIDI track output selector
doublemover May 6, 2026
fdd5c80
Add MIDI modulation lane removal
doublemover May 6, 2026
5fd1d7d
Add MIDI source revert control
doublemover May 6, 2026
aa6a5d9
Route MIDI tracks to selected outputs
doublemover May 6, 2026
ec8bd6b
Cut over MIDI runtime config to projects
doublemover May 6, 2026
68ca4fb
Align MIDI sequencer docs with cutover
doublemover May 6, 2026
7ae5482
Cover clip project mappings in MIDI router
doublemover May 6, 2026
1348397
Add MIDI chord inversion control
doublemover May 6, 2026
06c2173
Add MIDI time signature controls
doublemover May 6, 2026
7ce79a4
Cover MIDI time signature project flow
doublemover May 6, 2026
25e9004
Refresh MIDI roadmap wording
doublemover May 6, 2026
cb2abe0
Honor MIDI track voice budgets
doublemover May 6, 2026
1b4b3f0
Add MIDI arp clip mode control
doublemover May 6, 2026
95bdc66
Add MIDI direct arp mapping control
doublemover May 6, 2026
412bec5
Add MIDI arp pattern preset control
doublemover May 6, 2026
f7077e5
Add MIDI quantize swing controls
doublemover May 6, 2026
ebb96cd
Add MIDI automation operator control
doublemover May 6, 2026
73d1488
Add MIDI direct expression controls
doublemover May 6, 2026
f26f227
Add MIDI global envelope controls
doublemover May 6, 2026
fb91f7d
Cover new MIDI sequencer controls in E2E
doublemover May 6, 2026
10ed6b9
Add MIDI global duration controls
doublemover May 6, 2026
5358288
Add MIDI density modulation controls
doublemover May 6, 2026
d5a8dbb
Add MIDI global range controls
doublemover May 6, 2026
dd7cce8
Cover MIDI global modulation controls in E2E
doublemover May 6, 2026
5182bca
Route MIDI position runtime patches
doublemover May 6, 2026
4081f85
Add MIDI step duration editing
doublemover May 6, 2026
02dacf9
Add MIDI key and scale controls
doublemover May 6, 2026
1567ffa
Cover MIDI runtime patch globals
doublemover May 6, 2026
263729d
Cover MIDI track mixer controls in E2E
doublemover May 6, 2026
1713b6a
Add MIDI safety limit controls
doublemover May 6, 2026
706fe3a
Cover MIDI scheduler pressure status
doublemover May 6, 2026
38184c5
Cover MIDI safety limit controls in E2E
doublemover May 6, 2026
b2aa317
Add MIDI view pan shaping controls
doublemover May 6, 2026
e045b7e
Cover MIDI view pan shaping in E2E
doublemover May 6, 2026
8a11293
Add MIDI timbre range controls
doublemover May 6, 2026
d2afb1b
Add MIDI reverse panic toggle
doublemover May 6, 2026
282afa5
Add MIDI x note offset controls
doublemover May 6, 2026
4eba49f
Cover MIDI clip runtime lowering in E2E
doublemover May 6, 2026
e9a6d38
Cover MIDI clip step filtering
doublemover May 6, 2026
fcc5244
Cover MIDI learn range warnings
doublemover May 6, 2026
fdca877
Cover MIDI direct chord runtime E2E
doublemover May 6, 2026
e62d8ac
Cover MIDI panic button E2E
doublemover May 6, 2026
9cab954
Cover MIDI multi-track routing E2E
doublemover May 6, 2026
2ffb185
Cover MIDI direct runtime config in E2E
doublemover May 6, 2026
74009e2
Cover MIDI source assignment filters
doublemover May 6, 2026
d04c922
Cover MIDI no-device setup feedback
doublemover May 6, 2026
cab279c
Expand editor capture states
doublemover May 6, 2026
3dedf63
Polish editor accessibility states
doublemover May 6, 2026
52c284d
Cover editor NXLV round trip
doublemover May 6, 2026
6aa4edc
Align level editor docs with current UI
doublemover May 6, 2026
fe2eaf2
Cover editor validation fix workflow
doublemover May 6, 2026
bc18b7a
Enable editor one-way terrain workflow
doublemover May 6, 2026
c5e2ab2
Cover editor playtest runtime lowering
doublemover May 6, 2026
3caa817
Label editor validation severities
doublemover May 6, 2026
a94f4df
Add editor recent palette strip
doublemover May 6, 2026
3327990
Improve shortcut overlay focus handling
doublemover May 6, 2026
d52170e
Cover shortcut overlay focus behavior
doublemover May 6, 2026
5094ac7
Document editor classic one-way boundary
doublemover May 6, 2026
f7ea9df
Cover game shortcut overlay focus
doublemover May 6, 2026
96c41be
Cover classic editor save reload export workflow
doublemover May 6, 2026
46ecbc5
Keep level controls above MIDI workspace
doublemover May 6, 2026
633fce3
Polish MIDI audition and modulation lanes
doublemover May 6, 2026
cfa413d
Cover missing MIDI clip assignments
doublemover May 6, 2026
8d735e6
Improve MIDI capture and modulation accessibility
doublemover May 6, 2026
e6abced
Cover MIDI tablet layout overflow
doublemover May 6, 2026
1aeebc3
Make level arrows keyboard accessible
doublemover May 6, 2026
3d5053b
Announce MIDI output log updates
doublemover May 6, 2026
f1341f8
Accept npm capture CLI filters
doublemover May 6, 2026
9e22a21
Label MIDI sequencer editor buttons
doublemover May 6, 2026
f869773
Add MIDI step rest controls
doublemover May 6, 2026
cda224b
Clarify muted MIDI audition skips
doublemover May 6, 2026
55a4eaa
Expose MIDI sequencer status regions
doublemover May 6, 2026
8ec963e
Verify MIDI panic clears queue
doublemover May 6, 2026
c8c6110
Keep MIDI clip focus visible
doublemover May 6, 2026
68a7389
Log MIDI import failures
doublemover May 6, 2026
d14fdc3
Keep MIDI source filters keyboard active
doublemover May 6, 2026
a9ec2fa
Cover MIDI learn warning preview
doublemover May 6, 2026
72472a9
Expose MIDI conflict summary as status
doublemover May 6, 2026
1255cbb
Keep MIDI clip list keyboard active
doublemover May 6, 2026
ec33036
Describe MIDI source conflicts in row labels
doublemover May 6, 2026
0dcc9fa
Cover MIDI reducer selection sanitizing
doublemover May 6, 2026
7d56796
Announce MIDI source filter counts
doublemover May 6, 2026
80db27b
Limit MIDI recording to clip length
doublemover May 6, 2026
8f17366
Update MIDI sequencer guide polish notes
doublemover May 6, 2026
3605740
Require MIDI clips before recording
doublemover May 6, 2026
244ac0f
Disable MIDI clip assignment without clips
doublemover May 6, 2026
198fd7f
Require MIDI clips before clip mode
doublemover May 6, 2026
bf5707c
Remove implicit MIDI clip creation helper
doublemover May 6, 2026
36ec37d
Use visible MIDI listbox keyboard anchors
doublemover May 6, 2026
4ca4135
Confirm MIDI template resets in status
doublemover May 6, 2026
95d6e1d
Cover MIDI device recovery routing
doublemover May 6, 2026
ea91a89
Cancel MIDI capture flows with Escape
doublemover May 6, 2026
02bdcf2
Cover disabled MIDI automation adapter lanes
doublemover May 6, 2026
5f967bb
Allow MIDI recovery errors to wrap
doublemover May 6, 2026
35b029e
Match MIDI step grid ARIA to layout
doublemover May 6, 2026
b14565b
Detect missing MIDI automation tracks
doublemover May 6, 2026
55b2b39
Cover responsive MIDI step arrows
doublemover May 6, 2026
984e8f5
Wrap MIDI output log on narrow layouts
doublemover May 6, 2026
93de483
Preserve MIDI reservation routing metadata
doublemover May 6, 2026
7d5de97
Cancel MIDI recording before learn
doublemover May 6, 2026
d5ce536
Ignore invalid MIDI source track assignments
doublemover May 6, 2026
f00fa7d
Keep MIDI track listbox active
doublemover May 6, 2026
4cddf35
Preserve MIDI send routing metadata
doublemover May 6, 2026
1abf073
Show MIDI track output labels
doublemover May 6, 2026
b89911f
Ignore invalid MIDI automation track updates
doublemover May 6, 2026
ab0fe98
Ignore MIDI reducer identity updates
doublemover May 6, 2026
efd7e21
Aggregate MIDI scheduler routing rates
doublemover May 6, 2026
0518135
Summarize MIDI source route outputs
doublemover May 6, 2026
efad4a2
Preserve MIDI template save feedback
doublemover May 6, 2026
bcb182d
Confirm MIDI project exports in status
doublemover May 6, 2026
85b1872
Show queued MIDI scheduler pressure
doublemover May 6, 2026
bc07574
Confirm MIDI source reverts in status
doublemover May 6, 2026
e92baec
Confirm MIDI learn and recording commits
doublemover May 6, 2026
a879b3d
Add MIDI template keyboard shortcuts
doublemover May 6, 2026
503ae67
Scope MIDI direct source conflict summary
doublemover May 6, 2026
2ce6bf0
Guard MIDI source mode clip resolution
doublemover May 6, 2026
53e1c89
Cover MIDI step grid editing controls
doublemover May 6, 2026
a12ab2e
Cover MIDI track numeric clamp feedback
doublemover May 6, 2026
81e47e3
Cover MIDI hidden panel focus handoff
doublemover May 6, 2026
2d2d602
Expose MIDI automation point editing
doublemover May 6, 2026
0d06ecb
Remove selected MIDI clips safely
doublemover May 6, 2026
19171e6
Duplicate selected MIDI clips
doublemover May 6, 2026
0469381
Remove selected MIDI tracks safely
doublemover May 6, 2026
db922d0
Expose MIDI UI render metrics
doublemover May 6, 2026
38e8da9
Finish MIDI sequencer checkpoint polish
doublemover May 6, 2026
c44d3af
Update roadmap after MIDI checkpoint
doublemover May 6, 2026
874bea7
Productize level editor checkpoint
doublemover May 6, 2026
c9d43f9
Implement procgen streaming checkpoint
doublemover May 6, 2026
1b69bd7
Add solver foundation checkpoint
doublemover May 6, 2026
13406e1
Wire editor solver advisory validation
doublemover May 6, 2026
30e8d95
Verify procgen gap certificates
doublemover May 6, 2026
6a65bc0
Add editor solvability check command
doublemover May 7, 2026
fa23b6a
Verify procgen certificates in E2E
doublemover May 7, 2026
5a7d289
Implement milestone gauntlet
doublemover May 7, 2026
729b3af
Merge pull request #952 from doublemover/roundabout-milestone-gauntlet
doublemover May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
37 changes: 37 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,55 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.2.2
with:
fetch-depth: 0
- uses: actions/setup-node@v4.2.0
with:
node-version: 20
cache: npm
cache-dependency-path: package-lock.json
- run: npm ci
- run: npm audit --audit-level=moderate
- run: npx playwright install --with-deps chromium
- run: npm run format
- name: Check changed-line whitespace
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
git diff --check "origin/${{ github.base_ref }}...HEAD"
else
git diff --check "${{ github.event.before }}...HEAD"
fi
- run: git diff --exit-code
- run: npm run check-undefined
- run: npm run lint
- run: npm run typecheck:critical
- run: npm run release-readiness
- run: npm run depcheck
- run: npm run check-mcp-clients
- run: npm run test-bench-unit
- run: npm test
- name: Create localhost HTTPS cert
run: |
mkdir -p certs
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout certs/localhost-key.pem \
-out certs/localhost.pem \
-days 1 \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
- name: Start HTTPS server
run: |
npm run start-https > /tmp/lemmings-http.log 2>&1 &
echo $! > /tmp/lemmings-http.pid
node -e "const https=require('node:https'); const started=Date.now(); const tick=()=>{const req=https.get('https://localhost:8080/?e2e=1',{rejectUnauthorized:false},res=>{res.resume(); process.exit(0);}); req.on('error',()=>{if(Date.now()-started>30000) process.exit(1); setTimeout(tick,500);});}; tick();"
- run: npm run test-mcp-smoke
- run: npm run bench-smoke
- name: Stop HTTPS server
if: always()
run: |
if [ -f /tmp/lemmings-http.pid ]; then
kill "$(cat /tmp/lemmings-http.pid)" || true
fi
- run: npm run coverage
- uses: actions/upload-artifact@v4
with:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,4 @@ test/processhtmlfile.test.js
test/processhtmlfile.test.js
playwright-report/
test-results/
temp/
3 changes: 2 additions & 1 deletion MCP_COMPAT_PUBLISHING/manifest.example.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
"args": ["${__dirname}/server/index.js"],
"env": {
"LOG_LEVEL": "info",
"API_KEY": "${user_config.api_key}"
"API_KEY": "${user_config.api_key}",
"LEMMINGS_MCP_SURFACES": "game,editor,interact"
}
}
},
Expand Down
48 changes: 30 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,23 +151,33 @@ Keybindings are configurable in `keybindings.json`. The in-game defaults map to

## MIDI

- Enable MIDI from the left control panel (toggle persists).
- When disabled, WebMIDI is not enabled and the MIDI router is detached.
- Use the I/O section for Input/Output, Input channel, and `MIDI reset`.
- Input channel defaults to `Omni` and can be set to a specific 1-16 channel.
- Use `reset all` to clear stored configuration and UI state.
- Base BPM is the sequencing anchor; current BPM shows `speed x base`, plus ticks per second/beat/measure.
- Global FX tab:
- Intensity and Accent adjust default velocity and density scaling.
- Positional Modifiers add X/Y mappings (with optional operators) and per-target min/max ranges.
- Global Repeat applies a beat window, max count, target, and amount to scale parameters on rapid repeats.
- Events/Triggers tabs:
- Configure each SFX event or trigger with mode (note/degree/chord), key+octave, or scale degree + octave.
- Chords support triad, seventh, sixth, ninth, power, sus2, sus4, and octave.
- Arps support up/down/updown; triggers can optionally run independent arps per source.
- ADSR tab lets you target Global, a specific SFX, or a trigger to override envelope values.
- UI state is stored in localStorage. Defaults come from `midi-mapping.json` and apply only on first run or when a value is missing.
- Full defaults and customization notes live in `midi-mapping.json` and `docs/midi-mapping.md`.
- The in-game MIDI sequencer workspace is layered over `/` with transport
setup, source browser, track routing, inspector, clip editing, and output
status regions.
- Enable MIDI from the transport strip, then choose WebMIDI input/output
devices and an input channel. Panic sends all-notes-off and clears queued
notes.
- Editable state is stored only as `lemmings.midi.project.v1`. Fresh projects
are created from the checked-in `midi-mapping.json` factory template, and
legacy MIDI storage keys are cleared on load.
- Use the source browser to search and filter SFX events, trigger types, MIDI
flags, system events, changed sources, sources available in the current
level, assigned/unassigned sources, and conflict status.
- Tracks route sources to channels and output devices with mute, solo, arm,
velocity scale, priority, and voice budget controls.
- The inspector edits direct note/degree/chord/velocity/duration/envelope
mappings, assigns clips, audits conflicts, and auditions the selected source
or clip through the selected track.
- Clips support step, chord, and arp types. Step clips expose note, velocity,
probability, hold, and tie controls, plus keyboard navigation across the grid.
- Save Template, Export, and Import move sanitized project/template JSON through
the project validator.
- Learn captures a pending MIDI note assignment for a selected direct source.
Record captures a short mocked or live MIDI phrase into consecutive clip
steps.
- Full defaults and runtime mapping notes live in `midi-mapping.json` and
`docs/midi-mapping.md`. Current UI behavior is documented in
`docs/midi-ui.md`.

### MIDI input mapping

Expand Down Expand Up @@ -229,6 +239,7 @@ Keybindings are configurable in `keybindings.json`. The in-game defaults map to

## Docs

- Index: [docs/README.md](docs/README.md)
- Usage: [docs/usage.md](docs/usage.md)
- Offline tools: [docs/offline-tools.md](docs/offline-tools.md)
- Exporting sprites: [docs/exporting-sprites.md](docs/exporting-sprites.md)
Expand All @@ -249,7 +260,8 @@ mode. Touch input still needs polish, so please file bugs for any issues you hit

## Roadmap

See [docs/roadmap.md](docs/roadmap.md) for the consolidated roadmap and phases.
See [docs/roadmap.md](docs/roadmap.md) for the active roadmap. Completed
phases live in git history.

## Credits

Expand Down
Loading
Loading