Overwitch, a JACK client for Overbridge devices, AKA Overbridge for Linux

Version 1.0 is ready.

But before releasing it I’d like to know if someone is using Overwitch with Analog Rytm MKII. There was a long time issue with the audio from the computer into the devices that has been addressed and this machine is the last one to be confirmed.

TIA.

5 Likes

Hello, I just found out about this! :slight_smile:

I am a Jack user on Windows and was sad that overbridge didn’t work out of the box :frowning:

Is there an installation guide for windows users that includes dependencies / enviroments i need to preinstall? (or can someone get me some pointers on getting started? :slight_smile: I looked at the github page but was a bit intimidated and only found linux installation guide :slight_smile: )

Thank you very much for this project!

1 Like

Welcome to Elektronauts!

This is something that is quite difficult for me as I neither have a Windows computer nor any idea about how to build an autotools project on it. Sorry. :frowning:

If anyone knows or you manage to find out how, let us know.

1 Like

Excuse me for the thread bump but, anyone here that can confirm if Overwitch (master branch) is working with the Analog Rytm MKII?

There is no such thing as far as I know but it should be theoretically possible to compile the project for Windows.

The only caviat that I can see for now is that the project is using libusb and on Windows you would have to install a special driver instead of the official drivers from Elektron.

This would mean that your Elektron box would only be able to work with either the official Overbridge application or with Overwitch but not both, and you would have to reinstall the drivers if you want to switch.

1 Like

So, I was able to compile the CLI application with some tweaks here and there and it seems to work on Windows!

I had to comment out everything that was related to signals and manually change the makefile to include some Windows-specific linker flags.

If you want to experiment yourself, I used MSYS2 and I installed following the steps here: https://www.msys2.org/

I used MSYS MinGW x64 and I installed the following dependencies:

pacman -S autotools mingw-w64-x86_64-gcc libtool mingw-w64-x86_64-libusb mingw-w64-x86_64-jack2 mingw-w64-x86_64-libsamplerate mingw-w64-x86_64-libsndfile mingw-w64-x86_64-json-glib

After that I run

./configure CLI_ONLY=yes

These are the changes that I made to the files:

diff --git a/src/Makefile.am b/src/Makefile.am
index 06c53c4..be37f4b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -7,7 +7,7 @@ overwitch_CFLAGS = -I$(top_srcdir)/src `$(PKG_CONFIG) --cflags $(CLI_LIBS) $(GUI
 overwitch_LDFLAGS = `$(PKG_CONFIG) --libs $(CLI_LIBS) $(GUI_LIBS)` $(SAMPLERATE_LIBS)
 
 overwitch_cli_CFLAGS = -I$(top_srcdir)/src `$(PKG_CONFIG) --cflags $(CLI_LIBS)` -pthread $(SAMPLERATE_CFLAGS)
-overwitch_cli_LDFLAGS = `$(PKG_CONFIG) --libs $(CLI_LIBS)` $(SAMPLERATE_LIBS)
+overwitch_cli_LDFLAGS = `$(PKG_CONFIG) --libs $(CLI_LIBS)` $(SAMPLERATE_LIBS) -lws2_32
 
 overwitch_play_CFLAGS = -I$(top_srcdir)/src `$(PKG_CONFIG) --cflags libusb-1.0` -pthread $(SAMPLERATE_CFLAGS) $(SNDFILE_CFLAGS)
 overwitch_play_LDFLAGS = `$(PKG_CONFIG) --libs libusb-1.0` $(SAMPLERATE_LIBS) $(SNDFILE_LIBS)
@@ -16,7 +16,7 @@ overwitch_record_CFLAGS = -I$(top_srcdir)/src `$(PKG_CONFIG) --cflags libusb-1.0
 overwitch_record_LDFLAGS = `$(PKG_CONFIG) --libs libusb-1.0` $(SAMPLERATE_LIBS) $(SNDFILE_LIBS)
 
 if CLI_ONLY
