# Musializer
**THIS SOFTWARE IS UNFINISHED!!! Don't have any high expectations. Read [CONTRIBUTING.md](CONTRIBUTING.md) if you have a strong irresistable desire to contribute something here.**
The project aims to make a tool for creating beautiful music visualizations and rendering high quality videos of them.
## Demo
*Music by [@nu11](https://soundcloud.com/nu11_ft) from [https://soundcloud.com/nu11_ft/nu11-wip-works-2016-2022](https://soundcloud.com/nu11_ft/nu11-wip-works-2016-2022) at 20:38*
https://github.com/tsoding/musializer/assets/165283/8b9f9653-9b3d-4c04-9569-338fa19af071
## Build
Dependencies:
- [raylib](https://www.raylib.com/) and all its transitive dependencies.
- [ffmpeg](https://ffmpeg.org/) executable available in `PATH` environment variable. (it is called as a child process)
The project provides a bunch of build shell scripts that have the following naming scheme `build__.sh`. Pick the appropriate one.
### POSIX
```console
$ ./build_posix_clang.sh
$ ./build/musializer
```
Keep in mind that the application needs [./resources/](./resources/) to be present in the folder it is ran from.
### Windows
Windows support is at very early stage right now. Since I don't have a convenient Windows Development Environment, I'm cross compiling Musializer with [MinGW](https://www.mingw-w64.org/). See [./build_windows_mingw.sh](./build_windows_mingw.sh) for more information.
*More documentation regarding Windows build is comming soon. For now use your hacking skills to figure it out.*
## Hot Reloading
**Only on Linux for now**
```console
$ export HOTRELOAD=1
$ ./build_posix.sh
$ ./build/musializer
```
Keep the app running. Rebuild with `./build.sh`. Hot reload by focusing on the window of the app and pressing r.
The way it works is by putting the majority of the logic of the application into a `libplug` dynamic library and just reloading it when requested. The [rpath](https://en.wikipedia.org/wiki/Rpath) (aka hard-coded run-time search path) for that library is set to `.` and `./build/`. See [build.sh](./build.sh) for more information on how everything is configured.