Virtual Studio jamulus mixing

171 views
Skip to first unread message

Jan-Erik Steel

unread,
Jan 12, 2021, 11:50:14 PM1/12/21
to jacktrip-users
Hi All,
I have a small group of singers that successfully use a private jamulus server. I am running into some singers that don't have a modern computer setup and I am considering getting them raspberry pi computers as an interface. I built one of the Virtual studio machines per the spec on the JackTrip website to test this out.
I was able to set up an unmanaged server (by using the jamulus type option) and connect to a jamulus session on my server. However, I really need to be able to mix the volume of every participant through the jacktrip.local interface for this to be a viable solution for my singers.

After looking at some more documentation, it seemed like I could perhaps get mixing capabilities by using the Jamulus+Jacktrip type option when setting up the unmanaged server, however, that just gives me the error "server update failed: Server type must be either Jamulus or JackTrip: JackTrip+Jamulus"

Is what I'm trying to do (use jamulus server with Virtual studio device and get mixing per participant) possible? I set up the Jamulus server, so I can make adjustments or install Jacktrip on the server if that is needed.

Is there any guidance for setting up an unmanaged server with Jacktrip?

Thanks,
Jan-Erik 

Sharon Hennessy

unread,
Jan 18, 2021, 12:44:30 AM1/18/21
to jacktrip-users
The Jacktrip Virtual Device and Virtual Studio are wonderful resources.  I think your solution for singers without computers is headed in the right direction, but the image you need on the Rpi Virtual Device is Jamulus.    https://github.com/kdoren/jambox-pi-gen     

