               INCLUDE HPFIXUPS
               TITLE "TRIGRBOY"
***************************************************************************************************
***************************************************************************************************
***                                                                                             ***
***            TRIGRBOY - TRIGGER-INPUT HANDLER - INCLUDING EQUIVALENT OF "TRIGPADS"            ***
***                                                                                             ***
***************************************************************************************************
***************************************************************************************************
;
NEG_EXT        EQU     0FFFFFF00H      ;USE IN MOVEQ INSTRUCTIONS WHERE ARG IS
                                       ;80H OR LARGER - HP XASM DOES NOT HANDLE
                                       ;SIGN-EXTEND CORRECTLY.  COSMETIC, KEEPS
                                       ;ACTUAL BYTE VALUE CLEARER.
;
               ABS_SHORT
;
               GLB     PRO_TRIGGER,TRIG_TRANSMIT
;
               EXTERNAL  BACK_HANDLER
               EXTERNAL  VOICE_ASSIGN
               EXTERNAL  XMIT_LIVE
               EXTERNAL  LOG_IN_NEW_PAD
               EXTERNAL  LOG_OUT_NEW_PAD
               EXTERNAL  PAD_VEL_TBL
;
               EXTERNAL  SAMPLED_SOUNDS
               EXTERNAL  PAD_LEVELS
               EXTERNAL  PAD_PITCHES
               EXTERNAL  PAD_PANS
               EXTERNAL  PAD_SOUNDS
               EXTERNAL  KIT_INDEX
               EXTERNAL  EDIT_KIT_INDEX
               EXTERNAL  BUILD_KIT_FLAG
               EXTERNAL  PAD_JUST_HIT
               EXTERNAL  RECORDING
               EXTERNAL  ASSIGN_BLOCK
               EXTERNAL  CURRENT_SOUND
               EXTERNAL  LEVEL_CHANGE
               EXTERNAL  CURRENT_LEVEL
               EXTERNAL  PITCH_CHANGE
               EXTERNAL  CURRENT_PITCH
               EXTERNAL  PAN_CHANGE
               EXTERNAL  CURRENT_PAN
               EXTERNAL  SEQ_WR_PTR
;
;30SEP               EXTERNAL  WASTE_WR_PTR
;30SEP               EXTERNAL  PAD_REC_PARSE
               EXTERNAL  PAD_ON_WRITE
               EXTERNAL  WASTELAND_PTR
;
               EXTERNAL  NOW_TRACK
               EXTERNAL  ERASING
               EXTERNAL  TRIG_ACTION
               EXTERNAL  TRIG_KIT
               EXTERNAL  TRIG_ALT_PRM
               EXTERNAL  TRIG_VELOCITY
               EXTERNAL  TRIG_XMT_BUF
               EXTERNAL  TRIG_SEQ_BUF
               EXTERNAL  TRIG_XMT_PEND
               EXTERNAL  CUR_PADS_ON
               EXTERNAL  CUR_FTPADS_ON
               EXTERNAL  SWITCHES_ON
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; GENERATE AN EVENT IN RESPONSE TO TRIGGER INPUT -
; WE CAME HERE BECAUSE NEW_TRIG_ON WAS SET BY REALTIME, ALTHOUGH IT'S
; BEEN CLEARED ON THE WAY HERE, BY BACK_HANDLER (WHO JUST JUMPED HERE).
; WE EITHER TRIGGER A SOUND PAD EVENT OR "HIT" THE TAP-IN SWITCH.
; NOTE - OBLIVIOUS TO AUTOREPEAT, NO ACTION WHAT-SO-EVER IN ERASE MODE.
; GENERALLY, WE OUGHT NOT TO GET HERE IF TRIGGER-INPUT IS NOT ROUTED TO
; ANYTHING - SINCE TRIGGER-INPUT SCANNING IS PRETTY REALTIME-INTENSIVE -
; HOWEVER, THE POSSIBILITY IS OF COURSE ALLOWED FOR (ALOUD FOUR?).
; NO OTHER INPUTS - ASSUME ALL REGS DESTROYED TO AVOID DISAPPOINTMENT.
;
PRO_TRIGGER
               MOVE    TRIG_ACTION,D0       ;WHAT ARE WE SUPPOSED TO DO NOW?
               BEQ.S   PROTRIG_EXIT         ;WELL, NOTHING, ACTUALLY.
               CMP     #1,D0                ;TAP-IN SWITCH?
               BGT.S   TRIGPADS_BOY         ;NO - GIVE IT TO THE BOY, LET THERE BE A PAD HIT.
               BSET    #5,SWITCHES_ON+6     ;YES - JUST FAKE A SWITCH-ON EDGE FOR TAP-TEMPO SWITCH.
