A list of annoying UI things

So, I’ve been trying to build together a one-shot. Now, I have a specific way I like to have things so they are organized, so its been absolutely frustrating in having to figure out how Syrinscape’s idiosyncrasies are able to be bypassed.

For context, I’m using the Syrinscape Plugin for Foundry VTT through HTTPS. I use a combination of Chrome, Opera GX, and Edge to solve problems with Syrinscape’s problems. I have two computers I’m testing on: computer 1 is the master. Logged in as a GM on Foundry, with Syrinscape logged in as the master. Computer 2 is the client. Logged in as a player on Foundry through Chrome, no other windows.

So far, as I have figured out, there are multiple parts to Syrinscape:

  • The Syrinscape Master Interface (/online/master)
  • The Syrinscape App Interface (app.syrinscape.com)
  • The Syrinscape Foundry API Interface (through foundry as an API Key)
  • The Syrinscape direct API (/online/frontend-api)
  • The Syrinscape Downloaded Interface (an app you can run on Windows)

Not all of these talk to each other, and some are plain incompatible, depending on the scenario.

Let’s take scenario 1: I’m trying to make a Soundset. If you access the Master Interface, search for an item, and click any audio, it fails. You try to click the Plus symbol, nothing happens. So, if you check the Developer interface, you get a 403 status error that was uncaught, and didn’t notify the user. However, if you try accessing the address (which leads to the direct API), it doesn’t produce a 403 error, it actually plays on the Master Interface.

HOWEVER the weirdness doesn’t stop there. This item that was played by accessing the direct API it played only on the Master Interface. You also cannot stop that, and the stop button does not work to stop the sound from playing. So, if you played a really long music or sound, well, get ready to wait until it is done, or just F5 the entire interface.

Now, how you actually make this work is that you go to the App website, click Start, and then click New Game. Now, you can search for stuff, add it as an element in a Soundset, etc. However, there were no notifications or items that told you this problem.

So, already we have quite a few problems:

  1. The App Interface does not play to other Interfaces.
  2. The Master Interface cannot play or import sounds from the Search bar.
  3. The Master Interface does not produce error messages when problems occur.
  4. There’s no way to stop a sound that’s been played through the API directly.
  5. There’s no indication that a sound is playing through the Master Interface.
  6. When you actually click the + symbol, there is no notification or indication if it did or did not get added as an item, you need to investigate yourself if something happened.

Scenario 2: You’re trying to find a specific sound for a Soundset.
Let’s take this scenario. In one scenario, the players are going to be messing with boxes, and there’s a chance they can drop the boxes, which come crashing to the ground. So, you search Box. However, the search system seemingly is using a fuzzy search algorithm that does not have a sorting that makes sense:

  • 3x Box
  • 10x Bog
  • 1x Zox
  • 5x Box
  • 2x Nox
  • 5x Bog

If I search for “box,” I want box to be at the top. While I can use quotations to make sure that it is a “box,” expected search should be similar to how most search engine searches work: If you search for box, it finds box. If you want to find something similar to a word, you should append ~, which means “like” or “about” or “synonym.” Having items in your search that are not what you searched for makes it incredibly frustrating.

What’s even worse is that if there are more than 100 Elements on your search and you want to continue to find more, there’s no “page 2” button, it just ends with element 100 being half cut off.

Then, if you do find the element, then the add button is kind of confusing.

So, let’s add to the list of things that are problems:
7. Search function uses “like” instead of “exact” by default.
8. There is no Page 2 button.
9. When you click the :heavy_plus_sign: button, it doesn’t really indicate what happens, or if something didn’t work. It should ask you what do you want to do (add to Soundset, add to selected element, etc.), and it should provide a popup saying the item was successfully imported (or failed in an error).
10. There is no global stop for the Search menu.

Now, let’s move on to figuring out how to play items.

