restored the blue.sys driver

svn path=/trunk/; revision=7790
This commit is contained in:
Thomas Bluemel 2004-01-20 20:00:45 +00:00
parent 9e88919457
commit 859e0dceee
21 changed files with 3 additions and 3457 deletions

View file

@ -1,15 +0,0 @@
PATH_TO_TOP = ../../../..
TARGET_BOOTSTRAP = no
TARGET_TYPE = dynlink
TARGET_NAME = mpu401
TARGET_GCCLIBS = winmm
TARGET_OBJECTS = mpu401.o
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk

View file

@ -1,34 +0,0 @@
// These were missed out of mmsystem.h so I define them here until I get
// round to submitting a patch for mmsystem.h :)
#define DRVM_INIT 100
#define DRVM_EXIT 101
#define DRVM_DISABLE 102
#define DRVM_ENABLE 103
#define MODM_INIT DRVM_INIT
#define MODM_GETNUMDEVS 1
#define MODM_GETDEVCAPS 2
#define MODM_OPEN 3
#define MODM_CLOSE 4
#define MODM_PREPARE 5
#define MODM_UNPREPARE 6
#define MODM_DATA 7
#define MODM_LONGDATA 8
#define MODM_RESET 9
#define MODM_GETVOLUME 10
#define MODM_SETVOLUME 11
#define MODM_CACHEPATCHES 12
#define MODM_CACHEDRUMPATCHES 13
#define MIDM_INIT DRVM_INIT
#define MIDM_GETNUMDEVS 53
#define MIDM_GETDEVCAPS 54
#define MIDM_OPEN 55
#define MIDM_CLOSE 56
#define MIDM_PREPARE 57
#define MIDM_UNPREPARE 58
#define MIDM_ADDBUFFER 59
#define MIDM_START 60
#define MIDM_STOP 61
#define MIDM_RESET 62

View file

@ -1,369 +0,0 @@
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: services/dd/mpu401/dll/mpu401.c
* PURPOSE: MPU-401 MIDI driver WINMM interface
* PROGRAMMER: Andrew Greenwood
* UPDATE HISTORY:
* Sept 28, 2003: Created
*/
#include <windows.h>
typedef UINT *LPUINT;
#include <mmsystem.h>
#include "messages.h"
#define DBG printf
// Erm... This is in mmsystem i think:
LONG APIENTRY DefDriverProc(DWORD dwDriverIdentifier,
HANDLE hDriver,
UINT message, // Bug in ptypes32.h
LONG lParam1,
LONG lParam2);
STATIC int MessageLength(BYTE b)
{
if (b > 0xf8) return 1;
switch(b)
{
case 0xf0 : case 0xf4 : case 0xf5 : case 0xf6 : case 0xf7 :
return 1;
case 0xf1 : case 0xf3 :
return 2;
case 0xf2 :
return 3;
}
switch(b & 0xf0)
{
case 0x80 : case 0x90 : case 0xa0 : case 0xb0 : case 0xe0 :
return 2;
}
return 0; // must be a status byte
}
DWORD APIENTRY modMessage(DWORD id, DWORD msg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
switch(msg)
{
case MODM_GETNUMDEVS :
DBG("MODM_GETNUMDEVS\n");
break;
case MODM_GETDEVCAPS :
DBG("MODM_GETDEVCAPS\n");
break;
case MODM_OPEN :
DBG("MODM_OPEN\n");
break;
case MODM_CLOSE :
DBG("MODM_CLOSE\n");
break;
case MODM_DATA :
/*
MODM_DATA requests that the driver process a short MIDI message.
PARAMETERS
id : ?
dwUser : ?
dwParam1 : MIDI message packed into a 32-bit number
dwParam2 : ?
RETURN VALUES
???
*/
{
int i;
BYTE b[4];
DBG("MODM_DATA\n");
for (i = 0; i < 4; i ++)
{
b[i] = (BYTE)(dwParam1 % 256);
dwParam1 /= 256;
}
// midiOutWrite(data, length, client?)
// somehow we need to keep track of running status
// return midiOutWrite(b, modMIDIlength((PMIDIALLOC)dwUser, b[0]),
// (PMIDIALLOC)dwUser);
}
case MODM_LONGDATA :
DBG("MODM_LONGDATA\n");
break;
case MODM_RESET :
DBG("MODM_RESET\n");
break;
case MODM_SETVOLUME :
DBG("MODM_SETVOLUME\n");
break;
case MODM_GETVOLUME :
DBG("MODM_GETVOLUME\n");
break;
case MODM_CACHEPATCHES :
DBG("MODM_CACHEPATCHES\n");
break;
case MODM_CACHEDRUMPATCHES :
DBG("MODM_CACHEDRUMPATCHES\n");
break;
}
// return MMSYSERR_NOT_SUPPORTED;
}
LRESULT DriverProc(DWORD dwDriverID, HDRVR hDriver, UINT uiMessage,
LPARAM lParam1, LPARAM lParam2)
/*
ROUTINE
DriverProc
PURPOSE
Process driver messages
PARAMETERS
dwDriverID : Identifier of installable driver
hDriver : Handle of the installable driver instance
uiMessage : Which operation to perform
lParam1 : Message-dependent
lParam2 : Message-dependent
NOTES
For parameters that aren't listed in the messages, they are not
used.
Loading and unloading messages occur in this order:
DRV_LOAD - DRV_ENABLE - DRV_OPEN
DRV_CLOSE - DRV_DISABLE - DRV_FREE
*/
{
switch(uiMessage)
{
case DRV_LOAD :
/*
DRV_LOAD notifies the driver that it has been loaded. It should
then make sure it can function properly.
PARAMETERS
(No Parameters)
RETURN VALUES
Non-zero if successful
Zero if not
*/
DBG("DRV_LOAD\n");
break;
case DRV_FREE :
/*
DRV_FREE notifies the driver that it is being unloaded. It
should make sure it releases any memory or other resources.
PARAMETERS
hDriver : Hande of the installable driver instance
RETURN VALUES
Nothing
*/
DBG("DRV_FREE\n");
break;
case DRV_OPEN :
/*
DRV_OPEN directs the driver to open a new instance.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
lParam1 : Wide string specifying configuration
information, or this can be NULL
lParam2 : 32-bit driver-specific data
RETURN VALUES
Non-zero if successful
Zero if not
*/
DBG("DRV_OPEN\n");
break;
case DRV_CLOSE :
/*
DRV_CLOSE directs the driver to close the specified instance.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
lParam1 : 32-bit value passed from DriverClose()
lParam2 : 32-bit value passed from DriverClose()
RETURN VALUES
Non-zero if successful
Zero if not
*/
DBG("DRV_CLOSE\n");
break;
case DRV_ENABLE :
/*
DRV_ENABLE enables the driver (as if you didn't see THAT one
coming!)
PARAMETERS
hDriver : Handle of the installable driver instance
RETURN VALUES
Nothing
*/
DBG("DRV_ENABLE\n");
break;
case DRV_DISABLE :
/*
DRV_DISABLE disables the driver - see above comment ;) This
message comes before DRV_FREE.
PARAMETERS
hDriver : Handle of the installable driver instance
RETURN VALUES
Nothing
*/
DBG("DRV_DISABLE\n");
break;
case DRV_QUERYCONFIGURE :
/*
DRV_QUERYCONFIGURE asks the driver if it supports custom
configuration.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
RETURN VALUES
Non-zero to indicate the driver can display a config dialog
Zero if not
*/
DBG("DRV_QUERYCONFIGURE\n");
break;
case DRV_CONFIGURE :
/*
DRV_CONFIGURE requests the driver to display a configuration
dialog box.
PARAMETERS
dwDriverID : Identified of the installable driver
hDriver : Handle of the installable driver instance
lParam1 : Handle of the parent window of the dialog
lParam2 : Address of a DRVCONFIGINFO, or NULL
RETURN VALUES
DRVCNF_OK The configuration was successful
DRVCNF_CANCEL The user cancelled the dialog box
DRVCNF_RESTART The configuration requires a reboot
*/
DBG("DRV_CONFIGURE\n");
break;
case DRV_INSTALL :
/*
DRV_INSTALL notifies the driver that it is being installed.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
lParam2 : Address of a DEVCONFIGINFO, or NULL
RETURN VALUES
DRVCNF_OK The configuration was successful
DRVCNF_CANCEL The user cancelled the dialog box
DRVCNF_RESTART The configuration requires a reboot
*/
DBG("DRV_INSTALL\n");
break;
case DRV_REMOVE :
/*
DRV_REMOVE notifies the driver that it is being removed from the
system.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
RETURN VALUES
Nothing
*/
DBG("DRV_REMOVE\n");
break;
case DRV_POWER :
/*
DRV_POWER notifies the driver that power is being turned on/off.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
RETURN VALUES
Nothing
*/
DBG("DRV_POWER\n");
case DRV_EXITSESSION :
/*
DRV_EXITSESSION notifies the driver that Windows is shutting down.
PARAMETERS
dwDriverID : Identifier of the installable driver
hDriver : Handle of the installable driver instance
RETURN VALUES
Nothing
*/
// case DRV_PNPINSTALL : break;
default :
return DefDriverProc(dwDriverID, hDriver, uiMessage, lParam1, lParam2);
}
return DefDriverProc(dwDriverID, hDriver, uiMessage, lParam1, lParam2);
}
BOOL CALLBACK DProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// if (uMsg == WM_INITDIALOG)
// return -1;
return 0;
}
void Test()
{
// HWND Dlg = CreateDialog(GetModuleHandle(NULL), "Config", NULL, DProc);
HWND Z = CreateWindow("Static", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 20, 20, NULL, NULL, GetModuleHandle(NULL), NULL);
if (DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(1001), Z, DProc) == -1)
MessageBox(NULL, "Error", "Error", MB_OK | MB_TASKMODAL);
}

