Skip to content

Update MIDI docs for GUI tab#1121

Draft
ignotus666 wants to merge 1 commit intojamulussoftware:next-releasefrom
ignotus666:midi-upd
Draft

Update MIDI docs for GUI tab#1121
ignotus666 wants to merge 1 commit intojamulussoftware:next-releasefrom
ignotus666:midi-upd

Conversation

@ignotus666
Copy link
Member

@ignotus666 ignotus666 commented Feb 11, 2026

Short description of changes
Updated docs to cover the UI MIDI tab. I moved a number of paragraphs from the Using --ctrlmidich for MIDI controllers section to the Software Manual and just left the command line instructions there. It's a feature whose usage initially can be tricky to understand both in the UI and when using the command line, so it's hard to know what to include/trim from each section.

I'm also not sure about assuming usage of Jack/QjackCtl in Linux or even hand-holding users to make MIDI connections at all for that matter (except perhaps to explain the d option for Windows). I'm inclined to think that by providing a standard MIDI-in port that works the same way as any other MIDI-aware application, it's not up to us to explain how to connect to it. Ok, it helps, but from the point of view of doc maintenance it might make sense to just limit ourselves to things that are specific to Jamulus. Case in point: Jack/QjackCtl is gradually becoming obsolete, being replaced by PipeWire, though people will probably continue to use one or the other for some time still. Do we expand the docs to also explain PipeWire, pipewire-jack, etc? It can get messy, fast, and might become outdated at any moment.