PROTRIG_EXIT
               BRA     BACK_HANDLER         ;GET BACK TO THE GROUND.
;
;
TRIGPADS_BOY
               TST.B   ERASING              ;HOLD IT, HOLD IT - ARE WE IN ERASE MODE?
               BNE     TRIGPAD_EXIT         ;BRANCH IF YEAH, WE GOT NUTTIN' TO DO WIT DIS DEN.
;
               SUBQ    #2,D0                ;FIRST, WE NEED A "PAD" INDEX - NOW WE GOT ONE.
               MOVE    TRIG_KIT,D1          ;THIS INDICATES KIT PREFERENCE (PERHAPS NONE).
               MOVE    TRIG_ALT_PRM,D7      ;FETCH SPECIFIED ALT-PARAMS SETTING, IF ANY -
               MOVE    TRIG_VELOCITY,D4     ;FETCH NOTE-ON VELOCITY SETTING.
;
               MOVE    D0,PAD_JUST_HIT      ;UPDATE PAD-JUST-HIT STATUS PER PAD WE'RE MAPPED TO.
               TST     D1                   ;IS A KIT SPECIFIED FOR TRIGGER-PAD?
               BEQ.S   TRIGPAD_22           ;BRANCH IF NOT, USE WHATEVER IS CURRENTLY SELECTED.
               SUBQ    #1,D1                ;ELSE ADJUST SETTING TO OBTAIN EFFECTIVE KIT INDEX.
               BRA.S   TRIGPAD_24
TRIGPAD_22
               MOVE    KIT_INDEX,D1         ;GENERATE PAD PARAMETER INDEX FOR THIS EVENT -
               TST.B   BUILD_KIT_FLAG       ;ARE WE IN KIT-BUILD SCREEN?
               BEQ.S   TRIGPAD_24           ;BRANCH IF NOT, PLAY/EDIT SELECTED LIVE PAD ARRAY.
               MOVE    EDIT_KIT_INDEX,D1    ;KIT-BUILD - PLAY/EDIT EDIT-TARGET KIT (DISPLAYED KIT).
TRIGPAD_24
                                            ;D1 CONTAINS EVENT EFFECTIVE KIT INDEX -
               MOVE    D1,EDIT_KIT_INDEX    ;EDIT KIT FOLLOWS LIVE EVENT SOURCE KIT, UPDATE INDEX.
               TST.B   BUILD_KIT_FLAG       ;ARE WE IN KIT-BUILD SCREEN?
               BEQ.S   TRIGPAD_2A           ;BRANCH IF NOT, PLAY FROM LIVE PAD ARRAYS.
               ADD     #32,D1               ;ELSE ADD OFFSET SO WE ACCESS PRESET ARRAYS INSTEAD.
TRIGPAD_2A
               ASL     #3,D1                ;(8*KIT_INDEX) GETS SELECTED PAD/KIT ARRAY,
               ADD     D0,D1                ;STEP UP BY PAD NUMBER TO GET SELECTED PAD'S CELL.
               MOVE    D1,A0                ;A0 IS NOW THE PAD PARAMETER INDEX -
               CLR     D1                   ;CLEAR OUT D1 (ESPECIALLY HIGH BYTE),
               MOVE.B  PAD_SOUNDS(A0),D1    ;FETCH SOUND NUMBER (L.S.BIT = ALT PARAMS SETTING).