There is very little interface that shows you what exactly is playing if you switch soundsets. There’s no audio waveform underneath Global Volume or OneShot Volume that indicates that is what is playing, and that’s the volume you need to adjust. There’s no text that tells you what is playing. If you want to stop something individually, you have to locate the soundset and stop it there, or you have to stop all sounds.

Finally, there’s interconnectivity.

A reminder, there is three major parts to this system: The Foundry API, the App Interface, and the Master Interface. Both the master and the app interface look exactly the same. However, the app interface plays through the app browser, and not to the master or Foundry API. The Master Interface plays through Foundry API, but not the Master Interface.

You also cannot tell whom Syrinscape is broadcasting to. You just have to have faith that everyone is getting the sound data.

  1. The app and the master interfaces need to be merged, or at least operate interoperably.
  2. There needs to be a determination on what Syrinscape is playing to: How many clients, and where its going.

These are 12 frustrating things that made me quite annoyed to even use the interface. While its nothing I can’t work with because I’m a developer and a tester, it probably is annoying for any first-time Syrin users that don’t understand these problems, and how to work around them.

Lastly, I have two ADD things:
13. If I reorder Elements, they should stay in that order, even if I reload the page. If you reorder Elements, the order each category of elements is preserved, but music stays with music, SFX with SFX, and OneShots with OneShots. It annoys the hell out of me.
14. You can’t click on Global OneShots and delete them. I have, so far, been unable to figure out how to delete GOS.

There is an awful lot to respond to here. So apologies in advance if I miss anything. Also like to apologise if my tone comes off as condescending or otherwise inappropriate. Syrinscape has a lot of moving parts, and it is difficult to grasp how much anyone knows.

I might try to start by explaining how things are intended to work, and then we can see how that is different to your experience.

Firstly, Syrinscape has 3 “kinds” of Player (what we call the things that makes the sounds), that all work differently. In chronological order they are:

  1. The Offline Players (Fantasy Player, Sci-Fi Player, Board Game Player). These are seperate apps that are installed and intended to be used completely offline.
  2. The Online Player. This is built with the same Audio engine as #1, but receives its instructions on what to play when via a WebSocket connection to our servers, and dynamically downloads assets as needed.
  3. The Web Player. A complete rebuild of the Audio engine in JavaScript using the Web Audio API so we can embed it in web pages. Also receives instructions from our server via a different WebSocket protocol.

It sounds like you are not using #1 or #2, which is great and simplifies things, but knowing they exist may help explain how and why things are the way they are.

Both #2 and #3 should be able to be controlled and respond to the same requests (we say they are in the same “Session”). #1 is completely Offline, and does not respect the same Session, the only way to control what is played there is by using the App itself (or with 3rd party integration which I will not go into here).

Let me see if I can explain each of the parts you have identified as I understand you mean them.

  • The Syrinscape Master Interface (/online/master)
    • This is the Master Interface that was used to control the Online Player, and to create SoundSets, before the Web Player existed. It makes HTTP requests to our API in order to control the Session.
  • The Syrinscape App Interface (app.syrinscape.com)
    • This is the Master Interface that has an embedded Web Player, and so makes sound all by itself. In almost all other aspects it is the same as the other Master Interface, including how it controls a Session (sends HTTP requests to our API).
  • The Syrinscape Foundry API Interface (through foundry as an API Key)
    • I presume here you are talking about SyrinControl, the (unofficial) plugin a community member has developed in order to control a Session from within Foundry. It does this with the same HTTP API. Somewhat recently it also gained an embedded Web Player, so can make noise without any of the other Players.
  • The Syrinscape direct API (/online/frontend-api)
    • This is the HTTP API I was referring to in all the other places. Sure you can use it directly if you like, and some users like to configure stream decks and things like this, but the other interfaces are just making the requests for you so this is not really a different thing.
  • The Syrinscape Downloaded Interface (an app you can run on Windows)
    • I am not sure exactly which of the Offline Players or the Online Player you are referring to here, either way I hope the above explanation helps clear things up. In particular, the Offline Players are not expected to listen to changes to the Session, they work completely Offline.

