{"id":24801722,"url":"https://github.com/matejsemancik/astral-visuals","last_synced_at":"2025-10-13T04:30:26.561Z","repository":{"id":53158008,"uuid":"128466105","full_name":"matejsemancik/astral-visuals","owner":"matejsemancik","description":"👾 Audio-reactive visuals created with Processing \u0026 Kotlin","archived":false,"fork":false,"pushed_at":"2024-01-20T16:56:14.000Z","size":43010,"stargazers_count":17,"open_issues_count":2,"forks_count":0,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-01-27T20:46:52.830Z","etag":null,"topics":["3d","audio-analysis","kotlin","midi","osc","processing","touchosc","visualization","visuals","vjing"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matejsemancik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-04-06T20:14:39.000Z","updated_at":"2023-12-03T01:03:46.000Z","dependencies_parsed_at":"2024-01-20T17:56:27.018Z","dependency_job_id":null,"html_url":"https://github.com/matejsemancik/astral-visuals","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matejsemancik%2Fastral-visuals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matejsemancik%2Fastral-visuals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matejsemancik%2Fastral-visuals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matejsemancik%2Fastral-visuals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matejsemancik","download_url":"https://codeload.github.com/matejsemancik/astral-visuals/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236298284,"owners_count":19126500,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d","audio-analysis","kotlin","midi","osc","processing","touchosc","visualization","visuals","vjing"],"created_at":"2025-01-30T04:31:34.969Z","updated_at":"2025-10-13T04:30:19.433Z","avatar_url":"https://github.com/matejsemancik.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# astral-visuals\n\nJust some Processing sketches. Source code for visuals we use at [Soul Ex Machina](https://www.facebook.com/SoulExMachinaDnB).\n\n\n![](demo-gif.gif)\n\nThe project is divided into multiple modules.\n\nThe `:core` module contains the core stuff like audio processing, tools, remote control handlers, extensions, etc.\n\nThe `:playground` module serves as, well... playground. Used to quickly create a new sketch and play around. I'm using the [Koin](https://insert-koin.io/) DI framework, so you can inject here whatever is defined in the `CoreModule`. Have a look around.\n\nThe `:visuals` module is meant to be used in live environment at the parties. There is an abstraction layer in form of `Mixer` and `Layer`s, which allows me to blend multiple scenes together. Also, have a look around, proceed at your own risk, ignore `legacy` package 😅 (I like to change things, API is generally unstable).\n\nThe `:raspberrypi` module contains standalone RPi application that can be distributed using the [Application Gradle plugin](https://docs.gradle.org/current/userguide/application_plugin.html).\n\n## How to build\n\nThis project depends on local [Processing 4](https://processing.org) installation, so go ahead and install it if you haven't already. Then create a `local.properties` file in project's root directory and configure the core library and contributed libraries' paths:\n\n```\nprocessing.core.jars=/path/to/core/processing/libraries\nprocessing.core.natives=/path/to/core/processing/libraries/\u003cos-architecture\u003e\nprocessing.core.natives.rpi=/path/to/core/processing/libraries/\u003cos-architecture\u003e\nprocessing.libs.jars=/path/to/core/processing/libraries\n```\n\nOn macOS it might look like this:\n\n```\nprocessing.core.jars=/Applications/Processing.app/Contents/Java/core/library\nprocessing.core.natives=/Applications/Processing.app/Contents/Java/core/library/macos-x86_64\nprocessing.core.natives.rpi=/Applications/Processing.app/Contents/Java/core/library/linux-aarch64\nprocessing.libs.jars=/Users/matsem/Documents/Processing/libraries\n```\nNote the difference between `processing.core.natives` and `processing.core.natives.rpi`.\nThe Raspberry Pi libs have to be configured if you wish to use the `:raspberrypi` module.\n\nThe Gradle buildscript will look for Processing dependencies at these two paths. Dependencies are defined in CommonDependencies gradle plugin. Open it up, and you can notice that this project depends on some 3rd party libraries, which need to be installed at `processing.libs.jars` path. Open your Processing library manager (Sketch \u003e Import Library \u003e Add library) and install whatever libraries are specified in the `build.gradle` file.\n\nCurrent list of library dependencies is\n\n```kotlin\nval processingLibs = listOf(\n    \"minim\", // audio input everything (input source, fft analysis, etc.)\n    \"themidibus\", // MIDI control protocol implementation\n    \"VideoExport\", // I use this to export video teasers synced with external audio file \n    \"box2d_processing\", // for physics (look for Gravity sketch in playground module)\n    \"video\", // video playback\n    \"extruder\", // 2d shape -\u003e 3d shape extrusion\n    \"geomerative\", // text -\u003e shape, svg -\u003e shape conversion\n    \"peasycam\", // adds camera handling to the sketches, nice to have when prototyping\n    \"PostFX\", // can apply post-processing shaders to video output\n    \"oscP5\", // OSC control protocol implementation\n    \"blobDetection\" // library to find \"blobs\" on image\n)\n```\n\n\n### :raspberrypi module\nThe Raspberry Pi app can be installed using `./gradlew raspberrypi:installDist` task and zipped using `./gradlew raspberrypi:distZip` task.\nSee the [Application Plugin](https://docs.gradle.org/current/userguide/application_plugin.html) docs for more info.\n\n### JDK\n\nProject must be built using JDK 17. You can use [SDKMAN!](https://sdkman.io/) with provided `.sdkmanrc` file to use correct JDK version.\n\n## How to run\n\nYou can run the project with Gradle `run` task. Be sure to include the `--sketch-path` argument so sketches can properly resolve the data folder containing resources needed by some Sketches.\n\n```\n./gradlew playground:run --args='--sketch-path=/path/to/project/'\n./gradlew visuals:run --args='--sketch-path=/path/to/project/'\n```\n\nThere are also IntelliJ Run configurations in `.run` folder which you can use to run the app from IDE. Just be sure to edit their configuration to match your setup.\n\n## Remote control\nCurrently, the project supports 3 remote control options:\n\n- If you own Traktor Kontrol F1, the `KontrolF1` class is for you - I use it for quick prototyping. It handles most of KontrolF1's hardware features, like pad buttons (with colors feature), encoder, knobs and faders.\n- If you'd like to try the `:visuals` module, go ahead and get yourself the [TouchOSC](https://hexler.net/products/touchosc) app and load it with `Astral.touchosc` layout that can be found in the `touchosc` folder. This layout uses MIDI and OSC protocol and there is a `Galaxy` class that handles most of TouchOSC MIDI controls. For future, I plan on to get rid of `Galaxy` and migrate everyhing to OSC protocol, which leads us to the last option\n- OSC - The most convenient way, though, is to use the [OSC](http://opensoundcontrol.org/introduction-osc) (Open Sound Control) with Delegated Properties\n\n### Osc Delegated Properties\nFirst, make your sketch/class implement the `OscHandler` interface, which makes you provide the `OscManager` class.\n\n```kotlin\nclass OscHandlerExample : PApplet(), OscHandler {\n\n    override val oscManager: OscManager by lazy {\n        OscManager(\n            sketch = this,\n            inputPort = 7001, // Port that this computer is listening on\n            outputIp = \"192.168.1.11\", // IP of phone running TouchOSC\n            outputPort = 7001 // Port, the TouchOSC app is listening on\n        )\n    }\n}\n```\n\nThen, you can create all sorts of properties tied to various OSC controls, like buttons, faders, labels, LED indicators, etc. Check out the `dev.matsem.astral.core.tools.osc.delegates` package for full list. Example:\n\n```kotlin\nprivate var fader1: Float by oscFaderDelegate(\"/1/fader1\", defaultValue = 0.5f)\n```\n\nMost of the delegated properties support value assign, so, if for example you create the fader variable and at some point in time you assign the value into it, the corresponding control in TouchOSC app will reflect that change.\n\n## Troubleshooting\n\n### App crashes on sketches which are using `movie` library\n\nMovie library stopped working after migration to Processing 4. Related issue: [#56](https://github.com/matejsemancik/astral-visuals/issues/56)\n\n### App crashes with `Instance creation error : could not create instance for [Single:'dev.matsem.astral.core.tools.audio.AudioProcessor']`\n\nIt's probably one of these things:\n- Your system has no audio input devices. Make sure to have at least one audio input device, as it's required by audio processing toolchain.\n- Your system has no audio input devices compatible with `minim` library. (Might happen on newer macOS versions). Happens on my M2 Pro Mac. You can use a virtual audio input device to mitigate this.\n- If you're on macOS, make sure to grant microphone permissions for your Processing installation. The simplest way to do this is to run some Processing sample from `sound` library. The system will ask you to grant microphone permission.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatejsemancik%2Fastral-visuals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatejsemancik%2Fastral-visuals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatejsemancik%2Fastral-visuals/lists"}