Merge pull request #10 from ricardomatias/orx-osc
Add orx-osc extension
This commit is contained in:
@@ -20,7 +20,8 @@ A growing library of assorted data structures, algorithms and utilities.
|
|||||||
- [`orx-noise`](orx-noise/README.md), library for random number generation and noise
|
- [`orx-noise`](orx-noise/README.md), library for random number generation and noise
|
||||||
- [`orx-no-clear`](orx-no-clear/README.md), a simple extension that provides drawing without clearing the background
|
- [`orx-no-clear`](orx-no-clear/README.md), a simple extension that provides drawing without clearing the background
|
||||||
- [`orx-obj-loader`](orx-obj-loader/README.md), simple Wavefront .obj mesh loader
|
- [`orx-obj-loader`](orx-obj-loader/README.md), simple Wavefront .obj mesh loader
|
||||||
- [`orx-olive`](orx-olive/README.md), extensions that turns OPENRNDR in to a live coding environment
|
- [`orx-olive`](orx-olive/README.md), extensions that turns OPENRNDR in to a live coding environment
|
||||||
|
- [`orx-osc`](orx-osc/README.md), open sound control interface
|
||||||
|
|
||||||
# Developer notes
|
# Developer notes
|
||||||
|
|
||||||
|
|||||||
16
orx-osc/README.md
Normal file
16
orx-osc/README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# orx-osc
|
||||||
|
|
||||||
|
Orx-osc is a wrapper around javaOSC
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
// PORT IN and OUT: 57110
|
||||||
|
val osc = OSC()
|
||||||
|
|
||||||
|
osc.listen("/live/track2") {
|
||||||
|
// do something
|
||||||
|
}
|
||||||
|
|
||||||
|
osc.send("/maxmsp/filter", 500, "hz")
|
||||||
|
```
|
||||||
5
orx-osc/build.gradle
Normal file
5
orx-osc/build.gradle
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
dependencies {
|
||||||
|
def withoutSlf4j = { exclude group: 'org.slf4j' }
|
||||||
|
|
||||||
|
compile "com.illposed.osc:javaosc-core:0.6", withoutSlf4j
|
||||||
|
}
|
||||||
70
orx-osc/src/main/kotlin/OSC.kt
Normal file
70
orx-osc/src/main/kotlin/OSC.kt
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package org.openrndr.extra.osc
|
||||||
|
|
||||||
|
import com.illposed.osc.OSCMessage
|
||||||
|
import com.illposed.osc.OSCMessageListener
|
||||||
|
import com.illposed.osc.messageselector.OSCPatternAddressMessageSelector
|
||||||
|
import com.illposed.osc.transport.udp.OSCPort
|
||||||
|
import com.illposed.osc.transport.udp.OSCPortIn
|
||||||
|
import com.illposed.osc.transport.udp.OSCPortOut
|
||||||
|
import mu.KotlinLogging
|
||||||
|
import java.net.InetAddress
|
||||||
|
import java.net.PortUnreachableException
|
||||||
|
|
||||||
|
private typealias OSCListener = Pair<OSCPatternAddressMessageSelector, OSCMessageListener>
|
||||||
|
|
||||||
|
private val logger = KotlinLogging.logger {}
|
||||||
|
|
||||||
|
class OSC (
|
||||||
|
val address: InetAddress = InetAddress.getLocalHost(),
|
||||||
|
val portIn: Int = OSCPort.DEFAULT_SC_OSC_PORT,
|
||||||
|
val portOut: Int = portIn
|
||||||
|
) {
|
||||||
|
private val receiver: OSCPortIn = OSCPortIn(portIn)
|
||||||
|
private val sender: OSCPortOut = OSCPortOut(address, portOut)
|
||||||
|
private val listeners: MutableMap<String, OSCListener> = mutableMapOf()
|
||||||
|
|
||||||
|
fun <T> send(channel: String, vararg message: T) {
|
||||||
|
if (!sender.isConnected) sender.connect()
|
||||||
|
|
||||||
|
val msg = OSCMessage(channel, message.toList())
|
||||||
|
|
||||||
|
try {
|
||||||
|
sender.send(msg)
|
||||||
|
} catch (ex: PortUnreachableException) {
|
||||||
|
logger.error(ex) { "Error: Could not connect to OUT port" }
|
||||||
|
} catch (ex: IllegalStateException) {
|
||||||
|
logger.error(ex) { "Error: Couldn't send message to channel: $channel" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun listen(channel: String, callback: (List<Any>) -> Unit) {
|
||||||
|
val selector = OSCPatternAddressMessageSelector(channel);
|
||||||
|
|
||||||
|
val cb = OSCMessageListener {
|
||||||
|
callback(it.message.arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
receiver.dispatcher.addListener(selector, cb)
|
||||||
|
|
||||||
|
listeners[channel] = Pair(selector, cb)
|
||||||
|
|
||||||
|
if (!receiver.isListening) this.startListening()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot be called inside a listener's callback
|
||||||
|
fun removeListener(channel: String?) {
|
||||||
|
val listener = listeners[channel]
|
||||||
|
|
||||||
|
if (listener != null) {
|
||||||
|
receiver.dispatcher.removeListener(listener.first, listener.second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startListening() {
|
||||||
|
receiver.dispatcher.isAlwaysDispatchingImmediately = true;
|
||||||
|
|
||||||
|
receiver.startListening()
|
||||||
|
|
||||||
|
if (receiver.isListening) logger.info("OSC is listening on port: $portIn")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ include 'orx-camera',
|
|||||||
'orx-noise',
|
'orx-noise',
|
||||||
'orx-obj-loader',
|
'orx-obj-loader',
|
||||||
'orx-olive',
|
'orx-olive',
|
||||||
|
'orx-osc',
|
||||||
'orx-poisson-fill',
|
'orx-poisson-fill',
|
||||||
'orx-shader-phrases',
|
'orx-shader-phrases',
|
||||||
'orx-kinect-common',
|
'orx-kinect-common',
|
||||||
|
|||||||
Reference in New Issue
Block a user