Scenario 1:

The Master Interface is only expected to make any noise if you are using the one with the embedded Web Player (app.syrinscape.com), not the one designed to control the Online Player (syrinscape.com/online/master/). This might be why you are saying the Audio fails, since it requires the Online Player to hear anything. The 403 error sounds like a bug, and would love to see some minimal reproduction steps to reproduce that, including who is logged in, what interface is being used, what you searched for, what Subscription access the user has, etc. I am guessing we are showing results that you are not authorised to play, but I am not sure. IIRC, the search panel is using the same method the rest of the Master Interface uses to control the Session, and that is the HTTP API, although depending what you are doing, it might be using a different HTTP Method than requesting the URL in the browser would (i.e. GET). Also the authentication mechanism may be different, although I believe they both use Auth Token (in this case you should check they are the same and match what you see in the Control Panel).

It is not clear to me which Master Interface you are referring to here, if it did not have an embedded Web Player, it can’t be playing there, so it must have been coming from somewhere else? If the Master Interface was unable to stop via the Stop All button, a few possibilities come to mind:

  1. The sound was coming from a Player that is connected to a different Session.
  2. The sound was coming from an Offline Player.
  3. The Master Interface had too many requests pending in its queue and so had not actually sent it yet. Making the request in a new window sidesteps that queue.
  4. There is a known bug with the Firefox implementation of the Web Audio API where a request to fade a Sample that is already mid-fade will just fail, so you might have caught it fading to somewhere else, and then the fade to 0 was skipped due to that bug.
  5. The Stop All button was disabled when it should not be - this was a problem for a while, but I thought we had that sorted.

Okay, so the next step I need to describe one other difference with app.syrinscape.com vs. syrinscape.com/online/master. Each Session has exactly 1 Game Master, and potentially many Minions. Going to app.syrinscape.com authenticated as the GM of your current Session, and you will get the Master Interface so you can control the Session. Navigating there as a Minion, and you are presented with the Player interface, with an embedded Web Player, and just your local volume control and the New Game button. If you are very fancy, you might visit app.syrinscape.com/<SESSION_ID>/player, and that will give you the Player interface wether you are GM of your current Session or not. Visiting syrinscape.com/online/master always gives you the Master Interface, since it has no concept of a Player.

Clicking New Game, takes you out of your current Session, and creates a brand new Session and makes you the GM of that session (so you see the Master Interface of this new Session, but are not controlling whatever Session you were in before, where you was probably not the GM). Lack of error handling is an issue for sure, but understanding why you were getting permission denied before is probably more important here, perhaps you were connected to a Session you were not allowed to control, or trying to access content you were not authorised for, or potentially some other reason.

  1. app.syrinscape.com absolutely should be controlling each Web Player and Online Player that is connected to the same Session. It does when I use it, so would need minimal reproduction steps to see why and when it does not.
  2. I think this curiosity is understood by the Master Interface at syrinscape.com/online/master/ does not have an embedded Web Player, so can never make noise on its own.
  3. Agreed, lack of error handling is something we would like to work on.
  4. I disagree there is no way to stop a sound that has been played through the API directly. Every way to control the Session is ultimately via the API, so it would seem that if a Sample is not responding to a Stop request, it is either an issue with the interface used not completing the request, the request landing and being associated with a different Session, or perhaps a bug in the receiving Player.
  5. Not sure what you mean by there being no indication a sound is playing through the Master Interface. If you mean via syrinscape.com/online/master, then yes, without an Online Player, nothing is playing, and the interface gets no feedback of what is playing, so gives no indication anything is playing. If you mean via app.syrinscape.com, then it should be getting feedback from the embedded Web Player what is playing, and showing glowing/pulsing animations behind the active Elements, and with the waveform visualisers in the Element names and also in the SoundSet artwork.
  6. Currently clicking the (+) icon does require you to have some understanding of what it would do. (+) on a Mood search result adds the Mood to the currently selected SoundSet, (+) on an Element search result adds the Element to the currently selected SoundSet, and (+) on a Sample search result adds that Sample to the Playlist of the currently selected Element (this can be near invisible if you do not know where to look). Assuming you have the permissions to do each of these.

