This project aims to combine music visualizers, such as GLava and Cava, with wallpaper engines, such as Wallpaper Engine and Lively, and bring them to the next level.
A simple example can be found here.
- Lightweight
- Simple and Powerful JSON Config
- Live Config Reload
- System Fonts
- Digital Clock
- Add config and cli arguments for setting the display
- Launch on startup
- Arguments(e.g. using different configs for 2 displays)
- Change the config directory for Windows(and their shit system structure)
- Implement system font support on Windows
- Polish sending window to the background layer on windows
- Implement configurable paths for the file system watcher used in live config reload
- Config volume profile
- Slideshow
- Build more commands into the app itself(e.g. wttr.in, now playing etc.)
- Completely modularize components such as vfx graphs etc.
- JSON variables(to reduce code duplication)
- Font materials
- Picking up system audio on Windows
- Picking up system audio on Linux
- Music Reactive Particle System
- Music Reactive VFX Graph
- Music Reactive Volume
- Clock, Date and Day
- Background From Local Files
- Live Reload JSON Config
- Custom Fonts
- Multiple Scenes
- Per Scene Config
- Automatic Scene Creation
- Dynamic Text(Weather, DateTime, FPS, Shell etc.)
- Modular UI
- Media Info(via Player CTL)
- Sourcing other files in config
Nisualizer is ready to use out of the box with very little setup, and the option of cloning/forking and making your own scenes.
Thanks to the modularity of components, creating your own backgrounds should be relatively easy, more can be read in Extending Nisualizer.
- Window Wrapper, to send Nisualizer to the background layer, such as:
- hyprwinwrap - Hyprland
- xwinwrap - most X desktop environments
- pipewire-pulse or Pulse Audio, so Nisualizer can capture audio
- Lively(optional), an alternative way to send Nisualizer to the background layer
- Download Nisualizer
- Configure the window wrapper of your choice, e.g. hyprwinwrap:
- Follow the official plugins guide for Hyprland
- Add the following to your Hyprland config:
plugin { hyprwinwrap { class = Nisualizer.x86_64 } }
- Launch Nisualizer to generate the default config
- Configure Nisualizer
- Make Nisualizer launch on startup(native implementation is WIP), e.g. with Hyprland:
exec-once = Path/To/Nisualizer.x86_64
- Download Nisualizer
- Launch Nisualizer to generate the default config
- Configure Nisualizer
- Make Nisualizer launch on startup(native implementation is WIP)
WIP
- Do you plan to support Mac?
- Fuck no, you are free to make a PR tho.
- How's the performance?
- It depends on your config. Nisualizer is just a Unity application with only necessary objects in the scene, you add the rest via config. It shouldn't be any more demanding than WPE whilst achieving way more.
- Can I fork this project and make my own visualizer?
- Absolutely, I am really interested to see what the community is capable of creating. After all, there are much more skilled artists and developers than me out there. You are also welcome to make a PR to get your scene merged into the master branch.
Nisualizer is just a Unity application that captures system audio and reacts to it. It supports pipewire-pulse/Pulse Audio(Linux) and Windows Core Audio(Windows, most of the code was taken from NAudio). TODO: Explain how it sends itself to the background layer Nisualizer utilizes simple JSON configuration with some additional features, such as comments, sourcing other files etc.
Nisualizer is built on top of modular components and utilities, allowing anyone to expand it with minimal effort.
If you've made something that would fit into the actual project, feel free to make a pull request and I'll merge it if I like it. Have fun!
- Make a fork of Nisualizer
- Clone the fork recursively
git clone --recurse https://github.com/YourName/Nisualizer - Make changes
- Create a PR with a detailed description of your contribution
Assets -> Create -> Nisualizer Scene
- Create a new directory under
Assets/Scenes/ - Give it an original, descriptive name, e.g.
Snowstorm - Add a new scene with the same name as the directory
- Create a new script that derives from the
SceneScriptand call itSceneNameManager, e.g.SnowstormManager - Add a new object to your scene, name it
SceneNameManager, e.g.SnowstormManager, and attach the previously created script - Create a
SceneNameConfig.jsonfile in your scene directory, e.g.SnowstormConfig.json, this will be your default scene config - Make a new script in your scene directory and call it
SceneNameConfigData, e.g.SnowstormConfigData, that inherits from theConfigDataclass, this class is used as a container to store values from your JSON config - Create a new scriptable object menu item by adding the following above the class name
[CreateAssetMenu(fileName = "SceneNameConfigData", menuName = "Config/SceneNameConfigData")] - Create a new instance of this scriptable object
- Attach all the components to the
ConfigScriptunder yourSceneManager, and make sure that theConfigNamevalue matches your scene name, scene loading won't work otherwise - Drag the
GameManagerprefab to your scene so you can start the playmode directly from your scene without any issues - Make sure you added your scene to the build settings
- Utilize powerful scripts built with modularity in mind, such as
InteractiveVFX,InteractiveVolumeetc.