;
               MOVE    D1,D2                ;PRESERVE SOUND NUMBER / ALT PARAM BIT IN D1,
               MOVE    D1,D3                ;SPLIT SOUND NUMBER AND ALT PARAMS BIT FROM EACH OTHER,
               LSR     #1,D2                ;UPDATE CURRENT_SOUND - NO QUESTION HERE.
               MOVE    D2,CURRENT_SOUND
               AND     #1,D3                ;ISOLATE ALT-PARAMS SETTING -
;
               TST     D7                   ;WHAT IS ALT-PARAMS SETTING ON OUR EVER-FAITHFUL TRIG?
               BEQ.S   TRIGPAD_2G           ;NONE SPECIFIED, USE THE ONE WE FETCHED FROM ARRAY.
               SUBQ    #1,D7                ;ELSE, SUBSTITUTE - CHOP DOWN TO WORKING VALUE,
               MOVE    D7,D3                ;PLOP IT INTO THE WORK-HOLE.
               BCLR    #0,D1                ;ALSO, UPDATE D1 (USED FOR EVENT-BUILDING BELOW).
               OR.B    D3,D1
TRIGPAD_2G
;
TRIGPAD_30
;
; LOOK FOR AND EXECUTE ANY PENDING PERFORMANCE PARAMETER EDITS:
; NORMALLY, EDITS REMAIN PENDING UNTIL PAD IS HIT, THEN ARE APPLIED TO
; THAT PAD BY THE FOLLOWING CODE (LIVE PAD ARRAYS ONLY).
;
; THE FOLLOWING CONDITIONS PREEMPT PAD-HANDLER EDITS - EDITS ARE
; INSTEAD GRABBED BY BACKGROUND (PAD_EDIT_CHECK), WE NEVER SEE 'EM:
;
; IF IN KIT-BUILD SCREEN, EDITS ARE IMMEDIATELY APPLIED TO LAST PAD HIT,
; IN PRESET ARRAYS OF THE EDIT-TARGET KIT (EDIT_KIT_INDEX) RATHER THAN
; THE KIT INDICATED BY KIT_INDEX.
;
; IF IN INITIAL PAN SCREEN, PAN CHANGES (ONLY) ARE HANDLED IMMEDIATELY,
; IN ARRAYS INDICATED BY KIT_INDEX (LIVE ARRAYS ONLY).
;
; IF NEITHER OF ABOVE CONDITIONS OBTAINS BUT PAD(S) ARE ON WHEN AN EDIT
; IS GENERATED, THE EDIT IS APPLIED IMMEDIATELY TO THOSE PADS, IN ARRAYS
; INDICATED BY KIT_INDEX (AGAIN, LIVE ARRAYS ONLY) - THIS INCLUDES ANY
; FOOTSWITCHES WHICH ARE SET UP AS PAD TRIGGERS.
;
; IN SUMMARY - EDITS DONE HERE ONLY IF NOT IN KIT-BUILD SCREEN/MODE AND
; NO PADS (OR PAD-FOOTSWITCHES) ARE ON AT THIS TIME.
;
               TST.B   BUILD_KIT_FLAG       ;JUST TO MAKE SURE NOTHING SLIPS THROUGH THE CRACKS ...
               BNE.S   TRIGPAD_80           ;SKIP EDIT TESTS IF IN KIT-BUILD SCREEN.
               MOVE.B  CUR_FTPADS_ON,D7     ;DEFER EDITS TO PAD_EDIT_CHECK IF ANY PADS ARE ON -
               OR.B    CUR_PADS_ON,D7       ;SURVEY ALL PADS AND PAD-FOOTSWITCHES -
               BNE.S   TRIGPAD_80           ;GIVE THEM TOTAL PRECEDENCE OVER TRIGGER INPUT,
                                            ;SINCE TRIG-IN PADS NEVER EXIST IN GATED-ON STATE.
;
                                            ;ELSE, PERFORM ANY PENDING EDITS:
TRIGPAD_EDIT
               TST.B   LEVEL_CHANGE         ;SOUND LEVEL -
               BEQ.S   TRPAD_ED_10
               MOVE.B  CURRENT_LEVEL+1,PAD_LEVELS(A0)
