A research project in music notation
Solo Composer
A research project to see whether I could build music notation software myself. Closely modelled on Steinberg's Dorico rather than a product in its own right, it's where I explore Rust, native rendering, audio and letting AI agents drive an app through MCP.

Highlights
Notation from musical rules
Barlines, ties and beaming are worked out from the music, so edits never leave a score inconsistent.
Parsing in milliseconds
Moved from TypeScript to Rust after measuring performance. A typical score now parses in a few milliseconds.
Rendering that doesn't repeat itself
Cached, backend-neutral draw instructions mean scrolling and selection don't recompute every frame. Skia runs on Metal on macOS and OpenGL elsewhere.
Real instruments
Hosts VST3 instruments, with the native layer built with Claude Code against an architecture I designed.
Driven by agents
Every app action is an MCP tool over local HTTP, so agents can create and edit scores.
The idea
Music notation is a surprisingly deep problem, and I wanted to see if I could build it. Solo Composer is a research project, not a product. Its design is closely modelled on Steinberg's Dorico, down to the way it's organised into modes, because the question I was interested in was how software like that works, not what a new notation app should be.
It began in 2020 as a web app with a Rust/WebAssembly engine. The current version, a native desktop app built with Tauri, has been in development since December 2024.
A score model built on musical rules
Instead of storing notation directly, the app stores musical events (notes, tempo changes, time signatures) and derives what you see by musical rules: where barlines fall, when a note needs a tie across one, how beams group. That keeps the data simple to edit, and the engraving consistent.
Parsing started in TypeScript. After profiling, I moved it to Rust, and a typical score now parses in a few milliseconds.
Rendering and audio
Drawing goes through cached, backend-neutral draw instructions, so scrolling and selection don't recompute the layout every frame. Skia does the drawing natively, with Metal on macOS and OpenGL elsewhere. Playback uses a multi-instrument sampler with expression and tempo control, and the app can host VST3 instruments.
I designed the architecture and implemented the native Skia layer and VST3 hosting with Claude Code.
Built for agents
The running app serves MCP over streamable HTTP on localhost. Every automation action becomes a generated MCP tool, alongside an onboarding tool that explains the domain model and the recommended order of calls. An agent in Claude Code or VS Code can connect and create or edit a score directly.
Details
- Type
- Personal project
- Role
- Sole developer: architecture, engine and UI
- When
- 2020 – present
- Platforms
- macOS, Windows, Linux
- Built with
- Tauri, Rust, React, TypeScript, Skia, Web Audio, VST3, MCP, Vite, Tailwind CSS, Vitest