System Architecture
Lumix is a .NET-based Digital Audio Workstation (DAW) built with a modular architecture that separates concerns between UI rendering, audio processing, and plugin management.Core Technologies
Lumix leverages several open-source libraries:- ImGui.NET - UI framework wrapping dear-imgui
- NAudio - Audio playback and processing
- DryWetMidi - MIDI file handling
- VST.NET - VST2 plugin support
- Veldrid - Graphics rendering abstraction
Architectural Layers
Presentation Layer
ImGui-based UI rendering for arrangement view, piano roll, device controls, and preferences
Audio Engine
NAudio-based audio processing pipeline with track engines, mixers, and sample providers
Plugin System
Unified interface for built-in and VST plugins with audio processing chains
Data Layer
Tracks, clips, MIDI data, and audio files management
Key Components
Program Entry Point
The main application initializes inProgram.cs:
Program.cs
Track System
Track Hierarchy
Track Hierarchy
Lumix uses an abstract
Track base class with specialized implementations:- AudioTrack - Handles audio clips and audio file playback
- MidiTrack - Manages MIDI clips and virtual instruments
- GroupTrack - Groups multiple tracks together
- MasterTrack - Final output mixer
TrackEngine- Audio processing pipelineList<Clip>- Timeline clips- Controls - Volume, pan, solo, mute, recording
Track Engine Architecture
Track Engine Architecture
The Audio Processing Flow:
TrackEngine abstract class defines the audio processing pipeline:Clip System
Clips represent audio or MIDI data on the timeline:- AudioClip - References
AudioClipDatacontaining audio file information - MidiClip - Contains
MidiClipDatawith MIDI events
Clip class:
Clips/Clip.cs
Plugin System
See Building Plugins for detailed plugin development guide. TheIAudioProcessor interface unifies all plugin types:
Plugins/IAudioProcessor.cs
The plugin chain processes audio serially through each enabled plugin in order.
View System
The UI is organized into specialized view components:ArrangementView
Main timeline view showing tracks, clips, and timeline controlsLocated in:
Views/Arrangement/ArrangementView.csDevicesView
Shows plugin chains and track devices for the selected trackLocated in:
Views/DevicesView.csMidiClipView / Piano Roll
MIDI editing interface with piano roll, note placement, and editingLocated in:
Views/Midi/MidiClipView.cs and PianoRoll.csAudio Processing Pipeline
Lumix uses NAudio’sISampleProvider pattern for audio processing:
Sample Provider Chain
Each track’s audio flows through:- MixingSampleProvider - Combines multiple clip sources
- PluginChainSampleProvider - Processes through plugins
- StereoSampleProvider - Applies panning
- MeteringSampleProvider - Measures volume levels
- TrackStateSampleProvider - Applies mute/solo state
Timeline and Musical Time
Lumix uses a tick-based timing system:- PPQ (Pulses Per Quarter) - Default 960 ticks per beat
- Musical Time - Bars:Beats:Ticks notation
- TimeLineV2 - Manages playback position and tempo
MusicalTime.cs
State Management
Lumix maintains application state through static managers:- ArrangementView.Tracks - All tracks in the project
- ArrangementView.SelectedClips - Currently selected clips
- DevicesView.SelectedTrack - Active track for device view
- TimeLineV2 - Playback state and position
Rendering Architecture
ImGui Rendering
Lumix uses immediate-mode GUI rendering:Custom Rendering
Clips and waveforms use ImGui’sDrawList for custom graphics:
Project Structure
Performance Considerations
- Audio processing runs on dedicated audio callback thread
- UI rendering runs on main thread at ~60 FPS
- Plugin processing uses circular buffers for VST compatibility
- Clips use cached waveform data for rendering performance
Next Steps
Contributing
Learn how to contribute to Lumix development
Building Plugins
Create custom audio processors and effects