SYS-EX-FORMAT LMK3 --------------------- 20.09.91 DIPL.ING. CHRISTIAN ASSALL - VERSION FOR PROGRAMMERS ------------------------------------------------------------------ - MULTI-REQUEST F0H,00H,44H,26H,41H,03H,02H,F7H DB 0F0H ; 1 SYSEXCLUSIV DB 000H ; 2 MANU-SUB-ID DB 044H ; 3 SUBID - 'D' DB 026H ; 4 SUBID - '&' DB 041H ; 6 SUBID - 'A' DB 3H ; 6 MACHINE-ID 'LMK3' DB 2H ; 7 FUNKTION-NR.: REQUEST-MULTI DB 0F7H ; 8 ------------------------------------------------------------------- - SINGLE-REQUEST (PRESET-NR. 1-64 / 0=EDITBUFFER) F0H,00H,44H,26H,41H,03H,03H,XXH,F7H DB 0F0H ; 1 SYSEXCLUSIV DB 000H ; 2 MANU-SUB-ID DB 044H ; 3 SUBID - 'D' DB 026H ; 4 SUBID - '&' DB 041H ; 6 SUBID - 'A' DB 3H ; 6 MACHINE-ID 'LMK3' DB 3H ; 7 FUNKTION-NR.: REQUEST-SINGLE DB XXH ; 8 PRESET-NR. DB 0F7H ; 9 ------------------------------------------------------------------- - MULTI-DUMP F0H, 00H,44H,26H,41H,03H,04H,....(64 PRESETS)....,F7H DB 0F0H ; SYSEXCLUSIV DB 000H ; MANU-SUB-ID DB 044H ; SUBID - 'D' DB 026H ; SUBID - '&' DB 041H ; SUBID - 'A' DB 3H ; MACHINE-ID 'LMK3' DB 4H ; FUNKTION-NR.: MULTI-DUMP .......... 64 PRESETS .......... DB 0F7H ; EOF-STRING ------------------------------------------------------------------- - SINGLE-DUMP (PRESET-NR. 1-64 / 0=EDITBUFFER) F0H,00H,44H,26H,41H,03H,03H,XXH,...(1 PRESET)...,F7H DB 0F0H ; 1 SYSEXCLUSIV DB 000H ; 2 MANU-SUB-ID DB 044H ; 3 SUBID - 'D' DB 026H ; 4 SUBID - '&' DB 041H ; 6 SUBID - 'A' DB 3H ; 6 MACHINE-ID 'LMK3' DB 5H ; 7 FUNKTION-NR.: DUMP-SINGLE DB XXH ; 8 PRESET-NR. ................. 1 PRESET ................. DB 0F7H ; 9 -------------------------------------------------------------------- FORMAT PRESET -------------- PRESET-ARRAY: ARRAY OF BYTE [110]; A transmission of preset data bytes via sysex has the following format: The preset data stream is cut into groups of 8 preset bytes. This group of 8 data bytes is transferred into 10 midibytes, because the values of the preset bytes maybe are greater than 127 which is not allowed for midi data bytes in sysex messages. So each group of 8 bytes is cut into 4 bytes without their MSB (Bit 7). These 4 MSB's are joined together to an additional byte, which is send after the group of the 4 bytes. Alltogether for 8 preset bytes of each group 10 midi bytes are send, whereas the MSB's of the bytes 1/2/3/4/6/7/8/9 are cut and joined together in the bytes 5/10. MSB Byte 1 -> Byte 5 Bit 0 / MSB Byte 2 -> Byte 5 Bit 1 .. MSB Byte 6 -> Byte 10 Bit 0 / MSB Byte 7 -> Byte 10 Bit 1 .. On the next pages all 110 bytes of an preset with their names and purpose are faced with their corresponding group of 8 bytes. The overlapping in group 12/13 is only required for software technical reasons. PARAMETERTYPE REL.ADRESS GROUP of 8 ============================================ ;------------------------------------------- <------- 1 ; SPLITS LOW SPLIT_LOW[8]; ;------------------------------------------- ; Values: 0-127 ; SPL1: EQU 0 SPL2: EQU 1 SPL3: EQU 2 SPL4: EQU 3 SPL5: EQU 4 SPL6: EQU 5 SPL7: EQU 6 SPL8: EQU 7 ;------------------------------------------- <------- 2 ; HIGH SPLIT_HIGH[8]; ;------------------------------------------- ; Values 0-127 SPH1: EQU 8 SPH2: EQU 9 SPH3: EQU 10 SPH4: EQU 11 SPH5: EQU 12 SPH6: EQU 13 SPH7: EQU 14 SPH8: EQU 15 ;------------------------------------------- <------- 3 ; TRANSPOSE TRANSPOSE[8]; ; +0-127 / - 0-127 (msb=signed-bit) TRS1: EQU 16 TRS2: EQU 17 TRS3: EQU 18 TRS4: EQU 19 TRS5: EQU 20 TRS6: EQU 21 TRS7: EQU 22 TRS8: EQU 23 ;------------------------------------------- <------- 4 ; OUT-CHANNEL CHANNEL[8]-LOW-NIBBLE CHN1: EQU 24 CHN2: EQU 25 CHN3: EQU 26 CHN4: EQU 27 CHN5: EQU 28 CHN6: EQU 29 CHN7: EQU 30 CHN8: EQU 31 ;------------------------------------------- <------- 5 ; DYN-TABS DYNAMIK_TABS[8]; BIT 0-4.:NOTE | BIT 5-7:AFTERTOUCH DYN1: EQU 32 DYN2: EQU 33 DYN3: EQU 34 DYN4: EQU 35 DYN5: EQU 36 DYN6: EQU 37 DYN7: EQU 38 DYN8: EQU 39 ; ;------------------------------------------- <------- 6 ; AD-ZONE-SWITCHES (if the corresponding BIT is set (AN0->BIT.0 ETC.) ; the midievent routed in 'AD-ASSIGN' is send ; according the ADC-value for zone 1-8 ; ; BIT: 0 1 2 ...... 7 ; AN0 AN1 AN2 AN7 ; ADZ1: EQU 40 ; FOR ZONE 1 ADZ2: EQU 41 ; FOR ZONE 2 ADZ3: EQU 42 ADZ4: EQU 43 ; .. ADZ5: EQU 44 ADZ6: EQU 45 ADZ7: EQU 46 ADZ8: EQU 47 ; FUER ZONE 8 ;------------------------------------------- <------- 7 ; SWITCH-ZONE-SWITCHES (if the corresponding BIT is set ; the midievent routed in 'SW-ASSIGN' is send ; according the switch-value for zone 1-8 ; ; BIT: 0 1 2 ; P3.3 P3.4 ; SWZ1: EQU 48 ; FOR ZONE 1 SWZ2: EQU 49 ; FOR ZONE 2 SWZ3: EQU 50 SWZ4: EQU 51 ; .. SWZ5: EQU 52 SWZ6: EQU 53 SWZ7: EQU 54 SWZ8: EQU 55 ; FUER ZONE 8 ;------------------------------------------- <------- 8 ; PRESET-COMMON-BEREICH ; ; These are the pointers of the ADC's (0-7) for the corresponding ; midievents. ; Low-Nibble ; 0: PITCH-WHEEL ; 1: AFTERTOUCH ; 2: MOD-WHEEL: ; 3: BREATH-CONTRL.: ; 4: PORTAMENTO-TIME: ; 5: DATA-ENTRY: ; 6: VOLUME ; 7: PAN ; 8-15: USER-DEFINED: ; High-Nibble ; 0: Controller 64 - Sustain ; 1: Controller 65 ; 2: Controller 66 ; 3: Controller 67 ; 4: Link-Mode AD0P: EQU 56 ; AD-0-POINTER AD1P: EQU 57 ; .. AD2P: EQU 58 AD3P: EQU 59 AD4P: EQU 60 AD5P: EQU 61 AD6P: EQU 62 AD7P: EQU 63 ;------------------------------------------- <------- 9 PRES_NAME: EQU 64 ; STRING 8-SIGNS ;------------------------------------------- <------- 10 ;------------------------------------------- ;------------------------------------------- <------- 11 PRG_CHN: EQU 72 ; PRG_CHN[16] BYTE ;------------------------------------------- <------- 12 CHN_SWITCHES: EQU 88 ; 8 SWITCHES,FOR EACH PRG_CHN CHN_SWITCHER+1: EQU 89 ;------------------------------------------- <------- 13 UDEF_CONTR: EQU 90 ; 8 USER-DEFINED CONTROLLER ; ADXS 9-15 ;------------------------------------------- <------- 14 R_MCL: EQU 98 ; MCLOCK-VALUE IN BPM LINK: EQU 99 MASTER_CHN: EQU 100 REALTMODE: EQU 101 ; REALTIME-FLAGS ;------------------------------------------- <------- 15 VELSWITCH: EQU 102 ; VELOCITY-SWITCHES END: PRESLEN = 110 ;-------------------------------------------------------------------------- PROGRAMMEXAMPLES: ORIGINAL LMK3 FIRMWARE FOR SYSEX ;************************************************************* ; NAME: SEND_PRES ; IMPORT: ACCU: NR. D. PRESET 1-64 ; EXPORT: SEND_PRES: ......... ; MOV A,PRESNR ; LCALL MIDI_OUT ; PRESET-NR.: 1-64 ......... ; MOV A,#SPL1 ; LCALL SEND_EIGHT ; MOV A,#SPH1 ; LCALL SEND_EIGHT ; MOV A,#TRS1 ; LCALL SEND_EIGHT ; MOV A,#CHN1 ; LCALL SEND_EIGHT ; MOV A,#DYN1 ; LCALL SEND_EIGHT ; MOV A,#ADZ1 ; LCALL SEND_EIGHT ; MOV A,#SWZ1 ; LCALL SEND_EIGHT ; MOV A,#AD0P ; LCALL SEND_EIGHT ; MOV A,#PRES_NAME ; LCALL SEND_EIGHT ; MOV A,#PRG_CHN ; LCALL SEND_EIGHT ; MOV A,#PRG_CHN+8 ; VOLUME LCALL SEND_EIGHT ; MOV A,#CHN_SWITCHES ; LCALL SEND_EIGHT ; MOV A,#UDEF_CONTR ; LCALL SEND_EIGHT ; MOV A,#R_MCL ; LCALL SEND_EIGHT ; MOV A,#VELSWITCH ; LCALL SEND_EIGHT ; MOV A,CHECKSUM ; DUMMY FOR CHKSUM CLR ACC.7 ; NO MSB FOR CHECKSUM LCALL MIDI_OUT ; SEND CHECKSUM RET ;************************************************************* ; NAME: SEND_EIGHT ; SEND_EIGHT: PUSH DPL PUSH DPH MOV B,R1 PUSH B ADD A,DPL ; LOWTBYTE MOV DPL,A ; CLR A ; HIGH-BYTE ADDC A,DPH ; MOV DPH,A ; MOV B,#0 MOV R1,#2 ; EIGHTLP: MOV B,#0 ; MOVX A,@DPTR ; MOV C,ACC.7 MOV B.0,C ; CLR ACC.7 LCALL MIDI_OUT ; ADD A,CHECKSUM ; MOV CHECKSUM,A INC DPTR ; MOVX A,@DPTR ; MOV C,ACC.7 MOV B.1,C ; CLR ACC.7 LCALL MIDI_OUT ADD A,CHECKSUM ; MOV CHECKSUM,A INC DPTR ; MOVX A,@DPTR ; MOV C,ACC.7 MOV B.2,C ; CLR ACC.7 LCALL MIDI_OUT ; ADD A,CHECKSUM ; MOV CHECKSUM,A INC DPTR ; MOVX A,@DPTR ; MOV C,ACC.7 MOV B.3,C ; CLR ACC.7 LCALL MIDI_OUT ADD A,CHECKSUM ; MOV CHECKSUM,A INC DPTR ; MOV A,B ; THE FIRST 4 HIGH-BITS LCALL MIDI_OUT ADD A,CHECKSUM ; MOV CHECKSUM,A DJNZ R1,EIGHTLP ; DEKR. LOOPCOUNTER ;------------------------ POP B MOV R1,B POP DPH POP DPL RET ;************************************************************* ; NAME: RECEIVE_PRES ; IMPORT: ACCU: NR. D. PRESET 1-64 ; EXPORT: ; GET THE PRESET VIA SYS-EX RECEIVE_PRES: MOV B,PRESNR ; LCALL GMIDI_IN ; CJNE A,B,REC_END ; NR=MIDI-NR. -> ERROR MOV CHECKSUM,#0 ; .......... MOV A,#SPL1 ; LCALL REC_EIGHT ; MOV A,#SPH1 ; LCALL REC_EIGHT ; MOV A,#TRS1 ; LCALL REC_EIGHT ; MOV A,#CHN1 ; LCALL REC_EIGHT ; MOV A,#DYN1 ; LCALL REC_EIGHT ; MOV A,#ADZ1 ; LCALL REC_EIGHT ; MOV A,#SWZ1 ; LCALL REC_EIGHT ; MOV A,#AD0P ; LCALL REC_EIGHT ; MOV A,#PRES_NAME ; LCALL REC_EIGHT ; MOV A,#PRG_CHN ; LCALL REC_EIGHT ; MOV A,#PRG_CHN+8 ; VOLUME LCALL REC_EIGHT ; MOV A,#CHN_SWITCHES ; LCALL REC_EIGHT ; MOV A,#UDEF_CONTR ; LCALL REC_EIGHT ; MOV A,#R_MCL ; LCALL REC_EIGHT ; MOV A,#VELSWITCH ; LCALL REC_EIGHT ; LCALL GMIDI_IN ; DUMMY FOR CHKSUM JZ NOCHECKSUM ; MOV B,A ; MOV A,CHECKSUM ; CLR ACC.7 ; CJNE A,B,CHECKDEF ; CHECKSUM CORRUPT NOCHECKSUM: ;................ REC_END: RET CHECKDEF: LJMP WATCHDOG ; TIMEOUT -> ;************************************************************* ; NAME: REC_EIGHT ; REC_EIGHT: PUSH DPL PUSH DPH MOV B,R1 PUSH B ADD A,DPL ; LOWTBYTE MOV DPL,A ; CLR A ; HIGH-BYTE ADDC A,DPH ; MOV DPH,A ; MOV R1,#2 ; EIGHTL: LCALL GMIDI_IN MOV PUFI1,A ADD A,CHECKSUM ; MOV CHECKSUM,A LCALL GMIDI_IN MOV PUFI2,A ADD A,CHECKSUM ; MOV CHECKSUM,A LCALL GMIDI_IN MOV PUFI3,A ADD A,CHECKSUM ; MOV CHECKSUM,A LCALL GMIDI_IN MOV PUFI4,A ADD A,CHECKSUM ; MOV CHECKSUM,A LCALL GMIDI_IN ; MOV B,A ADD A,CHECKSUM ; MOV CHECKSUM,A MOV A,PUFI1 ; MOV C,B.0 ; MOV ACC.7,C MOVX @DPTR,A ; INC DPTR ; MOV A,PUFI2 ; MOV C,B.1 ; MOV ACC.7,C MOVX @DPTR,A ; INC DPTR ; MOV A,PUFI3 ; MOV C,B.2 ; MOV ACC.7,C MOVX @DPTR,A ; INC DPTR ; MOV A,PUFI4 ; MOV C,B.3 ; MOV ACC.7,C MOVX @DPTR,A ; INC DPTR ; DJNZ R1,EIGHTL ; DEKR. LOOPCOUNTER ;------------------------ SYSEXEND: POP B MOV R1,B POP DPH POP DPL NOSYSEXERR: RET˙