doc: update some MIDI docs

The current situation is:

 - The ALSA sequencer produces and consumes raw UMP only. Legacy input
   is converted with the control mixer to UMP.
 - All apps and plugins are made to consume and produce UMP.
 - The control mixer can convert between UMP and MIDI when required.
 - Legacy apps (pw-filter) will still receive MIDI1 events (converted by
   the control mixer).
 - Helper functions to convert UMP to and from MIDI can be used to ease
   implementation when legacy MIDI is still required.

Using UMP natively over raw MIDI has some advantages:

 - Transparent support for MIDI2 hardware and the new MIDI2 features
   such as increased resolution for events, microtonal support, etc..
 - Easy to convert between legacy MIDI and UMP
 - Large SysEx can be fragmented properly.
 - Fixed size messages are easier to parse and handle.
This commit is contained in:
Wim Taymans 2024-07-26 15:28:35 +02:00
parent d057c95b2b
commit e507c03ad3

View file

@ -58,6 +58,10 @@ Since the MIDI events are embedded in the generic control stream,
they can be interleaved with other control message types, such as
property updates or OSC messages.
As of 1.4, SPA_CONTROL_UMP (Universal Midi Packet) is the prefered format
for the MIDI 1.0 and 2.0 messages in the \ref spa_pod_sequence. Conversion
to SPA_CONTROL_Midi is performed for legacy applications.
## The PipeWire Daemon
Nothing special is implemented for MIDI. Negotiation of formats
@ -78,9 +82,9 @@ in order to route MIDI streams to them from applications that want this.
# Implementation
## PipeWire Media Session
## Session manager (Wireplumber)
PipeWire media session uses the \ref SPA_NAME_API_ALSA_SEQ_BRIDGE plugin for
The session manager uses the \ref SPA_NAME_API_ALSA_SEQ_BRIDGE plugin for
the MIDI features. This creates a single SPA Node with ports per
MIDI client/stream.
@ -93,8 +97,16 @@ until the sequencer device node is accessible.
JACK assumes all `"application/control"` ports are MIDI ports.
The control messages are converted to the JACK event format by
filtering out the \ref SPA_CONTROL_Midi types. On output ports, the JACK
event stream is converted to control messages in a similar way.
filtering out the \ref SPA_CONTROL_Midi, \ref SPA_CONTROL_OSC and
\ref SPA_CONTROL_UMP types. On output ports, the JACK event stream is
converted to control messages in a similar way.
Normally, all MIDI and UMP messages are converted to MIDI1 jack events unless
the JACK port was created with an explcit "32 bits raw UMP" format, in which
case the raw UMP is passed to the JACK application directly. For output ports,
the JACK events are assumed to be MIDI1 and converted to UMP unless the port
has the "32 bit raw UMP" format, in which case the UMP messages are simply
passed on.
There is a 1 to 1 mapping between the JACK events and control
messages so there is no information loss or need for complicated