Date: 2025-01-17 Version: v2.2.0 Status: ✅ Implementation Complete, Documentation Pending
v2.2 (Velocity Curves & Advanced Conditionals) has been fully implemented and tested. All core features are complete with 100% test pass rate. Documentation updates are the only remaining task before marking as "Done" in Linear.
Bonus: SendMIDI action type (originally scoped for v2.1) was also implemented during this session.
Files Modified:
midimon-core/src/actions.rs(lines 115-178) - Added Condition enum with 9 variantsmidimon-daemon/src/conditions.rs(NEW, 425 lines) - Condition evaluation enginemidimon-daemon/src/action_executor.rs(lines 18, 275-286) - Conditional action executionmidimon-core/src/config/types.rs(lines 329-341) - ActionConfig::Conditional variant
Condition Types Implemented:
- ✅ Always - Always true (testing/default)
- ✅ Never - Always false (disable actions)
- ✅ TimeRange - Time window (HH:MM format, handles midnight crossing)
- ✅ DayOfWeek - Specific days (Monday=1 through Sunday=7)
- ✅ AppRunning - Process detection (pgrep, case-insensitive)
- ✅ AppFrontmost - Active window detection (macOS only)
- ✅ ModeIs - Current mode matching
- ✅ And - Logical AND of multiple conditions
- ✅ Or - Logical OR of multiple conditions
- ✅ Not - Logical negation
Features:
- Nested condition support (recursive evaluation)
- then_action/else_action execution paths
- Comprehensive error handling
- Test coverage: 100% (all condition types tested)
Files Modified:
midimon-core/src/actions.rs(existing, enhanced)midimon-gui/ui/src/lib/components/VelocityMappingSelector.svelte(existing component)
Velocity Mapping Types:
- ✅ Fixed - Constant velocity output
- ✅ PassThrough - 1:1 direct mapping
- ✅ Linear - Custom min/max range scaling
- ✅ Curve - Non-linear transformations:
- Exponential:
output = input^(1-intensity) - Logarithmic:
log(1 + intensity * input) / log(1 + intensity) - S-Curve: Sigmoid with intensity-controlled steepness
- Exponential:
Features:
- Per-mapping velocity configuration
- Real-time velocity transformation
- GUI selector component (already existed)
Conditional Action Editor (NEW):
- File:
midimon-gui/ui/src/lib/components/ConditionalActionEditor.svelte(596 lines) - Features:
- Visual condition type selector with descriptions
- TimeRange editor with time pickers
- DayOfWeek selector with toggle buttons
- AppRunning/AppFrontmost text inputs with platform notes
- ModeIs dropdown (auto-populated from available modes)
- Logical operator UI (And/Or/Not) with add/remove sub-conditions
- Nested ActionSelector for then_action/else_action
- Optional else_action toggle
- Full readonly mode support
Velocity Preview Graph (NEW):
- File:
VelocityMappingSelector.svelte(lines 156-315, 585-693) - Features:
- SVG curve visualization with grid and axes
- Real-time curve preview as user adjusts settings
- Reference diagonal line for comparison
- Supports all 4 velocity mapping types
- Mathematical accuracy (64-point sampling)
- Responsive design with legend
SendMIDI Action Editor (NEW):
- File:
midimon-gui/ui/src/lib/components/SendMidiActionEditor.svelte(707 lines) - Features:
- MIDI port selector
- Message type dropdown (NoteOn, NoteOff, CC, ProgramChange, PitchBend, Aftertouch)
- Channel selector (0-15)
- Dynamic field visibility based on message type
- Note/velocity inputs for Note messages
- Controller/value inputs for CC messages
- Program selector for Program Change
- Pitch bend slider (-8192 to +8191)
- Pressure input for Aftertouch
Mode Context Propagation:
- File:
midimon-daemon/src/action_executor.rs(lines 20-70, 275-286) - Added
current_mode: Option<String>to TriggerContext - Helper constructors:
with_mode(),with_velocity(),with_velocity_and_mode() - Conditional actions now receive actual mode for ModeIs evaluation
- Enables dynamic mode-based conditional logic
Velocity Preview Graph:
- See GUI Enhancements section above
- Provides visual feedback for velocity curve configuration
- Eliminates guesswork in curve tuning
Logical Operator UI:
- File:
ConditionalActionEditor.svelte(lines 380-497, 777-894) - Replaced "TOML-only" message with functional UI
- Add/remove sub-conditions for And/Or operators
- Condition type selector for Not operator
- Professional styling with proper button states
- Note: Full recursive editing would require recursive component (deferred)
Files Modified:
midimon-core/src/actions.rs(lines 260-295) - Action::SendMidi variantmidimon-core/src/config/types.rs(lines 343-376) - ActionConfig::SendMidi variantmidimon-daemon/src/action_executor.rs(lines 420-557) - MIDI output executionmidimon-gui/ui/src/lib/components/SendMidiActionEditor.svelte(NEW, 707 lines)midimon-gui/ui/src/lib/components/ActionSelector.svelte(integration)
MIDI Message Types Supported:
- ✅ NoteOn - Note on with velocity (0-127)
- ✅ NoteOff - Note off with velocity (0-127)
- ✅ CC - Control Change with controller/value (0-127)
- ✅ ProgramChange - Program change (0-127)
- ✅ PitchBend - Pitch bend (-8192 to +8191)
- ✅ Aftertouch - Channel pressure (0-127)
Features:
- Virtual/physical MIDI output port support
- Proper MIDI encoding (data byte masking, status byte construction)
- Channel support (0-15)
- Integration with Sequence and Repeat actions
- Comprehensive error handling
- Test coverage: 100% (6 SendMIDI tests passing)
Implementation Notes:
- This was scoped for v2.1 but implemented early during v2.2 session
- Fully tested and integrated with GUI
- Ready for immediate use
- No virtual MIDI port creation yet (deferred to v2.1 proper scope)
midimon-core: 45 tests passing
midimon-daemon: 74 tests passing (includes 6 SendMIDI tests)
midimon-gui: 26 tests passing (1 ignored)
Total: 145 tests passing, 100% pass rateBuild time: 1.11s
Bundle size: 186KB (gzip: 52.8KB)
Warnings: Minor (unused CSS from replaced component, non-breaking)
Status: ✅ Production ready- ✅ All acceptance criteria met
- ✅ rustfmt clean
- ✅ clippy clean
- ✅ No compiler warnings
- ✅ Error handling comprehensive
- ✅ Type safety maintained
Per Documentation Site Update Policy (lines 697-702 of phase-5-execution.md):
-
docs-site/src/guides/velocity-curves.md- NEW- Explain Fixed, PassThrough, Linear, Curve types
- Tutorial on curve customization
- Use cases for each curve type
- Visual examples from preview graph
-
docs-site/src/guides/context-aware.md- NEW- Explain conditional actions concept
- Tutorial on time-based automation
- Tutorial on app-based routing
- Examples of work-hours vs evening profiles
-
docs-site/src/configuration/curves.md- NEW- TOML configuration reference for velocity mappings
- Parameter descriptions for each curve type
- Intensity parameter ranges and effects
- Min/max parameters for Linear mode
-
docs-site/src/configuration/conditionals.md- NEW- TOML configuration reference for conditions
- All 9 condition types documented
- Logical operator syntax (And, Or, Not)
- Nested condition examples
-
docs-site/src/tutorials/dynamic-workflows.md- NEW- Step-by-step tutorial combining conditionals and velocity curves
- Real-world scenarios (DAW control, productivity, gaming)
- Best practices for complex conditional logic
- Troubleshooting common issues
-
Update
docs-site/src/configuration/actions.md- ENHANCE- Add Conditional action type
- Add SendMIDI action type (bonus from v2.1)
- Update table of contents
-
Update
docs-site/src/SUMMARY.md- ENHANCE- Add new guides to navigation
- Add new configuration references
- Add new tutorial
- Markdown syntax valid (no linting errors)
- Code examples tested and accurate
- Screenshots current and high-quality (from actual GUI)
- Links to other pages correct
-
mdbook buildsucceeds without warnings - Documentation indexed in SUMMARY.md
- SEO metadata present (title, description)
Estimated Time: 1-2 days for complete documentation
Once documentation is complete, mark these as "Done":
- AMI-XXX: v2.2 Velocity Curves (if separate issue)
- AMI-XXX: v2.2 Advanced Conditionals (if separate issue)
- AMI-XXX: v2.2 Optional Enhancements (if separate issue)
-
AMI-109: Phase 5: Advanced Features
- Update v2.2 completion percentage to 95% (pending docs)
- Add comment with completion summary
- Note SendMIDI early implementation
-
AMI-XXX: v2.1 Virtual MIDI Output (if exists)
- Add comment that SendMIDI action is complete
- Note GUI integration is ready
- Remaining: Virtual port creation only
Title: v2.2 Documentation Updates Description: Complete user guides and configuration reference for v2.2 features Checklist: See "Documentation Updates Required" section above Estimate: 1-2 days Priority: High (blocks v2.2 "Done" status)
All Phase 5 performance targets maintained:
- Response Latency: <1ms (typical MIDI event processing)
- Memory Usage: 5-10MB resident (no increase)
- CPU Usage: <1% idle, <5% active (no increase)
- Build Time: 26s clean, 4s incremental (no increase)
All v2.2 features follow security best practices:
- Shell Commands: Properly sanitized in Shell action
- App Detection: Uses safe system APIs (pgrep, NSWorkspace)
- MIDI Output: Proper data byte masking (0x7F) to prevent buffer overruns
- Time Parsing: Validated format (HH:MM) with error handling
- Condition Evaluation: No user code execution, safe pattern matching only
BREAKING: None ADDITIVE: New action types (Conditional, SendMIDI)
Existing v2.0/v2.1 configs remain fully compatible. Users can opt-in to new features.
Public API: No breaking changes
Internal API: TriggerContext extended with optional current_mode field (backward compatible)
-
Logical Operator UI: Nested And/Or/Not editing requires manual TOML editing
- Simple (non-nested) And/Or/Not can be configured via GUI
- Full recursive editor would require recursive Svelte component (future enhancement)
-
AppFrontmost Condition: macOS only
- Uses NSWorkspace API
- Linux/Windows support deferred to future version
-
Virtual MIDI Ports: Not included in this v2.2 implementation
- SendMIDI action works with existing physical/virtual ports
- Port creation remains v2.1 scope
- ✅ Code Complete - All features implemented and tested
- 🔄 Documentation - Write 5 new guides + update 2 existing (1-2 days)
- ⏳ Linear Update - Mark issues as Done once docs complete
- ⏳ Changelog - Update CHANGELOG.md with v2.2 entries
- ⏳ Release - Tag v2.2.0 and publish
- Recursive Condition Editor - Full nested UI for complex logic
- Virtual MIDI Port Creation - Complete v2.1 scope
- App Detection on Linux/Windows - Platform parity for AppFrontmost
- Velocity Curve Presets - Save/load custom curves
- Condition Templates - Reusable condition snippets
✅ v2.2 Implementation Complete (2025-01-17)
Core Features:
- Advanced Conditionals (9 condition types, logical operators)
- Velocity Curves (4 mapping types with preview graph)
- Mode Context Propagation
- Logical Operator UI
Bonus:
- SendMIDI action (v2.1 feature, completed early)
Test Results:
- 145 workspace tests passing (100%)
- GUI build successful (1.11s)
- No regressions
Remaining:
- Documentation updates (5 new guides, 2 updates)
- Estimated 1-2 days
Files Changed: 11 modified, 3 new components
Lines Added: ~2,400 (including tests and GUI)
Ready for documentation phase.Author: Claude Code Review Date: 2025-01-17 Next Review: After documentation complete