This is an old revision of the document!
Table of Contents
Open Sound Control
Open Sound Control (OSC) is a messaging protocol that is used for sending control signals between many popular digital music tools. We can write a small script in Folk to easily transform Folk signals into OSC messages.
The OSC Script
This script adds two utility functions for turning Tcl values into serialized OSC values, and also starts watching for a Wish the NetAddr is /n/ assertion to start running an OSC producer.
# Null terminates a tcl value and pads it to a multiple of four
# (needed for OSC spec)
# \x01 -> \x01\x00\x00\x00
# \x01\x02\x03 -> \x01\x02\x03\x00
# \x01\x02\x03\x04 -> \x01\x02\x03\x04\x00\x00\x00\x00
fn oscPad {s} {
set n [string bytelength $s]
set count [expr {4 - $n % 4}]
set nulls [string repeat \x00 $count]
return $s$nulls
}
fn oscPacket {target args} {
set tags ","
set payload ""
foreach a $args {
if {[string is integer $a]} {
append tags i
append payload [binary format I $a]
} elseif {[string is double $a]} {
append tags f
append payload [binary format R $a]
} else {
append tags s
append payload [oscPad $a]
}
}
return "[oscPad $target][oscPad $tags]$payload"
}
When the NetAddr is /n/ {
Subscribe: OSC at /target/ with args /...arguments/ {
set s [socket dgram]
$s sendto [oscPacket $target {*}$arguments] $n
$s close
}
}
Start the Subscriber:
Place a program that asserts Wish the NetAddr is /addr/. NetAddr is a string with form <IP>:<PORT>
For my current SuperCollider-based setup the assertion looks like this:
Wish the NetAddr is 192.168.4.71:57120
This script currently only sends values to a single OSC receiver. Features like multiple targets and OSC Bundles are still TODO.
Send OSC Packets
When the OSC Script and NetAddr claims are being run, we can now easily send messages using Folk via the syntax:
Notify: OSC at /tone with args 440
This sends an OSC message to NetAddr with path /tone and value 220 the OSC helper utils will parse 220 into an int and send it as a proper OSC integer.
For any questions please tag Paul on the discord!
