Sockets

The Renoise API allows you to create network sockets. This can be used to communicate with other devices via UDP and TCP, e.g. to send or receive OSC messages.

note

There's no support for encrypted connections. So using protocols like HTTPs is not easily possible with the socket API in Renoise.

HTTP / GET client

Creates a TCP socket and connect it to www.wurst.de, http, giving up the connection attempt after 2 seconds.

local connection_timeout = 2000 local client, socket_error = renoise.Socket.create_client( "www.wurst.de", 80, renoise.Socket.PROTOCOL_TCP, connection_timeout) if socket_error then renoise.app():show_warning(socket_error) return end -- request something local succeeded, socket_error = client:send("GET / HTTP/1.0\n\n") if (socket_error) then renoise.app():show_warning(socket_error) return end -- loop until we get no more data from the server. -- note: this is a silly example. we should check the HTTP -- header here and stop after receiveing "Content-Length" local receive_succeeded = false local receive_content = "" while (true) do local receive_timeout = 500 local message, socket_error = client:receive("*line", receive_timeout) if (message) then receive_content = receive_content .. message .. "\n" else if (socket_error == "timeout" or socket_error == "disconnected") then -- could retry here on timeout. we just stop in this example... receive_succeeded = true break else renoise.app():show_warning( "'socket reveive' failed with the error: " .. socket_error) break end end end -- close the connection if it was not closed by the server if (client and client.is_open) then client:close() end -- show what we've got if (receive_succeeded and #receive_content > 0) then renoise.app():show_prompt( "GET / HTTP/1.0 response", receive_content, {"OK"} ) else renoise.app():show_prompt( "GET / HTTP/1.0 response", "Socket receive timeout.", {"OK"} ) end

Echo UDP Server (using a table as notifier)

local server, socket_error = renoise.Socket.create_server( "localhost", 1025, renoise.Socket.PROTOCOL_UDP) if socket_error then app:show_warning( "Failed to start the echo server: " .. socket_error) else server:run { ---@param socket_error string socket_error = function(socket_error) renoise.app():show_warning(socket_error) end, ---@param socket renoise.Socket.SocketClient socket_accepted = function(socket) print(("client %s:%d connected"):format( socket.peer_address, socket.peer_port)) end, ---@param socket renoise.Socket.SocketClient ---@param message string socket_message = function(socket, message) print(("client %s:%d sent '%s'"):format( socket.peer_address, socket.peer_port, message)) -- simply sent the message back socket:send(message) end } end -- will run and echo as long as the script runs...

Echo TCP Server (using a class as notifier)

...and allowing any addresses to connect by not specifying an address:

class "EchoServer" function EchoServer:__init(port) -- create a server socket local server, socket_error = renoise.Socket.create_server(port) if socket_error then app:show_warning( "Failed to start the echo server: " .. socket_error) else -- start running self.server = server self.server:run(self) end end ---@param socket_error string function EchoServer:socket_error(socket_error) renoise.app():show_warning(socket_error) end ---@param socket renoise.Socket.SocketClient function EchoServer:socket_accepted(socket) print(("client %s:%d connected"):format( socket.peer_address, socket.peer_port)) end ---@param message string ---@param socket renoise.Socket.SocketClient function EchoServer:socket_message(socket, message) print(("client %s:%d sent '%s'"):format( socket.peer_address, socket.peer_port, message)) -- simply sent the message back socket:send(message) end -- create and run the echo server on port 1025 local echo_server = EchoServer(1025) -- will run and echo as long as the script runs or the EchoServer -- object is garbage collected...