1 /* $OpenBSD: sysex.h,v 1.4 2015/01/21 08:43:55 ratchov Exp $ */ 2 /* 3 * Copyright (c) 2011 Alexandre Ratchov <alex@caoua.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 #ifndef SYSEX_H 18 #define SYSEX_H 19 20 #include <stdint.h> 21 22 /* 23 * start and end markers 24 */ 25 #define SYSEX_START 0xf0 26 #define SYSEX_END 0xf7 27 28 /* 29 * type/vendor namespace IDs we use 30 */ 31 #define SYSEX_TYPE_RT 0x7f /* real-time universal */ 32 #define SYSEX_TYPE_EDU 0x7d /* non-comercial */ 33 34 /* 35 * realtime messages in the "universal real-time" namespace 36 */ 37 #define SYSEX_MTC 0x01 /* mtc messages */ 38 #define SYSEX_MTC_FULL 0x01 /* mtc full frame message */ 39 #define SYSEX_CONTROL 0x04 40 #define SYSEX_MASTER 0x01 41 #define SYSEX_MMC 0x06 42 #define SYSEX_MMC_STOP 0x01 43 #define SYSEX_MMC_START 0x02 44 #define SYSEX_MMC_LOC 0x44 45 #define SYSEX_MMC_LOC_LEN 0x06 46 #define SYSEX_MMC_LOC_CMD 0x01 47 48 /* 49 * sepcial "any" midi device number 50 */ 51 #define SYSEX_DEV_ANY 0x7f 52 53 /* 54 * minimum size of sysex message we accept 55 */ 56 #define SYSEX_SIZE(m) (5 + sizeof(struct sysex_ ## m)) 57 58 /* 59 * all possible system exclusive messages we support. 60 */ 61 struct sysex { 62 uint8_t start; 63 uint8_t type; /* type or vendor id */ 64 uint8_t dev; /* device or product id */ 65 uint8_t id0; /* message id */ 66 uint8_t id1; /* sub-id */ 67 union sysex_all { 68 struct sysex_empty { 69 uint8_t end; 70 } empty; 71 struct sysex_master { 72 uint8_t fine; 73 uint8_t coarse; 74 uint8_t end; 75 } master; 76 struct sysex_start { 77 uint8_t end; 78 } start; 79 struct sysex_stop { 80 uint8_t end; 81 } stop; 82 struct sysex_loc { 83 uint8_t len; 84 uint8_t cmd; 85 #define MTC_FPS_24 0 86 #define MTC_FPS_25 1 87 #define MTC_FPS_30 3 88 uint8_t hr; /* MSB contain MTC_FPS */ 89 uint8_t min; 90 uint8_t sec; 91 uint8_t fr; 92 uint8_t cent; 93 uint8_t end; 94 } loc; 95 struct sysex_full { 96 uint8_t hr; 97 uint8_t min; 98 uint8_t sec; 99 uint8_t fr; 100 uint8_t end; 101 } full; 102 } u; 103 }; 104 105 #endif /* !defined(SYSEX_H) */ 106