-bin_PROGRAMS = overwitch-cli overwitch-record overwitch-play
+bin_PROGRAMS = overwitch-cli
 else
 bin_PROGRAMS = overwitch overwitch-cli overwitch-record overwitch-play
 endif
@@ -32,4 +32,4 @@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@
 SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
 SNDFILE_LIBS = @SNDFILE_LIBS@
 
-AM_CPPFLAGS = -Wall -O3 -DDATADIR='"$(datadir)"'
+AM_CPPFLAGS = -Wall -O3
diff --git a/src/engine.c b/src/engine.c
index e91d6ca..eac1236 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -26,7 +26,7 @@
 #include <string.h>
 #include <errno.h>
 #include <stdlib.h>
-#include <endian.h>
+#include "portable_endian.h"
 #include <time.h>
 #include <unistd.h>
 #include "engine.h"
diff --git a/src/jclient.c b/src/jclient.c
index d0b79a4..540d96d 100644
--- a/src/jclient.c
+++ b/src/jclient.c
@@ -22,7 +22,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
-#include <arpa/inet.h>
+// #include <arpa/inet.h>
 #include <jack/jack.h>
 #include <jack/intclient.h>
 #include <jack/thread.h>
diff --git a/src/main-cli.c b/src/main-cli.c
index 7357743..4a02f0b 100644
--- a/src/main-cli.c
+++ b/src/main-cli.c
@@ -25,6 +25,11 @@
 #include "utils.h"
 #include "common.h"
 
+#ifdef DEFAULT_QUALITY
+// seems to befined somewhere in some Windows-specific header file
+#undef DEFAULT_QUALITY
+#endif
+
 #define DEFAULT_QUALITY 2
 #define DEFAULT_BLOCKS 24
 #define DEFAULT_PRIORITY -1	//With this value the default priority will be used.
@@ -44,27 +49,27 @@ static struct option options[] = {
   {NULL, 0, NULL, 0}
 };
 
