Skip to content

Conversation

@daiverd
Copy link
Contributor

@daiverd daiverd commented Aug 26, 2025

  • feat: Add MIDI service and GMCP client package
  • feat: Add JZZ and JZZ-synth-tiny
  • feat: allow gmcp packages to enable or disable themselves
  • fix: prevent MIDI activeNotes timeout collisions across channels
  • feat: Add MIDI device persistence to preferences
  • feat: Replace Web MIDI API with JZZ.js for enhanced device management
  • feat: Enhance MIDI UI with auto-reconnection and device monitoring
  • feat: Restore virtual MIDI synthesizer initialization

David Sexton and others added 8 commits August 25, 2025 06:40
- Add MidiService for managing MIDI devices and playback
- Add GMCPClientMidi for handling GMCP MIDI messages
- Add MidiStatus component for device selection and management
- Shows available MIDI outputs and current connection status
- Allows users to select and connect to MIDI devices
- Add MIDI tab to preferences dialog
- Allow users to enable/disable MIDI functionality
- Register MIDI GMCP package in App.tsx
- Add MIDI all-notes-off to Escape key handler
- Add MIDI tab to sidebar when enabled in preferences
- Handle GMCP MIDI support advertisement based on user preferences
Add jzz and jzz-synth-tiny packages to enable virtual MIDI synthesizer
functionality using Web Audio API.
Add VirtualMidiService class that wraps JZZ-synth-tiny functionality:
- Registers "Virtual Synthesizer" as available MIDI output device
Update MidiService to support virtual synthesizer:
- Add virtual synthesizer to getOutputDevices() list
Add enabled property to GMCPPackage base class:
- Add enabled getter to base GMCPPackage (defaults to true)
- Override enabled in GMCPClientMidi to check preferences
- Update Core.Supports.sendSet() to filter by enabled packages
- Change MIDI packageVersion from undefined to 1
- MIDI included in initial Core.Supports.Set when enabled in preferences, disabled when checkbox is unchecked in preferences
- Any future package can easily implement conditional inclusion in core.supports
Fix memory leak in GMCPClientMidi where activeNotes Map used only note
numbers as keys, causing timeout conflicts when same notes played on
different MIDI channels. Now uses composite "${note}_${channel}" keys
to ensure proper timeout isolation and cleanup.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Add lastInputDeviceId and lastOutputDeviceId to MidiPreferences
- Enable auto-reconnection to previously used devices on app restart

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Replace navigator.requestMIDIAccess with JZZ() for better cross-platform support
- Add comprehensive device change detection with onChange() event handling
- Implement connection state tracking and auto-reconnection logic
- Add device persistence with preferences integration
- Enhance virtual synthesizer initialization with proper JZZ refresh
- Support both hardware and virtual MIDI devices consistently
- Add methods for device enumeration, reconnection, and cleanup

Key improvements:
- Real-time device connect/disconnect detection
- Auto-reconnection to last used devices on startup
- Better error handling and connection state management
- Unified device management through JZZ.js

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Add real-time connection state display with visual indicators
- Implement auto-reconnection for previously used devices
- Show reconnection suggestions when last-used devices become available
- Add device connection events display with timestamps
- Enhance device refresh functionality with virtual synthesizer support
- Add comprehensive error handling for connection attempts
- Poll connection state to catch auto-reconnections and device changes
- Improve user feedback with connection status and event logging

UI improvements:
- Visual connection status (✓ Connected device names)
- Blue/green reconnection suggestion boxes
- Device connection events timeline
- Enhanced refresh button with full initialization
- Real-time device list updates

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Restore virtual synthesizer initialization in App component
- Maintain compatibility with existing virtual MIDI functionality
- Ensure virtual synthesizer appears in device list on startup

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@ctoth ctoth merged commit 12eb2fd into master Aug 26, 2025
1 check passed
github-actions bot pushed a commit that referenced this pull request Aug 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants