๐ŸŒ™ Dark
Audio-Reactive Lightshow Controller - Preview on YouTube
OpenLightShow_Controller_User_Interface_Screenshot
v1.0.0

๐ŸŽต What is OpenLightShow?

OpenLightShow is a powerful Python-based audio-reactive lightshow controller that turns your music into mesmerizing visual effects. Originally designed for projector shows, it's perfect for parties, events, DJ sets, or creative visual performances.

๐ŸŽจ
58+ Visual Effects
From classic scanners to particle systems, lasers, strobes, and more
๐ŸŽง
Beat Detection
Real-time audio analysis with librosa for perfect sync
โšก
Live Preview
See your effects in real-time with the built-in preview widget
๐ŸŽ›๏ธ
Customizable Presets
Create and save your own effect combinations and settings
๐Ÿ”„
Smart Rotation
Weighted random selection with conflict prevention
๐Ÿ–ฅ๏ธ
Dual Screen
Control panel on one screen, fullscreen output on another

๐Ÿ“ฆ Installation

๐Ÿš€ Easy Install (Recommended)

Windows Users

Download the standalone EXE installer from the GitHub Releases page. No Python installation required!

๐Ÿ“ฅ Download Windows Installer

Python Users (All Platforms)

Install directly from PyPI:

# Install from PyPI
pip install openlightshow

# Run the application
openlightshow

๐Ÿ’ป Development Install

For developers who want to modify the source code:

# Clone the repository
git clone https://github.com/digidigital/openlightshow.git
cd openlightshow

# Create virtual environment (recommended)
python -m venv venv

# Activate virtual environment
# On Linux/Mac:
source venv/bin/activate
# On Windows:
venv\Scripts\activate

# Install in development mode
pip install -e .

# Run the application
openlightshow

๐Ÿ“‹ Prerequisites

๐Ÿ“ฆ Dependencies

Automatically installed with the package:

๐ŸŽฎ First Run

  1. Launch OpenLightShow (via installer shortcut, openlightshow command, or development run)
  2. Click "Add MP3" to add your music files
  3. Select effects from the list (check the boxes)
  4. Adjust weights to control effect frequency
  5. Choose a preset or customize settings
  6. Hit "Play" and enjoy the show!

๐ŸŽฎ Usage Guide

Main Controls

Effects Panel

The effects panel shows all available effects with:

Presets

Use the preset dropdown to quickly load pre-configured settings:

Keyboard Shortcuts

๐Ÿ‘จโ€๐Ÿ’ป Developer Guide

Project Structure

openlightshow/
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ openlightshow/
โ”‚       โ”œโ”€โ”€ main.py              # Main application
โ”‚       โ”œโ”€โ”€ effect_base.py       # Base effect class
โ”‚       โ”œโ”€โ”€ effect_loader.py     # Auto-discovery system
โ”‚       โ”œโ”€โ”€ presets.toml         # Preset configurations
โ”‚       โ”œโ”€โ”€ exclude_list.toml    # Effect conflict rules
โ”‚       โ”œโ”€โ”€ icons/               # Application icons
โ”‚       โ””โ”€โ”€ effects/             # Effect modules (58+ effects)
โ”‚           โ”œโ”€โ”€ beat_strobe.py
โ”‚           โ”œโ”€โ”€ disco_derby.py
โ”‚           โ”œโ”€โ”€ starfield.py
โ”‚           โ””โ”€โ”€ ...
โ”œโ”€โ”€ pyproject.toml               # Package configuration
โ””โ”€โ”€ README.md                    # Documentation

Architecture

Creating Custom Effects

All effects inherit from the Effect base class and are automatically discovered by the loader. Copy the prompt below and paste it into your AI assistant with your effect idea!