The jacktrip virtual server can still be used as the server, but the better client is Jamulus (Kevin's Jambox) if most of the singing group is using Jamulus.  The Jamulus Jambox image (Kevin Doren) gives the Rpi user the opportunity to control volume of themselves and other singer. 

I have a couple of musicians who connect to an unmanaged Jamulus server listed on the Virtual Studio site.  They use the Jacktrip Virtual Studio Device and they are not able to see or control the audio levels of the other players.  The Jamulus players can see the Virtual Studio Device player however.

The beauty of the Rpi is that the sd card can be changed to suit the need at hand.  If you want to access through Jacktrip Virtual Studio, use the Jacktrip SD card, if you want to use Jamulus, use the Jambox (Kevin Doren)  card.   The Jambox card also has Jacktrip so direct connection can be made to a Jacktrip server using the Terminal window and Jacktrip commands.

Hilpoltsteiner Michael

unread,
Feb 10, 2021, 5:20:22 PM2/10/21
to jacktrip-users
In my setup, we use the Virtual Studio infrastructure to connect to an unmanaged Jamulus server (in Germany) because a managed JackTrip server is not available and not planned. To be able to centrally control the volume of each single singer, I use the singlemixserver branch of Jamulus. With that branch, only the first client gets the ability to mix the sound which is then fixed for all the other clients, which connect afterwards.

With a chorus of more than 40 singers, it makes no sense that everybody adjusts his own mix! With my setup, only one person (the classical sound engineer) has the task to adjust the levels of all singers and also mute channels which destroys the sound (because of bad connection)
For the singers, a really easy to use Web-Interface is sufficient to connect to the server and adjust the necessary levels (mic input, headphone output) - this makes the rehearsal with many singers easy to participate and administrate.

On the JackTrip server page, I can see who is connected and get some parameters about the connection quality  (and since today, I have the ability to disconnect participants, who forgot to disconnect from the server).
In our last rehearsal two days ago, we were 34 singers and it worked great.

neal rhodes

unread,
Feb 11, 2021, 10:15:04 AM2/11/21
to jacktri...@googlegroups.com
Thank you.   Please, tell us more.  

We initially used the Managed servers 600+ miles away, and always found the Jamulus server gave better sound quality than the Jacktrip server which always experienced dropouts.   We are now using 8 devices covering 11 musicians and the church sanctuary.  

So, singlemixserver - this is a source branch one has to get and compile separately?   Any hints/clues/recipes as to setting this up on linux?   We've already built a Ubuntu server and stock Jamulus and Jacktrip.

Since the VS boxes have no UI, how do you adjust the mix?  Do you make the first client run the stock Jamulus on PC/desktop?   In which case that device has the extra latency of the audio interface?  But for mixing that wouldn't much matter.   The fact that all the VS boxes have the lower latency HiFiBerry would not matter.

How do you distinguish which VS box is which user?   On the PC flavor of Jamulus,  I get no indication of the identity of the VS box.    Is there something to tweak in each VS box to give it a Jamulus name?

I was wondering how/where the mixing happens in Jamulus versus Jacktrip.    With JackTrip I guess each VS box sends 2 channels, and mixing happens at the server, and they get back 2 channels.   With Jamulus, each VS box compresses audio and sends... What?  One or two channels?    And mixing happens where?   At the server?   To do that, there would have to be signal/control communication happening.

It sounds to me like for our practice/recording, this would be the ideal setup.

The other use which we are working on running is a virtual online chorus - a couple musicians/singers in church, streaming live, and the other 8 VS boxes feeding harmony vocals.   Since the sanctuary feed is coming out of the actual main speakers, we have to use the Jacktrip server and remove "self" from each feed.     Otherwise feedback loop.    I don't see how to do that in Jamulus,

--
You received this message because you are subscribed to the Google Groups "jacktrip-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jacktrip-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jacktrip-users/a375297a-ae92-43a2-b565-c52ec496763cn%40googlegroups.com.

Hilpoltsteiner Michael

unread,
Feb 11, 2021, 3:41:39 PM2/11/21
to jacktrip-users
One thing first - It is not that easy because the version of Jamulus, which runs on VS box is not compatible with the most recent Jamulus version in combination with the singlemixserver branch. There was a modification made on the Jamulus protocol with 3.6.0. So you need to work with versions below 3.6.0 as long a the VS box uses 3.5.12. If you mix the versions, I went always into problems either no input or no output!

Let me answer your questions:

So, singlemixserver - this is a source branch one has to get and compile separately?   Any hints/clues/recipes as to setting this up on linux?   We've already built a Ubuntu server and stock Jamulus and Jacktrip. 
Yes, it has to be build by yourself, but that is not a big thing. A description how to do can be found here: https://jamulus.io/wiki/Server-Linux  -> Running a “headless” server
Fetching the sources shall be done in a different way:
  1. install git and other dependencies (ubuntu/debian):
    sudo apt-get install build-essential qt5-qmake qtdeclarative5-dev qt5-default qttools5-dev-tools libjack-jackd2-dev git
  2. fetch jamulus:
    git clone https://github.com/jamulussoftware/jamulus.git
  3. switch to singlemixserver branch
    git checkout tags/r3_5_10 -b feature_singlemixserver 
  4. continue with "qmake "CONFIG+=nosound headless" Jamulus.pro" from the instructions "Running a “headless” server"
If you now execute Jamulus -h, you will get a new option --singlemix and the option --fastupdate is not available any more. Adjust the options in the file jamulus.service accordingly.

Since the VS boxes have no UI, how do you adjust the mix?  Do you make the first client run the stock Jamulus on PC/desktop?   In which case that device has the extra latency of the audio interface?  But for mixing that wouldn't much matter.   The fact that all the VS boxes have the lower latency HiFiBerry would not matter
That is exact what needs to be done. Only the first connected client gets all the faders, so this has to be a native Jamulus client. The mix of that client is then sent to all clients which are connecting afterwards. But use a Jamulus client version below 3.6.0.

How do you distinguish which VS box is which user?   On the PC flavor of Jamulus,  I get no indication of the identity of the VS box.    Is there something to tweak in each VS box to give it a Jamulus name? 
That's a tricky thing, because you need to modify the jamulus.ini file of every VS box. In the VS box, a template of the jamulus.ini is located in /var/lib/jacktrip/ folder. I wrote a tiny script to change the identity (name_base64 tag) besides some other settings. Then the client appears in the native Jamulus GUI with that name.

I was wondering how/where the mixing happens in Jamulus versus Jacktrip.    With JackTrip I guess each VS box sends 2 channels, and mixing happens at the server, and they get back 2 channels.   With Jamulus, each VS box compresses audio and sends... What?  One or two channels?    And mixing happens where?   At the server?   To do that, there would have to be signal/control communication happening. 
As far as I understood, you can configure if Jamulus sends two (stereo) or one (mono) channel and receives mono or stereo. I use Mono-In/Stereo-Out. The mix happens at the server. With the singlemixserver branch, all clients gets the mix of the first client. So all clients sends their input signal to the server, client 1 mixes all the signals (on the server) and all the clients receives the mix of the first client from the server.

But there is an additional constraint: The first client also defines the (UDP) signal configuration (Audio Channels, Audio Quality, Soundcard buffer size). This settings are also adjusted in the jamulus.ini by my script to guarentee, that all settings are the same.

Please have a look in the Issue #599 which discusses that branch: https://github.com/jamulussoftware/jamulus/issues/599

neal rhodes

unread,
Feb 11, 2021, 8:43:51 PM2/11/21
to jacktrip-users
Thank you for the details.  Makes sense.  

Question though:  Given the versions challenges,  IF one was willing to collect up all the VS boxes, would updating the version of Jamulus on the VS boxes to 3.6.0 or higher simplify the build of the Jamulus server?   I've had to dink with them anyway to turn on Mic Bias Voltage, and since each of ours is a different color, we'd want to change the Jamulus name to match the color of the box.

regards,

Neal

Hilpoltsteiner Michael

unread,
Feb 12, 2021, 1:42:59 AM2/12/21
to jacktrip-users
This might be an easier approach and then you gain from the improvements, Jamulus got in the meantime.

neal rhodes

unread,
Feb 12, 2021, 7:49:29 AM2/12/21
to jacktrip-users
Thanks for the info.  Wouldn't mind looking at your script.   Maybe need some coffee too.   I tried...


root$ mount -o remount,rw /
root$cd /var/lib/jacktrip
root$  vi j*


<connectdlgshowallmusicians>1</connectdlgshowallmusicians>
 <name_base64>Yellow</name_base64>
 <instrument>0</instrument>

root$ sync; sync; reboot

and what I see on PC Jamulus for that device is now "a   ?-in-diamond  e ?-in-diamond"

neal rhodes

unread,
Feb 12, 2021, 7:58:35 AM2/12/21
to jacktrip-users
Slightl;y separate sub-topic - someone mentioned jambox.   I burned a new microSD with that yesterday and had it up and running in minutes.   Out of the box it doesn't work with HiFiBerry, but I'm seeing some threads on that.  Hope to have that resolve today.   Just sticking a Griffin iMic on it, it DOES very quickly and nicely give you a full function Jamulus UI on a nearby browser, which could be your first client which has mixing capabilities.

I'm thinking in our scenario, we might go that way with the stock Jamulus server.  Reason being, we need a different mix at church - TAKE OUT the piano/local-vocal feed going to the VS users.  because that's already in the house mix going to the speakers.   So we'd run Jambox at church to control that mix, and everyone else runs standard VS, and just gets 100% of what the VS web UI is set to.

This is doubly groovy, because with using Jamulus the church Jambox can Pan to create the virtual stereo, which at the moment the stock 1.3.0 Jacktrip does not do - only the "super-collider" managed server does that.

Regards,

Neal

Hilpoltsteiner Michael

unread,
Feb 12, 2021, 8:01:43 AM2/12/21
to jacktrip-users
I don't execute the script on the VS box, I mount the sdcard on a linux computer and execute the attached perl script, which modifies the jamulus.ini template.
pi4rkc.pl

neal rhodes

unread,
Feb 12, 2021, 11:24:06 AM2/12/21
to jacktrip-users
Aha.   my $g_nameBase64 = encode_base64($g_name, "");   A clue.    and it also updates  <storedfadertag0_base64>. 

I see from https://www.base64encode.org/ that "Yellow" in base64 is "WWVsbG93".    And people say this stuff is hard to use...

Thanks.

neal rhodes

unread,
Feb 12, 2021, 12:31:36 PM2/12/21
to jacktrip-users
You may not care, but for that one guy mixing, I dug around in the Jamulus source code to find the code values which define what Icon it shows:

 1         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Drum Set" ), ":/png/instr/res/instruments/drumset.png", IC_PERCUSSION_INSTRUMENT ) );
  2         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Djembe" ), ":/png/instr/res/instruments/djembe.png", IC_PERCUSSION_INSTRUMENT ) );
  3         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Electric Guitar" ), ":/png/instr/res/instruments/eguitar.png", IC_PLUCKING_INSTRUMENT ) );
  4         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Acoustic Guitar" ), ":/png/instr/res/instruments/aguitar.png", IC_PLUCKING_INSTRUMENT ) );
  5         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bass Guitar" ), ":/png/instr/res/instruments/bassguitar.png", IC_PLUCKING_INSTRUMENT ) );
  6         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Keyboard" ), ":/png/instr/res/instruments/keyboard.png", IC_KEYBOARD_INSTRUMENT ) );
  7         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Synthesizer" ), ":/png/instr/res/instruments/synthesizer.png", IC_KEYBOARD_INSTRUMENT ) );
  8         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Grand Piano" ), ":/png/instr/res/instruments/grandpiano.png", IC_KEYBOARD_INSTRUMENT ) );
  9         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Accordion" ), ":/png/instr/res/instruments/accordeon.png", IC_KEYBOARD_INSTRUMENT ) );
 10         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal" ), ":/png/instr/res/instruments/vocal.png", IC_OTHER_INSTRUMENT ) );
 11         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Microphone" ), ":/png/instr/res/instruments/microphone.png", IC_OTHER_INSTRUMENT ) );
 12         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Harmonica" ), ":/png/instr/res/instruments/harmonica.png", IC_WIND_INSTRUMENT ) );
 13         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Trumpet" ), ":/png/instr/res/instruments/trumpet.png", IC_WIND_INSTRUMENT ) );
 14         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Trombone" ), ":/png/instr/res/instruments/trombone.png", IC_WIND_INSTRUMENT ) );
 15         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "French Horn" ), ":/png/instr/res/instruments/frenchhorn.png", IC_WIND_INSTRUMENT ) );
 16         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Tuba" ), ":/png/instr/res/instruments/tuba.png", IC_WIND_INSTRUMENT ) );
 17         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Saxophone" ), ":/png/instr/res/instruments/saxophone.png", IC_WIND_INSTRUMENT ) );
 18         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Clarinet" ), ":/png/instr/res/instruments/clarinet.png", IC_WIND_INSTRUMENT ) );
 19         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Flute" ), ":/png/instr/res/instruments/flute.png", IC_WIND_INSTRUMENT ) );
 20         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Violin" ), ":/png/instr/res/instruments/violin.png", IC_STRING_INSTRUMENT ) );
 21         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Cello" ), ":/png/instr/res/instruments/cello.png", IC_STRING_INSTRUMENT ) );
 22         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Double Bass" ), ":/png/instr/res/instruments/doublebass.png", IC_STRING_INSTRUMENT ) );
 23         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Recorder" ), ":/png/instr/res/instruments/recorder.png", IC_OTHER_INSTRUMENT ) );
 24         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Streamer" ), ":/png/instr/res/instruments/streamer.png", IC_OTHER_INSTRUMENT ) );
 25         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Listener" ), ":/png/instr/res/instruments/listener.png", IC_OTHER_INSTRUMENT ) );
 26         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Guitar+Vocal" ), ":/png/instr/res/instruments/guitarvocal.png", IC_MULTIPLE_INSTRUMENT ) );
 27         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Keyboard+Vocal" ), ":/png/instr/res/instruments/keyboardvocal.png", IC_MULTIPLE_INSTRUMENT ) );
 28         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bodhran" ), ":/png/instr/res/instruments/bodhran.png", IC_PERCUSSION_INSTRUMENT ) );
 29         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bassoon" ), ":/png/instr/res/instruments/bassoon.png", IC_WIND_INSTRUMENT ) );
 30         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Oboe" ), ":/png/instr/res/instruments/oboe.png", IC_WIND_INSTRUMENT ) );
 31         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Harp" ), ":/png/instr/res/instruments/harp.png", IC_STRING_INSTRUMENT ) );
 32         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Viola" ), ":/png/instr/res/instruments/viola.png", IC_STRING_INSTRUMENT ) );
 33         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Congas" ), ":/png/instr/res/instruments/congas.png", IC_PERCUSSION_INSTRUMENT ) );
 34         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bongo" ), ":/png/instr/res/instruments/bongo.png", IC_PERCUSSION_INSTRUMENT ) );
 35         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal Bass" ), ":/png/instr/res/instruments/vocalbass.png", IC_OTHER_INSTRUMENT ) );
 36         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal Tenor" ), ":/png/instr/res/instruments/vocaltenor.png", IC_OTHER_INSTRUMENT ) );
 37         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal Alto" ), ":/png/instr/res/instruments/vocalalto.png", IC_OTHER_INSTRUMENT ) );
 38         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal Soprano" ), ":/png/instr/res/instruments/vocalsoprano.png", IC_OTHER_INSTRUMENT ) );
 39         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Banjo" ), ":/png/instr/res/instruments/banjo.png", IC_PLUCKING_INSTRUMENT ) );
 40         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Mandolin" ), ":/png/instr/res/instruments/mandolin.png", IC_PLUCKING_INSTRUMENT ) );
 41         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Ukulele" ), ":/png/instr/res/instruments/ukulele.png", IC_PLUCKING_INSTRUMENT ) );
 42         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bass Ukulele" ), ":/png/instr/res/instruments/bassukulele.png", IC_PLUCKING_INSTRUMENT ) );
 43         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal Baritone" ), ":/png/instr/res/instruments/vocalbaritone.png", IC_OTHER_INSTRUMENT ) );
 44         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal Lead" ), ":/png/instr/res/instruments/vocallead.png", IC_OTHER_INSTRUMENT ) );
 45         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Mountain Dulcimer" ), ":/png/instr/res/instruments/mountaindulcimer.png", IC_STRING_INSTRUMENT ) );
 46         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Scratching" ), ":/png/instr/res/instruments/scratching.png", IC_OTHER_INSTRUMENT ) );
 47         vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Rapping" ), ":/png/instr/res/instruments/rapping.png", IC_OTHER_INSTRUMENT ) );

It looks like it builds a list, then sorts it.  So that first number is what goes in the .ini file.

regards,

Neal

Michael Hilpoltsteiner

unread,
Feb 12, 2021, 1:50:39 PM2/12/21
to jacktri...@googlegroups.com
I used the Jamulus UI to change the configuration and then compared the Jamulus.ini, what values have changed …

Reply all
Reply to author
Forward
0 new messages