View file

@ -1,14 +0,0 @@
LIBRARY mpu401
DESCRIPTION "MPU401 driver DLL"
EXETYPE WINDOWS
EXPORTS
DriverProc
;mxdMessage
;auxMessage
;wodMessage
;widMessage
modMessage = modSynthMessage
Test

View file

@ -1,4 +0,0 @@
EXPORTS
DriverProc
modMessage
Test

View file

@ -1,415 +0,0 @@
00000000 A __loader_flags__
00000000 A __minor_image_version__
00000000 A __minor_os_version__
00000000 A __minor_subsystem_version__
00000001 A __dll__
00000001 A __major_image_version__
00000003 A __subsystem__
00000004 A __major_os_version__
00000004 A __major_subsystem_version__
00000200 A __file_alignment__
00001000 A __section_alignment__
00001000 A __size_of_heap_commit__
00001000 A __size_of_stack_commit__
00100000 A __size_of_heap_reserve__
00200000 A __size_of_stack_reserve__
10000000 A __image_base__
10001000 t .text
10001000 T __end__
10001000 T _DllMainCRTStartup@12
10001000 T _end
10001000 T end
10001000 t lab
10001090 t ___dll_exit
10001100 T _atexit
10001130 T __onexit
10001150 t .text
10001150 T ___do_frame_init
10001170 T ___do_frame_fini
10001190 t .text
10001190 t .text
10001190 t _MessageLength
1000130c T _modMessage
1000130c T _modMessage@20
100014f0 T _DriverProc
10001664 T _DProc@16
1000167e T _Test
10001700 t .text
10001700 T _DefDriverProc@20
10001710 t .text
10001710 t .text
10001710 t .text
10001710 T _DllMain@12
10001720 t .text
10001720 T ___do_global_dtors
10001750 T ___do_global_ctors
100017b0 T ___main
10001820 t .text
10001820 t _size_of_encoded_value
10001870 t _read_uleb128
100018b0 t _read_sleb128
10001900 t _read_encoded_value_with_base
10001a00 t _init_object_mutex
10001a20 t _init_object_mutex_once
10001aa0 T ___register_frame_info_bases
10001b30 T ___register_frame_info
10001b50 T ___register_frame
10001b80 T ___register_frame_info_table_bases
10001c10 T ___register_frame_info_table
10001c30 T ___register_frame_table
10001c50 T ___deregister_frame_info_bases
10001d40 T ___deregister_frame_info
10001d50 T ___deregister_frame
10001d80 t _base_from_object
10001dd0 t _get_cie_encoding
10001e80 t _fde_unencoded_compare
10001ea0 t _fde_single_encoding_compare
10001f20 t _fde_mixed_encoding_compare
10001fc0 t _frame_heapsort
10002140 t _classify_object_over_fdes
10002260 t _add_fdes
10002370 t _linear_search_fdes
10002490 t _search_object
10002710 T __Unwind_Find_FDE
10002860 t _init_object
10002af0 t _fde_split
10002bb0 t .text
10002bb0 T ___w32_sharedptr_initialize
10002d70 t .text
10002d70 t .text
10002d70 T ___dllonexit
10002d80 t .text
10002d80 T _fflush
10002d90 t .text
10002d90 T _free
10002da0 t .text
10002da0 T __errno
10002db0 t .text
10002db0 T _malloc
10002dc0 t .text
10002dc0 T _printf
10002dd0 t .text
10002dd0 T _strlen
10002de0 t .text
10002de0 T _abort
10002df0 t .text
10002df0 T _strtoul
10002e00 t .text
10002e00 T _memset
10002e10 t .text
10002e10 t .text
10002e10 t .text
10002e10 T _CreateWindowExA@48
10002e20 t .text
10002e20 T _DialogBoxParamA@20
10002e30 t .text
10002e30 T _MessageBoxA@16
10002e40 t .text
10002e40 t .text
10002e40 t .text
10002e40 T _GetModuleHandleA@4
10002e50 t .text
10002e50 T _CreateMutexA@12
10002e60 t .text
10002e60 T _InterlockedIncrement@4
10002e70 t .text
10002e70 T _Sleep@4
10002e80 t .text
10002e80 T _ReleaseMutex@4
10002e90 t .text
10002e90 T _WaitForSingleObject@8
10002ea0 t .text
10002ea0 T _FindAtomA@4
10002eb0 t .text
10002eb0 T _AddAtomA@4
10002ec0 t .text
10002ec0 T _GetAtomNameA@12
10002ed0 t .text
10002ed0 t .text
10002ed0 t .text
10002ed0 t .text
10002ed0 t ___reg_frame_ctor
10002ee0 t ___dereg_frame_dtor
10002ef0 T ___CTOR_LIST__
10002ef0 T __CTOR_LIST__
10002ef4 t .ctors
10002efc T ___DTOR_LIST__
10002efc T __DTOR_LIST__
10002f00 t .dtors
10002f08 T etext
10003000 d .data
10003000 d .data
10003000 d .data
10003000 d .data
10003000 d .data
10003000 d .data
10003000 d .data
10003000 d .data
10003000 d .data
10003000 D __data_start__
10003000 d _initialized
10003004 d _p.0
10003010 d .data
10003010 d _once.0
10003020 d .data
10003020 d ___w32_sharedptr
10003024 D ___w32_sharedptr_terminate
10003028 D ___w32_sharedptr_unexpected
1000302c D ___w32_sharedptr_unseen_objects
10003030 D ___w32_sharedptr_seen_objects
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 d .data
10003040 D __CRT_MT
10003050 d .data
10003050 D __data_end__
10004000 r .eh_frame
10004000 r .eh_frame
10004000 R ___EH_FRAME_BEGIN__
10004368 r .eh_frame
10004368 r ___EH_FRAME_END__
1000436c R ___RUNTIME_PSEUDO_RELOC_LIST__
1000436c R ___RUNTIME_PSEUDO_RELOC_LIST_END__
1000436c R __RUNTIME_PSEUDO_RELOC_LIST__
1000436c R __RUNTIME_PSEUDO_RELOC_LIST_END__
10005000 b .bss
10005000 B __bss_start__
10005000 b _first_atexit
10005010 b _next_atexit
10005020 b .bss
10005020 b _obj
10005040 b .bss
10005040 b .bss
10005040 b .bss
10005040 b .bss
10005040 b .bss
10005040 b .bss
10005040 b .bss
10005040 b .bss
10005040 b _marker.1
10005050 b _object_mutex
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005060 b .bss
10005080 B __bss_end__
10006000 e .edata
10006028 e name
10006034 e afuncs
10006040 e anames
1000604c e anords
10006052 e n3
1000605d e n1
10006062 e n2
10007000 i .idata$2
10007000 I __head_libkernel32_a
10007014 i .idata$2
10007014 I __head_libmsvcrt_a
10007028 i .idata$2
10007028 I __head_libuser32_a
1000703c i .idata$2
1000703c I __head_libwinmm_a
10007064 i .idata$4
10007068 i .idata$4
10007068 i hname
1000706c i .idata$4
10007070 i .idata$4
10007074 i .idata$4
10007078 i .idata$4
1000707c i .idata$4
10007080 i .idata$4
10007084 i .idata$4
10007088 i .idata$4
1000708c i .idata$4
10007090 i .idata$4
10007094 i .idata$4
10007094 i hname
10007098 i .idata$4
1000709c i .idata$4
100070a0 i .idata$4
100070a4 i .idata$4
100070a8 i .idata$4
100070ac i .idata$4
100070b0 i .idata$4
100070b4 i .idata$4
100070b8 i .idata$4
100070bc i .idata$4
100070c0 i .idata$4
100070c4 i .idata$4
100070c4 i hname
100070c8 i .idata$4
100070cc i .idata$4
100070d0 i .idata$4
100070d4 i .idata$4
100070d8 i .idata$4
100070d8 i hname
100070dc i .idata$4
100070e0 i .idata$5
100070e4 i .idata$5
100070e4 I __imp__AddAtomA@4
100070e4 i fthunk
100070e8 i .idata$5
100070e8 I __imp__CreateMutexA@12
100070ec i .idata$5
100070ec I __imp__FindAtomA@4
100070f0 i .idata$5
100070f0 I __imp__GetAtomNameA@12
100070f4 i .idata$5
100070f4 I __imp__GetModuleHandleA@4
100070f8 i .idata$5
100070f8 I __imp__InterlockedIncrement@4
100070fc i .idata$5
100070fc I __imp__ReleaseMutex@4
10007100 i .idata$5
10007100 I __imp__Sleep@4
10007104 i .idata$5
10007104 I __imp__WaitForSingleObject@8
10007108 i .idata$5
1000710c i .idata$5
10007110 i .idata$5
10007110 I __imp____dllonexit
10007110 i fthunk
10007114 i .idata$5
10007114 I __imp___errno
10007118 i .idata$5
10007118 I __imp__abort
1000711c i .idata$5
1000711c I __imp__fflush
10007120 i .idata$5
10007120 I __imp__free
10007124 i .idata$5
10007124 I __imp__malloc
10007128 i .idata$5
10007128 I __imp__memset
1000712c i .idata$5
1000712c I __imp__printf
10007130 i .idata$5
10007130 I __imp__strlen
10007134 i .idata$5
10007134 I __imp__strtoul
10007138 i .idata$5
1000713c i .idata$5
10007140 i .idata$5
10007140 I __imp__CreateWindowExA@48
10007140 i fthunk
10007144 i .idata$5
10007144 I __imp__DialogBoxParamA@20
10007148 i .idata$5
10007148 I __imp__MessageBoxA@16
1000714c i .idata$5
10007150 i .idata$5
10007154 i .idata$5
10007154 I __imp__DefDriverProc@20
10007154 i fthunk
10007158 i .idata$5
1000715c i .idata$6
10007168 i .idata$6
10007178 i .idata$6
10007184 i .idata$6
10007194 i .idata$6
100071a8 i .idata$6
100071c0 i .idata$6
100071d0 i .idata$6
100071d8 i .idata$6
100071f0 i .idata$6
10007200 i .idata$6
1000720c i .idata$6
10007214 i .idata$6
10007220 i .idata$6
10007228 i .idata$6
10007234 i .idata$6
10007240 i .idata$6
1000724c i .idata$6
10007258 i .idata$6
10007264 i .idata$6
10007278 i .idata$6
1000728c i .idata$6
1000729c i .idata$6
100072ac i .idata$7
100072b0 i .idata$7
100072b4 i .idata$7
100072b8 i .idata$7
100072bc i .idata$7
100072c0 i .idata$7
100072c4 i .idata$7
100072c8 i .idata$7
100072cc i .idata$7
100072d0 i .idata$7
100072d0 I __libkernel32_a_iname
100072e0 i .idata$7
100072e4 i .idata$7
100072e8 i .idata$7
100072ec i .idata$7
100072f0 i .idata$7
100072f4 i .idata$7
100072f8 i .idata$7
100072fc i .idata$7
10007300 i .idata$7
10007304 i .idata$7
10007308 i .idata$7
10007308 I __libmsvcrt_a_iname
10007314 i .idata$7
10007318 i .idata$7
1000731c i .idata$7
10007320 i .idata$7
10007320 I __libuser32_a_iname
1000732c i .idata$7
10007330 i .idata$7
10007330 I __libwinmm_a_iname
10008000 d .rsrc
10009000 d .reloc

View file

@ -1,61 +0,0 @@
#include <defines.h>
#include <reactos/resource.h>
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
1001 DIALOGEX 0, 0, 230, 230
STYLE WS_POPUP | WS_BORDER | DS_CENTER | DS_MODALFRAME | WS_CAPTION | DS_ABSALIGN | WS_SYSMENU
FONT 8, "Tahoma", FW_BOLD, 0
CAPTION "Settings"
BEGIN
GROUPBOX "", 0, 5, 2, 220, 203
LTEXT "Sample Device Technology :", 666, 11, 10, 210, 12
COMBOBOX "", 666, 10, 20, 210, 80, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Playback Samples Using :", 666, 11, 40, 150, 12
COMBOBOX "", 666, 10, 50, 210, 80, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Record Samples Using :", 666, 11, 70, 150, 12
COMBOBOX "", 666, 10, 80, 210, 80, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "OK", 666, 90, 210, 50, 14
PUSHBUTTON "Settings", 666, 160, 40, 50, 14
PUSHBUTTON "Settings", 666, 160, 70, 50, 14
LTEXT "Sample playback is DISABLED.", 666, 11, 180, 210, 12
END
VS_VERSION_INFO VERSIONINFO
FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", RES_STR_COMPANY_NAME
VALUE "FileDescription", "MPU-401 MIDI Driver DLL\0"
VALUE "FileVersion", "0.0.1\0"
VALUE "InternalName", "mpu401\0"
VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT
VALUE "OriginalFilename", "mpu401.dll\0"
VALUE "ProductName", RES_STR_PRODUCT_NAME
VALUE "ProductVersion", RES_STR_PRODUCT_VERSION
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

View file

@ -1,4 +1,4 @@
# $Id: makefile,v 1.23 2004/01/20 19:35:59 silverblade Exp $
# $Id: makefile,v 1.24 2004/01/20 20:00:45 weiden Exp $
PATH_TO_TOP = ../../..
@ -6,11 +6,9 @@ TARGET_BOOTSTRAP = yes
TARGET_TYPE = driver
TARGET_NAME = mpu401
TARGET_NAME = blue
TARGET_OBJECTS = mpu401.o \
portio.o \
settings.o
TARGET_OBJECTS = blue.o
TARGET_CFLAGS = -Wall -Werror

View file