๐Ÿค– AI Prompt for Creating New Effects
Create a new lightshow effect for OpenLightShow. OpenLightShow uses a video beamer to simulate a laser show. The application renders all effects on a 2D canvas, but the illusion of real laser beams is created in the physical world by filling the room with stage smoke. Because of this setup, the application only needs to draw what a laser would project onto a flat surface: A 2D line on the canvas becomes a 3D plane in the smoke-filled room. A single point on the canvas becomes a visible beam in 3D space. Your task is to generate a new visual effect by drawing shapes, lines, or points on the 2D canvas that will translate into convincing laserโ€‘like visuals when projected through smoke. The effect should: 1. Inherit from the Effect base class located at `from ..effect_base import Effect` 2. Follow this structure using the Effect base class: ```python from PySide6.QtCore import QSize from PySide6.QtGui import QPainter, QColor from ..effect_base import Effect class YourEffect(Effect): """Base class for all lightshow effects.""" name: str = "Your Effect Name" effect_class: str = "unique_class" def __init__(self, size: QSize): super().__init__(size) self.size = size # Initialize your effect state here def resize(self, size: QSize): super().resize(size) self.size = size # Recalculate positions/sizes def update(self, dt_ms: int, energies: dict, sensitivity: float, flash_thresh: float): # energies: {'low': 0.0-1.0, 'mid': 0.0-1.0, 'high': 0.0-1.0} # sensitivity: 0.0-1.0 (how reactive to audio) # flash_thresh: 0.0-1.0 (minimum energy for flashes) # Update animation state based on time and audio def paint(self, painter: QPainter, brightness: float): # brightness: 0.1-2.0 (overall brightness multiplier) # Draw your effect using QPainter methods def on_beat(self): # Optional: triggered on detected beats - (add some ms debounce / cool down) super().on_beat() ``` 3. The effect should be visually interesting and react to audio: - Use energies['low'], energies['mid'], energies['high'] for frequency-based reactions - Use sensitivity to scale reactiveness (0.0 to 1.0) - Use flash_thresh for triggering flash effects (0.0 to 1.0) - Use brightness to scale color intensity (0.1 to 2.0) 4. Use QPainter methods for drawing: - painter.drawLine(x1, y1, x2, y2) - painter.drawRect(x, y, width, height) - painter.drawEllipse(x, y, width, height) - painter.drawPolygon(points) - Use QColor with RGB or HSV: QColor(r, g, b) or QColor.fromHsvF(h, s, v) - Apply antialiasing: painter.setRenderHint(QPainter.Antialiasing) - Remember to use painter.save() and painter.restore() to preserve state 5. Save the effect in `src/openlightshow/effects/your_effect_name.py` 6. The effect will be automatically discovered and loaded by the application! Example effect idea: [describe your effect here, e.g., "rotating laser beams that pulse with the beat", "particle explosion system", "geometric tunnel effect"] Make it visually stunning and reactive to music!

Effect Base Class Reference

The base class is included in the AI prompt above for easy copy-paste!

class Effect:
    """Base class for all lightshow effects."""
    name: str = "Effect Name"
    effect_class: str = "unique_class"

    def __init__(self, size: QSize):
        self.size = size
        # Initialize your effect state here

    def resize(self, size: QSize):
        self.size = size
        # Recalculate positions/sizes

    def update(self, dt_ms: int, energies: dict,
               sensitivity: float, flash_thresh: float):
        # energies: {'low': 0.0-1.0, 'mid': 0.0-1.0, 'high': 0.0-1.0}
        # Update animation state

    def paint(self, painter: QPainter, brightness: float):
        # Draw your effect using QPainter

    def on_beat(self):
        # Optional: triggered on detected beats

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-effect
  3. Create your effect in src/openlightshow/effects/
  4. Test it in the application
  5. Commit your changes: git commit -m 'Add amazing effect'
  6. Push to the branch: git push origin feature/amazing-effect
  7. Submit a pull request

Development Tips

โš™๏ธ Configuration Files

presets.toml

Define custom presets with effect selections and weights:

["My Custom Preset"]
sensitivity = 80
brightness = 120
flash_threshold = 85
effect_period = 12.0
star_spacing = 50
max_active = 3
effects = [
    "Effect Name 1",
    "Effect Name 2",
    "Effect Name 3"
]

["My Custom Preset".effect_weights]
"Effect Name 1" = 50
"Effect Name 2" = 30
"Effect Name 3" = 20

exclude_list.toml

Define groups of effects that shouldn't play together:

my_conflict_group = [
    "Effect A",
    "Effect B",
    "Effect C"
]

โœจ Key Features

๐Ÿ“„ License & Credits

OpenLightShow License

OpenLightShow is released under the MIT License.

View Full License Text | Project Homepage

Third-Party Licenses

OpenLightShow is built using the following open-source libraries. We gratefully acknowledge their contributions:

Core Framework

  • PySide6 - Python bindings for the Qt framework
    License: LGPL v3
    Homepage | License

Audio Processing

  • librosa - Audio and music analysis library
    License: ISC License
    Homepage | License
  • soundfile - Audio file I/O based on libsndfile
    License: BSD 3-Clause License
    Homepage | License

Scientific Computing

  • NumPy - Fundamental package for scientific computing
    License: BSD 3-Clause License
    Homepage | License
  • SciPy - Scientific computing and technical computing
    License: BSD 3-Clause License
    Homepage | License
  • scikit-learn - Machine learning library (used by librosa)
    License: BSD 3-Clause License
    Homepage | License

Additional Dependencies

  • Numba - JIT compiler for Python (used by librosa)
    License: BSD 2-Clause License
    Homepage | License
  • audioread - Cross-library audio decoding
    License: MIT License
    Homepage | License

License Compatibility

All third-party libraries used in OpenLightShow are licensed under permissive open-source licenses (MIT, BSD, ISC, LGPL) that are compatible with OpenLightShow's MIT license. These licenses allow:

Acknowledgments

We are grateful to the open-source community and the developers of these excellent libraries. Without their work, OpenLightShow would not be possible.

View on GitHub Report Issue Download