Conversation
…ck visibility management and instrument family mapping.
…nt and adding a track accordion for multi-track files, improving user experience in the settings UI.
…better visual alignment
…ume adjustments and enhancing the multi-track accordion UI for better user interaction.
…acking and improving track mute functionality.
…oundfont selection based on instrument family.
…ness variation based on track index, improving user experience in the multi-track accordion UI.
…etadata, enabling tooltip display of track names in the piano roll UI.
…while removing unused components.
…e callbacks for file add requests to support VS Code integration, and implement drag-and-drop functionality for audio files.
… filenames with extensions and adding debug logging for file additions.
…update CHANGELOG for version 0.4.0; move acknowledgments to NOTICE file; clean up LICENSE; enhance README with multi-instrument MIDI support details.
…dio` in documentation and changelog.
…o match container dimensions.
…ngle link with Open VSX support.
There was a problem hiding this comment.
Pull request overview
This release adds comprehensive multi-instrument MIDI support to the Wave-Roll application, enabling users to work with complex multi-track MIDI files. The PR introduces General MIDI program detection, per-track visibility/mute/volume controls, automatic soundfont mapping, and enhanced UI elements to manage multiple tracks within a single MIDI file.
Key Changes:
- Added GM instrument family detection and auto soundfont routing for multi-instrument playback
- Implemented per-track controls (visibility, mute, volume, sustain, auto-instrument toggle)
- Enhanced UI with track accordions, instrument icons, and color-coded track indicators
Reviewed changes
Copilot reviewed 43 out of 45 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
wave-roll-logo.png |
Added new PNG logo asset for branding |
test/multi-midi-manager.test.ts |
Added comprehensive tests for track visibility filtering and GM instrument mapping |
test/instrument-icons.test.ts |
Added tests for instrument icon registry and fallback handling |
src/lib/core/visualization/piano-roll/utils/color-calculator.ts |
Added HSL color conversion and track variant color generation |
src/lib/core/visualization/piano-roll/types-internal.ts |
Extended FileInfo to include track metadata for tooltips |
src/lib/core/visualization/piano-roll/piano-roll.ts |
Updated tooltip rendering to show track names, fixed canvas responsive layout |
src/lib/core/utils/midi/types.ts |
Added InstrumentFamily type and TrackInfo interface for multi-instrument support |
src/lib/core/state/types.ts |
Added uniformTrackColor visual state option |
src/lib/core/state/default.ts |
Set default uniformTrackColor to false |
src/lib/core/playback/core-playback-engine.ts |
Reformatted code and added preload logic for auto-instrument samplers |
src/lib/core/parsers/midi-parser.ts |
Added GM program detection, instrument family mapping, and per-track metadata extraction |
src/lib/core/midi/types.ts |
Extended MidiFileEntry with per-track visibility, mute, volume, and auto-instrument state |
src/lib/core/midi/multi-midi-manager.ts |
Implemented track-level control methods and filtered note visibility by track |
src/lib/core/midi/file-entry.ts |
Added VS Code webview detection to preserve file extensions |
src/lib/core/controls/loop-controls.ts |
Fixed icon reference and formatting improvements |
src/lib/core/audio/unified-audio-controller.ts |
Added preloadAutoInstrumentSamplers method and reformatted code |
src/lib/core/audio/managers/sampler-manager.ts |
Implemented program-based sampler cache with lazy loading and track-aware playback |
src/lib/core/audio/managers/midi-player-group.ts |
Added program sampler support, pending player states, and track-level volume/mute handling |
src/lib/core/audio/gm-instruments.ts |
Added GM instrument names, soundfont URLs, and helper functions |
src/lib/components/ui/types.ts |
Added file drop control, VS Code integration callbacks, and data file handling |
src/lib/components/ui/settings/sections/wave-list.ts |
Converted to drag-and-drop zone UI with visual feedback |
src/lib/components/ui/settings/sections/solo-appearance.ts |
Code formatting improvements |
src/lib/components/ui/settings/sections/file-list.ts |
Added track accordions, uniform color toggle, and drag-and-drop zone |
src/lib/components/ui/settings/modal/index.ts |
Updated modal title from "Tracks" to "Files" |
src/lib/components/ui/file/toggle-manager.ts |
Updated button text from "Tracks" to "Files" |
src/lib/components/ui/file/components/file-toggle-item.ts |
Added track accordion with per-track controls and instrument icons |
src/lib/components/ui/controls/settings.ts |
Updated comment referencing modal title |
src/index.ts |
Added WaveRollPlayer export for external consumption |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| /** Common SVG attributes for consistent styling */ | ||
| const SVG_ATTRS = `width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"`; |
There was a problem hiding this comment.
Unused variable SVG_ATTRS.
| /** Common SVG attributes for consistent styling */ | |
| const SVG_ATTRS = `width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="pointer-events: none;"`; |
| const sw = Math.max(1, baseStroke); | ||
|
|
||
| // Base grid coordinates | ||
| const w = 24; |
There was a problem hiding this comment.
Unused variable w.
| const w = 24; |
|
|
||
| // Base grid coordinates | ||
| const w = 24; | ||
| const h = 24; |
There was a problem hiding this comment.
Unused variable h.
| const h = 24; |
| case "square": { | ||
| const d = r / Math.SQRT2; | ||
| return `<rect x="${cx - d}" y="${cy - d}" width="${2 * d}" height="${2 * d}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}"/>`; | ||
| const d = r / Math.SQRT2; // Make square fit within the circle radius area approx |
There was a problem hiding this comment.
Unused variable d.
| const d = r / Math.SQRT2; // Make square fit within the circle radius area approx |
| import { | ||
| DEFAULT_SAMPLE_MAP, | ||
| AUDIO_CONSTANTS, | ||
| AudioPlayerState, |
There was a problem hiding this comment.
Unused import AudioPlayerState.
| AudioPlayerState, |
Added
Changed