1 #ifndef LIBRARIES_CAMD_H
    2 #define LIBRARIES_CAMD_H
    3 
    4 #include <exec/lists.h>
    5 #include <exec/types.h>
    6 #include <utility/tagitem.h>
    7 
    8 enum
    9 {
   10 	CD_Linkages,
   11 	CD_NLocks
   12 };
   13 
   14 
   15 typedef union
   16 {
   17 	ULONG l[2];
   18 	UBYTE b[4];
   19 } MidiMsg;
   20 
   21 
   22 #define mm_Msg    l[0]
   23 #define mm_Time   l[1]
   24 #define mm_Status b[0]
   25 #define mm_Data1  b[1]
   26 #define mm_Data2  b[2]
   27 #define mm_Port   b[3]
   28 #define mm_Data   b
   29 
   30 
   31 #define voicemsg(m,a) (((m)->mm_Status & MS_StatBits) == (a))
   32 #define sysmsg(m)     ((m)->mm_Status >= MS_System)
   33 #define noteon(m)     (voicemsg(m,MS_NoteOn) && (m)->mm_Data2)
   34 #define realtime(m)   ((m)->mm_Status >= MS_RealTime)
   35 #define modemsg(m)    (voicemsg(m,MS_Ctrl) && (m)->mm_Data1 >= MM_Min)
   36 
   37 
   38 struct MidiCluster
   39 {
   40 	struct Node mcl_Node;
   41 	WORD        mcl_Participants;
   42 	struct List mcl_Receivers;
   43 	struct List mcl_Senders;
   44 	WORD        mcl_PublicParticipants;
   45 	UWORD       mcl_Flags;
   46 };
   47 
   48 
   49 struct MidiLink
   50 {
   51 	struct Node         ml_Node;
   52 	WORD                ml_Pad;
   53 	struct MinNode      ml_OwnerNode;
   54 	struct MidiNode    *ml_MidiNode;
   55 	struct MidiCluster *ml_Location;
   56 	char               *ml_ClusterComment;
   57 	UBYTE               ml_Flags;
   58 	UBYTE               ml_PortID;
   59 	UWORD               ml_ChannelMask;
   60 	ULONG               ml_EventTypeMask;
   61 
   62 	union SysExFilter
   63 	{
   64 		UBYTE            b[4];
   65 		ULONG            sxf_Packed;
   66 	} ml_SysExFilter;
   67 
   68 	APTR                ml_ParserData;
   69 	APTR                ml_UserData;
   70 };
   71 
   72 #define sxf_Mode b[0]
   73 #define sxf_ID1  b[1]
   74 #define sxf_ID2  b[2]
   75 #define sxf_ID3  b[3]
   76 
   77 
   78 enum
   79 {
   80 	MLTYPE_Receiver,
   81 	MLTYPE_Sender,
   82 	MLTYPE_NTypes
   83 };
   84 
   85 
   86 #define MLF_Sender      (1 << 0)
   87 #define MLF_PartChange  (1 << 1)
   88 #define MLF_PrivateLink (1 << 2)
   89 #define MLF_DeviceLink  (1 << 3)
   90 
   91 #define MLINK_Base         (TAG_USER + 65)
   92 
   93 #define MLINK_Location     (MLINK_Base + 0)
   94 #define MLINK_ChannelMask  (MLINK_Base + 1)
   95 #define MLINK_EventMask    (MLINK_Base + 2)
   96 #define MLINK_UserData     (MLINK_Base + 3)
   97 #define MLINK_Comment      (MLINK_Base + 4)
   98 #define MLINK_PortID       (MLINK_Base + 5)
   99 #define MLINK_Private      (MLINK_Base + 6)
  100 #define MLINK_Priority     (MLINK_Base + 7)
  101 #define MLINK_SysExFilter  (MLINK_Base + 8)
  102 #define MLINK_SysExFilterX (MLINK_Base + 9)
  103 #define MLINK_Parse        (MLINK_Base + 10)
  104 #define MLINK_Reserved     (MLINK_Base + 11)
  105 #define MLINK_ErrorCode    (MLINK_Base + 12)
  106 #define MLINK_Name         (MLINK_Base + 13)
  107 
  108 #define SXF_ModeBits  0x04
  109 #define SXF_CountBits 0x03
  110 
  111 #define SXFM_Off      0x00
  112 #define SXFM_1Byte    0x00
  113 #define SXFM_3Byte    0x04
  114 
  115 
  116 struct MidiNode
  117 {
  118 	struct Node     mi_Node;
  119 	UWORD           mi_ClientType;
  120 	struct Image   *mi_Image;
  121 	struct MinList  mi_OutLinks;
  122 	struct MinList  mi_InLinks;
  123 	struct Task    *mi_SigTask;
  124 	struct Hook    *mi_ReceiveHook;
  125 	struct Hook    *mi_ParticipantHook;
  126 	BYTE            mi_ReceiveSigBit;
  127 	BYTE            mi_ParticipantSigBit;
  128 	UBYTE           mi_ErrFilter;
  129 	UBYTE           mi_Alignment[1];
  130 	ULONG          *mi_TimeStamp;
  131 	ULONG           mi_MsgQueueSize;
  132 	ULONG           mi_SysExQueueSize;
  133 };
  134 
  135 #define CCType_Sequencer        (1 << 0)
  136 #define CCType_SampleEditor     (1 << 1)
  137 #define CCType_PatchEditor      (1 << 2)
  138 #define CCType_Notator          (1 << 3)
  139 #define CCType_EventProcessor   (1 << 4)
  140 #define CCType_EventFilter      (1 << 5)
  141 #define CCType_EventRouter      (1 << 6)
  142 #define CCType_ToneGenerator    (1 << 7)
  143 #define CCType_EventGenerator   (1 << 8)
  144 #define CCType_GraphicAnimator  (1 << 9)
  145 
  146 #define MIDI_Base         (TAG_USER + 65)
  147 #define MIDI_Name         (MIDI_Base + 0)
  148 #define MIDI_SignalTask   (MIDI_Base + 1)
  149 #define MIDI_RecvHook     (MIDI_Base + 2)
  150 #define MIDI_PartHook     (MIDI_Base + 3)
  151 #define MIDI_RecvSignal   (MIDI_Base + 4)
  152 #define MIDI_PartSignal   (MIDI_Base + 5)
  153 #define MIDI_MsgQueue     (MIDI_Base + 6)
  154 #define MIDI_SysExSize    (MIDI_Base + 7)
  155 #define MIDI_TimeStamp    (MIDI_Base + 8)
  156 #define MIDI_ErrFilter    (MIDI_Base + 9)
  157 #define MIDI_ClientType   (MIDI_Base + 10)
  158 #define MIDI_Image        (MIDI_Base + 11)
  159 #define MIDI_ErrorCode    (MIDI_Base + 12)
  160 
  161 #define CME_NoMem         801
  162 #define CME_NoSignals     802
  163 #define CME_NoTimer       803
  164 #define CME_BadPrefs      804
  165 #define CME_NoUnit(unit) (820 + (unit))
  166 
  167 #define CMB_Note          0
  168 #define CMB_Prog          1
  169 #define CMB_PitchBend     2
  170 
  171 #define CMB_CtrlMSB       3
  172 #define CMB_CtrlLSB       4
  173 #define CMB_CtrlSwitch    5
  174 #define CMB_CtrlByte      6
  175 #define CMB_CtrlParam     7
  176 #define CMB_CtrlUndef     8
  177 
  178 #define CMB_Mode          9
  179 #define CMB_ChanPress     10
  180 #define CMB_PolyPress     11
  181 
  182 #define CMB_RealTime      12
  183 #define CMB_SysCom        13
  184 #define CMB_SysEx         14
  185 
  186 #define CMF_Note          (1L << CMB_Note)
  187 #define CMF_Prog          (1L << CMB_Prog)
  188 #define CMF_PitchBend     (1L << CMB_PitchBend)
  189 
  190 #define CMF_CtrlMSB       (1L << CMB_CtrlMSB)
  191 #define CMF_CtrlLSB       (1L << CMB_CtrlLSB)
  192 #define CMF_CtrlSwitch    (1L << CMB_CtrlSwitch)
  193 #define CMF_CtrlByte      (1L << CMB_CtrlByte)
  194 #define CMF_CtrlParam     (1L << CMB_CtrlParam)
  195 #define CMF_CtrlUndef     (1L << CMB_CtrlUndef)
  196 
  197 #define CMF_Mode          (1L << CMB_Mode)
  198 #define CMF_ChanPress     (1L << CMB_ChanPress)
  199 #define CMF_PolyPress     (1L << CMB_PolyPress)
  200 
  201 #define CMF_RealTime      (1L << CMB_RealTime)
  202 #define CMF_SysCom        (1L << CMB_SysCom)
  203 #define CMF_SysEx         (1L << CMB_SysEx)
  204 
  205 #define CMF_Ctrl          (CMF_CtrlMSB | CMF_CtrlLSB | CMF_CtrlSwitch | CMF_CtrlByte | CMF_CtrlParam | CMF_CtrlUndef)
  206 #define CMF_Channel       (CMF_Note | CMF_Prog | CMF_PitchBend | CMF_Ctrl | CMF_Mode | CMF_ChanPress | CMF_PolyPress)
  207 #define CMF_All           (CMF_Channel | CMF_RealTime | CMF_SysCom | CMF_SysEx)
  208 
  209 
  210 #define CMEB_MsgErr       0
  211 #define CMEB_BufferFull   1
  212 #define CMEB_SysExFull    2
  213 #define CMEB_ParseMem     3
  214 #define CMEB_RecvErr      4
  215 #define CMEB_RecvOverflow 5
  216 #define CMEB_SysExTooBig  6
  217 
  218 #define CMEF_MsgErr       (1L << CMEB_MsgErr)
  219 #define CMEF_BufferFull   (1L << CMEB_BufferFull)
  220 #define CMEF_SysExFull    (1L << CMEB_SysExFull)
  221 #define CMEF_ParseMem     (1L << CMEB_ParseMem)
  222 #define CMEF_RecvErr      (1L << CMEB_RecvErr)
  223 #define CMEF_RecvOverflow (1L << CMEB_RecvOverflow)
  224 #define CMEF_SysExTooBig  (1L << CMEB_SysExTooBig)
  225 
  226 #define CMEF_All          (CMEF_MsgErr | CMEF_BufferFull | CMEF_SysExFull | CMEF_SysExTooBig | CMEF_ParseMem | CMEF_RecvErr | CMEF_RecvOverflow)
  227 
  228 enum
  229 {
  230 	CMSG_Recv,
  231 	CMSG_Link
  232 };
  233 
  234 struct cmLink
  235 {
  236 	ULONG cml_MethodID;
  237 	ULONG cml_Action;
  238 };
  239 
  240 enum
  241 {
  242 	CACT_Link,
  243 	CACT_Unlink
  244 };
  245 
  246 struct ClusterNotifyNode
  247 {
  248 	struct MinNode  cnn_Node;
  249 	struct Task	   *cnn_Task;
  250 	BYTE	          cnn_SigBit;
  251 	UBYTE	          pad[3];
  252 };
  253 
  254 #define PackSysExFilter0()            ((ULONG)(SXFM_Off << 24))
  255 #define PackSysExFilter1(id1)         ((ULONG)(SXFM_1Byte | 1) << 24 | (ULONG)(id1) << 16)
  256 #define PackSysExFilter2(id1,id2)     ((ULONG)(SXFM_1Byte | 2) << 24 | (ULONG)(id1) << 16 | (id2) << 8)
  257 #define PackSysExFilter3(id1,id2,id3) ((ULONG)(SXFM_1Byte | 3) << 24 | (ULONG)(id1) << 16 | (id2) << 8 | (id3))
  258 #define PutMidiMsg(ml,msg)            PutMidi((ml),(msg)->l[0])
  259 
  260 /*------------------*/
  261 /* MIDI definitions */
  262 /*------------------*/
  263 
  264 /* MIDI commands */
  265 
  266 #define MS_NoteOff    0x80
  267 #define MS_NoteOn     0x90
  268 #define MS_PolyPress  0xA0
  269 #define MS_Ctrl       0xB0
  270 #define MS_Mode       0xB0
  271 #define MS_Prog       0xC0
  272 #define MS_ChanPress  0xD0
  273 #define MS_PitchBend  0xE0
  274 
  275 #define MS_StatBits   0xF0
  276 #define MS_ChanBits   0x0F
  277 
  278 #define MS_System     0xF0
  279 #define MS_SysEx      0xF0
  280 #define MS_QtrFrame   0xF1
  281 #define MS_SongPos    0xF2
  282 #define MS_SongSelect 0xF3
  283 #define MS_TuneReq    0xF6
  284 #define MS_EOX        0xF7
  285 
  286 #define MS_RealTime   0xF8
  287 #define MS_Clock      0xF8
  288 #define MS_Start      0xFA
  289 #define MS_Continue   0xFB
  290 #define MS_Stop       0xFC
  291 #define MS_ActvSense  0xFE
  292 #define MS_Reset      0xFF
  293 
  294 
  295 /* MIDI standard controllers */
  296 
  297 #define MC_Bank       0x00
  298 #define MC_ModWheel   0x01
  299 #define MC_Breath     0x02
  300 #define MC_Foot       0x04
  301 #define MC_PortaTime  0x05
  302 #define MC_DataEntry  0x06
  303 #define MC_Volume     0x07
  304 #define MC_Balance    0x08
  305 #define MC_Pan        0x0a
  306 #define MC_Expression 0x0b
  307 #define MC_General1   0x10
  308 #define MC_General2   0x11
  309 #define MC_General3   0x12
  310 #define MC_General4   0x13
  311 
  312 #define MC_Sustain      0x40
  313 #define MC_Porta        0x41
  314 #define MC_Sustenuto    0x42
  315 #define MC_SoftPedal    0x43
  316 #define MC_Hold2        0x45
  317 #define MC_General5     0x50
  318 #define MC_General6     0x51
  319 #define MC_General7     0x52
  320 #define MC_General8     0x53
  321 #define MC_ExtDepth     0x5b
  322 #define MC_TremoloDepth 0x5c
  323 #define MC_ChorusDepth  0x5d
  324 #define MC_CelesteDepth 0x5e
  325 #define MC_PhaserDepth  0x5f
  326 
  327 #define MC_DataIncr     0x60
  328 #define MC_DataDecr     0x61
  329 #define MC_NRPNL        0x62
  330 #define MC_NRPNH        0x63
  331 #define MC_RPNL         0x64
  332 #define MC_RPNH         0x65
  333 
  334 #define MC_Max          0x78
  335 
  336 
  337 /* MIDI multivoice modes */
  338 
  339 #define MM_Min          0x79
  340 
  341 #define MM_ResetCtrl    0x79
  342 #define MM_Local        0x7a
  343 #define MM_AllOff       0x7b
  344 #define MM_OmniOff      0x7c
  345 #define MM_OmniOn       0x7d
  346 #define MM_Mono         0x7e
  347 #define MM_Poly         0x7f
  348 
  349 #define MRP_PBSens      0x0000
  350 #define MRP_FineTune    0x0001
  351 #define MRP_CourseTune  0x0002
  352 
  353 
  354 /* MIDI time */
  355 
  356 #define MTCQ_FrameL    0x00
  357 #define MTCQ_FrameH    0x10
  358 #define MTCQ_SecL      0x20
  359 #define MTCQ_SecH      0x30
  360 #define MTCQ_MinL      0x40
  361 #define MTCQ_MinH      0x50
  362 #define MTCQ_HourL     0x60
  363 #define MTCQ_HourH     0x70 
  364 
  365 #define MTCQ_TypeMask  0x70
  366 #define MTCQ_DataMask  0x0f
  367 
  368 #define MTCH_TypeMask  0x60
  369 #define MTCH_HourMask  0x1f
  370 
  371 #define MTCT_24FPS         0x00
  372 #define MTCT_25FPS         0x20
  373 #define MTCT_30FPS_Drop    0x40
  374 #define MTCT_30FPS_NonDrop 0x60
  375 
  376 
  377 /* Vendors (the table is incomplete, should be moved to API) */
  378 
  379 #define MID_Sequential     0x01
  380 #define MID_IDP            0x02
  381 #define MID_OctavePlateau  0x03
  382 #define MID_Moog           0x04
  383 #define MID_Passport       0x05
  384 #define MID_Lexicon        0x06
  385 #define MID_Kurzweil       0x07
  386 #define MID_Fender         0x08
  387 #define MID_Gulbransen     0x09
  388 #define MID_AKG            0x0a
  389 #define MID_Voyce          0x0b
  390 #define MID_Waveframe      0x0c
  391 #define MID_ADA            0x0d
  392 #define MID_Garfield       0x0e
  393 #define MID_Ensoniq        0x0f
  394 #define MID_Oberheim       0x10
  395 #define MID_Apple          0x11
  396 #define MID_GreyMatter     0x12
  397 #define MID_PalmTree       0x14
  398 #define MID_JLCooper       0x15
  399 #define MID_Lowrey         0x16
  400 #define MID_AdamsSmith     0x17
  401 #define MID_Emu            0x18
  402 #define MID_Harmony        0x19
  403 #define MID_ART            0x1a
  404 #define MID_Baldwin        0x1b
  405 #define MID_Eventide       0x1c
  406 #define MID_Inventronics   0x1d
  407 #define MID_Clarity        0x1f
  408 
  409 #define MID_XAmerica       0x00
  410 
  411 #define MIDX_DigitalMusic  0x000007
  412 #define MIDX_Iota          0x000008
  413 #define MIDX_Artisyn       0x00000a
  414 #define MIDX_IVL           0x00000b
  415 #define MIDX_SouthernMusic 0x00000c
  416 #define MIDX_LakeButler    0x00000d
  417 #define MIDX_DOD           0x000010
  418 #define MIDX_PerfectFret   0x000014
  419 #define MIDX_KAT           0x000015
  420 #define MIDX_Opcode        0x000016
  421 #define MIDX_Rane          0x000017
  422 #define MIDX_SpatialSound  0x000018
  423 #define MIDX_KMX           0x000019
  424 #define MIDX_Brenell       0x00001a
  425 #define MIDX_Peavey        0x00001b
  426 #define MIDX_360           0x00001c
  427 #define MIDX_Axxes         0x000020
  428 #define MIDX_CAE           0x000026
  429 #define MIDX_Cannon        0x00002b
  430 #define MIDX_BlueSkyLogic  0x00002e
  431 #define MIDX_Voce          0x000031
  432 
  433 #define MID_SIEL           0x21
  434 #define MID_Synthaxe       0x22
  435 #define MID_Hohner         0x24
  436 #define MID_Twister        0x25
  437 #define MID_Solton         0x26
  438 #define MID_Jellinghaus    0x27
  439 #define MID_Southworth     0x28
  440 #define MID_PPG            0x29
  441 #define MID_JEN            0x2a
  442 #define MID_SSL            0x2b
  443 #define MID_AudioVeritrieb 0x2c
  444 #define MID_Elka           0x2f
  445 #define MID_Dynacord       0x30
  446 #define MID_Clavia         0x33
  447 #define MID_Soundcraft     0x39
  448 
  449 #define MID_Kawai          0x40
  450 #define MID_Roland         0x41
  451 #define MID_Korg           0x42
  452 #define MID_Yamaha         0x43
  453 #define MID_Casio          0x44
  454 #define MID_Kamiya         0x46
  455 #define MID_Akai           0x47
  456 #define MID_JapanVictor    0x48
  457 #define MID_Mesosha        0x49
  458 
  459 #define MID_UNC   0x7d
  460 #define MID_UNRT  0x7e
  461 #define MID_URT   0x7f
  462 
  463 #define MiddleC         60
  464 #define DefaultVelocity 64
  465 #define PitchBendCenter 0x2000
  466 #define MClksPerQtr     24
  467 #define MClksPerSP      6
  468 #define MCCenter        64
  469 
  470 #define MIDIHiByte(word) ((word) >> 7 & 0x7f)
  471 #define MIDILoByte(word) ((word) & 0x7f)
  472 
  473 #define MIDIWord(hi,lo) (((hi) & 0x7f) << 7 | ((lo) & 0x7f))
  474 
  475 #define MakeMIDX(id0,id1,id2) ((ULONG)(id0)<<16 | (id1)<<8 | (id2))
  476 
  477 
  478 #endif /* LIBRARIES_CAMD_H */