You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
783 lines
23 KiB
783 lines
23 KiB
/****************************************************************************
|
|
|
|
MODULE: HAU_MIDI.HPP
|
|
Tab settings: 5 9
|
|
|
|
Copyright 1995, 1996, Microsoft Corporation, All Rights Reserved.
|
|
|
|
PURPOSE: Header for HAU_MIDI.CPP
|
|
|
|
|
|
Author(s): Name:
|
|
---------- ----------------
|
|
MEA Manolito E. Adan
|
|
|
|
Revision History:
|
|
-----------------
|
|
Version Date Author Comments
|
|
1.0 03-Apr-96 MEA original
|
|
16-Mar-99 waltw Remove unused DetectMidiDevice declaration
|
|
16-Mar-99 waltw DEFAULT_GET_DATA_PACKET_DELAY changed from
|
|
1 to 2. 1 worked OK for Win9x, but NT5
|
|
requires a value of 2. See NT RAID# 295373
|
|
(Jolt resets after crash in FlightSym 98)
|
|
29-Mar-99 waltw Fixed typo by restoring DEFAULT_GET_DATA_PACKET_DELAY
|
|
to 1 and bumping DEFAULT_GET_ID_PACKET_DELAY -> 2
|
|
29-Mar-99 waltw & dennisle - bump DEFAULT_GET_STATUS_PACKET_DELAY ->2
|
|
This fix may also fix the multi-proc issue.
|
|
|
|
****************************************************************************/
|
|
#ifndef _HAU_MIDI_SEEN
|
|
#define _HAU_MIDI_SEEN
|
|
#include "DX_MAP.hpp"
|
|
|
|
#define MAX_EFFECT_IDS 32
|
|
#define NEW_EFFECT_ID 0x7f
|
|
#define SYSTEM_EFFECT_ID 0x7f
|
|
#define SYSTEM_RTCSPRING_ID 0
|
|
#define SYSTEM_FRICTIONCANCEL_ID 1
|
|
#define SYSTEM_RTCSPRING_ALIAS_ID 0x7e // Due to internal ID=0 means create new
|
|
|
|
#define MAX_MIDI_CHANNEL 16
|
|
#define DEFAULT_MIDI_CHANNEL 5
|
|
#define DEFAULT_MIDI_PORTIO 0x330
|
|
|
|
#define COMM_WINMM 0x01
|
|
#define COMM_MIDI_BACKDOOR 0x02
|
|
#define COMM_SERIAL_BACKDOOR 0x03
|
|
#define COMM_SERIAL_FILE 0x04
|
|
#define MASK_OVERRIDE_MIDI_PATH 0x80000000
|
|
#define MASK_SERIAL_BACKDOOR 0x40000000
|
|
#define COMM_SERIAL1 1 // COMM Port 1
|
|
#define MIN_COMMSERIAL 1
|
|
#define MAX_COMMSERIAL 4
|
|
|
|
#define DEFAULT_JOLT_FORCE_RATE 100
|
|
#define DEFAULT_PERCENT 10000
|
|
|
|
#define MAX_SYS_EX_BUFFER_SIZE 1024 // Maximum Primary buffer size
|
|
#define DIFFERENCE_THRESHOLD 32 // Threshold to using absolute data
|
|
#define DIFFERENCE_BIT 0x40 // Bit to set for Difference data
|
|
#define MAX_MIDI_WAVEFORM_PACKET_SIZE (256-20) // Midi SYS_EX packet size
|
|
#define MAX_MIDI_WAVEFORM_DATA_SIZE 100 // Midi SYS_EX Data sample window size
|
|
#define MAX_PLIST_EFFECT_SIZE 8 // 8 effects in a PList
|
|
#define MAX_PLIST_EFFECT 8 // 8 PLists allowed
|
|
|
|
#define MAX_INDEX 15
|
|
#define MAX_SIZE_SNAME 64
|
|
|
|
#define MS_MANUFACTURER_ID 0x0a01
|
|
#define JOLT_PRODUCT_ID 0x01 // REVIEW: Is this correct?
|
|
|
|
#define DRIVER_ERROR_NO_MIDI_INPUT 0x100 // No open Midi input device
|
|
#define DRIVER_ERROR_MIDI_OUTPUT 0x101 // Error outputing to Midi output
|
|
|
|
|
|
//
|
|
// --- RTC Spring defaults
|
|
//
|
|
#define DEFAULT_RTC_KX 80
|
|
#define DEFAULT_RTC_KY 80
|
|
#define DEFAULT_RTC_X0 0
|
|
#define DEFAULT_RTC_Y0 0
|
|
#define DEFAULT_RTC_XSAT 96
|
|
#define DEFAULT_RTC_YSAT 96
|
|
#define DEFAULT_RTC_XDBAND 16
|
|
#define DEFAULT_RTC_YDBAND 16
|
|
|
|
//
|
|
// --- Effect status code from Device
|
|
//
|
|
#define SWDEV_STS_EFFECT_STOPPED 0x01
|
|
#define SWDEV_STS_EFFECT_RUNNING 0x02
|
|
|
|
//
|
|
// --- Bitmasks for Device Status
|
|
//
|
|
#define BANDWIDTH_MASK 0x200 // Bandwidth bit
|
|
#define COMM_MODE_MASK 0x100 // 0 = MIDI, 1 = Serial
|
|
#define AC_FAULT_MASK 0x80 // 1= AC brick fault
|
|
#define HOTS_MASK 0x20 // Hands on Throttle Sensor
|
|
#define RESET_MASK 0x10 // 1 = Power On Reset detected
|
|
#define SHUTDOWN_MASK 0x08 // 0 = normal Shutdown, else 1 = Soft Reset
|
|
|
|
#define MINIMUM_BANDWIDTH 1
|
|
#define MAXIMUM_BANDWIDTH 100 // in %
|
|
|
|
//
|
|
// --- ERROR CODES from Device
|
|
//
|
|
#define DEV_ERR_SUCCESS 0x00 // Success
|
|
#define DEV_ERR_INVALID_ID 0x01 // Effect ID is invalid or not found
|
|
#define DEV_ERR_INVALID_PARAM 0x02 // Invalid parameter in data structure
|
|
#define DEV_ERR_CHECKSUM 0x03 // Invalid checksum
|
|
#define DEV_ERR_TYPE_FULL 0x04 // No more room for specified Effect
|
|
#define DEV_ERR_UNKNOWN_CMD 0x05 // Unrecognized command
|
|
#define DEV_ERR_PLAYLIST_FULL 0x06 // Play List is full, cannot play any
|
|
// more effects
|
|
#define DEV_ERR_PROCESS_LIST_FULL 0x07 // Process List is full
|
|
|
|
|
|
//
|
|
// --- MIDI Command codes
|
|
//
|
|
#define MODIFY_CMD 0xA0
|
|
#define EFFECT_CMD 0xB0
|
|
#define SYSTEM_CMD 0xC0
|
|
#define STATUS_CMD 0xD0
|
|
#define RESPONSE_CMD 0xE0 // Device to Host
|
|
#define SYS_EX_CMD 0xF0
|
|
#define ASSIGN_CMD 0xF0
|
|
#define DNLOAD_CMD 0xF0
|
|
#define UPLOAD_CMD 0xF0
|
|
#define PROCESS_CMD 0xF0
|
|
#define MIDI_EOX 0xF7
|
|
|
|
//
|
|
// --- Second byte sub-commands
|
|
//
|
|
// --- MIDI_CMD_EFFECT second byte sub-command
|
|
#define NO_OVERRIDE 0x00
|
|
#define DESTINATION_X 0x01
|
|
#define DESTINATION_Y 0x02
|
|
#define DESTINATION_XY 0x03
|
|
#define PUT_FORCE_X 0x01
|
|
#define PUT_FORCE_Y 0x02
|
|
#define PUT_FORCE_XY 0x03
|
|
#define PLAY_EFFECT_SOLO 0x00
|
|
#define DESTROY_EFFECT 0x10
|
|
#define PLAY_EFFECT_SUPERIMPOSE 0x20
|
|
#define STOP_EFFECT 0x30
|
|
#define SET_INDEX 0x40
|
|
|
|
|
|
// --- MIDI_CMD_SYSTEM second byte sub-command
|
|
#define SWDEV_SHUTDOWN 1L // All Effects destroyed, Motors disabled
|
|
#define SWDEV_FORCE_ON 2L // Motors enabled. "Un-Mute"
|
|
#define SWDEV_FORCE_OFF 3L // Motors disabled. "Mute"
|
|
#define SWDEV_CONTINUE 4L // All "Paused" Effects are allow to continue
|
|
#define SWDEV_PAUSE 5L // All Effects are "Paused"
|
|
#define SWDEV_STOP_ALL 6L // Stops all Effects.
|
|
#define SWDEV_KILL_MIDI 7L // Kills (tri-states) MIDI
|
|
|
|
// Remap for dinput modes
|
|
#define DEV_RESET SWDEV_SHUTDOWN
|
|
#define DEV_FORCE_ON SWDEV_FORCE_ON
|
|
#define DEV_FORCE_OFF SWDEV_FORCE_OFF
|
|
#define DEV_CONTINUE SWDEV_CONTINUE
|
|
#define DEV_PAUSE SWDEV_PAUSE
|
|
#define DEV_STOP_ALL SWDEV_STOP_ALL
|
|
|
|
//
|
|
// --- ACK and NACK 2nd byte from RESPONSE_CMD
|
|
//
|
|
#define ACK 0x00
|
|
#define NACK 0x7f
|
|
#define ACKNACK_TIMEOUT 50 // 50*1msec timeout = 50msecs
|
|
#define ACKNACK_EFFECT_STATUS_TIMEOUT 1 // 1ms Timeout
|
|
#define MAX_RETRY_COUNT 10 // Retry count for comm NACKS
|
|
//#define MAX_GET_STATUS_PACKET_RETRY_COUNT 30
|
|
#define MAX_GET_STATUS_PACKET_RETRY_COUNT 10
|
|
#define SHORT_MSG_TIMEOUT 1
|
|
#define LONG_MSG_TIMEOUT 2
|
|
#define POWER_ON_MSG 0x007F00E5UL
|
|
#define RESPONSE_NACK 0x007FE0UL // Example for MIDI channel 0.
|
|
#define RESPONSE_ACK 0x0000E0UL // " "
|
|
|
|
// timing delays, in mS
|
|
#define DEFAULT_SHORT_MSG_DELAY 1 /* currently unused */
|
|
#define DEFAULT_LONG_MSG_DELAY 1
|
|
#define DEFAULT_DIGITAL_OVERDRIVE_PRECHARGE_CMD_DELAY 1
|
|
#define DEFAULT_SHUTDOWN_DELAY 10
|
|
#define DEFAULT_HWRESET_DELAY 20
|
|
#define DEFAULT_POST_SET_DEVICE_STATE_DELAY 1
|
|
#define DEFAULT_GET_EFFECT_STATUS_DELAY 2
|
|
#define DEFAULT_GET_DATA_PACKET_DELAY 1
|
|
#define DEFAULT_GET_STATUS_PACKET_DELAY 2
|
|
#define DEFAULT_GET_ID_PACKET_DELAY 2
|
|
#define DEFAULT_GET_STATUS_GATE_DATA_DELAY 0
|
|
#define DEFAULT_SET_INDEX_DELAY 0
|
|
#define DEFAULT_MODIFY_PARAM_DELAY 0
|
|
#define DEFAULT_FORCE_OUT_DELAY 1
|
|
#define DEFAULT_DESTROY_EFFECT_DELAY 1
|
|
#define DEFAULT_FORCE_OUT_MOD 1
|
|
|
|
typedef struct _DELAY_PARAMS
|
|
{
|
|
DWORD dwBytes;
|
|
DWORD dwDigitalOverdrivePrechargeCmdDelay;
|
|
DWORD dwShutdownDelay;
|
|
DWORD dwHWResetDelay;
|
|
DWORD dwPostSetDeviceStateDelay;
|
|
DWORD dwGetEffectStatusDelay;
|
|
DWORD dwGetDataPacketDelay;
|
|
DWORD dwGetStatusPacketDelay;
|
|
DWORD dwGetIDPacketDelay;
|
|
DWORD dwGetStatusGateDataDelay;
|
|
DWORD dwSetIndexDelay;
|
|
DWORD dwModifyParamDelay;
|
|
DWORD dwForceOutDelay;
|
|
DWORD dwShortMsgDelay;
|
|
DWORD dwLongMsgDelay;
|
|
DWORD dwDestroyEffectDelay;
|
|
DWORD dwForceOutMod;
|
|
} DELAY_PARAMS, *PDELAY_PARAMS;
|
|
|
|
void GetDelayParams(UINT nJoystickID, PDELAY_PARAMS pDelayParams);
|
|
|
|
//
|
|
// --- Format of Download command
|
|
// Bytes in SYS EX body (starting from Byte 5 to (n-1)
|
|
//
|
|
// Byte Contents
|
|
// ----- ---------
|
|
// 0 bOpCode - see detail on OPCODE below
|
|
// 1 bSubType - e.g. ET_UD_WAVEFORM, etc.
|
|
// 2 bEffectID - Effect ID, 0x7f = Create New
|
|
// 3 bDurationL - Low 7 bits duration in 2ms ticks, 0=Forever
|
|
// 4 bDurationH - High 7 bits
|
|
|
|
// 5 bAngleL - Low 7 bits Direction Angle
|
|
// 7 bAngleH - High 2 bits Direction Angle
|
|
// 8 bGain - 7 bits Gain 1 - 100%
|
|
// 9 bButtonPlayL - Low 7 bits button mask
|
|
// 10 bButtonPlayH - High 2 bits button mask
|
|
// 11 bForceOutRateL - Low 7 bits, 1 to 500 Hz
|
|
// 12 bForceOutRateH - High 2 bits
|
|
// 13 bLoopCountL - Low 7 bits Loop Count, Normally 1
|
|
// 14 bLoopCountH - High 7 bits Loop count
|
|
//
|
|
//
|
|
// The next block is optional and starts at Byte 15
|
|
// 15 bAttack - %tage
|
|
// 16 bSustain; - %tage
|
|
// 17 bDecay; - %tage
|
|
//
|
|
// Otherwise, Type specific Parameters start at either Byte 15 or 18
|
|
// 18 Type specific parameter bytes here
|
|
//
|
|
//
|
|
// ...
|
|
// n 7 bits Checksum of bytes 0 to n
|
|
//
|
|
//
|
|
//
|
|
// --- MIDI_CMD_ASSIGN, MIDI_CMD_DNLOAD, MIDI_CMD_PROCESS
|
|
// second byte sub-command
|
|
// Opcode is defined as follows:
|
|
// 7 6 5 4 3 2 1 0
|
|
// - - - - - - - -
|
|
// 0 c c c a a d d
|
|
//
|
|
// where:
|
|
// c c c
|
|
// - - -
|
|
// 0 0 0 - EXTEND_ESCAPE
|
|
// 0 0 1 - MIDI_ASSIGN
|
|
// 0 1 0 - DNLOAD_DATA
|
|
// 0 1 1 - UPLOAD_DATA
|
|
// 1 0 0 - PROCESS_DATA
|
|
// 1 0 1 - reserved
|
|
// 1 1 0 - reserved
|
|
// 1 1 1 - reserved
|
|
//
|
|
// and:
|
|
// a a
|
|
// - -
|
|
// 0 0 - DL_PLAY_STORE only after download
|
|
// 0 1 - DL_PLAY_SUPERIMPOSE right after download
|
|
// 1 0 - DL_PLAY_SOLO right after download
|
|
// 1 1 - reserved
|
|
// and:
|
|
// d d
|
|
// - -
|
|
// 0 0 - reserved
|
|
// 0 1 - X-Axis
|
|
// 1 0 - Y-Axis
|
|
// 1 1 - X and Y-Axis
|
|
//
|
|
|
|
#define EXTEND_ESCAPE 0x00
|
|
#define MIDI_ASSIGN 0x10
|
|
#define DNLOAD_DATA 0x20
|
|
#define UPLOAD_DATA 0x30
|
|
#define PROCESS_DATA 0x40
|
|
#define GET_FORCE_EFFECT_VALUE 0x50
|
|
|
|
// --- Download sub-commands
|
|
//
|
|
#define DL_PLAY_STORE 0x00
|
|
#define DL_PLAY_SUPERIMPOSE 0x04
|
|
#define DL_PLAY_SOLO 0x08
|
|
|
|
//
|
|
// --- Process List sub-commands
|
|
//
|
|
#define PLIST_CONCATENATE 0x01 //0x11 // Temp. s/b 0x01
|
|
#define PLIST_SUPERIMPOSE 0x02 //0x12 // Temp. s/b 0x02
|
|
|
|
|
|
//
|
|
// --- Special UD_EFFECT parameters
|
|
//
|
|
#define UD_DIFFERENCE_DATA 0x40
|
|
|
|
|
|
//
|
|
// --- Bitmap Indexes into Parameter storage array
|
|
//
|
|
#define INDEX0_MASK 0x00000001L
|
|
#define INDEX1_MASK 0x00000002L
|
|
#define INDEX2_MASK 0x00000004L
|
|
#define INDEX3_MASK 0x00000008L
|
|
#define INDEX4_MASK 0x00000010L
|
|
#define INDEX5_MASK 0x00000020L
|
|
#define INDEX6_MASK 0x00000040L
|
|
#define INDEX7_MASK 0x00000080L
|
|
#define INDEX8_MASK 0x00000100L
|
|
#define INDEX9_MASK 0x00000200L
|
|
#define INDEX10_MASK 0x00000400L
|
|
#define INDEX11_MASK 0x00000800L
|
|
#define INDEX12_MASK 0x00001000L
|
|
#define INDEX13_MASK 0x00002000L
|
|
#define INDEX14_MASK 0x00004000L
|
|
#define INDEX15_MASK 0x00008000L
|
|
|
|
#define INDEX0 0L
|
|
#define INDEX1 1L
|
|
#define INDEX2 2L
|
|
#define INDEX3 3L
|
|
#define INDEX4 4L
|
|
#define INDEX5 5L
|
|
#define INDEX6 6L
|
|
#define INDEX7 7L
|
|
#define INDEX8 8L
|
|
#define INDEX9 9L
|
|
#define INDEX10 10L
|
|
#define INDEX11 11L
|
|
#define INDEX12 12L
|
|
#define INDEX13 13L
|
|
#define INDEX14 14L
|
|
#define INDEX15 15L
|
|
|
|
|
|
//
|
|
// --- Effect types
|
|
//
|
|
|
|
#define ET_UD_WAVEFORM 1 // User Defined Waveform
|
|
|
|
#define ET_SE_SINE 2 // Sinusoidal
|
|
#define ET_SE_COSINE 3 // Cosine
|
|
#define ET_SE_SQUARELOW 4 // Square starting Low
|
|
#define ET_SE_SQUAREHIGH 5 // Square starting High
|
|
#define ET_SE_RAMPUP 6 // Ramp UP
|
|
#define ET_SE_RAMPDOWN 7 // Ramp Down
|
|
#define ET_SE_TRIANGLEUP 8 // Triangle rising
|
|
#define ET_SE_TRIANGLEDOWN 9 // Triangle falling
|
|
#define ET_SE_SAWTOOTHUP 10 // Sawtooth rising
|
|
#define ET_SE_SAWTOOTHDOWN 11 // Sawtooth falling
|
|
|
|
#define ET_BE_DELAY 12 // NOP delay
|
|
#define ET_BE_SPRING 13 // Springs
|
|
#define ET_BE_DAMPER 14 // Dampers
|
|
#define ET_BE_INERTIA 15 // Gravity
|
|
#define ET_BE_FRICTION 16 // Friction
|
|
#define ET_BE_WALL 17 // Wall (bumper)
|
|
#define ET_SE_CONSTANT_FORCE 18 // Constant Force
|
|
|
|
#define ET_PL_CONCATENATE 19 // Concatenate process list
|
|
#define ET_PL_SUPERIMPOSE 20 // Superimpose process list
|
|
|
|
// ROM Effect IDS
|
|
#define ET_RE_ROMID1 32
|
|
#define ET_RE_ROMID2 33
|
|
#define ET_RE_ROMID3 34
|
|
#define ET_RE_ROMID4 35
|
|
#define ET_RE_ROMID5 36
|
|
#define ET_RE_ROMID6 37
|
|
#define ET_RE_ROMID7 38
|
|
#define ET_RE_ROMID8 39
|
|
#define ET_RE_ROMID9 40
|
|
#define ET_RE_ROMID10 41
|
|
#define ET_RE_ROMID11 42
|
|
#define ET_RE_ROMID12 43
|
|
#define ET_RE_ROMID13 44
|
|
#define ET_RE_ROMID14 45
|
|
#define ET_RE_ROMID15 46
|
|
#define ET_RE_ROMID16 47
|
|
#define ET_RE_ROMID17 48
|
|
#define ET_RE_ROMID18 49
|
|
#define ET_RE_ROMID19 50
|
|
#define ET_RE_ROMID20 51
|
|
#define ET_RE_ROMID21 52
|
|
#define ET_RE_ROMID22 53
|
|
#define ET_RE_ROMID23 54
|
|
#define ET_RE_ROMID24 55
|
|
#define ET_RE_ROMID25 56
|
|
#define ET_RE_ROMID26 57
|
|
#define ET_RE_ROMID27 58
|
|
#define ET_RE_ROMID28 59
|
|
#define ET_RE_ROMID29 60
|
|
#define ET_RE_ROMID30 61
|
|
#define ET_RE_ROMID31 62
|
|
#define ET_RE_ROMID32 63
|
|
#define ET_RE_ROMID33 64
|
|
#define ET_RE_ROMID34 65
|
|
#define ET_RE_ROMID35 66
|
|
#define ET_RE_ROMID36 67
|
|
#define ET_RE_ROMID37 68
|
|
|
|
|
|
// more to be defined....
|
|
|
|
//
|
|
// Effect IDs as defined in Jolt device
|
|
//
|
|
#define EFFECT_ID_RTC_SPRING 0 // Built-in Return To Center Virtual Spring
|
|
#define EFFECT_ID_FRICTIONCANCEL 1 // Friction cancellation
|
|
|
|
|
|
//
|
|
// --- Process List Structure
|
|
//
|
|
typedef struct _PLIST {
|
|
ULONG ulNumEffects;
|
|
ULONG ulProcessMode; // PLIST_SUPERIMPOSE or PLIST_CONCATENATE
|
|
PDNHANDLE pEffectArray; // Effect ID[0} . . .
|
|
ULONG ulAction;
|
|
ULONG ulDuration;
|
|
} PLIST, *PPLIST;
|
|
|
|
//
|
|
// --- Behavioral Effects Structure
|
|
//
|
|
typedef struct _BE_XXX {
|
|
LONG m_XConstant; //(KX/BX/MX/FX/Wall type)
|
|
LONG m_YConstant; //(KY/BY/MY/FY/KWall)
|
|
LONG m_Param3; //(CX/VX/AX/Wall angle)
|
|
LONG m_Param4; //(CY/VYO/AY/Wall distance)
|
|
} BE_XXX, *PBE_XXX;
|
|
|
|
//
|
|
// --- SysEx Messages
|
|
//
|
|
typedef struct _SYS_EX_HDR {
|
|
BYTE m_bSysExCmd; // SysEx Fx command
|
|
BYTE m_bEscManufID; // Escape to long Manufac. ID, s/b 0
|
|
BYTE m_bManufIDL; // Low byte
|
|
BYTE m_bManufIDH; // High byte
|
|
BYTE m_bProdID; // Product ID
|
|
} SYS_EX_HDR, *PSYS_EX_HDR;
|
|
|
|
// --- Common Effect parameters
|
|
typedef struct _MIDI_EFFECT {
|
|
BYTE bDurationL; // Low 7 bits duration in 2ms ticks, 0=Forever
|
|
BYTE bDurationH; // High 7 bits
|
|
BYTE bButtonPlayL; // Low 7 bits button mask
|
|
BYTE bButtonPlayH; // High 2 bits button mask
|
|
BYTE bAngleL; // Low 7 bits Direction Angle
|
|
BYTE bAngleH; // High 2 bits Direction Angle
|
|
BYTE bGain; // 7 bits Gain 1 - 100%
|
|
BYTE bForceOutRateL; // Low 7 bits, 1 to 500 Hz
|
|
BYTE bForceOutRateH; // High 2 bits
|
|
BYTE bPercentL; // Low 7 bits Percent of waveform 1 to 10000
|
|
BYTE bPercentH; // High 7 bits Loop Count
|
|
} MIDI_EFFECT, *PMIDI_EFFECT;
|
|
|
|
// --- Envelope
|
|
typedef struct MIDI_ENVELOPE {
|
|
BYTE bAttackLevel; // Initial Attack amplitude 0 to +127
|
|
BYTE bSustainL; // time to Sustain in 2ms ticks
|
|
BYTE bSustainH; //
|
|
BYTE bSustainLevel; // Amplitude level to sustain
|
|
BYTE bDecayL; // time to Decay in 2ms ticks
|
|
BYTE bDecayH;
|
|
BYTE bDecayLevel; // Amplitude level to decay
|
|
} MIDI_ENVELOPE, *PMIDI_ENVELOPE;
|
|
|
|
// --- Midi Assign
|
|
typedef struct _MIDI_ASSIGN_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: MIDI_ASSIGN
|
|
BYTE bChannel; // Midi channel 1-16
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} MIDI_ASSIGN_SYS_EX, *PMIDI_ASSIGN_SYS_EX;
|
|
|
|
// --- Get Effect Force Value at a tick sample time
|
|
typedef struct _MIDI_GET_EFFECT_FORCE_VALUE_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: GET_EFFECT_FORCE_VALUE
|
|
BYTE bEffectID; // Effect ID
|
|
BYTE bSampleTimeL; // Low 7 bits in 2ms ticks
|
|
BYTE bSampleTimeH; // High 7 bits in 2ms ticks
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} MIDI_GET_EFFECT_FORCE_VALUE_SYS_EX, *PMIDI_GET_EFFECT_FORCE_VALUE_SYS_EX;
|
|
|
|
|
|
// --- Note: For the following, if bEffectID = 0x7f, then New, else Modify
|
|
// --- Download Data - Synthesized Waveform
|
|
typedef struct _SE_WAVEFORM_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: DNLOAD_DATA
|
|
BYTE bSubType; // ex: ET_SE_SINE
|
|
BYTE bEffectID; // Downloaded Effect ID
|
|
MIDI_EFFECT Effect;
|
|
MIDI_ENVELOPE Envelope;
|
|
// SE Parameters
|
|
BYTE bFreqL; // Low 7 bits Frequency 1-2048Hz
|
|
BYTE bFreqH; // High 4 bits
|
|
BYTE bMaxAmpL; // Low 7 bits Maximum Amplitude +/- 100%
|
|
BYTE bMaxAmpH; // High 1 bit
|
|
BYTE bMinAmpL; // Low 7 bits Minimum Amplitude +/- 100%
|
|
BYTE bMinAmpH; // High 1 bit
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} SE_WAVEFORM_SYS_EX, *PSE_WAVEFORM_SYS_EX;
|
|
|
|
// --- Download Data - NOP Delay
|
|
typedef struct _NOP_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: DNLOAD_DATA
|
|
BYTE bSubType; // Behavioral Effect Type: BE_FRICTION
|
|
BYTE bEffectID; // Downloaded Effect ID, 0x7F = Create NEw
|
|
BYTE bDurationL; // Low 7 bits duration in 2ms ticks, 0=Forever
|
|
BYTE bDurationH; // High 7 bits
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} NOP_SYS_EX, *PNOP_SYS_EX;
|
|
|
|
// --- Download Data - Behavioral SysEx
|
|
typedef struct _BEHAVIORAL_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: DNLOAD_DATA
|
|
BYTE bSubType; // Behavioral Effect Type: BE_SPRING
|
|
BYTE bEffectID; // Downloaded Effect ID
|
|
// Effects params
|
|
BYTE bDurationL; // Low 7 bits duration in 2ms ticks, 0=Forever
|
|
BYTE bDurationH; // High 7 bits
|
|
BYTE bButtonPlayL; // Low 7 bits button mask
|
|
BYTE bButtonPlayH; // High 2 bits button mask
|
|
// BE_XXX Parameters
|
|
BYTE bXConstantL; // Low 7 bits K (in +/- 100%) X-Axis
|
|
BYTE bXConstantH; // High 1 bit K
|
|
BYTE bYConstantL; // Low 7 bits K (in +/- 100%) Y-Axis
|
|
BYTE bYConstantH; // High 1 bit K
|
|
BYTE bParam3L; // Low 7 bits Axis center (in +/- 100%) X-Axis
|
|
BYTE bParam3H; // High 1 bit
|
|
BYTE bParam4L; // Low 7 bits Axis center (in +/- 100%) Y-Axis
|
|
BYTE bParam4H; // High 1 bit
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} BEHAVIORAL_SYS_EX, *PBEHAVIORAL_SYS_EX;
|
|
|
|
|
|
// --- Download Data - Friction SysEx
|
|
typedef struct _FRICTION_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: DNLOAD_DATA
|
|
BYTE bSubType; // Behavioral Effect Type: BE_FRICTION
|
|
BYTE bEffectID; // Downloaded Effect ID
|
|
// Effects params
|
|
BYTE bDurationL; // Low 7 bits duration in 2ms ticks, 0=Forever
|
|
BYTE bDurationH; // High 7 bits
|
|
BYTE bButtonPlayL; // Low 7 bits button mask
|
|
BYTE bButtonPlayH; // High 2 bits button mask
|
|
// BE_FRICTION Parameters
|
|
BYTE bXFConstantL; // Low 7 bits F (in +/- 100%) X-Axis
|
|
BYTE bXFConstantH; // High 1 bit F
|
|
BYTE bYFConstantL; // Low 7 bits F (in +/- 100%) Y-Axis
|
|
BYTE bYFConstantH; // High 1 bit F
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} FRICTION_SYS_EX, *PFRICTION_SYS_EX;
|
|
|
|
|
|
// --- Download Data - WALL SysEx
|
|
#define INNER_WALL 0 // Wall face to center
|
|
#define OUTER_WALL 1 // Wall face away from center
|
|
|
|
typedef struct _WALL_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: DNLOAD_DATA
|
|
BYTE bSubType; // Behavioral Effect Type: e.g. EF_BE_WALL
|
|
BYTE bEffectID; // Downloaded Effect ID
|
|
// Effects params
|
|
BYTE bDurationL; // Low 7 bits duration in 2ms ticks, 0=Forever
|
|
BYTE bDurationH; // High 7 bits
|
|
BYTE bButtonPlayL; // Low 7 bits button mask
|
|
BYTE bButtonPlayH; // High 2 bits button mask
|
|
// BE_SPRING Parameters
|
|
BYTE bWallType; // INNER_WALL or OUTER_WALL
|
|
BYTE bWallConstantL; // Low 7 bits: Similar to Spring Constant.
|
|
// Value is from +/- 100%.
|
|
BYTE bWallConstantH; // High 1 bit
|
|
BYTE bWallAngleL; // Low 7 bits: 0 to 359 degrees
|
|
// For simple vertical and horizontal walls,
|
|
// this value should be set to 0, 90, 180, 270
|
|
BYTE bWallAngleH; // Low 2 bit
|
|
BYTE bWallDistance; // 7 bits: Distance from Center of stick 0 to 100
|
|
BYTE bChecksum;
|
|
BYTE bEOX;
|
|
} WALL_SYS_EX, *PWALL_SYS_EX;
|
|
|
|
// --- Download Data - User Defined Waveform SysEx
|
|
typedef struct _UD_WAVEFORM_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: PROCESS_DATA
|
|
BYTE bSubType; // Process List: PL_SUPERIMPOSE/PL_CONCATENATE
|
|
BYTE bEffectID; // Downloaded Effect ID
|
|
MIDI_EFFECT Effect;
|
|
// BYTE bWaveformArray; // Force Data . . .
|
|
// BYTE bChecksum;
|
|
// BYTE bEOX;
|
|
} UD_WAVEFORM_SYS_EX, *PUD_WAVEFORM_SYS_EX;
|
|
#define UD_WAVEFORM_START_OFFSET (sizeof(UD_WAVEFORM_SYS_EX))
|
|
|
|
|
|
// --- Download Data - Process List SysEx
|
|
typedef struct _PROCESS_LIST_SYS_EX {
|
|
SYS_EX_HDR SysExHdr;
|
|
BYTE bOpCode; // Sub-command opcode: PROCESS_DATA
|
|
BYTE bSubType; // Process List: PL_SUPERIMPOSE/PL_CONCATENATE
|
|
BYTE bEffectID; // Downloaded Effect ID
|
|
BYTE bButtonPlayL; // Low 7 bits button mask
|
|
BYTE bButtonPlayH; // High 2 bits button mask
|
|
BYTE bEffectArrayID; // Effect ID[0] . . .
|
|
// BYTE bChecksum;
|
|
// BYTE bEOX;
|
|
} PROCESS_LIST_SYS_EX, *PPROCESS_LIST_SYS_EX;
|
|
#define PROCESS_LIST_EFFECT_START_OFFSET (sizeof(PROCESS_LIST_SYS_EX))
|
|
|
|
|
|
//
|
|
// --- Function Prototypes
|
|
//
|
|
HRESULT CMD_Init(void);
|
|
|
|
HRESULT CMD_SetIndex(
|
|
IN int nIndex,
|
|
IN DNHANDLE DnloadID);
|
|
|
|
HRESULT CMD_ModifyParam(
|
|
IN WORD wNewParam);
|
|
|
|
HRESULT CMD_ModifyParamByIndex(
|
|
IN int nIndex,
|
|
IN DNHANDLE DnloadID,
|
|
IN WORD wNewParam);
|
|
|
|
HRESULT CMD_Force_Out(
|
|
IN LONG lForceData,
|
|
IN ULONG ulAxisMask);
|
|
|
|
HRESULT CMD_DestroyEffect(
|
|
IN DNHANDLE hEffectID);
|
|
|
|
HRESULT CMD_PlayEffectSolo(
|
|
IN DNHANDLE hEffectID);
|
|
|
|
HRESULT CMD_PlayEffectSuperimpose(
|
|
IN DNHANDLE hEffectID);
|
|
|
|
HRESULT CMD_StopEffect(
|
|
IN DNHANDLE hEffectID);
|
|
|
|
HRESULT CMD_SetDeviceState(
|
|
IN ULONG ulMode);
|
|
|
|
HRESULT CMD_GetEffectStatus(
|
|
IN DNHANDLE hDnloadID,
|
|
IN OUT PBYTE pStatusCode);
|
|
|
|
HRESULT CMD_GetEffectForceValue(
|
|
IN DNHANDLE DnloadID,
|
|
IN ULONG ulAxisMask,
|
|
IN ULONG ulIndex,
|
|
IN OUT PLONG pForceValue);
|
|
|
|
HRESULT CMD_MIDI_Assign(
|
|
IN BYTE bMidiChannel);
|
|
|
|
HRESULT CMD_Download_NOP_DELAY(
|
|
IN ULONG ulDuration,
|
|
IN PEFFECT pEffect,
|
|
IN OUT PDNHANDLE pDnloadID);
|
|
|
|
HRESULT CMD_Download_UD_Waveform(
|
|
IN ULONG ulDuration,
|
|
IN PEFFECT pEffect,
|
|
IN ULONG ulNumVectors,
|
|
IN PLONG pUD_Array,
|
|
IN ULONG ulAction,
|
|
IN OUT PDNHANDLE pDnloadID,
|
|
IN DWORD dwFlags);
|
|
|
|
HRESULT CMD_Download_SYNTH(
|
|
IN PEFFECT pEffect,
|
|
IN PENVELOPE pEnvelope,
|
|
IN PSE_PARAM pSE_Param,
|
|
IN ULONG ulAction,
|
|
IN OUT PDNHANDLE pDnloadID,
|
|
IN DWORD dwFlags);
|
|
|
|
HRESULT CMD_Download_VFX(
|
|
IN PEFFECT pEffect,
|
|
IN PENVELOPE pEnvelope,
|
|
IN PVFX_PARAM pVFX_Param,
|
|
IN ULONG ulAction,
|
|
IN OUT PDNHANDLE pDnloadID,
|
|
IN DWORD dwFlags);
|
|
|
|
HRESULT CMD_Download_BE_XXX(
|
|
IN PEFFECT pEffect,
|
|
IN PENVELOPE pEnvelope,
|
|
IN PBE_XXX pBE_XXX,
|
|
IN OUT PDNHANDLE pDnloadID,
|
|
IN DWORD dwFlags);
|
|
|
|
HRESULT CMD_Download_RTCSpring(
|
|
IN PRTCSPRING_PARAM pRTCSpring,
|
|
IN OUT PDNHANDLE pDnloadID);
|
|
|
|
HRESULT CMD_ProcessEffect(
|
|
IN ULONG ulButtonPlayMask,
|
|
IN OUT PDNHANDLE pDnloadID,
|
|
IN int nNumEffects,
|
|
IN ULONG ulProcessMode,
|
|
IN PDNHANDLE pPListArray,
|
|
IN ULONG ulAction);
|
|
|
|
HRESULT CMD_VFXProcessEffect(
|
|
IN ULONG ulButtonPlayMask,
|
|
IN OUT PDNHANDLE pDnloadID,
|
|
IN int nNumEffects,
|
|
IN ULONG ulProcessMode,
|
|
IN PDNHANDLE pPListArray,
|
|
IN ULONG ulAction);
|
|
|
|
HRESULT ModifyEffectParams(
|
|
IN DNHANDLE DnloadID,
|
|
IN PEFFECT pEffect,
|
|
IN DWORD dwFlags);
|
|
|
|
class CMidiSynthesized;
|
|
|
|
HRESULT ModifyEnvelopeParams(
|
|
IN CMidiSynthesized *pMidiEffect,
|
|
IN DNHANDLE DnloadID,
|
|
IN ULONG ulDuration,
|
|
IN PENVELOPE pEnvelope,
|
|
IN DWORD dwFlags);
|
|
|
|
void MapEnvelope(
|
|
IN ULONG ulDuration,
|
|
IN ULONG dwMagnitude,
|
|
IN ULONG * pMaxLevel,
|
|
IN LPDIENVELOPE pDIEnvelope,
|
|
IN OUT PENVELOPE pEnvelope);
|
|
|
|
|
|
#endif // of ifdef _HAU_MIDI_SEEN
|