[alsa-devel] How to send non-SysEx system messages via ALSA?

Clemens Ladisch clemens at ladisch.de
Tue Mar 5 12:51:24 CET 2013


Joerg-Cyril.Hoehle at t-systems.com wrote:
> seqmid.h contains function that declare the major event types like
> snd_seq_ev_set_noteon and snd_seq_ev_set_sysex.  However, seq_event.h
> knows many more types, e.g. SND_SEQ_EVENT_START and
> SND_SEQ_EVENT_CLOCK/TICK.

The functions in seqmid.h are just helpers for the most common messages;
you can fill the snd_seq_event_t structure manually.

> Now, consider an app playing a MIDI file or a debug tool that allows
> to send arbitrary messages.  How should such an app send e.g. the
> 2-byte MTC Quarter Frame sequence via ALSA?
> ...
> B. Use SND_SEQ_EVENT_TICK

This is not a MIDI message.  (In fact, this message is not used at all.
Er, and don't believe what its comment says.)

>    snd_seq_ev_set_queue_control(ev,...)
>    But why does that alter my destination port via
>     snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER)?

Certain messages are use for sequencer-specific notification and control
purposes.  Messages that affect (queue) timers are sent to the special
system timer client.

> C. It's SND_SEQ_EVENT_CLOCK actually,

SND_SEQ_EVENT_CLOCK is MIDI Clock (F8).

MTC Quarter Frame (F1) is SND_SEQ_EVENT_QFRAME.

> Background: Wine on Linux needs to generate such messages on behalf of
> applications and users with real MIDI HW.
> So far Wine assumes that it can encapsulate all system messages in a SysEx,
> IOW Wine does A.  Is that usage of the set_sysex API correct?

It works, but it's not what this event type was designed for.  In any
case, all MIDI messages have a corresponding sequencer event type, so
you should use that.

You could save much work by using ALSA's built-in MIDI encoder:
http://www.alsa-project.org/alsa-doc/alsa-lib/group___m_i_d_i___event.html


Regards,
Clemens


More information about the Alsa-devel mailing list