Release MIDI Tools v0.1.0

This commit is contained in:
2026-09-01 14:22:42 +02:00
commit 4b51a6d903
58 changed files with 10240 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
# Accessibility
All import, edit, filter, playback and export controls use native labelled controls. Status changes use a polite live region, warnings include text, tables have header cells and the piano roll has an accessible SVG title with per-note descriptions. The timeline is keyboard-scrollable, focus is visible, layouts collapse on narrow screens and the shared shell provides system/light/dark themes. Reduced-motion preferences are respected.
+7
View File
@@ -0,0 +1,7 @@
# Architecture
`core/midi.ts` turns a bounded SMF byte stream into inert tracks and absolute-tick events. Chunk boundaries, four-byte VLQs, running status, event counts, SysEx size, PPQN division and known fixed-length meta events are validated before data is exposed. Editing functions clone this model and preserve stable event ordering.
`Workbench.tsx` keeps the last valid document during failed imports or operations. The SVG piano roll renders at most 5,000 notes. Playback maps ticks through the tempo map, creates fixed application-owned sine oscillators and can stop immediately by closing the active `AudioContext`; imported bytes never become code or remote references.
All Vite assets use relative paths for nested portal mounting. Release packaging fixes ZIP ordering, timestamps and permissions.
+5
View File
@@ -0,0 +1,5 @@
# Privacy and security
MIDI bytes are read into browser memory only. The application has no telemetry, account, database, remote asset or network client. CSP restricts connections and media to the application origin or local blobs.
Parsing and export enforce an 8 MiB file bound, 256 tracks, 250,000 events, a 1 MiB aggregate SysEx bound, four-byte VLQs and signed-safe absolute ticks. Playback is explicitly user started, schedules at most 2,000 notes and is stopped by closing its audio context. Imported text appears only as escaped React text and is never interpreted as markup, script, URL or shader.