diff --git a/orx-chataigne/README.md b/orx-chataigne/README.md new file mode 100644 index 000000000..181a18179 --- /dev/null +++ b/orx-chataigne/README.md @@ -0,0 +1,41 @@ +# orx-chataigne + +With `orx-chataigne` you can share [Chataigne](http://benjamin.kuperberg.fr/chataigne/en) variables within a OPENRNDR project. + +The current implementation makes use of the OSC protocol and supports `Double` and `ColorRGBa`. + +## Usage + +Defining the variables +```kotlin +class SceneVariables : ChataigneOSC(OSC(portIn = 9005, portOut = 12001)) { + val myRadius: Double by DoubleChannel("/myRadius") + val myOpacity: Double by DoubleChannel("/myOpacity") + val myColor: ColorRGBa by ColorChannel("/myColor") +} +``` + +Initiate + +```kotlin + val animation = SceneVariables() +``` + +Update time + +```kotlin +animation.update(seconds) +``` + +Use the variables + +```kotlin +animation.myRadius +animation.myOpacity +animation.myColor +``` + +## Example project + +Find the Chataigne example project in `/resources/timeline_example_chataigne.noisette` which works together with demo project `/src/demo/kotlin/ChataigneOSCDemo.kt` + diff --git a/orx-chataigne/build.gradle b/orx-chataigne/build.gradle new file mode 100644 index 000000000..1c4ec7c66 --- /dev/null +++ b/orx-chataigne/build.gradle @@ -0,0 +1,25 @@ +sourceSets { + demo { + java { + srcDirs = ["src/demo/kotlin"] + compileClasspath += main.getCompileClasspath() + runtimeClasspath += main.getRuntimeClasspath() + } + } +} +dependencies { + api project(":orx-osc") + + implementation "com.google.code.gson:gson:$gsonVersion" + demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") + + demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") + demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") + demoRuntimeOnly("org.openrndr:openrndr-extensions:$openrndrVersion") + demoImplementation("org.openrndr:openrndr-ffmpeg:$openrndrVersion") + demoRuntimeOnly("org.openrndr:openrndr-ffmpeg-natives-$openrndrOS:$openrndrVersion") + demoImplementation(project(":orx-fx")) +// demoImplementation(project(":orx-osc")) + + demoImplementation(sourceSets.getByName("main").output) +} \ No newline at end of file diff --git a/orx-chataigne/resources/timeline_example_chataigne.noisette b/orx-chataigne/resources/timeline_example_chataigne.noisette new file mode 100644 index 000000000..ae8a73814 --- /dev/null +++ b/orx-chataigne/resources/timeline_example_chataigne.noisette @@ -0,0 +1 @@ +{"metaData": {"version": "1.7.2", "versionNumber": 67330}, "projectSettings": {"containers": {"dashboardSettings": {"parameters": [{"value": false, "controlAddress": "/enableDashboardServer"}, {"value": 9999, "hexMode": false, "controlAddress": "/serverPort"}]}}}, "layout": {"mainLayout": {"type": 1, "width": 1496, "height": 1371, "direction": 2, "shifters": [{"type": 1, "width": 1496, "height": 1371, "direction": 2, "shifters": [{"type": 1, "width": 1496, "height": 761, "direction": 1, "shifters": [{"type": 1, "width": 307, "height": 761, "direction": 2, "shifters": [{"type": 0, "width": 307, "height": 387, "currentContent": "Modules", "tabs": [{"name": "Modules"}]}, {"type": 0, "width": 307, "height": 367, "currentContent": "Custom Variables", "tabs": [{"name": "Custom Variables"}]}]}, {"type": 0, "width": 749, "height": 761, "currentContent": "State Machine", "tabs": [{"name": "State Machine"}, {"name": "Dashboard"}, {"name": "Module Router"}, {"name": "Morpher"}]}, {"type": 0, "width": 428, "height": 761, "currentContent": "Inspector", "tabs": [{"name": "Inspector"}]}]}, {"type": 1, "width": 1496, "height": 603, "direction": 1, "shifters": [{"type": 0, "width": 178, "height": 603, "currentContent": "Sequences", "tabs": [{"name": "Sequences"}]}, {"type": 0, "width": 867, "height": 603, "currentContent": "Sequence Editor", "tabs": [{"name": "Sequence Editor"}]}, {"type": 0, "width": 439, "height": 603, "currentContent": "Logger", "tabs": [{"name": "Help"}, {"name": "Logger"}, {"name": "Warnings"}]}]}]}]}, "windows": null}, "modules": {"items": [{"parameters": [{"value": true, "controlAddress": "/enabled"}, {"value": true, "controlAddress": "/logIncoming"}, {"value": true, "controlAddress": "/logOutgoing"}], "niceName": "OSC", "type": "OSC", "scripts": {}, "params": {"parameters": [{"value": false, "controlAddress": "/splitArguments"}, {"value": true, "controlAddress": "/autoFeedback"}], "containers": {"oscInput": {"parameters": [{"value": 12001, "hexMode": false, "controlAddress": "/localPort"}]}, "oscOutputs": {"editorIsCollapsed": true, "items": [{"parameters": [{"value": "127.0.0.1", "controlAddress": "/remoteHost"}, {"value": 9005, "hexMode": false, "controlAddress": "/remotePort"}], "niceName": "OSC Output", "type": "BaseItem"}]}, "pass_through": {}}}, "values": {"parameters": [{"value": [0.0, 0.501960813999176, 0.0, 1.0], "controlMode": 2, "reference": {"value": "/sequences/sequence/layers/color/colors/color", "controlAddress": "/reference"}, "controlAddress": "/_myColor", "type": "Color", "niceName": "/myColor", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false}, {"value": 0.8833333253860474, "controlMode": 2, "reference": {"value": "/sequences/sequence/layers/opacity/automation/value", "controlAddress": "/reference"}, "controlAddress": "/_myOpacity", "type": "Float", "niceName": "/myOpacity", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false}, {"value": 0.8666667342185974, "controlMode": 2, "reference": {"value": "/sequences/sequence/layers/radius/automation/value", "controlAddress": "/reference"}, "controlAddress": "/_myRadius", "type": "Float", "niceName": "/myRadius", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false}, {"value": 11.77089214324951, "controlAddress": "/_setTime", "type": "Float", "niceName": "/setTime", "customizable": true, "removable": true, "description": "", "hideInEditor": false, "feedbackOnly": false, "shortName": "_setTime"}]}}]}, "states": {"items": [{"parameters": [{"value": [-80.0, -142.0], "controlAddress": "/viewUIPosition"}, {"value": [287.0, 243.0], "controlAddress": "/viewUISize"}, {"value": true, "controlAddress": "/active"}], "niceName": "State", "type": "State", "processors": {"items": [{"niceName": "OSC Trigger", "editorIsCollapsed": true, "type": "Mapping", "im": {"items": [{"parameters": [{"value": "/modules/osc/values/_setTime", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {"items": [{"niceName": "Math", "type": "Math", "filterParams": {"parameters": [{"value": "Modulo", "controlAddress": "/operation"}, {"value": "Adjust", "controlAddress": "/rangeRemapMode"}]}, "operationValue": {"value": 10.0, "controlMode": 2, "reference": {"value": "/sequences/sequence/totalTime", "controlAddress": "/reference"}, "controlAddress": "/states/state/processors/oscTrigger/filters/math/filterParams/value"}}]}, "outputs": {"items": [{"niceName": "MappingOutput 1", "type": "BaseItem", "commandModule": "sequences", "commandPath": "Time", "commandType": "Set Current Time", "command": {"parameters": [{"value": "/sequences/sequence", "controlAddress": "/target"}, {"value": 1.770892143249512, "controlAddress": "/time"}, {"value": false, "controlAddress": "/play"}]}}]}}]}}]}, "sequences": {"items": [{"parameters": [{"value": 5.0, "controlAddress": "/listSize"}, {"value": 10.0, "controlAddress": "/totalTime"}, {"value": false, "controlAddress": "/loop"}, {"value": 10.0, "controlAddress": "/viewEndTime"}, {"value": ["", ""], "controlAddress": "/syncDevices"}], "niceName": "Sequence", "type": "Sequence", "layers": {"items": [{"parameters": [{"value": 87.0, "controlAddress": "/listSize"}, {"value": 120, "hexMode": false, "controlAddress": "/uiHeight"}, {"value": [0.2117647081613541, 0.2117647081613541, 0.2117647081613541, 1.0], "controlAddress": "/layerColor"}, {"value": 0.8666667342185974, "controlAddress": "/value"}], "niceName": "Radius", "containers": {"automation": {"parameters": [{"value": 10.0, "controlAddress": "/length"}, {"value": 0.0, "controlAddress": "/position"}, {"value": 0.8666667342185974, "controlAddress": "/value"}, {"value": [0.0, 1.0], "controlAddress": "/viewValueRange"}, {"value": [0.0, 1.0], "controlAddress": "/range", "enabled": true}], "items": [{"parameters": [{"value": 0.0, "controlAddress": "/position"}, {"value": 0.8666667342185974, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 18", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 1.089901447296143, "controlAddress": "/position"}, {"value": 0.3083333373069763, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key", "containers": {"easing": {"parameters": [{"value": [0.5597290992736816, 0.0], "controlAddress": "/anchor1"}, {"value": [-0.1908860206604004, -0.0166667103767395], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 1.896896004676819, "controlAddress": "/position"}, {"value": 0.4416666030883789, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key 1", "containers": {"easing": {"parameters": [{"value": [0.1908860206604004, 0.0166667103767395], "controlAddress": "/anchor1"}, {"value": [-0.1785714626312256, 0.008333325386047363], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 2.278325080871582, "controlAddress": "/position"}, {"value": 0.8500000238418579, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 2", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 3.004926204681396, "controlAddress": "/position"}, {"value": 0.8583332896232605, "controlAddress": "/value"}, {"value": "Sine", "controlAddress": "/easingType"}], "niceName": "Key 3", "containers": {"easing": {"parameters": [{"value": [1.0, 0.25], "controlAddress": "/frequencyAmplitude"}]}}, "type": "Key"}, {"parameters": [{"value": 4.051724433898926, "controlAddress": "/position"}, {"value": 0.449999988079071, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 4", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 4.753694534301758, "controlAddress": "/position"}, {"value": 0.4583333134651184, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 5", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.01231575012207, "controlAddress": "/position"}, {"value": 0.7083333134651184, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 6", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.123153209686279, "controlAddress": "/position"}, {"value": 0.8000000715255737, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 7", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.264778137207031, "controlAddress": "/position"}, {"value": 0.5916666388511658, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 8", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 5.671182155609131, "controlAddress": "/position"}, {"value": 0.2083332538604736, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 9", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.133005142211914, "controlAddress": "/position"}, {"value": 0.5083333253860474, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 10", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.280788421630859, "controlAddress": "/position"}, {"value": 0.6916666626930237, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 11", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.508620738983154, "controlAddress": "/position"}, {"value": 0.4166666269302368, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 12", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 7.068964958190918, "controlAddress": "/position"}, {"value": 0.4166666269302368, "controlAddress": "/value"}, {"value": "Hold", "controlAddress": "/easingType"}], "niceName": "Key 13", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 8.084975242614746, "controlAddress": "/position"}, {"value": 0.9166666865348816, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 14", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 8.392856597900391, "controlAddress": "/position"}, {"value": 0.4333332777023315, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key 15", "containers": {"easing": {"parameters": [{"value": [0.2050492316484451, 0.0], "controlAddress": "/anchor1"}, {"value": [-0.2050492316484451, 0.0], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 9.076354026794434, "controlAddress": "/position"}, {"value": 0.8750000596046448, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 16", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 9.636699676513672, "controlAddress": "/position"}, {"value": 0.449999988079071, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 17", "containers": {"easing": {}}, "type": "Key"}]}, "recorder": {"parameters": [{"value": false, "controlAddress": "/arm"}, {"value": false, "controlAddress": "/isRecording"}], "editorIsCollapsed": true}, "mapping": {"niceName": "Mapping", "type": "Mapping", "im": {"items": [{"parameters": [{"value": "", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {}, "outputs": {}}}, "type": "Mapping"}, {"parameters": [{"value": 87.0, "controlAddress": "/listSize"}, {"value": 120, "hexMode": false, "controlAddress": "/uiHeight"}, {"value": [0.2117647081613541, 0.2117647081613541, 0.2117647081613541, 1.0], "controlAddress": "/layerColor"}, {"value": 0.8833333253860474, "controlAddress": "/value"}], "niceName": "Opacity", "containers": {"automation": {"parameters": [{"value": 10.0, "controlAddress": "/length"}, {"value": 0.0, "controlAddress": "/position"}, {"value": 0.8833333253860474, "controlAddress": "/value"}, {"value": [0.0, 1.0], "controlAddress": "/viewValueRange"}, {"value": [0.0, 1.0], "controlAddress": "/range", "enabled": true}], "items": [{"parameters": [{"value": 0.0, "controlAddress": "/position"}, {"value": 0.8833333253860474, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 1.68719220161438, "controlAddress": "/position"}, {"value": 0.449999988079071, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 1", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 3.152709245681763, "controlAddress": "/position"}, {"value": 0.2749999761581421, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 2", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 4.193350315093994, "controlAddress": "/position"}, {"value": 0.9583333730697632, "controlAddress": "/value"}, {"value": "Bezier", "controlAddress": "/easingType"}], "niceName": "Key 3", "containers": {"easing": {"parameters": [{"value": [0.5110831260681152, 0.0], "controlAddress": "/anchor1"}, {"value": [-0.5110831260681152, 0.0], "controlAddress": "/anchor2"}]}}, "type": "Key"}, {"parameters": [{"value": 4.913793087005615, "controlAddress": "/position"}, {"value": 0.3833333849906921, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 4", "containers": {"easing": {}}, "type": "Key"}, {"parameters": [{"value": 6.293103694915771, "controlAddress": "/position"}, {"value": 0.3583333492279053, "controlAddress": "/value"}, {"value": "Sine", "controlAddress": "/easingType"}], "niceName": "Key 5", "containers": {"easing": {"parameters": [{"value": [0.04926061630249023, 0.6416666507720947], "controlAddress": "/frequencyAmplitude"}]}}, "type": "Key"}, {"parameters": [{"value": 7.173645496368408, "controlAddress": "/position"}, {"value": 0.3833333253860474, "controlAddress": "/value"}, {"value": "Linear", "controlAddress": "/easingType"}], "niceName": "Key 6", "containers": {"easing": {}}, "type": "Key"}]}, "recorder": {"parameters": [{"value": false, "controlAddress": "/isRecording"}], "editorIsCollapsed": true}, "mapping": {"niceName": "Mapping", "type": "Mapping", "im": {"items": [{"parameters": [{"value": "", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {}, "outputs": {}}}, "type": "Mapping"}, {"parameters": [{"value": 27.0, "controlAddress": "/listSize"}, {"value": 60, "hexMode": false, "controlAddress": "/uiHeight"}, {"value": [0.2117647081613541, 0.2117647081613541, 0.2117647081613541, 1.0], "controlAddress": "/layerColor"}, {"value": [0.0, 0.501960813999176, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color", "containers": {"mapping": {"niceName": "Mapping", "type": "Mapping", "im": {"items": [{"parameters": [{"value": "", "controlAddress": "/inputValue"}], "niceName": "Input", "type": "BaseItem"}]}, "filters": {}, "outputs": {}}, "colors": {"editorIsCollapsed": true, "items": [{"parameters": [{"value": 2.0, "controlAddress": "/time"}, {"value": [0.0, 0.501960813999176, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 1", "type": "BaseItem"}, {"parameters": [{"value": 4.0, "controlAddress": "/time"}, {"value": [1.0, 1.0, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 2", "type": "BaseItem"}, {"parameters": [{"value": 6.0, "controlAddress": "/time"}, {"value": "None", "controlAddress": "/interpolation"}, {"value": [1.0, 0.0, 0.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 3", "type": "BaseItem"}, {"parameters": [{"value": 8.0, "controlAddress": "/time"}, {"value": [0.0, 0.0, 1.0, 1.0], "controlAddress": "/color"}], "niceName": "Color 4", "type": "BaseItem"}]}}, "type": "Color"}]}, "cues": {}, "editing": true}]}} \ No newline at end of file diff --git a/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt b/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt new file mode 100644 index 000000000..82c36c08b --- /dev/null +++ b/orx-chataigne/src/demo/kotlin/ChataigneOSCDemo.kt @@ -0,0 +1,29 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.extra.osc.OSC + +fun main() = application { + + configure { + width = 500 + height = 500 + } + + /* Find the Chataigne example project in /resources */ + class SceneVariables : ChataigneOSC(OSC(portIn = 9005, portOut = 12001)) { + val myRadius: Double by DoubleChannel("/myRadius") + val myOpacity: Double by DoubleChannel("/myOpacity") + val myColor: ColorRGBa by ColorChannel("/myColor") + } + + program { + val animation = SceneVariables() + + extend { + animation.update(seconds) + + drawer.fill = animation.myColor.opacify(animation.myOpacity) + drawer.circle(width/2.0, height/2.0, animation.myRadius * 250) + } + } +} \ No newline at end of file diff --git a/orx-chataigne/src/main/kotlin/ChataigneOSC.kt b/orx-chataigne/src/main/kotlin/ChataigneOSC.kt new file mode 100644 index 000000000..3488741a0 --- /dev/null +++ b/orx-chataigne/src/main/kotlin/ChataigneOSC.kt @@ -0,0 +1,53 @@ +import org.openrndr.color.ColorRGBa +import org.openrndr.extra.osc.OSC +import java.awt.Color +import kotlin.reflect.KProperty + +open class ChataigneOSC( + val osc: OSC +) { + inner class DoubleChannel(key:String) { + private var currentDouble = 0.0 + + init { + osc.listen(key) { + currentDouble = (it[0] as Float).toDouble() + } + } + + operator fun getValue(thisRef: Any?, property: KProperty<*>):Double { + return currentDouble + } + + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Double) { + print("$value") + } + } + + inner class ColorChannel(key:String) { + private var currentColor = ColorRGBa.BLACK + + init { + println(key) + osc.listen(key) { + val c = it[0] as Color + currentColor = ColorRGBa(c.red/255.0, c.green/255.0, c.blue/255.0, c.alpha/255.0) + } + } + + operator fun getValue(thisRef: Any?, property: KProperty<*>):ColorRGBa { + return currentColor + } + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Double) { + print("$value") + } + } + + fun update(seconds: Double) { + osc.send("/setTime", seconds.toFloat()) + } + + init { + println("setup Chataigne with OSC ${osc.address} in:${osc.portIn} out:${osc.portOut}") + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 87aa22c4c..7d13dfd71 100644 --- a/settings.gradle +++ b/settings.gradle @@ -45,5 +45,6 @@ include 'openrndr-demos', 'orx-kinect-v1-natives-linux-x64', 'orx-kinect-v1-natives-macos', 'orx-kinect-v1-natives-windows', - 'orx-kinect-v1-demo' + 'orx-kinect-v1-demo', + 'orx-chataigne'