summaryrefslogtreecommitdiff
path: root/sysex.h
blob: 245cd2a7c725020cf4c9589be8be663d7462969e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*      $OpenBSD$       */
/*
 * Copyright (c) 2011 Alexandre Ratchov <alex@caoua.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#ifndef AUCAT_SYSEX_H
#define AUCAT_SYSEX_H

#include <stdint.h>

/*
 * start and end markers
 */
#define SYSEX_START             0xf0
#define SYSEX_END               0xf7

/*
 * type/vendor namespace IDs we use
 */
#define SYSEX_TYPE_RT           0x7f    /* real-time universal */
#define SYSEX_TYPE_EDU          0x7d    /* non-comercial */

/*
 * realtime messages in the "universal real-time" namespace
 */
#define SYSEX_MTC               0x01            /* mtc messages */
#define   SYSEX_MTC_FULL        0x01            /* mtc full frame message */
#define SYSEX_CONTROL           0x04
#define   SYSEX_MASTER          0x01
#define SYSEX_MMC               0x06
#define   SYSEX_MMC_STOP        0x01
#define   SYSEX_MMC_START       0x02
#define   SYSEX_MMC_LOC         0x44
#define   SYSEX_MMC_LOC_LEN     0x06
#define   SYSEX_MMC_LOC_CMD     0x01

/*
 * aucat-specific messages, in the "edu" namespace
 */
#define SYSEX_AUCAT             0x23            /* aucat-specific */
#define   SYSEX_AUCAT_MIXINFO   0x01            /* mixer info */
#define   SYSEX_AUCAT_DUMPREQ   0x02            /* dump request */
#define   SYSEX_AUCAT_DUMPEND   0x03            /* end of dump */

/*
 * minimum size of sysex message we accept
 */
#define SYSEX_SIZE(m)   (5 + sizeof(struct sysex_ ## m))

/*
 * all possible system exclusive messages we support. For aucat-specific
 * messages we use the same header as real-time messages to simplify the
 * message parser
 */
struct sysex {
        uint8_t start;
        uint8_t type;                           /* type or vendor id */
        uint8_t dev;                            /* device or product id */
        uint8_t id0;                            /* message id */
        uint8_t id1;                            /* sub-id */
        union sysex_all {
                struct sysex_empty {
                        uint8_t end;
                } empty;
                struct sysex_master {
                        uint8_t fine;
                        uint8_t coarse;
                        uint8_t end;
                } master;
                struct sysex_start {
                        uint8_t end;
                } start;
                struct sysex_stop {
                        uint8_t end;
                } stop;
                struct sysex_loc {
                        uint8_t len;
                        uint8_t cmd;
                        uint8_t hr;
                        uint8_t min;
                        uint8_t sec;
                        uint8_t fr;
                        uint8_t cent;
                        uint8_t end;
                } loc;
                struct sysex_full {
                        uint8_t hr;
                        uint8_t min;
                        uint8_t sec;
                        uint8_t fr;
                        uint8_t end;
                } full;
                struct sysex_mixinfo {
                        uint8_t chan;                   /* channel */
                        uint8_t vol;                    /* current volume */
#define SYSEX_NAMELEN   10                              /* \0 included */
                        uint8_t name[SYSEX_NAMELEN];    /* stream name */
                        uint8_t end;
                } mixinfo;
                struct sysex_dumpreq {
                        uint8_t end;
                } dumpreq;
                struct sysex_dumpend {
                        uint8_t end;
                } dumpend;
        } u;
};

#endif /* !defined(AUCAT_SYSEX_H) */