Scenario 2:

Fuzzy search being the default is by design. If you use any sophisticated search engine, it will try to guess what you meant, rather than just looking for what you asked for. Typos are very common, and we can’t let not being able to spell Nyarlathotep precisely stop you getting at that great content. I agree the ordering of the results may not be always ideal, but it is not trivial to anticipate exactly what each and every search term is expecting as a result (compounded by every User has potentially their own private content, and the Officially released content is growing all the time). We do not have the resources of the popular Search Engines you may be trying to compare us with, but we are trying to make improvements as we can, and have more planned.

  1. This is expected and by design. Least effort by the user to maximise the chance they see a result they want (instead of nothing).
  2. The infinite scroll for the search panel was recently broken by a different change we made, causing the problem of only ever seeing 100 results. We have a fix for this which should land soon.
  3. Giving more indication something has happened via an animation or other visual cue sounds like a good idea, but I would expect going via a confirmation dialog/button would grow annoying quite quickly. Each (+) button only ever does one thing, and if you’re familiar with the type of search result, you should be able to infer what thing it did. Again, being more informative on error cases is completely valid, and something we should work on.
  4. Not sure what no global stop means here. I think I may have touched on some reasons why you may be experiencing something like this higher up though, please correct me if not.

Playing items:
The search has a Playing filter facet you could use without any other filtering to see everything that is currently playing. It is not (yet) live updating, so this is not ideal, but should give you something in a pinch to find that stray playing Element you can not find otherwise, and any search filter can be toggled on/off to update the results when needed. Volume control in search results is on our wish list, but you should be able to at least Stop the Element from there, or click on the result to be taken to it where you can control the volume. There is also the waveform overlay on the SoundSet artwork in the bottom left I mentioned earlier. I am not sure what an audio waveform under Global Volume or OneShot Volume would be for?

Interconnectivity:

As above, it sounds like you have gotten into a situation where different Players are respecting different Sessions. As far as I understand, this should not happen if they are all using the same authentication, but perhaps this needs special handling in the Foundry integration for example, to reconnect as the session changes. If you can get us a minimal test case here it is something we can investigate. I go into some detail regarding the same-ness of the two Master Interfaces in this post: Online Player Search Doesn't Play, and indeed reading through that thread could be generally enlightening.

  1. Agreed. We want to integrate them into one interface eventually. For now what we have seems to be at least functional. Indeed understanding that only one of them has an embedded Web Player (and if you heard the other making noise it was coming from somewhere else, maybe a Web Player embedded in Foundry?), then they should be operating interoperably.
  2. Yup. We also want to increase the visibility of what users are joined to what Session.

Final things:

  1. I believe the Elements in a SoundSet are ordered by type (Music, SFX, OneShot), and then the custom ordering. The ordering by type is by design, if you think it should be otherwise, you will need to make a convincing argument to @benjamin :slight_smile:
  2. All Global OneShots are discovered by searching through your authorised Elements, see which ones have the “Show in global OneShots?” flag on, and are not in your currently selected SoundSet. You can find the Elements in your own content that may have this on and toggle it off, but unfortunately, as a user you are not permitted to change Elements inside Official SoundSets, so can not change this flag for those. This feature is a hold over from the days of the Offline Player, where SoundSets are specifically installed, so you could turn off Global OneShots by creating your own custom copy, and uninstalling the original SoundSet. Yes, we would like the situation here to improve also.

I hope there is some good news for you somewhere in all that. I have not included any screenshots because this is already long enough, but please feel free to ask follow-up questions, and I can go into more detail.

Thank you kindly for reading until the end!

3 Likes

A fascinating look under the hood that explains a lot.
Thanks!

2 Likes