# Send an OSC message (Open Sound Control)

``

    osc  path (arguments)

Sends an OSC message to the current host and port specified by `use_osc` or `with_osc`.

OSC (Open Sound Control) is a simple way of passing messages between two separate programs on the same computer or even on different computers via a local network or even the internet. `osc` enables you to send well-timed OSC messages from within Sonic Pi. `osc` will ensure that the OSC message is sent at the correct time using the same timing system shared with the synthesis functionality via `sample`, `synth` and friends. `osc` even works seamlessly within `time_warp` - see examples.

A typical OSC message has two parts: a descriptive `path` which looks simalar to a URL (website address), and an optional list of `arguments` that are either numbers or strings.

For example, a hypothetical synth program might accept this OSC message:

`/set/filter lowpass 80 0.5`

where `/set/filter` is the path, and `lowpass`, `80`, and `0.5` are three arguments. This can be sent from within Sonic Pi by writing:

`osc "/set/filter", "lowpass", 80, 0.5`

However, in order to send the OSC message you must first specify where to send it to. This is achieved by specifying both the host (the machine’s internet address) and the port that the remote OSC server is listening on. This is configured using `use_osc` or `with_osc`. So, if our synth program was running on a machine on the local network with IP address `10.0.1.5` on port `5100` we could send our OSC message to it with the following:

`use_osc "10.0.1.5", 5100`

`osc "/set/filter", "lowpass", 80, 0.5`

Note, by default, Sonic Pi listens for OSC messages on port `4560`, so you may send messages to an external machine running Sonic Pi if you know the IP address of that external machine. Any OSC messages received on port `4559` are automatically converted to standard cue events and displayed in the GUI’s cue log. This also means that you can use `sync` to wait for the next incoming OSC message with a given path (see example).

Finally, it is also very useful to send OSC messages to aother programs on the same computer. This can be achieved by specifying “localhost” as the hostname and the port as normal (depending on which port the other program is listening on).

See `osc_send` for a version which allows you to specify the hostname and port directly (ignoring any values set via `use_osc` or `with_osc`).

For further information see the OSC spec: http://opensoundcontrol.org/spec-1_0

Introduced in v3.0

## Examples

# Example 1
``
    use_osc "localhost", 7000
    osc "/foo/bar"
| ``
    # Send a simple OSC message to another program on the same machine

    # Specify port 7000 on this machine
    # Send an OSC message with path "/foo/bar"
    # and no arguments
# Example 2
``
    use_osc "localhost", 7000
    osc "/foo/bar", 1, 3.89, "baz"
| ``
    # Send an OSC messages with arguments to another program on the same machine

    # Specify port 7000 on this machine
    # Send an OSC message with path "/foo/bar"
    # and three arguments:
    # 1) The whole number (integer) 1
    # 2) The fractional number (float) 3.89
    # 3) The string "baz"
# Example 3
``
    use_osc "10.0.1.5", 7000
    osc "/foo/bar", 1, 3.89, "baz"
| ``
    # Send an OSC messages with arguments to another program on a different machine

    # Specify port 7000 on the machine with address 10.0.1.5
    # Send an OSC message with path "/foo/bar"
    # and three arguments:
    # 1) The whole number (integer) 1
    # 2) The fractional number (float) 3.89
    # 3) The string "baz"
# Example 4
``
    osc "/foo/bar"
    play 60

    sleep 1

    osc "/baz/quux"
    play 72
| ``
    # OSC messages honour the timing system

    # Send an OSC message with path /foo/bar at *exactly* the
    # same time as note 60 is played

    # Wait for 1 beat

    # Send an OSC message with path /baz/quux at *exactly* the
    # same time as note 72 is played
# Example 5
``
    live_loop :foo do
      osc "/counter", tick

      sleep 1
    end
| ``
    # Send a incrementing OSC counter

    # Start a live loop called :foo
    # Send an OSC message with the path /counter
    # with successive whole numbers (0, 1, 2, 3.. etc.)
    # each time round the live loop
    # Repeat the live loop every 1 beat
# Example 6
``
    time_warp 0.5 do
      osc "/foo/bar"
    end

    sleep 1

    time_warp -0.1 do
      osc "/baz/quux"
    end
| ``
    # OSC messages can be sent from within time_warp

    # Send an OSC message with path /foo/bar at 0.5 beats

    # Wait for 1 beat

    # Send an OSC message with path /baz/quux at 0.9 beats