TRPAD_ED_10
               TST.B   PITCH_CHANGE         ;SOUND PITCH -
               BEQ.S   TRPAD_ED_20
               MOVE.B  CURRENT_PITCH+1,PAD_PITCHES(A0)
TRPAD_ED_20
               TST.B   PAN_CHANGE           ;SOUND PAN -
               BEQ.S   TRPAD_ED_30
               MOVE.B  CURRENT_PAN+1,PAD_PANS(A0)
TRPAD_ED_30
;
;
TRIGPAD_60
               SF      LEVEL_CHANGE         ;ACKNOWLEDGE ANY AND ALL PERFORMANCE PARAMETER EDITS.
               SF      PITCH_CHANGE
               SF      PAN_CHANGE
;
;
;
; VOICE-ASSIGN TIME -
; V_IDENTITY MINI-REFRESHER COURSE:
;
;                      BIT 15                       BIT 0
;                        |                             |
;                        V                             V
; TRIGGER "PAD" EVENT V_IDENTITY:
;              WORD 0 -  1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
;              WORD 2 -  0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0
;
;                   NOTE: NO GATE-ON STATE FOR TRIGGER-PAD EVENTS.
;
;
TRIGPAD_80
               MOVE.L  SAMPLED_SOUNDS,D7    ;DONE DIDDLING PADS - IS THIS SOUND SAMPLED?
               BTST    D2,D7
               BEQ.S   TRIGPAD_A0           ;BRANCH IF NOT - DON'T BOTHER MR.VOICE_ASSIGN.
;
                                            ;ELSE, SET UP ASSIGN_BLOCK FOR HIM TO CHEW ON -
               MOVE    #2,ASSIGN_BLOCK+0    ;SET ORIGIN CODE TO IDENTIFY THIS AS A PAD EVENT.
               MOVE    D2,ASSIGN_BLOCK+2    ;INSTALL SOUND NUMBER FOR THIS EVENT.
               MOVE    D3,ASSIGN_BLOCK+4    ;INSTALL ALT PARAMS STATUS FOR THIS EVENT.
               MOVE.B  D4,ASSIGN_BLOCK+6    ;COPY VELOCITY SETTING INTO ASSIGN_BLOCK -
               BEQ.S   TRIGPAD_84           ;IF ZERO, USING SENSED VELOCITY - SO WE'RE OK.
                                            ;ELSE, USING DEFAULT VEL - TRANSFORM TO 5-BIT FORMAT.
               MOVE    D4,D5                ;COPY EVENT VELOCITY (MIDI FORMAT, 1-127).
               SUBQ    #1,D5                ;CONVERT TO VELOCITY TABLE INDEX (0-126).
               MOVE.L  #PAD_VEL_TBL,A1      ;SET POINTER TO TABLE,
               MOVE.B  0(A1,D5),D5          ;NOW FETCH DOT VALOSSIDY (1-31, INTERNAL FORMAT).
               MOVE.B  D5,ASSIGN_BLOCK+6    ;COPY VELOCITY INTO ASSIGN_BLOCK.
TRIGPAD_84
               MOVE.B  PAD_PITCHES(A0),ASSIGN_BLOCK+7 ;INSTALL PERFORMANCE PARAMETERS.
               MOVE.B  PAD_LEVELS(A0),ASSIGN_BLOCK+9
               MOVE.B  PAD_PANS(A0),ASSIGN_BLOCK+11
               MOVE    D0,ASSIGN_BLOCK+12             ;INSTALL PAD NUMBER.
               MOVE.L  #800000F0H,ASSIGN_BLOCK+14     ;COPY VOICE ID TAG INTO ASSIGN_BLOCK.
               BSR     VOICE_ASSIGN                   ;ASSIGN_BLOCK IS COMPLETELY SET UP -
                                                      ;GET VOICE PLAY UNDERWAY.