-static void
-signal_handler (int signo)
-{
-  if (signo == SIGHUP || signo == SIGINT || signo == SIGTERM
-      || signo == SIGTSTP)
-    {
-      struct jclient *jclient = jclients;
-      for (int i = 0; i < jclient_count; i++, jclient++)
-	{
-	  jclient_stop (jclient);
-	}
-    }
-  else if (signo == SIGUSR1)
-    {
-      struct jclient *jclient = jclients;
-      for (int i = 0; i < jclient_count; i++, jclient++)
-	{
-	  ow_resampler_report_status (jclient->resampler);
-	}
-    }
-}
+// static void
+// signal_handler (int signo)
+// {
+//   if (signo == SIGHUP || signo == SIGINT || signo == SIGTERM
+//       || signo == SIGTSTP)
+//     {
+//       struct jclient *jclient = jclients;
+//       for (int i = 0; i < jclient_count; i++, jclient++)
+// 	{
+// 	  jclient_stop (jclient);
+// 	}
+//     }
+//   else if (signo == SIGUSR1)
+//     {
+//       struct jclient *jclient = jclients;
+//       for (int i = 0; i < jclient_count; i++, jclient++)
+// 	{
+// 	  ow_resampler_report_status (jclient->resampler);
+// 	}
+//     }
+// }
 
 static int
 run_single (int device_num, const char *device_name,
@@ -159,20 +164,20 @@ main (int argc, char *argv[])
   char *device_name = NULL;
   int long_index = 0;
   ow_err_t ow_err;
-  struct sigaction action;
+  // struct sigaction action;
   int device_num = -1;
   int blocks_per_transfer = DEFAULT_BLOCKS;
   int quality = DEFAULT_QUALITY;
   int priority = DEFAULT_PRIORITY;
 
-  action.sa_handler = signal_handler;
-  sigemptyset (&action.sa_mask);
-  action.sa_flags = 0;
-  sigaction (SIGHUP, &action, NULL);
-  sigaction (SIGINT, &action, NULL);
-  sigaction (SIGTERM, &action, NULL);
-  sigaction (SIGUSR1, &action, NULL);
-  sigaction (SIGTSTP, &action, NULL);
+  // action.sa_handler = signal_handler;
+  // sigemptyset (&action.sa_mask);
+  // action.sa_flags = 0;
+  // sigaction (SIGHUP, &action, NULL);
+  // sigaction (SIGINT, &action, NULL);
+  // sigaction (SIGTERM, &action, NULL);
+  // sigaction (SIGUSR1, &action, NULL);
+  // sigaction (SIGTSTP, &action, NULL);
 
   while ((opt = getopt_long (argc, argv, "n:d:q:b:p:lvh",
 			     options, &long_index)) != -1)

You can find portable_endian.h here :arrow_down:. Just save it into the src folder.

After completing everything above you should be able to just compile with make and find overwitch-cli.exein the src folder.

You can use Zadigto switch your Elektron box to the libusbdriver and then you should be good to go.

https://zadig.akeo.ie/

You need to select Options and then List all devices. Chose your Elektron device, make sure that the WinUSB driver is selected and then press Replace driver.

Now, what this tells me that it should definitely be possible to run Overwitch on Windows, but it needs some tweaking. Platform-specific bits would have to be abstracted away and enabled with pre-processor options.

For the most part that seems to only be relevant for signals and endian-conversion code.

There was also some weirdness around the -DDATADIR='"$(datadir)"'macro definition and it caused the compilation to fail with a cryptic error message:

$ make
gcc -DHAVE_CONFIG_H -I. -I..  -Wall -O3 -DDATADIR='"/mingw64/share"'  -I../src `/mingw64/bin/pkg-config --cflags jack libusb-1.0 json-glib-1.0` -pthread -IC:/msys64/mingw64/include  -g -O2 -MT overwitch_cli-main-cli.o -MD -MP -MF .deps/overwitch_cli-main-cli.Tpo -c -o overwitch_cli-main-cli.o `test -f 'main-cli.c' || echo './'`main-cli.c
<command-line>: error: expected identifier or '(' before string constant
make: *** [Makefile:670: overwitch_cli-main-cli.o] Error 1
2 Likes

After giving it some thought, I think it should be possible to complete the project completely for Windows under MSYS2. All the dependencies exists as binary packages:

https://packages.msys2.org

They can easily be installed with pacman.

The next step would be to somehow make autotools generate a correct Makefile under Windows.

Alternatively we could look into cross-compilation and compile to Windows on Linux with MinGW.

1 Like

Hi!

Thanks for your hard world, this tool es excellent in every way, also, the icon revamp feels really good
:slight_smile:

I have one question, though I’m in ubuntu studio, with bitwig 4.3 but i didn’t manage to get midi from/through the box, I am using studio controls (With a2jmidi activated) and raysession to manage connections.

Can you give me any tips on how could i connect?

Thanks!

1 Like

What is the exact problem that you are experiencing?

Welcome to Elektronauts, @yellow-13!

Thanks for your hard world, this tool es excellent in every way,

Thank you very much! I’s a lot of work but it’s nice to see that it’s helpful for others.

also, the icon revamp feels really good

:smiling_face_with_three_hearts:

I have one question, though I’m in ubuntu studio, with bitwig 4.3 but i didn’t manage to get midi from/through the box, I am using studio controls (With a2jmidi activated) and raysession to manage connections.

A couple of questions regarding your setup. Probably obvious but I need to know.

  • What machine are you using? Depending on this, MIDI out is different. On the Syntakt, every track sends MIDI (I think); on the Digitakt, only the MIDI tracks send MIDI data.
  • Have you activated MIDI input in the settings menu? Clock, transport?
  • Have you checked that you’re using the right MIDI channels?

Version 1.0 is just out! :partying_face:

This is a much more mature version with a lot of bugfixes and new features, such as the following.

  • Add many improvements and support for all the devices including the new Syntakt. Input audio tracks are fully working now.
  • Add a new GUI.
  • Let users rename the Overbridge devices from the GUI.
  • Manage all the compatible devices from a single instance for both GUI and CLI.
  • Add new CLI utilities to directly record audio from and play thru the devices.

For more information, go to the README.md.

I hope JACK and Linux users enjoy this. :slight_smile:

9 Likes

Sorry for my ignorance but how to update? Shall I uninstall the previous version and reinstall?
I’m using Manjaro and the previous package was aailable on AUR depot but the new hasn’t been pushed yet, maybe i should wait for that :wink:

Thanks for your job, it is very much appreciated.

Thanks for your job, it is very much appreciated.

:smiling_face_with_three_hearts:

I’ve never tried Arch but I think packages are compiled from sources so, uninstall the package to avoid messing with different installation paths. Then, there are 2 options.

  • Install from the sources, so you have to follow the README.md in the project.
  • Install from the packages available in GitHub. You won’t need all the dependencies but the ones for the run time libraries (libusb-1.0-0-dev, libjack-jackd2-dev, libsamplerate0-dev, libjson-glib-dev, libgtk-3-dev, libsndfile1-dev).

Let us know how you build this on Arch or create a PR to include the instructions so others will know how.

1 Like

I don’t know whether this is expected behavior in the Syntakt or an Overwitch problem. Let me ask.

My DAW can pick the audio of all the tracks, and it works great. Well, actually not all the tracks. I have a MIDI track with a synth connected. The audio of the synth can be heard in Main, but there is no audio coming from this track. It would be great to be able to isolate the synth audio, just like the audio of any other track can be isolated.

You should hear the isolated tracks on their dedicated channels.

Can you try with a completely new project?

1 Like

Ok, I’ll try later.

To be clear, the “regular” tracks are already isolated in their respective channels, and they are received by the DAW in different tracks. It’s the MIDI track the only one that isn’t sending the audio to its channel (although the audio from this track makes it to the general Main).

I still can record the synth audio by playing the MIDI track, muting the rest, and recording the audio from Main, but it is of course a pain.

There is no audio coming from a MIDI track of course, MIDI tracks are only… well MIDI.

There should be dedicated channels for the external inputs of the Syntakt available in overbridge/overwitch, if you connected your synth to the inputs.

1 Like

I misunderstood the original question. If you can hear your external synth via the main output then I’m assuming you have it connected to the input of the Syntakt - if that is the case then you have use the two “Input” ports in Jack/PipeWire to monitor your external synth.

1 Like

Sorry for the silence, busy days.

@rtme @frekvencia yes, of course you are right and now that I understand the problem I can only say “doh”. Thank you, problem solved! The synth is connected to InputL, I set that input in the DAW, and of course it works.

I think this is my last question before considering my Overwitch setup complete (and again I’m not sure whether this is an Overwitch question or something more generic, sorry!):

The volume of the audio coming from the Syntakt seems rather low for all tracks:

  • Track 1 (kick) doesn’t go above -23.7 dB
  • Track 2 (snare) -24.7 dB
  • Track 3 (clap) -24.3 dB
  • … and so on

I’m not sure this is a concern or something that the user can change (other than pumping up the volume in the DAW and speakers, of course). I cannot find any way to send a higher volume signal by tweaking knobs in the Syntakt.

Ah, the “Overbridge is not loud enough” topic :wink:

There has been a lot of discussion on this already: Overbridge much too quiet? (nope: just plenty of headroom) - #2 by redrabbit

In short: The outputs are 24 bit so you can safely boost each track in your DAW to -12db or so for further mixing. The outputs are deliberately so low so in case of filter / distortion peaks there will be absolutely no (unintended) clipping.

1 Like