I did away with the default offset of 70 (it's gone in the app PR). It's an arbitrary value that was initially hard-coded to cater to a single device and hasn't made sense for a long time.

Context: Fixes an issue? Related issues
Related to #3502

@softins: #1119 may need updating if/when this gets in.

Status of this Pull Request
Preliminary version subject to comments.

What is missing until this pull request can be merged?

Does this need translation?

YES.

Checklist

  • I've verified that this Pull Request follows the general code principles
  • I waited some time after this Pull Request was opened and all GitHub checks completed without errors.
  • I'm sure that this Pull Request goes to the correct branch

@ignotus666 ignotus666 marked this pull request as draft February 11, 2026 09:09
@ignotus666
Copy link
Member Author

ignotus666 commented Feb 11, 2026

It seems that uploading images to an open issue to generate a url that can then be used is not working. Apparently GH is cracking down on using it as free image hosting and will only allow images to be used in its own system (issues, PR's, etc). Following the link directly will take you to the image (so should work in theory), but it's not rendered in the generated Jekyll website. If that's the case we're going to have to bundle all the images ourselves or find an alternative.

Edit: digging further, it appears that GH is generating temporary signed URLs that expire after 5 minutes when accessed from outside GH. So ideally this should be sorted before releasing the updated website. Great.

@ignotus666 ignotus666 requested a review from ann0see February 11, 2026 10:26
```

* `MIDI channel` is required or else the parameter argument is ignored and the feature is not active. `0` means "any channel", `1`-`16` listen only to MIDI messages on the specified MIDI channel.
* `MIDI channel`
Copy link
Contributor

@pljones pljones Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the description removed?

--ctrlmidich ";1"

should fail to parse and be ignored.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed it because it's a verbatim repetition of the same explanation a bit further up. But I see your point - it could be assumed that the requirement doesn't apply in this case.

### Using `--ctrlmidich` for MIDI controllers

The volume fader, pan control and mute and solo buttons in the Client's mixer window strips can be controlled using a connected MIDI controller. This feature is available from version 3.7.0 on macOS, Linux, and the JACK version of Jamulus for Windows. From Jamulus 3.12.0 onwards, it is also available for the non-JACK (ASIO) Windows version. To enable this feature, Jamulus must be launched with the `--ctrlmidich` command-line option.
MIDI controller parameters can be set using the `--ctrlmidich` command-line option. Bear in mind that when used it will overwrite any values set previously via the GUI. Any values not set in the command line will be reverted to defaults (0 for offset/first MIDI CC and 1 for count).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the style guide prefers "using" to "via" -- give it a quick read.

Also, it's probably useful to link to the MIDI section in the Software Manual page from here, as you've centralised it nicely.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do.

@pljones
Copy link
Contributor

pljones commented Feb 12, 2026

Edit: digging further, it appears that GH is generating temporary signed URLs that expire after 5 minutes when accessed from outside GH. So ideally this should be sorted before releasing the updated website. Great.

MIDI Control Settings

OK - so this one is still here.... but you reckon it'll go?

@pljones
Copy link
Contributor

pljones commented Feb 12, 2026


image

Hm, I just noticed (as this is the first time I've properly looked, sorry!!) the layout of "MIDI Channel" abd "Mute Myself" look odd compared with the other rows.

Can you make the whole thing a table, so the layout is more consistent?

MIDI Channel [0-16<>]
Mute Myself MIDI CC [0-127<>] [ Learn ]
Fader First MIDI CC [0-127<>] [ Learn ] Count [0-127<>]
Pan First MIDI CC [0-127<>] [ Learn ] Count [0-127<>]
Solo First MIDI CC [0-127<>] [ Learn ] Count [0-127<>]
Mute First MIDI CC [0-127<>] [ Learn ] Count [0-127<>]

You could "learn" the channel, too -- any incoming MIDI message would do.

@ignotus666
Copy link
Member Author

OK - so this one is still here.... but you reckon it'll go?

Yes, you can see it here, but try pasting the link into the address bar and see what happens. It turns into an amazonaws-hosted link with a 5-minute expiry time. Keep the link with the image open for 5 mins and then force-refresh the page.

@ignotus666
Copy link
Member Author

Hm, I just noticed (as this is the first time I've properly looked, sorry!!) the layout of "MIDI Channel" abd "Mute Myself" look odd compared with the other rows.

Can you make the whole thing a table, so the layout is more consistent?

Back when I started this I did try laying it all out as a table with each "learnable" item on a single row. The thing is, you either end up with a really wide settings window, or if you try making it narrower, the text gets bunched up together and doesn't really look good. MIDI Channel and Mute Myself (and MIDI-in) are kind of "different" as regards the editable options they have so that's why I have a different layout, with both on the same row as they're shorter. Another reason is that I totally suck at using Qt Designer and had a hard time coming up with what you see. I can have another go at it though I suppose...

I hadn't really considered making MIDI channel learnable because the applications I use don't do it either - MIDI notes, CCs, CNs are learnable but not the channel. I guess because you just have 16 to choose from and it's easier to do it in a couple of clicks than click on "Learn" and move your controller. Which leads me to think - instead of a spinbox, what about a dropdown with 0 (all) to 15?

@pljones
Copy link
Contributor

pljones commented Feb 12, 2026

I don't think we generally use Qt Designer for anything -- just raw QT Creator and a lot of dynamically created stuff!

I find the Qt design support (Designer and Creator) is really painful to use. But then, I use vi for writing HTML. (I'm slowly training myself into using VSCode/Cursor and IntelliJ more for CoPilot/AI integration, though...)

Why not try feeding that table to Github CoPilot and say "Turn this into a Qt form that fits into the current bounds of the Settings dialog" or something?

@ignotus666
Copy link
Member Author

Why not try feeding that table to Github CoPilot and say "Turn this into a Qt form that fits into the current bounds of the Settings dialog" or something?

I tried that in VSCode with Copilot and it produced an unholy mess... I find that with code for visual stuff it's rubbish. It's great at more abstract things though - it's helped me immensely to put together the MIDI tab code.

@pljones
Copy link
Contributor

pljones commented Feb 12, 2026

This pulls the Count and spinner under the Channel and spinner, making it less wide:

Enable MIDI In [ ]
MIDI Channel [0-16<>]
Mute Myself MIDI CC [0-127<>] [ Learn ]
Fader First MIDI CC [0-127<>] [ Learn ]
Count [0-127<>]
Pan First MIDI CC [0-127<>] [ Learn ]
Count [0-127<>]
Solo First MIDI CC [0-127<>] [ Learn ]
Count [0-127<>]
Mute First MIDI CC [0-127<>] [ Learn ]
Count [0-127<>]

I'm still (and this is the wrong PR) wondering whether the code could have platform-specific "give me a list of available MIDI devices" and provide a drop-down (that works like the -d option on Windows but cross-platform)... Definitely not this PR... New feature...

Copy link
Member

@ann0see ann0see left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TBH, I cannot say much here as I don't own any midi hardware (except for a digital piano which I don't have access to)

@ignotus666
Copy link
Member Author

@ann0see the main issue that has surfaced here is that we have to change how we store images.

@ann0see
Copy link
Member

ann0see commented Feb 21, 2026

Worst case: compress it and serve it from this or better another repo

@pljones
Copy link
Contributor

pljones commented Feb 22, 2026

@ann0see the main issue that has surfaced here is that we have to change how we store images.

https://jamulus.io/wiki/Software-Manual still loads fine. Pages where people attach images don't lose the images.

So won't they continue to be fine when viewing Github Pages?

Yes, if you "open in new tab", you now get a weird "github-production-user-asset-6210df.s3.amazonaws.com" URL that, presumably, will expire. But the Github Pages resource is there, isn't it?

@ignotus666
Copy link
Member Author

Images uploaded before this change in Github's policy (I don't know when it happened) still continue to work as before, which is why the website images still work fine. The problem is with new images.

@ann0see
Copy link
Member

ann0see commented Feb 23, 2026

I'd like to test this.

image

Gives https://github.com/user-attachments/assets/906b9fda-e752-47c5-a17a-6c2cc8bd4856

If we check the GitHub html of this PR you say it produces another URL?

@ignotus666
Copy link
Member Author

If we check the GitHub html of this PR you say it produces another URL?

Put that link in your address bar - see how it turns into another URL. Wait 5 mins and force refresh. If you want to view it in a GH issue, PR etc it will work forever. Outside of GH it will last 5 mins.

@pljones
Copy link
Contributor

pljones commented Feb 23, 2026

Right-click, copy image link on https://github.com/user-attachments/assets/906b9fda-e752-47c5-a17a-6c2cc8bd4856 said

https://private-user-images.githubusercontent.com/20726856/553416385-906b9fda-e752-47c5-a17a-6c2cc8bd4856.jpeg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzE4NjY5MzcsIm5iZiI6MTc3MTg2NjYzNywicGF0aCI6Ii8yMDcyNjg1Ni81NTM0MTYzODUtOTA2YjlmZGEtZTc1Mi00N2M1LWExN2EtNmMyY2M4YmQ0ODU2LmpwZWc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMjIzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDIyM1QxNzEwMzdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mYTUzYmQyMjIxODUzZjQ1ZDg0ZWVlZjQyYzM3OGZiYjQ1YjVhODliMmJhMWM0YTNiYzJlZmRiODViNjIzZGI3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Ocib8RMd3f-VWTSDzFtjlYJzOV1CxpEUVY6jN65BA-Q

Note the jwt -- that will have been issued when I loaded this page and will encode the expiry time.

So

  • private-user-images.githubusercontent.com/20726856/553416385-906b9fda-e752-47c5-a17a-6c2cc8bd4856.jpeg

vs

  • github.com/user-attachments/assets/906b9fda-e752-47c5-a17a-6c2cc8bd4856

I expect the private-user-images is the one that expires?

@pljones
Copy link
Contributor

pljones commented Feb 23, 2026

Put that link in your address bar - see how it turns into another URL. Wait 5 mins and force refresh. If you want to view it in a GH issue, PR etc it will work forever. Outside of GH it will last 5 mins.

The link we need is the one in the message, not the one you get after the redirect.


#1121 (comment)

For example: the image in that comment has two URLs -- the one I see when I edit it:

<img alt="MIDI Control Settings" src="https://github.com/user-attachments/assets/b1b07b0d-e5e7-4704-a7ae-17bc18004095" />

and the one from right-click copy image link

https://private-user-images.githubusercontent.com/4263412/547533183-b1b07b0d-e5e7-4704-a7ae-17bc18004095.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzE4NjY5MzcsIm5iZiI6MTc3MTg2NjYzNywicGF0aCI6Ii80MjYzNDEyLzU0NzUzMzE4My1iMWIwN2IwZC1lNWU3LTQ3MDQtYTdhZS0xN2JjMTgwMDQwOTUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDIyMyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAyMjNUMTcxMDM3WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NmYxNDliNjJjNWY0NGJhYWQyMGQ3YjY5YTk4NDRlMWY1M2NkNGIwZmQwMTkzZmIzYTA1ODUxZmYyMDRmZjJlNCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.k7rFwC-LBJkbmsrnO8ODLKWatqg_b27YwpmoZTVjytU

So long as we remember to use the github.com/user-attachments/assets links, we're okay.

(And that means it needs someone with Admin access to grab the links, or to get people to post the generated github.com/user-attachments/assets links as code blocks.)


If you access an .../assets URL directly, you get a 302 redirect:

HTTP/2 302 
...
location: https://github-production-user-asset-6210df.s3.amazonaws.com/20726856/553416385-906b9fda-e752-47c5-a17a-6c2cc8bd4856.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20260223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260223T172602Z&X-Amz-Expires=300&X-Amz-Signature=f7783f70105ab4cf7ecffa0dbdca4bba9105b81598b830e69afec77d92086e5c&X-Amz-SignedHeaders=host
...

so you can probably capture the request from the page display, even if the right-click copy image link location has been updated. Easier to get it from the message source, though.

@ignotus666
Copy link
Member Author

Ok, here's what's happening. The other day when I pasted an image in a comment, the URL I got (before posting the comment), was of the https://private-user-images.githubusercontent.com variety. I tried several times. I may be mistaken but I could have sworn this used to work. What happens now is that as long as the comment hasn't been posted, the link is a temporary signed URL (https://private-user-images.githubusercontent.com). It's not until you actually post the comment that it becomes a permanent URL (https://github.com/user-attachments/assets). So yeah, the procedure is to paste the image, post the comment, and then click on "edit" to retrieve the usable URL.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants