//########################################################################### //## ## //## MLIST.C ## //## ## //## Standard MIDI file dump utility ## //## ## //## V1.00 of 17-Mar-91 ## //## V1.01 of 07-Sep-91: New sysex dump formatting ## //## V1.10 of 23-Oct-91: Roland sysex disassembly/ ## //## Programmer's Reference features ## //## V1.11 of 3-Feb-92: BC 3.0 const declarations fixed ## //## V1.12 of 20-Jun-92: Undefined meta-events handled correctly ## //## ## //## Project: Miles Sound System ## //## Author: John Miles ## //## ## //########################################################################### //## ## //## Copyright (C) RAD Game Tools, Inc. ## //## ## //## For technical support, contact RAD Game Tools at 425-893-4300. ## //## ## //########################################################################### #include "mss.h" #include "imssapi.h" static char const FAR *buffer; static char const FAR *bufpnt; static char const FAR *bufend; static UINTa offset; static U32 arg_mt; static U8 sysex_buffer[256]; //################################################################ #define TIMBRE 0 #define PATCH_TEMP 1 #define RHYTHMS 2 #define PATCH 3 #define SYSTEM 4 #define DISPLAY 5 #define WRITE_REQUEST 6 #define ALL_PARMS_RESET 7 #define T_A 0 #define T_N 1 #define T_C 2 #define T_NONE 3 static HMEMDUMP memout; static U32 last_chunk = 0; typedef MSS_STRUCT { char area_name[128]; char parm_name[128]; U16 type; } addr_desc; typedef MSS_STRUCT { U16 MSB; U16 KSB; U16 LSB; } sysex_addr; typedef MSS_STRUCT { char *name; U16 type; } entry; typedef MSS_STRUCT { char *name; sysex_addr base; U16 base_size; U16 base_num; U16 group_count; const entry *items; } Roland_area; const entry patch_temp[] = { {"TIMBRE GROUP",T_N}, {"TIMBRE NUMBER",T_N}, {"KEY SHIFT",T_N}, {"FINE TUNE",T_N}, {"BENDER RANGE",T_N}, {"ASSIGN MODE",T_N}, {"REVERB SWITCH",T_N}, {"dummy (ignored if received) (offset $00 $07)",T_N}, {"OUTPUT LEVEL",T_N}, {"PANPOT",T_N}, {"dummy (ignored if received) (offset $00 $0A)",T_N}, {"dummy (ignored if received) (offset $00 $0B)",T_N}, {"dummy (ignored if received) (offset $00 $0C)",T_N}, {"dummy (ignored if received) (offset $00 $0D)",T_N}, {"dummy (ignored if received) (offset $00 $0E)",T_N}, {"dummy (ignored if received) (offset $00 $0F)",T_N} }; const entry patch[] = { {"TIMBRE GROUP",T_N}, {"TIMBRE NUMBER",T_N}, {"KEY SHIFT",T_N}, {"FINE TUNE",T_N}, {"BENDER RANGE",T_N}, {"ASSIGN MODE",T_N}, {"REVERB SWITCH",T_N}, {"dummy (offset $00 $07)",T_N} }; const entry rhythm_setup[] = { {"TIMBRE",T_N}, {"OUTPUT LEVEL",T_N}, {"PANPOT",T_N}, {"REVERB SWITCH",T_N} }; const entry system_area[] = { {"MASTER TUNE",T_N}, {"REVERB MODE",T_N}, {"REVERB TIME",T_N}, {"REVERB LEVEL",T_N}, {"PARTIAL RESERVE (Part 1)",T_N}, {"PARTIAL RESERVE (Part 2)",T_N}, {"PARTIAL RESERVE (Part 3)",T_N}, {"PARTIAL RESERVE (Part 4)",T_N}, {"PARTIAL RESERVE (Part 5)",T_N}, {"PARTIAL RESERVE (Part 6)",T_N}, {"PARTIAL RESERVE (Part 7)",T_N}, {"PARTIAL RESERVE (Part 8)",T_N}, {"PARTIAL RESERVE (Part R)",T_N}, {"MIDI CHANNEL (Part 1)",T_C}, {"MIDI CHANNEL (Part 2)",T_C}, {"MIDI CHANNEL (Part 3)",T_C}, {"MIDI CHANNEL (Part 4)",T_C}, {"MIDI CHANNEL (Part 5)",T_C}, {"MIDI CHANNEL (Part 6)",T_C}, {"MIDI CHANNEL (Part 7)",T_C}, {"MIDI CHANNEL (Part 8)",T_C}, {"MIDI CHANNEL (Part R)",T_C}, {"MASTER VOLUME",T_N} }; const entry display[] = { {"MT-32 LCD Display (character 1)",T_A}, {"MT-32 LCD Display (character 2)",T_A}, {"MT-32 LCD Display (character 3)",T_A}, {"MT-32 LCD Display (character 4)",T_A}, {"MT-32 LCD Display (character 5)",T_A}, {"MT-32 LCD Display (character 6)",T_A}, {"MT-32 LCD Display (character 7)",T_A}, {"MT-32 LCD Display (character 8)",T_A}, {"MT-32 LCD Display (character 9)",T_A}, {"MT-32 LCD Display (character 10)",T_A}, {"MT-32 LCD Display (character 11)",T_A}, {"MT-32 LCD Display (character 12)",T_A}, {"MT-32 LCD Display (character 13)",T_A}, {"MT-32 LCD Display (character 14)",T_A}, {"MT-32 LCD Display (character 15)",T_A}, {"MT-32 LCD Display (character 16)",T_A}, {"MT-32 LCD Display (character 17)",T_A}, {"MT-32 LCD Display (character 18)",T_A}, {"MT-32 LCD Display (character 19)",T_A}, {"MT-32 LCD Display (character 20)",T_A} }; const entry write_request[] = { {"Timbre Write (part 1)",T_N}, {"(Internal) (Offset $01)",T_N}, {"Timbre Write (part 2)",T_N}, {"(Internal) (Offset $03)",T_N}, {"Timbre Write (part 3)",T_N}, {"(Internal) (Offset $05)",T_N}, {"Timbre Write (part 4)",T_N}, {"(Internal) (Offset $07)",T_N}, {"Timbre Write (part 5)",T_N}, {"(Internal) (Offset $09)",T_N}, {"Timbre Write (part 6)",T_N}, {"(Internal) (Offset $0B)",T_N}, {"Timbre Write (part 7)",T_N}, {"(Internal) (Offset $0D)",T_N}, {"Timbre Write (part 8)",T_N}, {"(Internal) (Offset $0F)",T_N}, {"Patch Write (part 1)",T_N}, {"(Internal) (Offset $01)",T_N}, {"Patch Write (part 2)",T_N}, {"(Internal) (Offset $03)",T_N}, {"Patch Write (part 3)",T_N}, {"(Internal) (Offset $05)",T_N}, {"Patch Write (part 4)",T_N}, {"(Internal) (Offset $07)",T_N}, {"Patch Write (part 5)",T_N}, {"(Internal) (Offset $09)",T_N}, {"Patch Write (part 6)",T_N}, {"(Internal) (Offset $0B)",T_N}, {"Patch Write (part 7)",T_N}, {"(Internal) (Offset $0D)",T_N}, {"Patch Write (part 8)",T_N}, {"(Internal) (Offset $0F)",T_N}, }; const entry timbre[] = { {"TIMBRE NAME 1",T_A}, {"TIMBRE NAME 2",T_A}, {"TIMBRE NAME 3",T_A}, {"TIMBRE NAME 4",T_A}, {"TIMBRE NAME 5",T_A}, {"TIMBRE NAME 6",T_A}, {"TIMBRE NAME 7",T_A}, {"TIMBRE NAME 8",T_A}, {"TIMBRE NAME 9",T_A}, {"TIMBRE NAME 10",T_A}, {"Structure of Partial # 1 & 2",T_N}, {"Structure of Partial # 3 & 4",T_N}, {"PARTIAL MUTE",T_N}, {"ENV MODE",T_N}, {"(Partial #1) WG PITCH COARSE",T_N}, {"(Partial #1) WG PITCH FINE",T_N}, {"(Partial #1) WG PITCH KEYFOLLOW",T_N}, {"(Partial #1) WG PITCH BENDER SW",T_N}, {"(Partial #1) WG WAVEFORM/PCM BANK",T_N}, {"(Partial #1) WG PCM WAVE #",T_N}, {"(Partial #1) WG PULSE WIDTH",T_N}, {"(Partial #1) WG PW VELO SENS",T_N}, {"(Partial #1) P-ENV DEPTH",T_N}, {"(Partial #1) P-ENV VELO SENS",T_N}, {"(Partial #1) P-ENV TIME KEYF",T_N}, {"(Partial #1) P-ENV TIME 1",T_N}, {"(Partial #1) P-ENV TIME 2",T_N}, {"(Partial #1) P-ENV TIME 3",T_N}, {"(Partial #1) P-ENV TIME 4",T_N}, {"(Partial #1) P-ENV LEVEL 0",T_N}, {"(Partial #1) P-ENV LEVEL 1",T_N}, {"(Partial #1) P-ENV LEVEL 2",T_N}, {"(Partial #1) P-ENV SUSTAIN LEVEL",T_N}, {"(Partial #1) END LEVEL",T_N}, {"(Partial #1) P-LFO RATE",T_N}, {"(Partial #1) P-LFO DEPTH",T_N}, {"(Partial #1) P-LFO MOD SENS",T_N}, {"(Partial #1) TVF CUTOFF FREQ",T_N}, {"(Partial #1) TVF RESONANCE",T_N}, {"(Partial #1) TVF KEYFOLLOW",T_N}, {"(Partial #1) TVF BIAS POINT/DIR",T_N}, {"(Partial #1) TVF BIAS LEVEL",T_N}, {"(Partial #1) TVF ENV DEPTH",T_N}, {"(Partial #1) TVF ENV VELO SENS",T_N}, {"(Partial #1) TVF ENV DEPTH KEYF",T_N}, {"(Partial #1) TVF ENV TIME KEYF",T_N}, {"(Partial #1) TVF ENV TIME 1",T_N}, {"(Partial #1) TVF ENV TIME 2",T_N}, {"(Partial #1) TVF ENV TIME 3",T_N}, {"(Partial #1) TVF ENV TIME 4",T_N}, {"(Partial #1) TVF ENV TIME 5",T_N}, {"(Partial #1) TVF ENV LEVEL 1",T_N}, {"(Partial #1) TVF ENV LEVEL 2",T_N}, {"(Partial #1) TVF ENV LEVEL 3",T_N}, {"(Partial #1) TVF ENV SUSTAIN LEVEL",T_N}, {"(Partial #1) TVA LEVEL",T_N}, {"(Partial #1) TVA VELO SENS",T_N}, {"(Partial #1) TVA BIAS POINT 1",T_N}, {"(Partial #1) TVA BIAS LEVEL 1",T_N}, {"(Partial #1) TVA BIAS POINT 2",T_N}, {"(Partial #1) TVA BIAS LEVEL 2",T_N}, {"(Partial #1) TVA ENV TIME KEYF",T_N}, {"(Partial #1) TVA ENV TIME V_FOLLOW",T_N}, {"(Partial #1) TVA ENV TIME 1",T_N}, {"(Partial #1) TVA ENV TIME 2",T_N}, {"(Partial #1) TVA ENV TIME 3",T_N}, {"(Partial #1) TVA ENV TIME 4",T_N}, {"(Partial #1) TVA ENV TIME 5",T_N}, {"(Partial #1) TVA ENV LEVEL 1",T_N}, {"(Partial #1) TVA ENV LEVEL 2",T_N}, {"(Partial #1) TVA ENV LEVEL 3",T_N}, {"(Partial #1) TVA ENV SUSTAIN LEVEL",T_N}, {"(Partial #2) WG PITCH COARSE",T_N}, {"(Partial #2) WG PITCH FINE",T_N}, {"(Partial #2) WG PITCH KEYFOLLOW",T_N}, {"(Partial #2) WG PITCH BENDER SW",T_N}, {"(Partial #2) WG WAVEFORM/PCM BANK",T_N}, {"(Partial #2) WG PCM WAVE #",T_N}, {"(Partial #2) WG PULSE WIDTH",T_N}, {"(Partial #2) WG PW VELO SENS",T_N}, {"(Partial #2) P-ENV DEPTH",T_N}, {"(Partial #2) P-ENV VELO SENS",T_N}, {"(Partial #2) P-ENV TIME KEYF",T_N}, {"(Partial #2) P-ENV TIME 1",T_N}, {"(Partial #2) P-ENV TIME 2",T_N}, {"(Partial #2) P-ENV TIME 3",T_N}, {"(Partial #2) P-ENV TIME 4",T_N}, {"(Partial #2) P-ENV LEVEL 0",T_N}, {"(Partial #2) P-ENV LEVEL 1",T_N}, {"(Partial #2) P-ENV LEVEL 2",T_N}, {"(Partial #2) P-ENV SUSTAIN LEVEL",T_N}, {"(Partial #2) END LEVEL",T_N}, {"(Partial #2) P-LFO RATE",T_N}, {"(Partial #2) P-LFO DEPTH",T_N}, {"(Partial #2) P-LFO MOD SENS",T_N}, {"(Partial #2) TVF CUTOFF FREQ",T_N}, {"(Partial #2) TVF RESONANCE",T_N}, {"(Partial #2) TVF KEYFOLLOW",T_N}, {"(Partial #2) TVF BIAS POINT/DIR",T_N}, {"(Partial #2) TVF BIAS LEVEL",T_N}, {"(Partial #2) TVF ENV DEPTH",T_N}, {"(Partial #2) TVF ENV VELO SENS",T_N}, {"(Partial #2) TVF ENV DEPTH KEYF",T_N}, {"(Partial #2) TVF ENV TIME KEYF",T_N}, {"(Partial #2) TVF ENV TIME 1",T_N}, {"(Partial #2) TVF ENV TIME 2",T_N}, {"(Partial #2) TVF ENV TIME 3",T_N}, {"(Partial #2) TVF ENV TIME 4",T_N}, {"(Partial #2) TVF ENV TIME 5",T_N}, {"(Partial #2) TVF ENV LEVEL 1",T_N}, {"(Partial #2) TVF ENV LEVEL 2",T_N}, {"(Partial #2) TVF ENV LEVEL 3",T_N}, {"(Partial #2) TVF ENV SUSTAIN LEVEL",T_N}, {"(Partial #2) TVA LEVEL",T_N}, {"(Partial #2) TVA VELO SENS",T_N}, {"(Partial #2) TVA BIAS POINT 1",T_N}, {"(Partial #2) TVA BIAS LEVEL 1",T_N}, {"(Partial #2) TVA BIAS POINT 2",T_N}, {"(Partial #2) TVA BIAS LEVEL 2",T_N}, {"(Partial #2) TVA ENV TIME KEYF",T_N}, {"(Partial #2) TVA ENV TIME V_FOLLOW",T_N}, {"(Partial #2) TVA ENV TIME 1",T_N}, {"(Partial #2) TVA ENV TIME 2",T_N}, {"(Partial #2) TVA ENV TIME 3",T_N}, {"(Partial #2) TVA ENV TIME 4",T_N}, {"(Partial #2) TVA ENV TIME 5",T_N}, {"(Partial #2) TVA ENV LEVEL 1",T_N}, {"(Partial #2) TVA ENV LEVEL 2",T_N}, {"(Partial #2) TVA ENV LEVEL 3",T_N}, {"(Partial #2) TVA ENV SUSTAIN LEVEL",T_N}, {"(Partial #3) WG PITCH COARSE",T_N}, {"(Partial #3) WG PITCH FINE",T_N}, {"(Partial #3) WG PITCH KEYFOLLOW",T_N}, {"(Partial #3) WG PITCH BENDER SW",T_N}, {"(Partial #3) WG WAVEFORM/PCM BANK",T_N}, {"(Partial #3) WG PCM WAVE #",T_N}, {"(Partial #3) WG PULSE WIDTH",T_N}, {"(Partial #3) WG PW VELO SENS",T_N}, {"(Partial #3) P-ENV DEPTH",T_N}, {"(Partial #3) P-ENV VELO SENS",T_N}, {"(Partial #3) P-ENV TIME KEYF",T_N}, {"(Partial #3) P-ENV TIME 1",T_N}, {"(Partial #3) P-ENV TIME 2",T_N}, {"(Partial #3) P-ENV TIME 3",T_N}, {"(Partial #3) P-ENV TIME 4",T_N}, {"(Partial #3) P-ENV LEVEL 0",T_N}, {"(Partial #3) P-ENV LEVEL 1",T_N}, {"(Partial #3) P-ENV LEVEL 2",T_N}, {"(Partial #3) P-ENV SUSTAIN LEVEL",T_N}, {"(Partial #3) END LEVEL",T_N}, {"(Partial #3) P-LFO RATE",T_N}, {"(Partial #3) P-LFO DEPTH",T_N}, {"(Partial #3) P-LFO MOD SENS",T_N}, {"(Partial #3) TVF CUTOFF FREQ",T_N}, {"(Partial #3) TVF RESONANCE",T_N}, {"(Partial #3) TVF KEYFOLLOW",T_N}, {"(Partial #3) TVF BIAS POINT/DIR",T_N}, {"(Partial #3) TVF BIAS LEVEL",T_N}, {"(Partial #3) TVF ENV DEPTH",T_N}, {"(Partial #3) TVF ENV VELO SENS",T_N}, {"(Partial #3) TVF ENV DEPTH KEYF",T_N}, {"(Partial #3) TVF ENV TIME KEYF",T_N}, {"(Partial #3) TVF ENV TIME 1",T_N}, {"(Partial #3) TVF ENV TIME 2",T_N}, {"(Partial #3) TVF ENV TIME 3",T_N}, {"(Partial #3) TVF ENV TIME 4",T_N}, {"(Partial #3) TVF ENV TIME 5",T_N}, {"(Partial #3) TVF ENV LEVEL 1",T_N}, {"(Partial #3) TVF ENV LEVEL 2",T_N}, {"(Partial #3) TVF ENV LEVEL 3",T_N}, {"(Partial #3) TVF ENV SUSTAIN LEVEL",T_N}, {"(Partial #3) TVA LEVEL",T_N}, {"(Partial #3) TVA VELO SENS",T_N}, {"(Partial #3) TVA BIAS POINT 1",T_N}, {"(Partial #3) TVA BIAS LEVEL 1",T_N}, {"(Partial #3) TVA BIAS POINT 2",T_N}, {"(Partial #3) TVA BIAS LEVEL 2",T_N}, {"(Partial #3) TVA ENV TIME KEYF",T_N}, {"(Partial #3) TVA ENV TIME V_FOLLOW",T_N}, {"(Partial #3) TVA ENV TIME 1",T_N}, {"(Partial #3) TVA ENV TIME 2",T_N}, {"(Partial #3) TVA ENV TIME 3",T_N}, {"(Partial #3) TVA ENV TIME 4",T_N}, {"(Partial #3) TVA ENV TIME 5",T_N}, {"(Partial #3) TVA ENV LEVEL 1",T_N}, {"(Partial #3) TVA ENV LEVEL 2",T_N}, {"(Partial #3) TVA ENV LEVEL 3",T_N}, {"(Partial #3) TVA ENV SUSTAIN LEVEL",T_N}, {"(Partial #4) WG PITCH COARSE",T_N}, {"(Partial #4) WG PITCH FINE",T_N}, {"(Partial #4) WG PITCH KEYFOLLOW",T_N}, {"(Partial #4) WG PITCH BENDER SW",T_N}, {"(Partial #4) WG WAVEFORM/PCM BANK",T_N}, {"(Partial #4) WG PCM WAVE #",T_N}, {"(Partial #4) WG PULSE WIDTH",T_N}, {"(Partial #4) WG PW VELO SENS",T_N}, {"(Partial #4) P-ENV DEPTH",T_N}, {"(Partial #4) P-ENV VELO SENS",T_N}, {"(Partial #4) P-ENV TIME KEYF",T_N}, {"(Partial #4) P-ENV TIME 1",T_N}, {"(Partial #4) P-ENV TIME 2",T_N}, {"(Partial #4) P-ENV TIME 3",T_N}, {"(Partial #4) P-ENV TIME 4",T_N}, {"(Partial #4) P-ENV LEVEL 0",T_N}, {"(Partial #4) P-ENV LEVEL 1",T_N}, {"(Partial #4) P-ENV LEVEL 2",T_N}, {"(Partial #4) P-ENV SUSTAIN LEVEL",T_N}, {"(Partial #4) END LEVEL",T_N}, {"(Partial #4) P-LFO RATE",T_N}, {"(Partial #4) P-LFO DEPTH",T_N}, {"(Partial #4) P-LFO MOD SENS",T_N}, {"(Partial #4) TVF CUTOFF FREQ",T_N}, {"(Partial #4) TVF RESONANCE",T_N}, {"(Partial #4) TVF KEYFOLLOW",T_N}, {"(Partial #4) TVF BIAS POINT/DIR",T_N}, {"(Partial #4) TVF BIAS LEVEL",T_N}, {"(Partial #4) TVF ENV DEPTH",T_N}, {"(Partial #4) TVF ENV VELO SENS",T_N}, {"(Partial #4) TVF ENV DEPTH KEYF",T_N}, {"(Partial #4) TVF ENV TIME KEYF",T_N}, {"(Partial #4) TVF ENV TIME 1",T_N}, {"(Partial #4) TVF ENV TIME 2",T_N}, {"(Partial #4) TVF ENV TIME 3",T_N}, {"(Partial #4) TVF ENV TIME 4",T_N}, {"(Partial #4) TVF ENV TIME 5",T_N}, {"(Partial #4) TVF ENV LEVEL 1",T_N}, {"(Partial #4) TVF ENV LEVEL 2",T_N}, {"(Partial #4) TVF ENV LEVEL 3",T_N}, {"(Partial #4) TVF ENV SUSTAIN LEVEL",T_N}, {"(Partial #4) TVA LEVEL",T_N}, {"(Partial #4) TVA VELO SENS",T_N}, {"(Partial #4) TVA BIAS POINT 1",T_N}, {"(Partial #4) TVA BIAS LEVEL 1",T_N}, {"(Partial #4) TVA BIAS POINT 2",T_N}, {"(Partial #4) TVA BIAS LEVEL 2",T_N}, {"(Partial #4) TVA ENV TIME KEYF",T_N}, {"(Partial #4) TVA ENV TIME V_FOLLOW",T_N}, {"(Partial #4) TVA ENV TIME 1",T_N}, {"(Partial #4) TVA ENV TIME 2",T_N}, {"(Partial #4) TVA ENV TIME 3",T_N}, {"(Partial #4) TVA ENV TIME 4",T_N}, {"(Partial #4) TVA ENV TIME 5",T_N}, {"(Partial #4) TVA ENV LEVEL 1",T_N}, {"(Partial #4) TVA ENV LEVEL 2",T_N}, {"(Partial #4) TVA ENV LEVEL 3",T_N}, {"(Partial #4) TVA ENV SUSTAIN LEVEL",T_N}, {"(Unused -- timbre offset $F6)",T_NONE}, {"(Unused -- timbre offset $F7)",T_NONE}, {"(Unused -- timbre offset $F8)",T_NONE}, {"(Unused -- timbre offset $F9)",T_NONE}, {"(Unused -- timbre offset $FA)",T_NONE}, {"(Unused -- timbre offset $FB)",T_NONE}, {"(Unused -- timbre offset $FC)",T_NONE}, {"(Unused -- timbre offset $FD)",T_NONE}, {"(Unused -- timbre offset $FE)",T_NONE}, {"(Unused -- timbre offset $FF)",T_NONE} }; const Roland_area areas[] = { {"Timbre Temporary Area (part 1-8)",0x02,0x00,0x00,0xf6,1,1, timbre}, {"Patch Temporary Area (part %u)",0x03,0x00,0x00,0x10,1,8, patch_temp}, {"Rhythm Setup Temporary Area (for Key # %u)",0x03,0x01,0x10,0x04,24,85, rhythm_setup}, {"Timbre Temporary Area (part %u)",0x04,0x00,0x00,0xf6,1,8, timbre}, {"Patch Memory #%u",0x05,0x00,0x00,0x08,1,128, patch}, {"Timbre Memory #%u",0x08,0x00,0x00,0x100,1,64, timbre}, {"System area",0x10,0x00,0x00,0x17,1,1, system_area}, {"Display",0x20,0x00,0x00,0x14,1,1, display}, {"Write Request",0x40,0x00,0x00,0x20,1,1, write_request}, {"All parameters reset",0x7f,0x00,0x00,0x01,1,1, NULL} }; //################################################################ static sysex_addr calc_offset(sysex_addr base, U32 offset) { U32 addr; sysex_addr result; addr = ((U32) base.MSB << 14L) | ((U32) base.KSB << 7L) | ((U32) base.LSB); addr += offset; result.LSB = (U16)(addr & 0x7fL); result.KSB = (U16)((addr >> 7L) & 0x7fL); result.MSB = (U16)((addr >> 14L) & 0x7fL); return result; } static S32 sysex_window(sysex_addr cur, sysex_addr next, sysex_addr test) { U32 laddr,haddr,taddr; laddr = ((U32) cur.MSB << 14L) | ((U32) cur.KSB << 7L) | ((U32) cur.LSB); haddr = ((U32) next.MSB << 14L) | ((U32) next.KSB << 7L) | ((U32) next.LSB); taddr = ((U32) test.MSB << 14L) | ((U32) test.KSB << 7L) | ((U32) test.LSB); if ((taddr >= laddr) && (taddr < haddr)) return taddr-laddr; return -1; } static void show_address(U16 curpos, U16 dest, sysex_addr cur) { U16 k; AIL_mem_printc(memout,' '); for (k=curpos;k 1) AIL_sprintf(desc->area_name,areas[i].name,j+areas[i].base_num); else AIL_sprintf(desc->area_name,areas[i].name); parms = areas[i].items; if (parms != NULL) { AIL_strcpy(desc->parm_name,parms[k].name); desc->type = parms[k].type; } else { AIL_strcpy(desc->parm_name,""); desc->type = T_NONE; } return 1; } cur = calc_offset(cur,areas[i].base_size); } } return 0; } //################################################################ static void show_MR(U16 abridged) { U16 i,gc; U16 j,k,m; char *tname; sysex_addr group,cur; const entry *parms; AIL_mem_prints(memout," Roland MT-32 / LAPC-1 Programmer's Reference Guide\r\n\r\n"); AIL_mem_prints(memout,"Parameter Hex Decimal\r\n"); AIL_mem_prints(memout,"_______________________________________________________ ________ _____________\r\n\r\n"); for (i=0;i 1) ? AIL_mem_printf(memout,tname,j+areas[i].base_num) : AIL_mem_prints(memout,tname)); if (abridged) show_address(k,54,cur); else AIL_mem_prints(memout,"\r\n"); group = cur; cur = calc_offset(cur,areas[i].base_size); if (abridged) continue; for (m=0;m> 8),division & 0xff); } else { AIL_mem_printf(memout," MIDI division: %u delta-time ticks per quarter-note\r\n",division); } } if (AIL_strnicmp(chunk_title,"MTrk",4)) { bufpnt = ( C8* ) AIL_ptr_add(buffer,chunk_end); return (!last_chunk); // unknown chunk type } // else parse MTrk chunk ... running_status = 0; end_of_track = 0; do { delta_time = get_vln(); AIL_mem_printf(memout," DTime %.4lu: ",delta_time); status = 0; if (next_chr() >= 0x80) status = running_status = get_chr(); else status = running_status; if ((status >= 0x80) && (status < 0xf0)) { channel = status & 0x0f; // channel voice message $8x-$Ex status = status & 0xf0; AIL_mem_printf(memout,"Ch %.2u ",channel+1); } switch (status) { case 0x80: // note off k = get_chr(); v = get_chr(); AIL_mem_printf(memout,"note %.3u off, release velocity %.3u",k,v); break; case 0x90: // note on k = get_chr(); v = get_chr(); if (v == 0) AIL_mem_printf(memout,"note %.3u off",k); else AIL_mem_printf(memout,"note %.3u on, attack velocity %.3u",k,v); break; case 0xa0: // polyphonic key pressure k = get_chr(); v = get_chr(); AIL_mem_printf(memout,"polyphonic key pressure %.3u applied to note %.3u",v,k); break; case 0xb0: // control change or channel mode message con_num = get_chr(); con_val = get_chr(); bn = 0; switch (con_num) { case 1: AIL_mem_printf(memout,"modulation controller %s = %.3u",bs[bn],con_val); break; case 2: AIL_mem_printf(memout,"breath controller %s = %.3u",bs[bn],con_val); break; case 4: AIL_mem_printf(memout,"foot controller %s = %.3u",bs[bn],con_val); break; case 5: AIL_mem_printf(memout,"portamento time %s = %.3u",bs[bn],con_val); break; case 6: AIL_mem_printf(memout,"data entry %s = %.3u",bs[bn],con_val); break; case 7: AIL_mem_printf(memout,"main volume %s = %.3u",bs[bn],con_val); break; case 8: AIL_mem_printf(memout,"balance controller %s = %.3u",bs[bn],con_val); break; case 10: AIL_mem_printf(memout,"pan controller %s = %.3u",bs[bn],con_val); break; case 11: AIL_mem_printf(memout,"expression controller %s = %.3u",bs[bn],con_val); break; case 16: AIL_mem_printf(memout,"general purpose controller #1 %s = %.3u",bs[bn],con_val); break; case 17: AIL_mem_printf(memout,"general purpose controller #2 %s = %.3u",bs[bn],con_val); break; case 18: AIL_mem_printf(memout,"general purpose controller #3 %s = %.3u",bs[bn],con_val); break; case 19: AIL_mem_printf(memout,"general purpose controller #4 %s = %.3u",bs[bn],con_val); break; case 32: AIL_mem_printf(memout,"MSS sysex start address MSB (queue 0) %.3u",con_val); break; case 33: AIL_mem_printf(memout,"MSS sysex start address KSB (queue 0) %.3u",con_val); break; case 34: AIL_mem_printf(memout,"MSS sysex start address LSB (queue 0) %.3u",con_val); break; case 35: AIL_mem_printf(memout,"MSS sysex data byte (queue 0) %.3u",con_val); break; case 36: AIL_mem_printf(memout,"MSS final sysex data byte (queue 0) %.3u",con_val); break; case 37: AIL_mem_printf(memout,"MSS sysex start address MSB (queue 1) %.3u",con_val); break; case 38: AIL_mem_printf(memout,"MSS sysex start address KSB (queue 1) %.3u",con_val); break; case 39: AIL_mem_printf(memout,"MSS sysex start address LSB (queue 1) %.3u",con_val); break; case 40: AIL_mem_printf(memout,"MSS sysex data byte (queue 1) %.3u",con_val); break; case 41: AIL_mem_printf(memout,"MSS final sysex data byte (queue 1) %.3u",con_val); break; case 42: AIL_mem_printf(memout,"MSS sysex start address MSB (queue 2) %.3u",con_val); break; case 43: AIL_mem_printf(memout,"MSS sysex start address KSB (queue 2) %.3u",con_val); break; case 44: AIL_mem_printf(memout,"MSS sysex start address LSB (queue 2) %.3u",con_val); break; case 45: AIL_mem_printf(memout,"MSS sysex data byte (queue 2) %.3u",con_val); break; case 46: AIL_mem_printf(memout,"MSS final sysex data byte (queue 2) %.3u",con_val); break; case 58: AIL_mem_printf(memout,"MSS rhythm setup timbre %.3u",con_val); break; case 59: AIL_mem_printf(memout,"MSS MT-32 patch reverb switch %.3u",con_val); break; case 60: AIL_mem_printf(memout,"MSS MT-32 patch bender range %.3u",con_val); break; case 61: AIL_mem_printf(memout,"MSS MT-32 reverb mode %.3u",con_val); break; case 62: AIL_mem_printf(memout,"MSS MT-32 reverb time %.3u",con_val); break; case 63: AIL_mem_printf(memout,"MSS MT-32 reverb level %.3u",con_val); break; case 64: AIL_mem_printf(memout,"damper pedal (sustain) = %s",stat[con_val > 63]); break; case 65: AIL_mem_printf(memout,"portamento = %s",stat[con_val > 63]); break; case 66: AIL_mem_printf(memout,"sostenuto %s",stat[con_val > 63]); break; case 67: AIL_mem_printf(memout,"soft pedal = %s",stat[con_val > 63]); break; case 69: AIL_mem_printf(memout,"hold 2 = %s",stat[con_val > 63]); break; case 80: AIL_mem_printf(memout,"general purpose controller #5 = %.3u",con_val); break; case 81: AIL_mem_printf(memout,"general purpose controller #6 = %.3u",con_val); break; case 82: AIL_mem_printf(memout,"general purpose controller #7 = %.3u",con_val); break; case 83: AIL_mem_printf(memout,"general purpose controller #8 = %.3u",con_val); break; case 91: AIL_mem_printf(memout,"external effects depth = %.3u",con_val); break; case 92: AIL_mem_printf(memout,"tremolo depth = %.3u",con_val); break; case 93: AIL_mem_printf(memout,"chorus depth = %.3u",con_val); break; case 94: AIL_mem_printf(memout,"celeste (detune) depth = %.3u",con_val); break; case 95: AIL_mem_printf(memout,"phaser depth = %.3u",con_val); break; case 96: AIL_mem_prints(memout,"data increment"); break; case 97: AIL_mem_prints(memout,"data decrement"); break; case 98: AIL_mem_printf(memout,"non-registered parameter LSB %.3u selected",con_val); break; case 99: AIL_mem_printf(memout,"non-registered parameter MSB %.3u selected",con_val); break; case 100: AIL_mem_printf(memout,"registered parameter LSB %.3u selected",con_val); break; case 101: AIL_mem_printf(memout,"registered parameter MSB %.3u selected",con_val); break; case 110: AIL_mem_printf(memout,"MSS channel lock/release %.3u",con_val); break; case 111: AIL_mem_printf(memout,"MSS channel lock protection %.3u",con_val); break; case 112: AIL_mem_printf(memout,"MSS voice protection %.3u",con_val); break; case 113: AIL_mem_printf(memout,"MSS timbre protection %.3u",con_val); break; case 114: AIL_mem_printf(memout,"MSS patch bank select, bank %.3u",con_val); break; case 115: AIL_mem_printf(memout,"MSS indirect controller prefix, array[%.3u]",con_val); break; case 116: AIL_mem_printf(memout,"MSS loop controller: FOR loop = 1 to %.3u",con_val); break; case 117: AIL_mem_printf(memout,"MSS loop controller: NEXT/BREAK value %.3u",con_val); break; case 118: AIL_mem_prints(memout,"MSS clear beat / measure count controller"); break; case 119: AIL_mem_printf(memout,"MSS callback trigger controller %.3u",con_val); break; case 120: AIL_mem_printf(memout,"MSS sequence index controller %.3u",con_val); break; case 121: AIL_mem_prints(memout,"reset all controllers"); break; case 122: AIL_mem_printf(memout,"local control %s",stat[con_val > 63]); break; case 123: AIL_mem_prints(memout,"all notes off"); break; case 124: AIL_mem_prints(memout,"omni mode off"); break; case 125: AIL_mem_prints(memout,"omni mode on"); break; case 126: AIL_mem_printf(memout,"mono mode on, %.3u channels",con_val); break; case 127: AIL_mem_prints(memout,"poly mode on"); break; default: if (con_num > 127) AIL_mem_printf(memout,"MIDI file syntax error: data value %.3u",con_num); else AIL_mem_printf(memout,"undefined controller #%.3u, value = %.3u", con_num,con_val); break; } break; case 0xc0: // program change AIL_mem_printf(memout,"program change to %.3u",get_chr()); break; case 0xd0: // channel pressure AIL_mem_printf(memout,"channel pressure %.3u applied",get_chr()); break; case 0xe0: // pitch bend change l = get_chr(); h = get_chr(); AIL_mem_printf(memout,"pitch wheel set to %.5u",h*128+l); break; case 0xf0: // system exclusive message AIL_mem_printf(memout,"system exclusive message, type $F0\r\n"); t = get_vln(); if (arg_mt) { for (i=0;i