@ -1,406 +0,0 @@
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: services/dd/mpu401/mpu401.c
* PURPOSE: MPU-401 MIDI device driver
* PROGRAMMER: Andrew Greenwood
* UPDATE HISTORY:
* Sept 26, 2003: Copied from beep.c as template
* Sept 27, 2003: Implemented MPU-401 init & playback
*/
/* INCLUDES ****************************************************************/
#include <ddk/ntddk.h>
//#include <ddk/ntddbeep.h>
//#define NDEBUG
#include <debug.h>
#include "mpu401.h"
/* INTERNAL VARIABLES ******************************************************/
UINT DeviceCount = 0;
/* FUNCTIONS ***************************************************************/
NTSTATUS InitDevice(
IN PWSTR RegistryPath,
IN PVOID Context)
{
// PDEVICE_INSTANCE Instance = Context;
PDEVICE_OBJECT DeviceObject; // = Context;
PDEVICE_EXTENSION Parameters; // = DeviceObject->DeviceExtension;
UNICODE_STRING DeviceName = UNICODE_STRING_INITIALIZER(L"\\Device\\MPU401_Out_0");
UNICODE_STRING SymlinkName = UNICODE_STRING_INITIALIZER(L"\\??\\MPU401_Out_0");
// CONFIG Config;
RTL_QUERY_REGISTRY_TABLE Table[2];
NTSTATUS s;
// This is TEMPORARY, to ensure that we don't process more than 1 device.
// I'll remove this limitation in the future.
if (DeviceCount > 0)
{
DPRINT("Sorry - only 1 device supported by MPU401 driver at present :(\n");
return STATUS_NOT_IMPLEMENTED;
}
DPRINT("Creating IO device\n");
s = IoCreateDevice(Context, // driverobject
sizeof(DEVICE_EXTENSION),
&DeviceName,
FILE_DEVICE_SOUND, // Correct?
0,
FALSE,
&DeviceObject);
if (!NT_SUCCESS(s))
return s;
DPRINT("Device Extension at 0x%x\n", DeviceObject->DeviceExtension);
Parameters = DeviceObject->DeviceExtension;
DPRINT("Creating DOS link\n");
/* Create the dos device link */
IoCreateSymbolicLink(&SymlinkName,
&DeviceName);
DPRINT("Initializing device\n");
// DPRINT("Allocating memory for parameters structure\n");
// Bodged:
// Parameters = (PDEVICE_EXTENSION)ExAllocatePool(NonPagedPool, sizeof(DEVICE_EXTENSION));
// DeviceObject->DeviceExtension = Parameters;
// Parameters = Instance->DriverObject->DriverExtension;
DPRINT("DeviceObject at 0x%x, DeviceExtension at 0x%x\n", DeviceObject, Parameters);
if (! Parameters)
{
DPRINT("NULL POINTER!\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
// Instance->DriverObject->DriverExtension = Parameters;
DPRINT("Setting reg path\n");
Parameters->RegistryPath = RegistryPath;
// Parameters->DriverObject = Instance->DriverObject;
DPRINT("Zeroing table memory and setting query routine\n");
RtlZeroMemory(Table, sizeof(Table));
Table[0].QueryRoutine = LoadSettings;
DPRINT("Setting port and IRQ defaults\n");
Parameters->Port = DEFAULT_PORT;
Parameters->IRQ = DEFAULT_IRQ;
// Only to be enabled once we can get support for multiple cards working :)
/*
DPRINT("Loading settings from: %S\n", RegistryPath);
s = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath, Table,
&Parameters, NULL);
*/
if (! NT_SUCCESS(s))
return s;
DPRINT("Port 0x%x IRQ %d\n", Parameters->Port, Parameters->IRQ);
// Instance->P
// Enter UART mode (should be done in init phase
if (! InitUARTMode(Parameters->Port))
{
DPRINT("UART mode initialization FAILED!\n");
// Set state indication somehow
// Failure - what error code do we give?!
// return STATUS_????
}
DeviceCount ++;
return STATUS_SUCCESS;
}
static NTSTATUS STDCALL
MPU401Create(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
/*
* FUNCTION: Handles user mode requests
* ARGUMENTS:
* DeviceObject = Device for request
* Irp = I/O request packet describing request
* RETURNS: Success or failure
*/
{
DPRINT("MPU401Create() called!\n");
// Initialize the MPU-401
// ... do stuff ...
// Play a note to say we're alive:
// WaitToSend(MPU401_PORT);
// MPU401_WRITE_DATA(MPU401_PORT, 0x90);
// WaitToSend(MPU401_PORT);
// MPU401_WRITE_DATA(MPU401_PORT, 0x50);
// WaitToSend(MPU401_PORT);
// MPU401_WRITE_DATA(MPU401_PORT, 0x7f);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
MPU401Close(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
/*
* FUNCTION: Handles user mode requests
* ARGUMENTS:
* DeviceObject = Device for request
* Irp = I/O request packet describing request
* RETURNS: Success or failure
*/
{
PDEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
DPRINT("MPU401Close() called!\n");
DeviceExtension = DeviceObject->DeviceExtension;
Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(Status);
}
static NTSTATUS STDCALL
MPU401Cleanup(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
/*
* FUNCTION: Handles user mode requests
* ARGUMENTS:
* DeviceObject = Device for request
* Irp = I/O request packet describing request
* RETURNS: Success or failure
*/
{
UINT Channel;
DPRINT("MPU401Cleanup() called!\n");
// Reset the device (should we do this?)
for (Channel = 0; Channel <= 15; Channel ++)
{
// All notes off
// MPU401_WRITE_MESSAGE(MPU401_PORT, 0xb0 + Channel, 123, 0);
// All controllers off
// MPU401_WRITE_MESSAGE(MPU401_PORT, 0xb0 + Channel, 121, 0);
}
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
MPU401DeviceControl(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
/*
* FUNCTION: Handles user mode requests
* ARGUMENTS:
* DeviceObject = Device for request
* Irp = I/O request packet describing request
* RETURNS: Success or failure
*/
{
PIO_STACK_LOCATION Stack;
PDEVICE_EXTENSION DeviceExtension;
UINT ByteCount;
PBYTE Data;
DPRINT("MPU401DeviceControl() called!\n");
DeviceExtension = DeviceObject->DeviceExtension;
Stack = IoGetCurrentIrpStackLocation(Irp);
switch(Stack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_MIDI_PLAY :
{
DPRINT("Received IOCTL_MIDI_PLAY\n");
Data = (PBYTE) Irp->AssociatedIrp.SystemBuffer;
DPRINT("Sending %d bytes of MIDI data to 0x%d:\n", Stack->Parameters.DeviceIoControl.InputBufferLength, DeviceExtension->Port);
for (ByteCount = 0; ByteCount < Stack->Parameters.DeviceIoControl.InputBufferLength; ByteCount ++)
{
DPRINT("0x%x ", Data[ByteCount]);
MPU401_WRITE_BYTE(DeviceExtension->Port, Data[ByteCount]);
// if (WaitToSend(MPU401_PORT))
// MPU401_WRITE_DATA(MPU401_PORT, Data[ByteCount]);
}
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
}
return(STATUS_SUCCESS);
/*
DeviceExtension = DeviceObject->DeviceExtension;
Stack = IoGetCurrentIrpStackLocation(Irp);
BeepParam = (PBEEP_SET_PARAMETERS)Irp->AssociatedIrp.SystemBuffer;
Irp->IoStatus.Information = 0;
if (Stack->Parameters.DeviceIoControl.IoControlCode != IOCTL_BEEP_SET)
{
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(STATUS_NOT_IMPLEMENTED);
}
if ((Stack->Parameters.DeviceIoControl.InputBufferLength != sizeof(BEEP_SET_PARAMETERS))
|| (BeepParam->Frequency < BEEP_FREQUENCY_MINIMUM)
|| (BeepParam->Frequency > BEEP_FREQUENCY_MAXIMUM))
{
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(STATUS_INVALID_PARAMETER);
}
DueTime.QuadPart = 0;
*/
/* do the beep!! */
/* DPRINT("Beep:\n Freq: %lu Hz\n Dur: %lu ms\n",
pbsp->Frequency,
pbsp->Duration);
if (BeepParam->Duration >= 0)
{
DueTime.QuadPart = (LONGLONG)BeepParam->Duration * -10000;
KeSetTimer(&DeviceExtension->Timer,
DueTime,
&DeviceExtension->Dpc);
HalMakeBeep(BeepParam->Frequency);
DeviceExtension->BeepOn = TRUE;
KeWaitForSingleObject(&DeviceExtension->Event,
Executive,
KernelMode,
FALSE,
NULL);
}
else if (BeepParam->Duration == (DWORD)-1)
{
if (DeviceExtension->BeepOn == TRUE)
{
HalMakeBeep(0);
DeviceExtension->BeepOn = FALSE;
}
else
{
HalMakeBeep(BeepParam->Frequency);
DeviceExtension->BeepOn = TRUE;
}
}
DPRINT("Did the beep!\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(STATUS_SUCCESS);
*/
}
static NTSTATUS STDCALL
MPU401Unload(PDRIVER_OBJECT DriverObject)
{
DPRINT("MPU401Unload() called!\n");
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
/*
* FUNCTION: Called by the system to initalize the driver
* ARGUMENTS:
* DriverObject = object describing this driver
* RegistryPath = path to our configuration entries
* RETURNS: Success or failure
*/
{
// PDEVICE_EXTENSION DeviceExtension;
// PDEVICE_OBJECT DeviceObject;
// DEVICE_INSTANCE Instance;
// Doesn't support multiple instances (yet ...)
NTSTATUS Status;
DPRINT("MPU401 Device Driver 0.0.1\n");
// Is this really necessary? Yes! (Talking to myself again...)
// Instance.DriverObject = DriverObject;
// previous instance = NULL...
// DeviceExtension->RegistryPath = RegistryPath;
DriverObject->Flags = 0;
DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)MPU401Create;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)MPU401Close;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)MPU401Cleanup;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)MPU401DeviceControl;
DriverObject->DriverUnload = (PDRIVER_UNLOAD)MPU401Unload;
// Major hack to just get this damn thing working:
Status = InitDevice(RegistryPath, DriverObject); // ????
// DPRINT("Enumerating devices at %wZ\n", RegistryPath);
// Status = EnumDeviceKeys(RegistryPath, PARMS_SUBKEY, InitDevice, (PVOID)&DeviceObject); // &Instance;
// check error
/* set up device extension */
// DeviceExtension = DeviceObject->DeviceExtension;
// DeviceExtension->BeepOn = FALSE;
return(STATUS_SUCCESS);
}
/* EOF */

View file

@ -1,145 +0,0 @@
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: services/dd/mpu401/mpu401.h
* PURPOSE: MPU-401 MIDI device driver header
* PROGRAMMER: Andrew Greenwood
* UPDATE HISTORY:
* Sept 26, 2003: Created
*/
#ifndef __INCLUDES_MPU401_H__
#define __INCLUDES_MPU401_H__
#define DEFAULT_PORT 0x330
#define DEFAULT_IRQ 9
#define DEVICE_SUBKEY L"Devices"
#define PARMS_SUBKEY L"Parameters"
#define REGISTRY_PORT L"Port"
// At the moment, we just support a single device with fixed parameters:
#define MPU401_PORT DEFAULT_PORT
#define MPU401_IRQ DEFAULT_IRQ
#define MPU401_TIMEOUT 10000
#define IOCTL_SOUND_BASE FILE_DEVICE_SOUND
// wave base 0
#define IOCTL_MIDI_BASE 0x0080
#define IOCTL_MIDI_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MIDI_SET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_MIDI_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_MIDI_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MIDI_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
// The MPU-401 has 2 ports, usually 0x330 and 0x331, which are known as
// "data" and "status/command", respectively. These macros deal with
// reading from and writing to these ports:
#define MPU401_WRITE_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp, x)
#define MPU401_READ_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp)
#define MPU401_WRITE_COMMAND(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+1, x)
#define MPU401_READ_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+1)
// Flow control
#define MPU401_READY_TO_SEND(bp) \
MPU401_READ_STATUS(bp) & 0x80
#define MPU401_READY_TO_RECEIVE(bp) \
MPU401_READ_STATUS(bp) & 0x40
#define MPU401_WRITE_BYTE(bp, x) \
if (WaitToSend(bp)) MPU401_WRITE_DATA(bp, x)
#define MPU401_WRITE_MESSAGE(bp, status, da, db) \
MPU401_WRITE(bp, status); \
MPU401_WRITE(bp, da); \
MPU401_WRITE(bp, db)
//#define MPU401_READ(bp)
// if (WaitToRead(bp)) ... ???
/*
DEVICE_EXTENSION contains the settings for each individual device
*/
typedef struct _DEVICE_EXTENSION
{
PWSTR RegistryPath;
PDRIVER_OBJECT DriverObject;
UINT Port;
UINT IRQ;
// KDPC Dpc;
// KTIMER Timer;
// KEVENT Event;
// BOOLEAN BeepOn;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
/*
DEVICE_INSTANCE contains ???
*/
typedef struct _DEVICE_INSTANCE
{
// pPrevGDI
PDRIVER_OBJECT DriverObject;
} DEVICE_INSTANCE, *PDEVICE_INSTANCE;
/*
CONFIG contains device parameters (port/IRQ)
THIS STRUCTURE IS REDUNDANT
*/
//typedef struct _CONFIG
//{
// UINT Port;
// UINT IRQ;
//} CONFIG, *PCONFIG;
/*
Some callback typedefs
*/
typedef NTSTATUS REGISTRY_CALLBACK_ROUTINE(PWSTR RegistryPath, PVOID Context);
typedef REGISTRY_CALLBACK_ROUTINE *PREGISTRY_CALLBACK_ROUTINE;
/*
Prototypes for functions in portio.c :
*/
BOOLEAN WaitToSend(UINT BasePort);
BOOLEAN WaitToReceive(UINT BasePort);
BOOLEAN InitUARTMode(UINT BasePort);
/*
Prototypes for functions in settings.c :
*/
NTSTATUS EnumDeviceKeys(
IN PUNICODE_STRING RegistryPath,
IN PWSTR SubKey,
IN PREGISTRY_CALLBACK_ROUTINE Callback,
IN PVOID Context);
NTSTATUS LoadSettings(
IN PWSTR ValueName,
IN ULONG ValueType,
IN PVOID ValueData,
IN ULONG ValueLength,
IN PVOID Context,
IN PVOID EntryContext);
#endif

View file

@ -1,38 +0,0 @@
#include <defines.h>
#include <reactos/resource.h>
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
VS_VERSION_INFO VERSIONINFO
FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", RES_STR_COMPANY_NAME
VALUE "FileDescription", "MPU-401 MIDI Driver\0"
VALUE "FileVersion", "0.0.1\0"
VALUE "InternalName", "mpu401\0"
VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT
VALUE "OriginalFilename", "mpu401.sys\0"
VALUE "ProductName", RES_STR_PRODUCT_NAME
VALUE "ProductVersion", RES_STR_PRODUCT_VERSION
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

View file

@ -1,97 +0,0 @@
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: services/dd/mpu401/portio.c (see also mpu401.h)
* PURPOSE: MPU-401 MIDI port I/O helper
* PROGRAMMER: Andrew Greenwood
* UPDATE HISTORY:
* Sept 26, 2003: Created
*/
#include <windows.h>
#include <ddk/ntddk.h>
#include "mpu401.h"
BOOLEAN WaitToSend(UINT BasePort)
{
int TimeOut;
DbgPrint("WaitToSend ");
// Check if it's OK to send
for (TimeOut = MPU401_TIMEOUT;
! MPU401_READY_TO_SEND(BasePort) && TimeOut > 0;
TimeOut --);
// If a time-out occurs, we report failure
if (! TimeOut)
{
DbgPrint("FAILED\n");
return FALSE;
}
DbgPrint("SUCCEEDED\n");
return TRUE;
}
BOOLEAN WaitToReceive(UINT BasePort)
{
int TimeOut;
DbgPrint("WaitToSend ");
// Check if it's OK to receive
for (TimeOut = MPU401_TIMEOUT;
! MPU401_READY_TO_RECEIVE(BasePort) && TimeOut > 0;
TimeOut --);
// If a time-out occurs, we report failure
if (! TimeOut)
{
DbgPrint("FAILED\n");
return FALSE;
}
DbgPrint("SUCCEEDED\n");
return TRUE;
}
BOOLEAN InitUARTMode(UINT BasePort)
{
UINT TimeOut;
UCHAR Status = 0;
DbgPrint("InitUARTMode() called\n");
// Check if it's OK to send
if (! WaitToSend(BasePort))
return FALSE;
DbgPrint("Resetting MPU401\n");
// Send an MPU reset:
MPU401_WRITE_COMMAND(BasePort, 0xff);
// Check if it's OK to receive (some cards will ignore the above reset
// command and so will not issue an ACK, so time out is NOT an error)
DbgPrint("Waiting for an ACK\n");
if (WaitToReceive(BasePort))
{
// Check to make sure the reset was acknowledged:
for (TimeOut = MPU401_TIMEOUT;
Status = (MPU401_READ_DATA(BasePort) & 0xfe) && TimeOut > 0;
TimeOut --);
}
DbgPrint("Entering UART mode\n");
// Now we kick the MPU401 into UART ("dumb") mode
MPU401_WRITE_COMMAND(BasePort, 0x3f);
return TRUE;
}

View file

@ -1,28 +0,0 @@
----------------------------------
REACTOS MPU-401 MIDI DEVICE DRIVER
by Andrew Greenwood
----------------------------------
This driver initializes the MPU-401 MIDI/joystick port found on
most sound cards, and allows the sending of simple messages.
It's far from complete, and at present will only support 1 device.
In Bochs, the MIDI output will be played using whatever device is
set up in Windows as your MIDI output.
For real hardware, the output will be played to whatever device is
attached to your MIDI/joystick port, or, in some cases, the wave-table
or other synth on-board your card (note: this is NOT an FM synth
driver!)
Thanks to Vizzini and all the other great ReactOS developers for
helping me code this driver and also for giving me encouragement.
I'd also like to thank Jeff Glatt, whose MIDI and MPU-401
documentation has been a valuable resource to me over the past few
years, and who provided me with almost all of my knowledge of MIDI
and MPU-401. His site is at: www.borg.com/~jglatt/
- Andrew "Silver Blade" Greenwood

View file

@ -1,24 +0,0 @@
#ifndef NDEBUG
#define TEST_STATUS(s) \
if (! NT_SUCCESS(s)) \
{ \
if (s == STATUS_NO_MORE_ENTRIES) \
DPRINT("NTSTATUS == NO MORE ENTRIES\n") \
else if (s == STATUS_BUFFER_OVERFLOW) \
DPRINT("NTSTATUS == BUFFER OVERFLOW\n") \
else if (s == STATUS_BUFFER_TOO_SMALL) \
DPRINT("NTSTATUS == BUFFER TOO SMALL\n") \
else if (s == STATUS_INVALID_PARAMETER) \
DPRINT("NTSTATUS == INVALID PARAMETER\n") \
else if (s == STATUS_OBJECT_NAME_NOT_FOUND) \
DPRINT("NTSTATUS == OBJECT NAME NOT FOUND\n") \
else if (s == STATUS_INVALID_HANDLE) \
DPRINT("NTATATUS == INVALID_HANDLE\n") \
else if (s == STATUS_ACCESS_DENIED) \
DPRINT("NTSTATUS == ACCESS_DENIED\n") \
else \
DPRINT("NTSTATUS == FAILURE (???)\n"); \
}
#else
#define TEST_STATUS(s)
#endif

View file

@ -1,306 +0,0 @@
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: services/dd/mpu401/settings.c
* PURPOSE: MPU-401 MIDI device driver setting management
* PROGRAMMER: Andrew Greenwood
* UPDATE HISTORY:
* Sept 27, 2003: Created
*/
#include <ntddk.h>
#include <windows.h>
#include "mpu401.h"
// #define NDEBUG
#include <debug.h>
#include "sbdebug.h" // our own debug helper
NTSTATUS
OpenDevicesKey(
IN PWSTR RegistryPath,
OUT PHANDLE Key)
/*
Description:
Create a volatile key under this driver's Services node to contain
the device name list.
Parameters:
RegistryPath The location of the registry entry
Key The key in the registry
Return Value:
NT status STATUS_SUCCESS if successful (duh...)
*/
{
NTSTATUS s;
HANDLE hKey;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uStr;
// Attempt to open the key
RtlInitUnicodeString(&uStr, RegistryPath);
InitializeObjectAttributes(&oa, &uStr, OBJ_CASE_INSENSITIVE, NULL,
(PSECURITY_DESCRIPTOR)NULL);
s = ZwOpenKey(&hKey, KEY_CREATE_SUB_KEY, &oa);
if (! NT_SUCCESS(s))
return s; // Problem
// Now create sub key
RtlInitUnicodeString(&uStr, (PWSTR) DEVICE_SUBKEY);
InitializeObjectAttributes(&oa, &uStr, OBJ_CASE_INSENSITIVE, hKey,
(PSECURITY_DESCRIPTOR)NULL);
s = ZwCreateKey(Key, KEY_ALL_ACCESS, &oa, 0, NULL, REG_OPTION_VOLATILE,
NULL);
ZwClose(hKey);
return s;
}
NTSTATUS EnumDeviceKeys(
IN PUNICODE_STRING RegistryPath,
IN PWSTR SubKey,
IN PREGISTRY_CALLBACK_ROUTINE Callback,
IN PVOID Context)
/*
Description:
Enumerate the device subkeys in the driver's registry entry, and
call the specified callback routine for each device.
Parameters:
RegistryPath The location of the registry entry
Subkey The device's subkey
Callback A routine called for each device
Context ???
Return Value:
NT status STATUS_SUCCESS if successful
*/
{
NTSTATUS s;
OBJECT_ATTRIBUTES oa;
HANDLE hKey, hSubKey;
UNICODE_STRING SubkeyName;
ULONG i;
// Attempt to open the key
InitializeObjectAttributes(&oa, RegistryPath, OBJ_CASE_INSENSITIVE,
NULL, (PSECURITY_DESCRIPTOR)NULL);
s = ZwOpenKey(&hKey, KEY_READ, &oa);
TEST_STATUS(s); // debugging
if (! NT_SUCCESS(s))
return s; // Problem
RtlInitUnicodeString(&SubkeyName, SubKey);
DPRINT("Subkey: %wZ\n", &SubkeyName);
InitializeObjectAttributes(&oa, &SubkeyName, OBJ_CASE_INSENSITIVE,
hKey, (PSECURITY_DESCRIPTOR)NULL);
s = ZwOpenKey(&hSubKey, KEY_ENUMERATE_SUB_KEYS, &oa);
ZwClose(hKey);
TEST_STATUS(s); // debugging
if (! NT_SUCCESS(s))
return s;
// And now, the enumeration
for (i = 0;; i ++)
{
KEY_BASIC_INFORMATION Info;
PKEY_BASIC_INFORMATION pInfo;
ULONG ResultLength = 0;
ULONG Size = 0;
PWSTR Pos;
PWSTR Name;
// Find the length of the subkey data
// Info.NameLength = 0; // TEMPORARY!
s = ZwEnumerateKey(hSubKey, i, KeyBasicInformation, &Info,
sizeof(Info), &ResultLength);
if (s == STATUS_NO_MORE_ENTRIES)
break;
DPRINT("Found an entry, allocating memory...\n");
// Size = Info.NameLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]);
Size = ResultLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]);
DPRINT("Size is %d\n", Size);
pInfo = (PKEY_BASIC_INFORMATION) ExAllocatePool(PagedPool, Size);
if (pInfo == NULL)
{
DPRINT("INSUFFICIENT RESOURCES!\n");
s = STATUS_INSUFFICIENT_RESOURCES;
break;
}
DPRINT("Re-enumerating...\n");
s = ZwEnumerateKey(hSubKey, i, KeyBasicInformation, pInfo, Size,
&ResultLength);
// TEST_STATUS(s); // debugging
if (! NT_SUCCESS(s))
{
ExFreePool((PVOID) pInfo);
s = STATUS_INTERNAL_ERROR;
break;
}
DPRINT("Allocating memory for name...\n");
Name = ExAllocatePool(PagedPool,
RegistryPath->Length + sizeof(WCHAR) +
SubkeyName.Length + sizeof(WCHAR) +
pInfo->NameLength + sizeof(UNICODE_NULL));
if (Name == NULL)
{
DPRINT("INSUFFICIENT RESOURCES!");
ExFreePool((PVOID) pInfo);
return STATUS_INSUFFICIENT_RESOURCES;
}
// Copy the key name
RtlCopyMemory((PVOID)Name, (PVOID)RegistryPath->Buffer, RegistryPath->Length);
Pos = Name + (RegistryPath->Length / sizeof(WCHAR));
Pos[0] = '\\';
Pos++;
// Copy the parameters sub key name
RtlCopyMemory((PVOID)Pos, (PVOID)SubKey, SubkeyName.Length); //SubkeyName?
Pos += SubkeyName.Length / sizeof(WCHAR);
Pos[0] = '\\';
Pos ++;
// Copy the device sub key name
RtlCopyMemory((PVOID)Pos, (PVOID)pInfo->Name, pInfo->NameLength);
Pos += pInfo->NameLength / sizeof(WCHAR);
Pos[0] = UNICODE_NULL;
ExFreePool((PVOID)pInfo);
DPRINT("Calling callback...\n");
s = (*Callback)(Name, Context);
if (! NT_SUCCESS(s))
{ DPRINT("Callback FAILED\n");
break;}
}
ZwClose(hSubKey);
DPRINT("%d device registry keys found\n", i);
if ((i == 0) && (s == STATUS_NO_MORE_ENTRIES))
return STATUS_DEVICE_CONFIGURATION_ERROR;
return s == STATUS_NO_MORE_ENTRIES ? STATUS_SUCCESS : s;
}
NTSTATUS LoadSettings(
IN PWSTR ValueName,
IN ULONG ValueType,
IN PVOID ValueData,
IN ULONG ValueLength,
IN PVOID Context,
IN PVOID EntryContext)
/*
Description:
Read the settings for a particular device
Parameters:
ValueName The value to read from the registry
ValueType ?
ValueData ?
ValueLength ?
Context The configuration structure to write to
EntryContext ?
Return Value:
NT status STATUS_SUCCESS if successful
*/
{
PDEVICE_EXTENSION DeviceInfo = Context;
if (ValueType == REG_DWORD)
{
if (! _wcsicmp(ValueName, REGISTRY_PORT))
{
DeviceInfo->Port = *(PULONG) ValueData;
DPRINT("Registry port = 0x%x\n", DeviceInfo->Port);
}
// More to come... (config.c)
}
else
{
// ?
}
return STATUS_SUCCESS;
}
NTSTATUS SaveSettings(
IN PWSTR RegistryPath,
IN ULONG Port,
IN ULONG IRQ,
IN ULONG DMA)
/*
Description:
Saves the settings for a particular device
Parameters:
RegistryPath Where to save the settings to
Port The device's port number
IRQ The device's interrupt number
DMA The device's DMA channel
Return Value:
NT status STATUS_SUCCESS if successful
*/
{
NTSTATUS s;
DPRINT("SaveSettings() unimplemented\n");
// UNIMPLEMENTED;
return STATUS_SUCCESS;
}

View file

@ -1,70 +0,0 @@
#include <stdio.h>
#include <windows.h>
#include <ddk/ntddk.h>
#include "mpu401.h"
int main()
{
// NTSTATUS s;
// PHANDLE Handle;
// PIO_STATUS_BLOCK Status;
DWORD BytesReturned;
BYTE Test[3]; // Will store MIDI data
BYTE Notes[] = {50, 52, 54, 55, 57, 59, 61};
HANDLE Device;
UINT Note;
UINT Junk;
printf("Test program for MPU401 driver\n");
Device = CreateFile("\\\\.\\MPU401_Out_0", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL);
if (Device == INVALID_HANDLE_VALUE)
{
printf("Device is busy or could not be found.\n");
return -1;
}
printf("Device is open, let's play some music...\n");
Test[0] = 0x90;
Test[2] = 0x7f;
for (Note = 0; Note < sizeof(Notes); Note ++)
{
Test[1] = Notes[Note];
DeviceIoControl(
Device,
IOCTL_MIDI_PLAY,
&Test,
sizeof(Test),
NULL,
0,
&BytesReturned,
NULL
);
for (Junk = 0; Junk < 100000; Junk ++); // Pause
}
/* s = IoCreateFile(Handle, GENERIC_READ | GENERIC_WRITE,
OBJ_KERNEL_HANDLE,
Status,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE,
NULL,
0,
CreateFileTypeNone,
NULL,
0);
*/
}

View file

@ -1,519 +0,0 @@
/*
playmidi.c
MIDI playback tester
*/
#include <stdio.h>
#include <windows.h>
// typedef UINT *LPUINT;
#include <mmsystem.h>
#include <malloc.h>
struct GENERIC_CHUNK
{
char Header[4];
ULONG Length;
} GENERIC_CHUNK;
struct MTHD_CHUNK
{
char Header[4];
ULONG Length;
USHORT Format;
USHORT NumTracks;
USHORT Division;
} MTHD_CHUNK;
struct MidiMessage
{
UINT Time;
UCHAR Status;
UCHAR Data1;
UCHAR Data2;
UCHAR Data3;
};
struct MessageQueue
{
UINT MessageCount;
UINT MessageCapacity;
UINT QueuePos;
struct MidiMessage* Messages; // MQ[trk][entry]
};
struct Song
{
USHORT Format;
USHORT NumTracks;
USHORT Division; // correct?
struct MessageQueue* Tracks;
};
struct Song Song;
USHORT SwapShortBytes(USHORT *Value)
{
return *Value = ((*Value % 256) * 256) + (*Value / 256);
}
ULONG SwapLongBytes(ULONG *Value)
{
BYTE b[4];
INT i;
for (i = 0; i < 4; i ++)
{
b[i] = *Value % 256;
*Value /= 256;
}
printf("SLB : %u %u %u %u\n", b[0], b[1], b[2], b[3]);
return *Value = (b[0] * 256 * 256 *256) +
(b[1] * 256 * 256) +
(b[2] * 256) +
b[3];
}
ULONG ReadVarLen(FILE* f, ULONG *b)
{
char c;
ULONG v;
*b ++;
if ((v = getc(f)) & 0x80)
{
v &= 0x7f;
do
{
v = (v << 7) + ((c = getc(f)) & 0x7f);
*b ++;
}
while (c & 0x80);
}
return v;
}
BOOLEAN QueueMessage(UINT Track, struct MidiMessage* Msg)
{
PVOID OldPtr = NULL;
// printf("QueueMessage called\n");
if (Song.Tracks[Track].MessageCount + 1 > Song.Tracks[Track].MessageCapacity)
{
Song.Tracks[Track].MessageCapacity += 1;
OldPtr = Song.Tracks[Track].Messages;
// printf("Allocating %d bytes - ", Song.Tracks[Track].MessageCapacity * sizeof(struct MidiMessage));
Song.Tracks[Track].Messages =
realloc(Song.Tracks[Track].Messages,
Song.Tracks[Track].MessageCapacity * sizeof(struct MidiMessage));
// printf("0x%x\n", Song.Tracks[Track].Messages);
if (! Song.Tracks[Track].Messages)
{
Song.Tracks[Track].Messages = OldPtr;
return FALSE;
}
}
// Copy the message
Song.Tracks[Track].Messages[Song.Tracks[Track].MessageCount] = *Msg;
// printf("Message 0x%x %d %d %d\n", Msg->Status, Msg->Data1, Msg->Data2, Msg->Data3);
Song.Tracks[Track].MessageCount ++;
// printf("Msg count %u\n", Song.Tracks[Track].MessageCount);
return TRUE;
}
BOOLEAN DequeueMessage(UINT Track, struct MidiMessage* Msg)
{
printf("Dequeueing message from %u < %u\n", Song.Tracks[Track].QueuePos, Song.Tracks[Track].MessageCount);
if (Song.Tracks[Track].QueuePos >= Song.Tracks[Track].MessageCount)
{
printf("No more messages in queue\n");
return FALSE;
}
*Msg = Song.Tracks[Track].Messages[Song.Tracks[Track].QueuePos];
Song.Tracks[Track].QueuePos ++;
return TRUE;
}
UINT GetMessageLength(BYTE b)
{
switch(b)
{
case 0xf0 : // case 0xf4 : case 0xf5 : case 0xf6 : case 0xf7 :
return 0; // ignore
case 0xf1 : case 0xf3 :
return 2;
case 0xf2 :
return 3;
case 0xff : // meta event
return 0;
}
if (b > 0xf8) return 1;
switch(b & 0xf0)
{
case 0x80 : case 0x90 : case 0xa0 : case 0xb0 : case 0xe0 :
return 2;
case 0xc0 : case 0xd0 :
return 1;
}
return 0; // must be a status byte
}
UINT ReadEvent(FILE* f, struct MidiMessage* Msg)
{
ULONG Bytes = 0;
ULONG MsgLen = 0;
UCHAR Status;
PVOID NextByte = NULL;
Msg->Data1 = 0;
Msg->Data2 = 0;
Msg->Data3 = 0;
Msg->Time = ReadVarLen(f, &Bytes); // Increment ?
// Bytes = 4; // WRONG!
// printf("Message at %u : ", Msg->Time);
Status = getc(f);
Bytes ++;
// Figure out if we're using running status or not
if (Status & 0x80)
{
Msg->Status = Status;
NextByte = &Msg->Data1;
// printf("NRS\n");
}
else
{
Bytes --;
MsgLen --; // ok?
Msg->Data1 = Status;
NextByte = &Msg->Data2;
}
Bytes += MsgLen = GetMessageLength(Msg->Status);
// printf("Len(%u) ", Bytes);
// if (Bytes <= 4) // System messages are ignored
// {
if (Msg->Status == 0xf0)
{
ReadVarLen(f, &Bytes); // we don't care!
while ((! feof(f)) && (Status = fgetc(f) != 0x7f))
{
Bytes ++;
}
// printf("Ignored %u bytes of SysEx\n", Bytes);
return Bytes;
}
else if (Msg->Status == 0xff) // meta event
{
UCHAR METype, MELen;
// process the message somehow... (pass song pointer?)
METype = getc(f); // What type of event it is
MELen = getc(f); // How long it is
fseek(f, MELen, SEEK_CUR);
if (METype == 0x2f) // track end
return FALSE;
// printf("Found a meta-event of type %u, length %u (ignored it)\n", METype, MELen);
return Bytes + MELen;
}
else if (Msg->Status > 0xf0)
return Bytes + 1;
// }
// else if (Bytes > 4 + 3)
// {
// printf("MIDI bytecount > 3. THIS SHOULD NOT HAPPEN!\n");
// }
// printf("Reading %u bytes .. ", MsgLen);
fread(NextByte, 1, MsgLen, f);
// printf("Message 0x%x %d %d %d\n", Msg->Status, Msg->Data1, Msg->Data2, Msg->Data3);
if (feof(f))
return FALSE;
return Bytes;
}
UINT Trk = 0;
BOOLEAN ReadChunk(FILE* f)
{
struct GENERIC_CHUNK Chunk;
fread(&Chunk, sizeof(GENERIC_CHUNK), 1, f);
SwapLongBytes(&Chunk.Length);
if (feof(f))
return FALSE;
if (! strncmp(Chunk.Header, "MThd", 4))
{
int i;
struct MTHD_CHUNK HeaderChunk;
memcpy(&HeaderChunk, &Chunk, sizeof(GENERIC_CHUNK));
printf("Found MThd chunk\n");
fread(&HeaderChunk.Format, 1, Chunk.Length, f);
SwapShortBytes(&HeaderChunk.Format);
SwapShortBytes(&HeaderChunk.NumTracks);
SwapShortBytes(&HeaderChunk.Division);
Song.Format = HeaderChunk.Format;
Song.NumTracks = HeaderChunk.NumTracks;
Song.Division = HeaderChunk.Division;
Song.Tracks = malloc(Song.NumTracks * sizeof(struct MessageQueue));
for (i = 0; i < Song.NumTracks; i ++)
{
Song.Tracks[i].MessageCount = 0;
Song.Tracks[i].MessageCapacity = 0;
Song.Tracks[i].QueuePos = 0;
Song.Tracks[i].Messages = NULL;
}
switch(HeaderChunk.Format)
{
case 0 :
printf("Single track format\n");
if (HeaderChunk.NumTracks > 1)
{
printf("Found more than one track!\n");
return FALSE;
}
printf("1 track\n");
break;
case 1 :
printf("Multi-track format\n");
if (HeaderChunk.NumTracks < 1)
{
printf("MIDI file contains no tracks!\n");
return FALSE;
}
printf("%u track(s)\n", HeaderChunk.NumTracks);
break;
default :
printf("Unsupported format!\n");
return FALSE;
}
}
else if (! strncmp(Chunk.Header, "MTrk", 4))
{
struct MidiMessage Msg;
UINT ByteCount = 0;
// Song.Tracks[Trk].MessageCapacity = 0;
// Song.Tracks[Trk].MessageCount = 0;
// Song.Tracks[Trk].Messages = NULL;
printf("Found an MTrk chunk - length %u\n", Chunk.Length);
Msg.Time = 0; // this gets incremented
while (ReadEvent(f, &Msg))
{
if (Msg.Status >= 0xf0)
continue;
if ((Msg.Data1 & 0x80) ||
(Msg.Data2 & 0x80) ||
(Msg.Data3 & 0x80))
{
printf("WARNING: Malformed MIDI message: 0x%x %u %u %u\n", Msg.Status, Msg.Data1, Msg.Data2, Msg.Data3);
}
// else
// printf("0x%x %u %u %u\n", Msg.Status, Msg.Data1, Msg.Data2, Msg.Data3);
if (! QueueMessage(Trk, &Msg))
{
UINT i;
printf("Out of memory\n");
for (i = 0; i < Trk; i ++)
{
free(Song.Tracks[Trk].Messages);
}
free(Song.Tracks);
abort();
}
}
printf("%u messages were processed\n", Song.Tracks[Trk].MessageCount);
Trk ++;
// while (ByteCount < Chunk.Length)
// {
// printf("%u < %u ?\n", ByteCount, Chunk.Length);
// ByteCount += ReadEvent(f, &Msg);
// ...
// }
// fseek(f, Chunk.Length, SEEK_CUR);
}
else
{
// skip it...
printf("Haven't got a clue what this chunk is: %s\n", Chunk.Header);
fseek(f, Chunk.Length, SEEK_CUR);
}
return TRUE;
}
BOOLEAN Load(char* Filename)
{
FILE* f = fopen(Filename, "rb");
if (! f)
{
printf("File not found!\n");
return FALSE;
}
// fread(&Header, 1, 4, f);
// printf("Header = %s\n", Header);
// if (strncmp(Header, "MThd", 4))
// {
// printf("Not a MIDI file!\n");
// return FALSE;
// }
while (! feof(f))
if (! ReadChunk(f)) break;
// fread(&Length, 4, 1, f);
// Length = SwapLongBytes(Length);
// if (Length != 6)
// {
// printf("Abnormal MThd chunk length : %u\n", Length);
// return FALSE;
// }
// fread(&Format, 2, 1, f);
// Format = SwapShortBytes(Format);
// fread(&NumTracks, 2, 1, f);
// NumTracks = SwapShortBytes(NumTracks);
// Ignore this for now:
// fread(&Division, 2, 1, f);
fclose(f);
return TRUE;
}
#define PACK_MIDI(s, d1, d2, d3) \
(d3 * 256 * 256 * 256) + \
(d2 * 256 * 256) + \
(d1 * 256) + s
BOOLEAN Play()
{
printf("Now playing - press any key to stop...\n");
UINT Trk;
struct MidiMessage Msg;
HANDLE Timer;
LARGE_INTEGER ns;
HMIDIOUT Device;
if (midiOutOpen(&Device, -1, NULL, 0, CALLBACK_NULL) != MMSYSERR_NOERROR)
{
printf("midiOutOpen() failed!\n");
return FALSE;
}
Timer = CreateWaitableTimer(NULL, TRUE, "PlayMidiTimer");
while(DequeueMessage(5, &Msg)) // fix this
{
if (Msg.Time > 0)
{
ns.QuadPart = 20000 * Msg.Time;
ns.QuadPart = - ns.QuadPart;
SetWaitableTimer(Timer, &ns, 0, NULL, NULL, FALSE);
WaitForSingleObject(Timer, INFINITE);
}
printf("%u : ", Msg.Time);
printf("0x%x %d %d %d\n", Msg.Status, Msg.Data1, Msg.Data2, Msg.Data3);
midiOutShortMsg(Device, PACK_MIDI(Msg.Status, Msg.Data1, Msg.Data2, Msg.Data3));
}
return TRUE;
}
int main(int argc, char* argv[])
{
printf("MIDI Playback Test Applet\n");
printf("by Andrew Greenwood\n\n");
if (argc == 1)
{
printf("Need a filename\n");
return -1;
}
printf("Playing %s\n", argv[1]);
if (Load(argv[1]))
if (! Play())
return -1;
return 0;
}

View file

@ -1,907 +0,0 @@
MIDI Playback Test Applet
by Andrew Greenwood
Playing test.mid
SLB : 0 0 0 6
Found MThd chunk
Multi-track format
14 track(s)
SLB : 0 0 0 38
Found an MTrk chunk - length 38
0 < 38 ?
Message at 0 : Len(5) Found a meta-event of type 81, length 3 (ignored it)
8 < 38 ?
Message at 0 : Len(5) Found a meta-event of type 88, length 4 (ignored it)
17 < 38 ?
Message at 86012 : Len(5) Found a meta-event of type 81, length 3 (ignored it)
25 < 38 ?
Message at 768 : Len(5) Found a meta-event of type 81, length 3 (ignored it)
33 < 38 ?
Message at 175363 : Len(5) Found a meta-event of type 47, length 0 (ignored it)
SLB : 0 0 10 122
Found an MTrk chunk - length 2682
0 < 2682 ?
Message at 0 : Len(5) Found a meta-event of type 1, length 8 (ignored it)
13 < 2682 ?
Message at 1 : Len(5) Reading 1 bytes .. Message 0xc3 90 3 120
18 < 2682 ?
Message at 8 : Len(7) Reading 3 bytes .. Message 0xb3 7 116 129
25 < 2682 ?
Message at 2231 : Len(7) Reading 3 bytes .. Message 0x93 59 110 92
32 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
38 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
44 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
50 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 129 108
56 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 129 68
62 < 2682 ?
Message at 2489 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
68 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
74 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
80 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
86 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
92 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
98 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 96 131
104 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
110 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
116 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 131 4
122 < 2682 ?
Message at 2489 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
128 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
134 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
140 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
146 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
152 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
158 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
164 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
170 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
176 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
182 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 96 131
188 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
194 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
200 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
206 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
212 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 132 68
218 < 2682 ?
Message at 2491 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
224 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
230 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
236 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
242 < 2682 ?
Message at 64 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
248 < 2682 ?
Message at 448 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
254 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
260 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
266 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
272 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
278 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
284 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
290 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
296 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
302 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
308 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
314 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
320 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
326 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
332 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
338 < 2682 ?
Message at 52 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
344 < 2682 ?
Message at 52 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
350 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
356 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
362 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
368 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
374 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
380 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
386 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
392 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
398 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
404 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
410 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
416 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
422 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
428 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
434 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 131 44
440 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 132 68
446 < 2682 ?
Message at 8666 : Len(6) Reading 2 bytes .. Message 0x93 0 147 59
452 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 92 131 59
458 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 4 147 62
464 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 44 131 62
470 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 4 147 59
476 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 108 131 59
483 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 68 147 57
490 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
496 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
502 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
508 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
514 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
520 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
526 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 96 131 57
532 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 0 147 55
538 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 60 131 55
545 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x83 4 147 57
552 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x83 44 131 57
558 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x83 4 147 57
564 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x83 92 131 57
570 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x83 4 147 57
576 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 57
583 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 100 147 57
589 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
595 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
601 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
607 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
613 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 96 131 57
619 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 0 147 55
625 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
631 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
637 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 60 131 55
644 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x84 68 147 59
651 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x84 92 131 59
657 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x84 4 147 62
663 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x84 44 131 62
669 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x84 4 147 64
675 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 64
682 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
688 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
694 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
700 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
706 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
712 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
718 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
724 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 59
730 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
736 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 57
742 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
748 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 57
754 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
760 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 60 131 55
767 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 52
773 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 52
779 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
785 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
791 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
797 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 60 131 57
804 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
810 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
816 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
822 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
828 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
834 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 60 131 57
841 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
847 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
853 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
859 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 44 131 55
865 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
871 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x83 44 131 59
878 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x83 100 147 57
884 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 57
891 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
897 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 59
904 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 100 147 60
910 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
916 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
922 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
928 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
934 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 44 131 59
940 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
946 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 60
953 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
959 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
965 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
971 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
977 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
983 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
989 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
995 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
1001 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1007 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1013 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1019 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
1025 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1031 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1037 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 100 147 57
1043 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 57
1050 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1056 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 59
1063 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1069 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
1075 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 100 147 60
1081 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
1087 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1093 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
1099 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1105 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
1111 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1117 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
1123 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1129 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 44 131 57
1135 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
1141 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 55
1148 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1154 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 96 131 59
1160 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 0 147 57
1166 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1172 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1178 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1184 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 68 147 57
1191 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 57
1198 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1204 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 59
1211 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1217 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
1223 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 100 147 60
1229 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 60
1235 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1241 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 44 131 59
1247 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1253 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 60
1260 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1266 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
1272 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1278 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1284 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
1290 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
1296 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
1302 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
1308 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1314 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1320 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1326 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
1332 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1338 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
1344 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 100 147 57
1350 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 57
1357 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1363 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 12 131 59
1370 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1376 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 60
1382 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
1388 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 59
1394 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1400 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 60
1406 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 62
1412 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 62
1418 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 60
1424 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 60
1430 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 64
1436 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 124 131 64
1442 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 64
1448 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x82 124 131 64
1455 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 68 147 59
1462 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 48 131 59
1468 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 0 147 57
1474 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 44 131 57
1480 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
1486 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
1492 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
1498 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 96 131 57
1504 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 0 147 55
1510 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
1516 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
1522 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x82 124 131 55
1529 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x89 4 195 62
1536 < 2682 ?
Message at 0 : Len(7) Reading 3 bytes .. Message 0x93 59 110 92
1543 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1549 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
1555 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1561 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 129 108
1567 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 129 68
1573 < 2682 ?
Message at 2489 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1579 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1585 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1591 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1597 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1603 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1609 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 96 131
1615 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
1621 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
1627 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 131 4
1633 < 2682 ?
Message at 2489 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
1639 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1645 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1651 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1657 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
1663 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
1669 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1675 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1681 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1687 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1693 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 96 131
1699 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
1705 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1711 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1717 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
1723 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 132 68
1729 < 2682 ?
Message at 2491 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1735 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1741 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
1747 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1753 < 2682 ?
Message at 64 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
1759 < 2682 ?
Message at 448 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1765 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1771 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1777 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1783 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1789 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1795 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1801 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
1807 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1813 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
1819 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1825 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
1831 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1837 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
1843 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1849 < 2682 ?
Message at 52 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1855 < 2682 ?
Message at 52 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1861 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1867 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1873 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
1879 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1885 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1891 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1897 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1903 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1909 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 60
1915 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1921 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1927 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1933 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
1939 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1945 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 131 44
1951 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
1957 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
1963 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1969 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
1975 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
1981 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1987 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
1993 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
1999 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2005 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
2011 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2017 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2023 < 2682 ?
Message at 444 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2029 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2035 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2041 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2047 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2053 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2059 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2065 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2071 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2077 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2083 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2089 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2095 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2101 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2107 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
2113 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2119 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2125 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2131 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2137 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2143 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
2149 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2155 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2161 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2167 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2173 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2179 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2185 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2191 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2197 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
2203 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2209 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2215 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2221 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 96 131
2227 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
2233 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2239 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2245 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2251 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 68
2257 < 2682 ?
Message at 2489 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2263 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2269 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2275 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2281 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2287 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
2293 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2299 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2305 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
2311 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2317 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2323 < 2682 ?
Message at 444 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2329 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2335 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2341 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2347 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2353 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2359 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2365 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2371 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2377 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2383 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2389 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2395 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2401 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2407 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 100 147
2413 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2419 < 2682 ?
Message at 441 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2425 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 129 12
2431 < 2682 ?
Message at 443 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2437 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
2443 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2449 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
2455 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2461 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
2467 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2473 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
2479 < 2682 ?
Message at 62 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2485 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
2491 < 2682 ?
Message at 60 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2497 < 2682 ?
Message at 64 : Len(6) Reading 2 bytes .. Message 0x93 110 124 131
2503 < 2682 ?
Message at 64 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2509 < 2682 ?
Message at 64 : Len(6) Reading 2 bytes .. Message 0x93 110 130 124
2515 < 2682 ?
Message at 448 : Len(6) Reading 2 bytes .. Message 0x93 110 129 68
2521 < 2682 ?
Message at 2491 : Len(6) Reading 2 bytes .. Message 0x93 110 48 131
2527 < 2682 ?
Message at 59 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
2533 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 44 131
2539 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2545 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2551 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2557 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 96 131
2563 < 2682 ?
Message at 57 : Len(6) Reading 2 bytes .. Message 0x93 110 0 147
2569 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 92 131
2575 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 4 147
2581 < 2682 ?
Message at 55 : Len(6) Reading 2 bytes .. Message 0x93 110 130 124
2587 < 2682 ?
Message at 439 : Len(6) Reading 2 bytes .. Message 0x93 110 197 4
2593 < 2682 ?
Message at 6535 : Len(6) Reading 2 bytes .. Message 0x93 120 0 195
2599 < 2682 ?
Message at 80 : Len(6) Reading 2 bytes .. Message 0x93 0 147 59
2605 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 92 131 59
2611 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 4 147 62
2617 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 44 131 62
2623 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x93 4 147 59
2629 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 108 131 59
2636 < 2682 ?
Message at 110 : Len(7) Reading 3 bytes .. Message 0x81 68 147 57
2643 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 57
2649 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 55
2655 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 55
2661 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 59
2667 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 92 131 59
2673 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 4 147 57
2679 < 2682 ?
Message at 110 : Len(6) Reading 2 bytes .. Message 0x81 96 131 57
SLB : 110 129 60 131
Haven't got a clue what this chunk is: n
SLB : 131 60 129 110