;
;
TRIGPAD_A0
;
; AT THIS POINT:
;    D0 CONTAINS EVENT PAD NUMBER.
;    D1 CONTAINS EVENT COMBINED SOUND NUMBER / ALT PARAMS BIT.
;    D2 CONTAINS EVENT SOUND NUMBER.
;    D3 CONTAINS EVENT ALT PARAMS BIT.
;    D4 CONTAINS EVENT NOTE-ON VELOCITY (MIDI FORMAT).
;    D7 CONTAINS SAMPLED_SOUNDS MAP.
;    A0 IS PAD/KIT ARRAY INDEX FOR FURTHER ACCESS TO PERFORMANCE PARAMS.
; FOR WHAT IT'S WORTH .....
;
;
;
; SO - IT BE TIME TO KICK DON MIDI AND SIR MTC IN THE BUTT - MAYBE ....
; BAZE-ICLY, WE BUILD AND SAVE THE NOTE-OFF EVENT, THEN CHECK TO SEE IF
; WE'RE USING SENSED OR DEFAULT FIXED VELOCITY - IF USING DEFAULT VEL,
; WE CAN TRANSMIT THE EVENTS RIGHT AWAY.  IF SENSING VEL, WE SET A FLAG
; TO DENOTE PENDING MIDI/MTC NOTE-ON TRANSMISSION FOR TRIGGER-IN "PAD".
; WHEN PAD VEL BECOMES AVAILABLE, SOMEONE IN HIGH-PRIO BACKGROUND COPIES
; THE NOTE-OFF EVENT FROM WHERE WE HAVE SAVED IT, PLUGS IN THE NOTE-ON
; VELOCITY AND HANDS IT TO DR. MIDI / MR. MTC.
; THIS IS IMMEDIATELY FOLLOWED BY NOTE-OFF EVENTS, SINCE TRIGGER "PADS"
; DO NOT HAVE A GATE-ON STATE, AS SUCH.
;
               MOVE    #TRIG_XMT_BUF,A2     ;A2 POINTS TO BUFFER WHICH HOLDS TRIGGER-PAD EVENT IN
                                            ;READY-FOR-XMIT_LIVE FORMAT.
               MOVE    D0,(A2)+             ;STORE EVENT PAD NUMBER.
               MOVE    D1,(A2)+             ;STORE EVENT COMBINED SOUND NUMBER / ALT PARAMS BIT.
               MOVE.B  #0,(A2)+             ;DON'T BOTHER WITH VELOCITY, DEAL WITH IT BELOW/LATER.
               MOVE.B  PAD_PITCHES(A0),(A2)+     ;STORE EVENT PITCH SETTING.
               MOVE.B  PAD_PANS(A0),(A2)+   ;STORE EVENT PAN SETTING.
               MOVE.B  PAD_LEVELS(A0),(A2)  ;STORE EVENT LEVEL SETTING.
