xref: /OK3568_Linux_fs/kernel/Documentation/sound/designs/seq-oss.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun===============================
2*4882a593SmuzhiyunOSS Sequencer Emulation on ALSA
3*4882a593Smuzhiyun===============================
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunCopyright (c) 1998,1999 by Takashi Iwai
6*4882a593Smuzhiyun
7*4882a593Smuzhiyunver.0.1.8; Nov. 16, 1999
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunDescription
10*4882a593Smuzhiyun===========
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunThis directory contains the OSS sequencer emulation driver on ALSA. Note
13*4882a593Smuzhiyunthat this program is still in the development state.
14*4882a593Smuzhiyun
15*4882a593SmuzhiyunWhat this does - it provides the emulation of the OSS sequencer, access
16*4882a593Smuzhiyunvia ``/dev/sequencer`` and ``/dev/music`` devices.
17*4882a593SmuzhiyunThe most of applications using OSS can run if the appropriate ALSA
18*4882a593Smuzhiyunsequencer is prepared.
19*4882a593Smuzhiyun
20*4882a593SmuzhiyunThe following features are emulated by this driver:
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun* Normal sequencer and MIDI events:
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun    They are converted to the ALSA sequencer events, and sent to the
25*4882a593Smuzhiyun    corresponding port.
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun* Timer events:
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun    The timer is not selectable by ioctl. The control rate is fixed to
30*4882a593Smuzhiyun    100 regardless of HZ. That is, even on Alpha system, a tick is always
31*4882a593Smuzhiyun    1/100 second. The base rate and tempo can be changed in ``/dev/music``.
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun* Patch loading:
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun    It purely depends on the synth drivers whether it's supported since
36*4882a593Smuzhiyun    the patch loading is realized by callback to the synth driver.
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun* I/O controls:
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun    Most of controls are accepted. Some controls
41*4882a593Smuzhiyun    are dependent on the synth driver, as well as even on original OSS.
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunFurthermore, you can find the following advanced features:
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun* Better queue mechanism:
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun    The events are queued before processing them.
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun* Multiple applications:
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun    You can run two or more applications simultaneously (even for OSS
52*4882a593Smuzhiyun    sequencer)!
53*4882a593Smuzhiyun    However, each MIDI device is exclusive - that is, if a MIDI device
54*4882a593Smuzhiyun    is opened once by some application, other applications can't use
55*4882a593Smuzhiyun    it. No such a restriction in synth devices.
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun* Real-time event processing:
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun    The events can be processed in real time without using out of bound
60*4882a593Smuzhiyun    ioctl. To switch to real-time mode, send ABSTIME 0 event. The followed
61*4882a593Smuzhiyun    events will be processed in real-time without queued. To switch off the
62*4882a593Smuzhiyun    real-time mode, send RELTIME 0 event.
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun* ``/proc`` interface:
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun    The status of applications and devices can be shown via
67*4882a593Smuzhiyun    ``/proc/asound/seq/oss`` at any time. In the later version,
68*4882a593Smuzhiyun    configuration will be changed via ``/proc`` interface, too.
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun
71*4882a593SmuzhiyunInstallation
72*4882a593Smuzhiyun============
73*4882a593Smuzhiyun
74*4882a593SmuzhiyunRun configure script with both sequencer support (``--with-sequencer=yes``)
75*4882a593Smuzhiyunand OSS emulation (``--with-oss=yes``) options. A module ``snd-seq-oss.o``
76*4882a593Smuzhiyunwill be created. If the synth module of your sound card supports for OSS
77*4882a593Smuzhiyunemulation (so far, only Emu8000 driver), this module will be loaded
78*4882a593Smuzhiyunautomatically.
79*4882a593SmuzhiyunOtherwise, you need to load this module manually.
80*4882a593Smuzhiyun
81*4882a593SmuzhiyunAt beginning, this module probes all the MIDI ports which have been
82*4882a593Smuzhiyunalready connected to the sequencer. Once after that, the creation and deletion
83*4882a593Smuzhiyunof ports are watched by announcement mechanism of ALSA sequencer.
84*4882a593Smuzhiyun
85*4882a593SmuzhiyunThe available synth and MIDI devices can be found in proc interface.
86*4882a593SmuzhiyunRun ``cat /proc/asound/seq/oss``, and check the devices. For example,
87*4882a593Smuzhiyunif you use an AWE64 card, you'll see like the following:
88*4882a593Smuzhiyun::
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun    OSS sequencer emulation version 0.1.8
91*4882a593Smuzhiyun    ALSA client number 63
92*4882a593Smuzhiyun    ALSA receiver port 0
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun    Number of applications: 0
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun    Number of synth devices: 1
97*4882a593Smuzhiyun    synth 0: [EMU8000]
98*4882a593Smuzhiyun      type 0x1 : subtype 0x20 : voices 32
99*4882a593Smuzhiyun      capabilties : ioctl enabled / load_patch enabled
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun    Number of MIDI devices: 3
102*4882a593Smuzhiyun    midi 0: [Emu8000 Port-0] ALSA port 65:0
103*4882a593Smuzhiyun      capability write / opened none
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun    midi 1: [Emu8000 Port-1] ALSA port 65:1
106*4882a593Smuzhiyun      capability write / opened none
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun    midi 2: [0: MPU-401 (UART)] ALSA port 64:0
109*4882a593Smuzhiyun      capability read/write / opened none
110*4882a593Smuzhiyun
111*4882a593SmuzhiyunNote that the device number may be different from the information of
112*4882a593Smuzhiyun``/proc/asound/oss-devices`` or ones of the original OSS driver.
113*4882a593SmuzhiyunUse the device number listed in ``/proc/asound/seq/oss``
114*4882a593Smuzhiyunto play via OSS sequencer emulation.
115*4882a593Smuzhiyun
116*4882a593SmuzhiyunUsing Synthesizer Devices
117*4882a593Smuzhiyun=========================
118*4882a593Smuzhiyun
119*4882a593SmuzhiyunRun your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1
120*4882a593Smuzhiyunand xmp-1.1.5. You can load samples via ``/dev/sequencer`` like sfxload,
121*4882a593Smuzhiyuntoo.
122*4882a593Smuzhiyun
123*4882a593SmuzhiyunIf the lowlevel driver supports multiple access to synth devices (like
124*4882a593SmuzhiyunEmu8000 driver), two or more applications are allowed to run at the same
125*4882a593Smuzhiyuntime.
126*4882a593Smuzhiyun
127*4882a593SmuzhiyunUsing MIDI Devices
128*4882a593Smuzhiyun==================
129*4882a593Smuzhiyun
130*4882a593SmuzhiyunSo far, only MIDI output was tested. MIDI input was not checked at all,
131*4882a593Smuzhiyunbut hopefully it will work. Use the device number listed in
132*4882a593Smuzhiyun``/proc/asound/seq/oss``.
133*4882a593SmuzhiyunBe aware that these numbers are mostly different from the list in
134*4882a593Smuzhiyun``/proc/asound/oss-devices``.
135*4882a593Smuzhiyun
136*4882a593SmuzhiyunModule Options
137*4882a593Smuzhiyun==============
138*4882a593Smuzhiyun
139*4882a593SmuzhiyunThe following module options are available:
140*4882a593Smuzhiyun
141*4882a593Smuzhiyunmaxqlen
142*4882a593Smuzhiyun  specifies the maximum read/write queue length. This queue is private
143*4882a593Smuzhiyun  for OSS sequencer, so that it is independent from the queue length of ALSA
144*4882a593Smuzhiyun  sequencer. Default value is 1024.
145*4882a593Smuzhiyun
146*4882a593Smuzhiyunseq_oss_debug
147*4882a593Smuzhiyun  specifies the debug level and accepts zero (= no debug message) or
148*4882a593Smuzhiyun  positive integer. Default value is 0.
149*4882a593Smuzhiyun
150*4882a593SmuzhiyunQueue Mechanism
151*4882a593Smuzhiyun===============
152*4882a593Smuzhiyun
153*4882a593SmuzhiyunOSS sequencer emulation uses an ALSA priority queue. The
154*4882a593Smuzhiyunevents from ``/dev/sequencer`` are processed and put onto the queue
155*4882a593Smuzhiyunspecified by module option.
156*4882a593Smuzhiyun
157*4882a593SmuzhiyunAll the events from ``/dev/sequencer`` are parsed at beginning.
158*4882a593SmuzhiyunThe timing events are also parsed at this moment, so that the events may
159*4882a593Smuzhiyunbe processed in real-time. Sending an event ABSTIME 0 switches the operation
160*4882a593Smuzhiyunmode to real-time mode, and sending an event RELTIME 0 switches it off.
161*4882a593SmuzhiyunIn the real-time mode, all events are dispatched immediately.
162*4882a593Smuzhiyun
163*4882a593SmuzhiyunThe queued events are dispatched to the corresponding ALSA sequencer
164*4882a593Smuzhiyunports after scheduled time by ALSA sequencer dispatcher.
165*4882a593Smuzhiyun
166*4882a593SmuzhiyunIf the write-queue is full, the application sleeps until a certain amount
167*4882a593Smuzhiyun(as default one half) becomes empty in blocking mode. The synchronization
168*4882a593Smuzhiyunto write timing was implemented, too.
169*4882a593Smuzhiyun
170*4882a593SmuzhiyunThe input from MIDI devices or echo-back events are stored on read FIFO
171*4882a593Smuzhiyunqueue. If application reads ``/dev/sequencer`` in blocking mode, the
172*4882a593Smuzhiyunprocess will be awaked.
173*4882a593Smuzhiyun
174*4882a593SmuzhiyunInterface to Synthesizer Device
175*4882a593Smuzhiyun===============================
176*4882a593Smuzhiyun
177*4882a593SmuzhiyunRegistration
178*4882a593Smuzhiyun------------
179*4882a593Smuzhiyun
180*4882a593SmuzhiyunTo register an OSS synthesizer device, use snd_seq_oss_synth_register()
181*4882a593Smuzhiyunfunction:
182*4882a593Smuzhiyun::
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun  int snd_seq_oss_synth_register(char *name, int type, int subtype, int nvoices,
185*4882a593Smuzhiyun          snd_seq_oss_callback_t *oper, void *private_data)
186*4882a593Smuzhiyun
187*4882a593SmuzhiyunThe arguments ``name``, ``type``, ``subtype`` and ``nvoices``
188*4882a593Smuzhiyunare used for making the appropriate synth_info structure for ioctl. The
189*4882a593Smuzhiyunreturn value is an index number of this device. This index must be remembered
190*4882a593Smuzhiyunfor unregister. If registration is failed, -errno will be returned.
191*4882a593Smuzhiyun
192*4882a593SmuzhiyunTo release this device, call snd_seq_oss_synth_unregister() function:
193*4882a593Smuzhiyun::
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun  int snd_seq_oss_synth_unregister(int index)
196*4882a593Smuzhiyun
197*4882a593Smuzhiyunwhere the ``index`` is the index number returned by register function.
198*4882a593Smuzhiyun
199*4882a593SmuzhiyunCallbacks
200*4882a593Smuzhiyun---------
201*4882a593Smuzhiyun
202*4882a593SmuzhiyunOSS synthesizer devices have capability for sample downloading and ioctls
203*4882a593Smuzhiyunlike sample reset. In OSS emulation, these special features are realized
204*4882a593Smuzhiyunby using callbacks. The registration argument oper is used to specify these
205*4882a593Smuzhiyuncallbacks. The following callback functions must be defined:
206*4882a593Smuzhiyun::
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun  snd_seq_oss_callback_t:
209*4882a593Smuzhiyun   int (*open)(snd_seq_oss_arg_t *p, void *closure);
210*4882a593Smuzhiyun   int (*close)(snd_seq_oss_arg_t *p);
211*4882a593Smuzhiyun   int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg);
212*4882a593Smuzhiyun   int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char *buf, int offs, int count);
213*4882a593Smuzhiyun   int (*reset)(snd_seq_oss_arg_t *p);
214*4882a593Smuzhiyun
215*4882a593SmuzhiyunExcept for ``open`` and ``close`` callbacks, they are allowed to be NULL.
216*4882a593Smuzhiyun
217*4882a593SmuzhiyunEach callback function takes the argument type ``snd_seq_oss_arg_t`` as the
218*4882a593Smuzhiyunfirst argument.
219*4882a593Smuzhiyun::
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun  struct snd_seq_oss_arg_t {
222*4882a593Smuzhiyun      int app_index;
223*4882a593Smuzhiyun      int file_mode;
224*4882a593Smuzhiyun      int seq_mode;
225*4882a593Smuzhiyun      snd_seq_addr_t addr;
226*4882a593Smuzhiyun      void *private_data;
227*4882a593Smuzhiyun      int event_passing;
228*4882a593Smuzhiyun  };
229*4882a593Smuzhiyun
230*4882a593SmuzhiyunThe first three fields, ``app_index``, ``file_mode`` and ``seq_mode``
231*4882a593Smuzhiyunare initialized by OSS sequencer. The ``app_index`` is the application
232*4882a593Smuzhiyunindex which is unique to each application opening OSS sequencer. The
233*4882a593Smuzhiyun``file_mode`` is bit-flags indicating the file operation mode. See
234*4882a593Smuzhiyun``seq_oss.h`` for its meaning. The ``seq_mode`` is sequencer operation
235*4882a593Smuzhiyunmode. In the current version, only ``SND_OSSSEQ_MODE_SYNTH`` is used.
236*4882a593Smuzhiyun
237*4882a593SmuzhiyunThe next two fields, ``addr`` and ``private_data``, must be
238*4882a593Smuzhiyunfilled by the synth driver at open callback. The ``addr`` contains
239*4882a593Smuzhiyunthe address of ALSA sequencer port which is assigned to this device. If
240*4882a593Smuzhiyunthe driver allocates memory for ``private_data``, it must be released
241*4882a593Smuzhiyunin close callback by itself.
242*4882a593Smuzhiyun
243*4882a593SmuzhiyunThe last field, ``event_passing``, indicates how to translate note-on
244*4882a593Smuzhiyun/ off events. In ``PROCESS_EVENTS`` mode, the note 255 is regarded
245*4882a593Smuzhiyunas velocity change, and key pressure event is passed to the port. In
246*4882a593Smuzhiyun``PASS_EVENTS`` mode, all note on/off events are passed to the port
247*4882a593Smuzhiyunwithout modified. ``PROCESS_KEYPRESS`` mode checks the note above 128
248*4882a593Smuzhiyunand regards it as key pressure event (mainly for Emu8000 driver).
249*4882a593Smuzhiyun
250*4882a593SmuzhiyunOpen Callback
251*4882a593Smuzhiyun-------------
252*4882a593Smuzhiyun
253*4882a593SmuzhiyunThe ``open`` is called at each time this device is opened by an application
254*4882a593Smuzhiyunusing OSS sequencer. This must not be NULL. Typically, the open callback
255*4882a593Smuzhiyundoes the following procedure:
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun#. Allocate private data record.
258*4882a593Smuzhiyun#. Create an ALSA sequencer port.
259*4882a593Smuzhiyun#. Set the new port address on ``arg->addr``.
260*4882a593Smuzhiyun#. Set the private data record pointer on ``arg->private_data``.
261*4882a593Smuzhiyun
262*4882a593SmuzhiyunNote that the type bit-flags in port_info of this synth port must NOT contain
263*4882a593Smuzhiyun``TYPE_MIDI_GENERIC``
264*4882a593Smuzhiyunbit. Instead, ``TYPE_SPECIFIC`` should be used. Also, ``CAP_SUBSCRIPTION``
265*4882a593Smuzhiyunbit should NOT be included, too. This is necessary to tell it from other
266*4882a593Smuzhiyunnormal MIDI devices. If the open procedure succeeded, return zero. Otherwise,
267*4882a593Smuzhiyunreturn -errno.
268*4882a593Smuzhiyun
269*4882a593SmuzhiyunIoctl Callback
270*4882a593Smuzhiyun--------------
271*4882a593Smuzhiyun
272*4882a593SmuzhiyunThe ``ioctl`` callback is called when the sequencer receives device-specific
273*4882a593Smuzhiyunioctls. The following two ioctls should be processed by this callback:
274*4882a593Smuzhiyun
275*4882a593SmuzhiyunIOCTL_SEQ_RESET_SAMPLES
276*4882a593Smuzhiyun    reset all samples on memory -- return 0
277*4882a593Smuzhiyun
278*4882a593SmuzhiyunIOCTL_SYNTH_MEMAVL
279*4882a593Smuzhiyun    return the available memory size
280*4882a593Smuzhiyun
281*4882a593SmuzhiyunFM_4OP_ENABLE
282*4882a593Smuzhiyun    can be ignored usually
283*4882a593Smuzhiyun
284*4882a593SmuzhiyunThe other ioctls are processed inside the sequencer without passing to
285*4882a593Smuzhiyunthe lowlevel driver.
286*4882a593Smuzhiyun
287*4882a593SmuzhiyunLoad_Patch Callback
288*4882a593Smuzhiyun-------------------
289*4882a593Smuzhiyun
290*4882a593SmuzhiyunThe ``load_patch`` callback is used for sample-downloading. This callback
291*4882a593Smuzhiyunmust read the data on user-space and transfer to each device. Return 0
292*4882a593Smuzhiyunif succeeded, and -errno if failed. The format argument is the patch key
293*4882a593Smuzhiyunin patch_info record. The buf is user-space pointer where patch_info record
294*4882a593Smuzhiyunis stored. The offs can be ignored. The count is total data size of this
295*4882a593Smuzhiyunsample data.
296*4882a593Smuzhiyun
297*4882a593SmuzhiyunClose Callback
298*4882a593Smuzhiyun--------------
299*4882a593Smuzhiyun
300*4882a593SmuzhiyunThe ``close`` callback is called when this device is closed by the
301*4882a593Smuzhiyunapplication. If any private data was allocated in open callback, it must
302*4882a593Smuzhiyunbe released in the close callback. The deletion of ALSA port should be
303*4882a593Smuzhiyundone here, too. This callback must not be NULL.
304*4882a593Smuzhiyun
305*4882a593SmuzhiyunReset Callback
306*4882a593Smuzhiyun--------------
307*4882a593Smuzhiyun
308*4882a593SmuzhiyunThe ``reset`` callback is called when sequencer device is reset or
309*4882a593Smuzhiyunclosed by applications. The callback should turn off the sounds on the
310*4882a593Smuzhiyunrelevant port immediately, and initialize the status of the port. If this
311*4882a593Smuzhiyuncallback is undefined, OSS seq sends a ``HEARTBEAT`` event to the
312*4882a593Smuzhiyunport.
313*4882a593Smuzhiyun
314*4882a593SmuzhiyunEvents
315*4882a593Smuzhiyun======
316*4882a593Smuzhiyun
317*4882a593SmuzhiyunMost of the events are processed by sequencer and translated to the adequate
318*4882a593SmuzhiyunALSA sequencer events, so that each synth device can receive by input_event
319*4882a593Smuzhiyuncallback of ALSA sequencer port. The following ALSA events should be
320*4882a593Smuzhiyunimplemented by the driver:
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun=============	===================
323*4882a593SmuzhiyunALSA event	Original OSS events
324*4882a593Smuzhiyun=============	===================
325*4882a593SmuzhiyunNOTEON		SEQ_NOTEON, MIDI_NOTEON
326*4882a593SmuzhiyunNOTE		SEQ_NOTEOFF, MIDI_NOTEOFF
327*4882a593SmuzhiyunKEYPRESS	MIDI_KEY_PRESSURE
328*4882a593SmuzhiyunCHANPRESS	SEQ_AFTERTOUCH, MIDI_CHN_PRESSURE
329*4882a593SmuzhiyunPGMCHANGE	SEQ_PGMCHANGE, MIDI_PGM_CHANGE
330*4882a593SmuzhiyunPITCHBEND	SEQ_CONTROLLER(CTRL_PITCH_BENDER),
331*4882a593Smuzhiyun		MIDI_PITCH_BEND
332*4882a593SmuzhiyunCONTROLLER	MIDI_CTL_CHANGE,
333*4882a593Smuzhiyun		SEQ_BALANCE (with CTL_PAN)
334*4882a593SmuzhiyunCONTROL14	SEQ_CONTROLLER
335*4882a593SmuzhiyunREGPARAM	SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE)
336*4882a593SmuzhiyunSYSEX		SEQ_SYSEX
337*4882a593Smuzhiyun=============	===================
338*4882a593Smuzhiyun
339*4882a593SmuzhiyunThe most of these behavior can be realized by MIDI emulation driver
340*4882a593Smuzhiyunincluded in the Emu8000 lowlevel driver. In the future release, this module
341*4882a593Smuzhiyunwill be independent.
342*4882a593Smuzhiyun
343*4882a593SmuzhiyunSome OSS events (``SEQ_PRIVATE`` and ``SEQ_VOLUME`` events) are passed as event
344*4882a593Smuzhiyuntype SND_SEQ_OSS_PRIVATE.  The OSS sequencer passes these event 8 byte
345*4882a593Smuzhiyunpackets without any modification. The lowlevel driver should process these
346*4882a593Smuzhiyunevents appropriately.
347*4882a593Smuzhiyun
348*4882a593SmuzhiyunInterface to MIDI Device
349*4882a593Smuzhiyun========================
350*4882a593Smuzhiyun
351*4882a593SmuzhiyunSince the OSS emulation probes the creation and deletion of ALSA MIDI
352*4882a593Smuzhiyunsequencer ports automatically by receiving announcement from ALSA
353*4882a593Smuzhiyunsequencer, the MIDI devices don't need to be registered explicitly
354*4882a593Smuzhiyunlike synth devices.
355*4882a593SmuzhiyunHowever, the MIDI port_info registered to ALSA sequencer must include
356*4882a593Smuzhiyuna group name ``SND_SEQ_GROUP_DEVICE`` and a capability-bit
357*4882a593Smuzhiyun``CAP_READ`` or ``CAP_WRITE``. Also, subscription capabilities,
358*4882a593Smuzhiyun``CAP_SUBS_READ`` or ``CAP_SUBS_WRITE``, must be defined, too. If
359*4882a593Smuzhiyunthese conditions are not satisfied, the port is not registered as OSS
360*4882a593Smuzhiyunsequencer MIDI device.
361*4882a593Smuzhiyun
362*4882a593SmuzhiyunThe events via MIDI devices are parsed in OSS sequencer and converted
363*4882a593Smuzhiyunto the corresponding ALSA sequencer events. The input from MIDI sequencer
364*4882a593Smuzhiyunis also converted to MIDI byte events by OSS sequencer. This works just
365*4882a593Smuzhiyuna reverse way of seq_midi module.
366*4882a593Smuzhiyun
367*4882a593SmuzhiyunKnown Problems / TODO's
368*4882a593Smuzhiyun=======================
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun* Patch loading via ALSA instrument layer is not implemented yet.
371*4882a593Smuzhiyun
372