is it possible to control Bitwig anyhow from a standalone application?

Post Reply New Topic
RELATED
PRODUCTS

Post

Hello,

I wrote a Linux application to configure the mappings for NI Komplete Kontrol MK2 controllers. While it is already possible to configure the MIDI channels assigned to selected key ranges and which CC codes all the knobs, buttons and connected pedals send, the goal for upcoming versions is to make it also possible to use the buttons on the controller to execute functions in the Bitwig DAW (for example to start playing of the play button on the controller is pushed).

Does anybody know if Bitwig provides something like a network service or DBus service which allows to remote-control a running instance of the program. Alternatively, is there any controller plugin which provides something like this?
Do you want to use NI Komplete Kontrol MK2 controllers on Linux? Then check out the qKontrol project.

Post

GoaSkin wrote: Fri Jun 14, 2019 10:23 pm Hello,

I wrote a Linux application to configure the mappings for NI Komplete Kontrol MK2 controllers. While it is already possible to configure the MIDI channels assigned to selected key ranges and which CC codes all the knobs, buttons and connected pedals send, the goal for upcoming versions is to make it also possible to use the buttons on the controller to execute functions in the Bitwig DAW (for example to start playing of the play button on the controller is pushed).

Does anybody know if Bitwig provides something like a network service or DBus service which allows to remote-control a running instance of the program. Alternatively, is there any controller plugin which provides something like this?
Yes, there are lots of possible solutions for this. E.g. you could simply use OSC (e.g. from DrivenByMoss or write you own commands). If you write a Java extension for Bitwig you can also access any Java communication library on the planet (even call into C-code).

Post

Thanks a lot for your reply.

I already thought about using the OSC protocol. Unfortunately, I use Bitwig 2.3.5 and we currently have no update plan running. Trying with the older "2.0" version of this extension, port 8000 or another specified port remains closed.

The console output is just:

Code: Select all

java.net.PortUnreachableException: ICMP Port Unreachable
        at java.net.PlainDatagramSocketImpl.receive0(Native Method)
        at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)
        at java.net.DatagramSocket.receive(DatagramSocket.java:812)
        at com.bitwig.flt.control_surface.opensoundcontrol.ESQ.MlO(SourceFile:60)
        at java.lang.Thread.run(Thread.java:745)
but I will debug this a bit more ASAP
Do you want to use NI Komplete Kontrol MK2 controllers on Linux? Then check out the qKontrol project.

Post

I send sysex messages to pass code to my script, maybe this would be a solution if OSC is not available for you?

I'm sure there is a better way to code this:

Code: Select all

function hex_to_ascii(str1)
	{
	   var hex  = str1.toString();
	   var str = '';
	   for (var n = 0; n < hex.length; n += 2) {
	      str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
	   }
	   return str;  
	}

function onSysex0(data) {
	
	data=data.substr(2).slice(0,-2)
	data=hex_to_ascii(data)
	
	firstWord = data.split(" ")[0]
	content = data.split(" ")
	content = content.slice(1,content.length).join(" ")


	//Display custom string notification
	if (firstWord == 'disp'){host.showPopupNotification(content)}


}

Post

I actually have a working solution to this, using a UDP socket, ( which is available from controller scripts) I made a webapp that behaves as a touchscreen controller for bitwig macros... it's done using node.js as a server that acts as a communication bridge between the browser and bitwig...

here's the code for the server: https://github.com/brunomolteni/overwig ... er.js#L111

and here's the code for the controller script:
https://github.com/brunomolteni/overwig ... ol.js#L155


I had to actually figure out how to encode the data when sent through the socket ( String.getBytes and bytesToString in the controller script, ReadBytes and GetBytes in the server), and added a JSON polyfill to use JSON.stringify inside the controller script.
On the server side I just do a JSON.parse on the data recieved ( I had to actually implement a splitting logic because sometimes the socket would send several messages all together )

hope this helps...

Post Reply

Return to “Controller Scripting”