;
;
;
; THE FOLLOWING PROCEDURE IS ANALOGOUS TO THE ABOVE,
; BUT APPLIES TO GENERATION OF EVENT FOR THE SEQUENCER?  YEAH - THAT'S
; IT - EVENT IS SET UP IN A BUFFER USING OUR ON-HAND VELOCITY SETTING.
; IF USING DEFAULT FIXED VEL, CAN HAND EVENT TO SEQUENCER RIGHT AWAY -
; ELSE EVENT SITS IN ITS BUFFER AWAITING VELOCITY VALUE - WHEN VELOCITY
; ARRIVES, IT IS PLUGGED INTO EVENT, AND EVENT IS PASSED TO SEQUENCER -
; THIS IS DONE BY SAME ROUTINE WHICH TRANSMITS PAD EVENTS TO MIDI/MTC,
; HAPPENS AT THE SAME TIME IN RESPONSE TO SAME FLAG (TRIG_XMT_PEND).
; IMMEDIATELY AFTERWARD, FIRST TWO WORDS OF EVENT ARE REGROOMED WITH
; SEQUENCE INTERNAL NOTE-OFF EVENT ID TAG AND PASSED AGAIN TO SEQUENCER.
; OF COURSE, NONE OF THIS HAPPENS IF WE ARE NOT IN NORMAL RECORD MODE.
;
; SEQUENCER FORMAT FOR INTERNAL NOTE-ON EVENT:
;              WORD 0 -  P-P-P S-S-S-S-S A T-T-T 0 0 0 1
;              WORD 1 -  X H-H-H-H-H N-N-N-N-N V-V-V-V-V
;              WORD 2 -  X X X X X X X X X X X L-L-L-L-L
;
; SEQUENCER FORMAT FOR INTERNAL NOTE-OFF EVENT:
;              WORD 0 -  P-P-P S-S-S-S-S A T-T-T 0 0 1 0
;              WORD 1 -  X H-H-H-H-H N-N-N-N-N V-V-V-V-V
;
;                   G = GATE STATUS BIT.
;                   P-P-P = PAD NUMBER.
;                   S-S-S-S-S = SOUND NUMBER.
;                   A = ALT-PARAMS STATUS.
;                   T-T-T = TRACK NUMBER.
;                   H-H-H-H-H = EVENT PITCH.
;                   N-N-N-N-N = EVENT PAN.
;                   V-V-V-V-V = EVENT VELOCITY.
;                   X = UNDEFINED.
;                   L-L-L-L-L = EVENT LEVEL.
;
;
               TST.B   RECORDING            ;ARE WE IN NORMAL-KINDA SEQUENCE-RECORD MODE?
               BEQ.S   TRIGPAD_B0           ;BRANCH IF NOT - DON'T BOTHER GENERATING SEQ EVENT.
                                            ;ELSE, GENERATE AN EVENT FOR SEQUENCER -
               MOVE    #TRIG_SEQ_BUF,A2     ;SET POINTER TO TRIGGER-GENERATED SEQ EVENT BUFFER.
               MOVE    D0,D5                ;COPY PAD NUMBER FOR EVENT GENERATION.
               LSL     #6,D5                ;SHIFT PAD NUMBER OVER, MAKE ROOM FOR SOUND#/ALT BIT.
               OR      D1,D5                ;THERE IT GOES.
               LSL     #3,D5                ;STEP ASIDE, MAKE WAY FER TRACK NUMMA -
               OR      NOW_TRACK,D5
               LSL     #4,D5                ;NOW MAKE WAY FOR NOTE-ON EVENT ID -
               BSET    #0,D5                ;EVENT ID = 0001 FOR INTERNAL NOTE-ON EVENT.
               CLR     D6                   ;BUILD PITCH/PAN/VELOCITY WORD IN D6:
               MOVE.B  PAD_PITCHES(A0),D6   ;PITCH GOES IN LEFTMOST,
               LSL     #5,D6
               OR.B    PAD_PANS(A0),D6      ;FOLLOWED BY PAN -
               LSL     #5,D6                ;JUST LEAVE ROOM FOR VELOCITY FOR NOW.
               CLR     D7                   ;EVENT LEVEL IS DANGLING OFF IN A WORD OF ITS OWN ....
               MOVE.B  PAD_LEVELS(A0),D7
               MOVEM   D5-D7,(A2)           ;DONE - PUMP 'EM ALL OUT THERE (TRIG SEQ EVENT BUFFER).
;
TRIGPAD_B0
               TST     D4                   ;NOW, DO WE OR DON'T WE (KNOW VELOCITY RIGHT NOW)?
               BNE.S   TRIG_TRANSMIT        ;BRANCH IF YES, TRANSMIT MIDI/MTC/SEQ EVENTS AT ONCE.
               ST      TRIG_XMT_PEND        ;ELSE SET FLAG TO INDICATE MIDI/MTC/SEQ EVENTS ARE
                                            ;WAITING TO BE SENT, PENDING READ OF TRIG-IN VELOCITY.
;
TRIGPAD_EXIT
               BRA     BACK_HANDLER
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
               SKIP
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;
; PASS TRIGGER-PAD EVENTS TO MIDI / MTC HANDLER -
; IF IN NORMAL RECORD MODE, PASS EVENT TO SEQUENCER INPUT AS WELL.
; D4.B CONTAINS NOTE-ON VELOCITY IN MIDI FORMAT (I.E. 1-127).
; SENDS NOTE-ON IMMEDIATELY FOLLOWED BY NOTE-OFF TO ACTIVE DESTINATIONS.
; DESTROYS A GREAT MANY REGISTERS, WHICH SHOULD NOT UNDULY CONCERN YOU.
;
; NOTE - THIS IS NOT A SUBROUTINE !!!  BRANCHED TO BY BACK_HANDLER,
; BRANCHES BACK THERE WHEN DONE.
;
TRIG_TRANSMIT
               MOVE.B  D4,TRIG_XMT_BUF+4    ;PLUG VELOCITY INTO MIDI/MTC EVENT.
               MOVE.L  TRIG_XMT_BUF,D0      ;RETRIEVE EVENT PAD # / SOUND # / ALT PARAMS BIT,
               MOVE.L  TRIG_XMT_BUF+4,D1    ;LIKEWISE VELOCITY / PITCH / PAN / LEVEL,
               BSR     XMIT_LIVE            ;GIVE IT TO THE MIDI/MTC HANDLER.
               AND.L   #00FFFFFFH,D1        ;ZORCH VELOCITY TO CREATE NOTE-OFF EVENT,
               BSR     XMIT_LIVE            ;GIVE IT TO THE MIDI/MTC HANDLER.
;
               TST.B   RECORDING            ;ARE WE IN NORMAL RECORD MODE?
               BEQ.S   TRIG_XMT_EXIT        ;BRANCH IF NOT - WE'RE OUTA HERE, THEN.
;
               AND     #0FFH,D4             ;ELSE - MAKE SURE WE GOTTA NO CRAP-OLA IN UPPER BYTE.
               SUBQ    #1,D4                ;CONVERT MIDI VELOCITY TO VELOCITY TABLE INDEX (0-126),
               MOVE.L  #PAD_VEL_TBL,A1      ;SET POINTER TO TABLE,
               MOVE.B  0(A1,D4),D4          ;NOW FETCH DOT VALOSSIDY (1-31, INTERNAL FORMAT),
               OR      D4,TRIG_SEQ_BUF+2    ;TACK VELOCITY ONTO SEQUENCER EVENT.
;
               MOVE.L  SEQ_WR_PTR,A6        ;LOAD WRITE POINTERS FOR SEQUENCE RECORD PROCESSES,
               MOVE    WASTELAND_PTR,A3
               MOVE    PAD_ON_WRITE,A2      ;LIKEWISE FOR CURRENT PAD EVENT RECORD-INPUT VECTOR.
;
               MOVE.L  TRIG_SEQ_BUF,D7      ;LOAD SEQ NOTE-ON EVENT FOR TRANSFER TO RECORD MODULE -
               SWAP    D7
               MOVE.L  D7,D6                ;COPY FOR NOTE-OFF EVENT TO FOLLOW.
               JSR     (A2)                 ;HERE GOES FIRST WORD ....
               SWAP    D7
               JSR     (A2)                 ;THIS WOULD BE THE SECOND ....
                ABS_LONG
               JSR     LOG_IN_NEW_PAD       ;LOG IN TO CURRENTLY-ON BUFFER ....
                ABS_SHORT
               MOVE    TRIG_SEQ_BUF+4,D7
               JSR     (A2)                 ;LAST AND PROBABLY LEAST - LEVEL WORD TO RECORDER.
;
               MOVE.L  D6,D7                ;RETRIEVE WORD-SWAPPED COPY OF FIRST TWO WORDS,
               BCLR    #0,D7                ;CONVERT TO NOTE-OFF EVENT,
               BSET    #1,D7
               JSR     (A2)                 ;PUT 'ER THERE, PAL!
               SWAP    D7
               JSR     (A2)
                ABS_LONG
               JSR     LOG_OUT_NEW_PAD      ;NOW, LOG OUT OF CURRENTLY-ON HANDLER - NO THIRD WORD.
                ABS_SHORT
               MOVE.L  A6,SEQ_WR_PTR        ;DONE - SAVE POINTERS FOR SEQUENCE RECORD PROCESSES.
               MOVE    A3,WASTELAND_PTR
;
TRIG_XMT_EXIT
               BRA     BACK_HANDLER
;
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
