├── requirements.txt
├── shell
├── toggle-output.sh
├── set-output-speakers.sh
└── set-output-headphones.sh
├── g6_util.py
├── .run
├── g6-cli (--help).run.xml
├── g6-cli (--toggle-output).run.xml
├── g6-cli (--set-bass Disabled).run.xml
├── g6-cli (--set-bass Enabled).run.xml
├── g6-cli (--set-bass-value 0).run.xml
├── g6-cli (--set-bass-value 50).run.xml
├── g6-cli (--set-bass-value 100).run.xml
├── g6-cli (--set-output Speakers).run.xml
├── g6-cli (--set-surround Disabled).run.xml
├── g6-cli (--set-surround Enabled).run.xml
├── g6-cli (--set-surround-value 0).run.xml
├── g6-cli (--set-surround-value 50).run.xml
├── g6-cli (--set-output Headphones).run.xml
├── g6-cli (--set-surround-value 100).run.xml
├── g6-cli (--set-crystalizer Enabled).run.xml
├── g6-cli (--set-crystalizer-value 0).run.xml
├── g6-cli (--set-dialog-plus Enabled).run.xml
├── g6-cli (--set-dialog-plus-value 0).run.xml
├── g6-cli (--set-crystalizer Disabled).run.xml
├── g6-cli (--set-crystalizer-value 100).run.xml
├── g6-cli (--set-crystalizer-value 50).run.xml
├── g6-cli (--set-dialog-plus Disabled).run.xml
├── g6-cli (--set-dialog-plus-value 100).run.xml
├── g6-cli (--set-dialog-plus-value 50).run.xml
├── g6-cli (--set-smart-volume Enabled).run.xml
├── g6-cli (--set-smart-volume-value 0).run.xml
├── g6-cli (--set-smart-volume Disabled).run.xml
├── g6-cli (--set-smart-volume-value 100).run.xml
├── g6-cli (--set-smart-volume-value 50).run.xml
├── g6-cli (--set-output Headphones, --dry-run).run.xml
├── g6-cli (--set-smart-volume-special-value Loud).run.xml
└── g6-cli (--set-smart-volume-special-value Night).run.xml
├── payloads
├── toggle-output-to-speakers.hex
├── toggle-output-to-headphones.hex
└── 0-100.hex
├── readme.md
├── g6_spec.py
├── doc
├── usb-protocol.md
└── usb-spec.txt
├── LICENSE
└── g6_cli.py
/requirements.txt:
--------------------------------------------------------------------------------
1 | hidapi==0.14.0
2 | packaging==24.0
3 | pkg-about==1.1.5
4 |
--------------------------------------------------------------------------------
/shell/toggle-output.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | python_bin="$(dirname $0)/../venv/bin/python"
3 | python_file="$(dirname $0)/../g6_cli.py"
4 | eval "$python_bin $python_file --toggle-output"
5 |
--------------------------------------------------------------------------------
/shell/set-output-speakers.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | python_bin="$(dirname $0)/../venv/bin/python"
3 | python_file="$(dirname $0)/../g6_cli.py"
4 | eval "$python_bin $python_file --set-output Speakers"
5 |
--------------------------------------------------------------------------------
/shell/set-output-headphones.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | python_bin="$(dirname $0)/../venv/bin/python"
3 | python_file="$(dirname $0)/../g6_cli.py"
4 | eval "$python_bin $python_file --set-output Headphones"
5 |
--------------------------------------------------------------------------------
/g6_util.py:
--------------------------------------------------------------------------------
1 | def read_payload_as_hex_lines(payload_file_path):
2 | """
3 | Read the hex data from a payload text file as list, omitting any line separators
4 | :param payload_file_path: the file path to the payload hex-line file
5 | :return: the stripped file content lines as list
6 | """
7 | with open(payload_file_path, 'r') as file:
8 | return [line.strip() for line in file.readlines()]
9 |
--------------------------------------------------------------------------------
/.run/g6-cli (--help).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--toggle-output).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-bass Disabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-bass Enabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-bass-value 0).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-bass-value 50).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-bass-value 100).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-output Speakers).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-surround Disabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-surround Enabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-surround-value 0).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-surround-value 50).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-output Headphones).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-surround-value 100).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-crystalizer Enabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-crystalizer-value 0).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-dialog-plus Enabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-dialog-plus-value 0).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-crystalizer Disabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-crystalizer-value 100).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-crystalizer-value 50).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-dialog-plus Disabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-dialog-plus-value 100).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-dialog-plus-value 50).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume Enabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume-value 0).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume Disabled).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume-value 100).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume-value 50).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-output Headphones, --dry-run).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume-special-value Loud).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.run/g6-cli (--set-smart-volume-special-value Night).run.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/payloads/toggle-output-to-speakers.hex:
--------------------------------------------------------------------------------
1 | 5a2c0500020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2 | 5a2c0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3 | 5a120701960a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4 | 5a110301960a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5 | 5a120701960b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6 | 5a110301960b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7 | 5a120701960c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
8 | 5a110301960c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
9 | 5a120701960d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
10 | 5a110301960d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
11 | 5a120701960e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
12 | 5a110301960e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
13 | 5a120701960f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14 | 5a110301960f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
15 | 5a120701961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
16 | 5a110301961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
17 | 5a120701961100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
18 | 5a110301961100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
19 | 5a120701961200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
20 | 5a110301961200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
21 | 5a120701961300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
22 | 5a110301961300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
23 | 5a120701961400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
24 | 5a110301961400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
25 | 5a120701960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
26 | 5a110301960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
27 | 5a120701960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
28 | 5a110301960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
--------------------------------------------------------------------------------
/payloads/toggle-output-to-headphones.hex:
--------------------------------------------------------------------------------
1 | 5a2c0500040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2 | 5a2c0101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3 | 5a120701960a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4 | 5a110301960a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5 | 5a120701960b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6 | 5a110301960b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7 | 5a120701960c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
8 | 5a110301960c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
9 | 5a120701960d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
10 | 5a110301960d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
11 | 5a120701960e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
12 | 5a110301960e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
13 | 5a120701960f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14 | 5a110301960f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
15 | 5a120701961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
16 | 5a110301961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
17 | 5a120701961100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
18 | 5a110301961100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
19 | 5a120701961200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
20 | 5a110301961200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
21 | 5a120701961300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
22 | 5a110301961300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
23 | 5a120701961400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
24 | 5a110301961400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
25 | 5a120701960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
26 | 5a110301960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
27 | 5a120701960600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
28 | 5a110301960600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
29 | 5a120701960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
30 | 5a110301960900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # SoundBlaster X G6 CLI
2 |
3 | This project makes use of the [hidapi](https://github.com/trezor/cython-hidapi) library and thus transitively from
4 | [libusb](https://github.com/libusb/libusb) to provide a CLI to control
5 | the [SoundBlaster X G6](https://de.creative.com/p/sound-blaster/sound-blasterx-g6) device from command line. This empowers the people to control the G6 in Linux.
6 |
7 | ## Important Disclaimer
8 |
9 | I developed this CLI to the best of my belief and I use it myself to control my G6, and it works fine for me.
10 | I read pretty often, that you are able to damage or brick a USB device, if you send faulty data to it.
11 |
12 | That's why I want point out, that you **USE THIS CLI AT YOUR OWN RISK**! I am not responsible for any damages on your
13 | system or your device!
14 |
15 | ## Firmware version
16 |
17 | This software is tested with a G6 having the **Firmware version:** `2.1.201208.1030`.
18 |
19 | Make sure, that you have the same version, since I do not know whether the USB specification may differ between the
20 | versions. You are able to update your Firmware with
21 | [SoundBlaster Command](https://support.creative.com/Products/ProductDetails.aspx?prodID=21383&prodName=Sound%20Blaster)
22 | in Windows by using a [QEMU/KVM VM](https://virt-manager.org/) and the USB Redirection feature.
23 |
24 | ## Installation
25 |
26 | Select a directory of your choice and clone the repository into it:
27 |
28 | ```shell
29 | cd $HOME
30 | git clone
31 | ```
32 |
33 | Install Python3. The application has been tested with **Python3.10** (LinuxMint 21.3) and **Python3.12** (Windows 10):
34 |
35 | ```shell
36 | sudo apt-get install Python3.10
37 | ```
38 |
39 | This should create the directory `~/soundblaster-x-g6-cli`, containing all files.
40 |
41 | The directory `~/soundblaster-x-g6-cli/shell` contains ready to use shell scripts to toggle or set the device output
42 | of the SoundBlaster X G6. Just set the required file permissions and you should be good to go:
43 |
44 | ```shell
45 | sudo chmod 0544 /home//soundblaster-x-g6-cli/shell/*
46 | ```
47 |
48 | Create a virtual environment and download the dependencies using pip:
49 |
50 | ```shell
51 | # create virtual environment 'venv'
52 | cd /home//soundblaster-x-g6-cli/
53 | python -m venv venv
54 |
55 | # install virtualenv package (if required) and activate 'venv'
56 | pip install virtualenv
57 | virtualenv venv
58 | source venv/bin/activate
59 |
60 | # install dependencies into 'venv'
61 | pip install -r requirements.txt
62 | ```
63 |
64 | ### Linux: Create udev-rule
65 |
66 | In `/etc/udev/rules.d/` create a rule file as root (e.q. with name `50-soundblaster-x-g6.rules`) having the
67 | following content:
68 |
69 | ```
70 | SUBSYSTEM=="usb", ATTRS{idVendor}=="041e", ATTRS{idProduct}=="3256", TAG+="uaccess"
71 | ```
72 |
73 | This allows you (and the application) to access the USB device directly and is mandatory for the application to being
74 | able to send data to the device.
75 |
76 | Apply the udev rules by issuing:
77 | ```shell
78 | # Reload udev rules:
79 | sudo udevadm trigger
80 | ```
81 |
82 | ### Linux: Install libusb1
83 |
84 | The following libusb packages are required:
85 |
86 | ```txt
87 | libusb-1.0-0-dev/jammy-updates,now 2:1.0.25-1ubuntu2 amd64 [installed]
88 | libusb-1.0-0/jammy-updates,now 2:1.0.25-1ubuntu2 amd64 [installed]
89 | ```
90 |
91 | ### Windows: Add libusb-1.0.dll to %PATH%
92 |
93 | Download the package [libusb](https://pypi.org/project/libusb/#files) from Pypi (version `1.0.27`) and add the
94 | following DLL file to your `%PATH%` variable:
95 | `/libusb-1.0.27/src/libusb/_platform/_windows/x64/libusb-1.0.dll`
96 |
97 | This is required to let the application use libusb in the backend.
98 |
99 | ### Conclusion
100 |
101 | The shell scripts in `/home//soundblaster-x-g6-cli/shell/` should now be usable and the installation
102 | is complete.
103 |
104 | ## CLI usage
105 |
106 | ```shell
107 | usage: g6_cli.py [-h] [--toggle-output] [--set-output {Speakers,Headphones}]
108 | [--dry-run] [--set-surround {Enabled,Disabled}]
109 | [--set-surround-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}]
110 | [--set-crystalizer {Enabled,Disabled}]
111 | [--set-crystalizer-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}]
112 | [--set-bass {Enabled,Disabled}]
113 | [--set-bass-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}]
114 | [--set-smart-volume {Enabled,Disabled}]
115 | [--set-smart-volume-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}]
116 | [--set-smart-volume-special-value {Night,Loud}]
117 | [--set-dialog-plus {Enabled,Disabled}]
118 | [--set-dialog-plus-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}]
119 |
120 | SoundBlaster X G6 CLI
121 |
122 | options:
123 | -h, --help show this help message and exit
124 | --toggle-output Toggles the sound output between Speakers and
125 | Headphones
126 | --set-output {Speakers,Headphones}
127 | --dry-run Used to verify the available hex_line files, without
128 | making any calls against the G6 device.
129 | --set-surround {Enabled,Disabled}
130 | Enables or disables the Surround sound effect:
131 | ['Enabled', 'Disabled']
132 | --set-surround-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}
133 | Set the value for the Surround sound effect as
134 | integer: [0 .. 100].
135 | --set-crystalizer {Enabled,Disabled}
136 | Enables or disables the Crystalizer sound effect:
137 | ['Enabled', 'Disabled']
138 | --set-crystalizer-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}
139 | Set the value for the Crystalizer sound effect as
140 | integer: [0 .. 100].
141 | --set-bass {Enabled,Disabled}
142 | Enables or disables the Bass sound effect: ['Enabled',
143 | 'Disabled']
144 | --set-bass-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}
145 | Set the value for the Bass sound effect as integer: [0
146 | .. 100].
147 | --set-smart-volume {Enabled,Disabled}
148 | Enables or disables the Smart-Volume sound effect:
149 | ['Enabled', 'Disabled']
150 | --set-smart-volume-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}
151 | Set the value for the Smart-Volume sound effect as
152 | value: [0 .. 100].
153 | --set-smart-volume-special-value {Night,Loud}
154 | Set the value for the Smart-Volume sound effect as
155 | string: 'Night', 'Loud'. Supersedes the value from '--
156 | set-smart-volume-value'!
157 | --set-dialog-plus {Enabled,Disabled}
158 | Enables or disables the Dialog-Plus sound effect:
159 | ['Enabled', 'Disabled']
160 | --set-dialog-plus-value {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}
161 | Set the value for the Dialog-Plus sound effect as
162 | integer: : [0 .. 100].
163 | ```
164 |
165 | # G6 USB specification
166 |
167 | I reverse engineered the USB specification by recording the USB communication using
168 | [Wireshark USBPCAP](https://wiki.wireshark.org/CaptureSetup/USB) and making conclusions of the HEX codes being
169 | transmitted from
170 | [SoundBlaster Command](https://support.creative.com/Products/ProductDetails.aspx?prodID=21383&prodName=Sound%20Blaster)
171 | to the device:
172 |
173 | See: [usb-spec.txt](./doc/usb-spec.txt)
174 |
175 | # USB protocol
176 |
177 | The following file contains some basic information about the USB protocol:
178 |
179 | See: [usb-protocol.md](./doc/usb-protocol.md)
180 |
--------------------------------------------------------------------------------
/g6_spec.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 | from g6_util import read_payload_as_hex_lines
4 |
5 |
6 | class StaticsEnum(Enum):
7 | PREFIX = 0
8 | INTERMEDIATE = 1
9 |
10 |
11 | class RequestTypeEnum(Enum):
12 | DATA = 0
13 | COMMIT = 1
14 |
15 |
16 | class AudioFeatureEnum(Enum):
17 | SURROUND = 0
18 | CRYSTALIZER = 1
19 | BASS = 2
20 | SMART_VOLUME = 3
21 | DIALOG_PLUS = 4
22 |
23 |
24 | class AudioFeatureSpecialValueEnum(Enum):
25 | SMART_VOLUME_NIGHT = 0
26 | SMART_VOLUME_LOUD = 1
27 |
28 |
29 | class AudioFeature:
30 | def __init__(self, toggle_hex, slider_hex):
31 | self.toggle_hex = toggle_hex
32 | self.slider_hex = slider_hex
33 |
34 |
35 | class AudioFeatureExtended(AudioFeature):
36 | def __init__(self, toggle_hex, slider_hex, slider_special_hex, slider_special_enabled_value_hex,
37 | slider_special_disabled_value_hex):
38 | super().__init__(toggle_hex, slider_hex)
39 | self.slider_special_hex = slider_special_hex
40 | self.slider_special_enabled_value_hex = slider_special_enabled_value_hex
41 | self.slider_special_disabled_value_hex = slider_special_disabled_value_hex
42 |
43 |
44 | class Audio:
45 | def __init__(self, payload_number_values_hex_path):
46 | # define static hex values
47 | self.static_dict = {
48 | StaticsEnum.PREFIX: 0x5a,
49 | StaticsEnum.INTERMEDIATE: 0x0196
50 | }
51 | # define request type hex values
52 | self.request_type_dict = {
53 | RequestTypeEnum.DATA: 0x1207,
54 | RequestTypeEnum.COMMIT: 0x1103
55 | }
56 | # define audio feature hex values
57 | self.audio_feature_dict = {
58 | AudioFeatureEnum.SURROUND: AudioFeature(0x00, 0x01),
59 | AudioFeatureEnum.CRYSTALIZER: AudioFeature(0x07, 0x08),
60 | AudioFeatureEnum.BASS: AudioFeature(0x18, 0x19),
61 | AudioFeatureEnum.SMART_VOLUME: AudioFeatureExtended(0x04, 0x05, 0x06,
62 | 0x0000803f,
63 | 0x00000040),
64 | AudioFeatureEnum.DIALOG_PLUS: AudioFeature(0x02, 0x03)
65 | }
66 | # parse number hex values
67 | self.number_value_dict = {}
68 | hex_lines = read_payload_as_hex_lines(payload_number_values_hex_path)
69 | # check the file's number of lines
70 | expected_line_count = 202
71 | if not len(hex_lines) == expected_line_count:
72 | raise RuntimeError(
73 | f"The file {payload_number_values_hex_path} seems to be corrupted, since it does not contain the "
74 | f"expected {expected_line_count} lines! Aborting execution.")
75 | # read from every even line, which is a 'Data' line containing a number's value (from 0-100)
76 | expected_line_length = 128
77 | for i in range(0, len(hex_lines), 2):
78 | hex_line = hex_lines[i]
79 | # check hex_line length
80 | if len(hex_line) != expected_line_length:
81 | raise RuntimeError(f"The file {payload_number_values_hex_path} seems to be corrupted."
82 | f"Expected the hex_line '{hex_lines}' to have a length of {expected_line_length} "
83 | f"characters, but it had {len(hex_line)} characters!")
84 | # check hex_line containing Data request type ('1207')
85 | if not hex_line.__contains__(self.__to_hex_str(self.request_type_dict[RequestTypeEnum.DATA])):
86 | raise RuntimeError(f"The file {payload_number_values_hex_path} seems to be corrupted."
87 | f"The hex_line '{hex_lines}' does not contain the expected 'DATA' request type:"
88 | f" '{str(self.request_type_dict[RequestTypeEnum.DATA])}'!")
89 | self.number_value_dict[int(i / 2)] = int(hex_line[12:20], 16)
90 |
91 | def build_hex_lines_toggle(self, audio_feature_enum, enabled):
92 | """
93 | Build a list of 64 byte hex-line commands for the given AudioFeature's toggle.
94 | :param audio_feature_enum: the enum value of the AudioFeature to build the hex-line for
95 | :param enabled: the boolean value, whether to enable or disable the AudioFeature.
96 | :return: a list of hex-line commands, designated being sent to the G6.
97 | """
98 | if type(audio_feature_enum) is not AudioFeatureEnum:
99 | raise ValueError(f'Argument \'audio_feature_enum\' should be of type \'{type(AudioFeatureEnum)}\','
100 | f' but was \'{type(audio_feature_enum)}\'!')
101 | if type(enabled) is not bool:
102 | raise ValueError(f'Argument \'enabled\' should be of type \'{type(bool)}\','
103 | f' but was \'{type(enabled)}\'!')
104 |
105 | audio_feature_hex = self.audio_feature_dict[audio_feature_enum].toggle_hex
106 | value_hex = self.number_value_dict[100] if enabled else self.number_value_dict[0]
107 |
108 | return [
109 | self.__build_hex_line(RequestTypeEnum.DATA, audio_feature_hex, value_hex),
110 | self.__build_hex_line(RequestTypeEnum.COMMIT, audio_feature_hex, 0)
111 | ]
112 |
113 | def build_hex_lines_slider(self, audio_feature_enum, value):
114 | """
115 | Build a list of 64 byte hex-line commands for the given AudioFeature's slider value.
116 | :param audio_feature_enum: the enum value of the AudioFeature to build the hex-line for
117 | :param value: the integer value for the slider of the corresponding AudioFeature (0 - 100)
118 | :return: a list of hex-line commands, designated being sent to the G6.
119 | """
120 | if type(audio_feature_enum) is not AudioFeatureEnum:
121 | raise ValueError(f'Argument \'audio_feature_enum\' should be of type \'{type(AudioFeatureEnum)}\','
122 | f' but was \'{type(audio_feature_enum)}\'!')
123 | if type(value) is not int:
124 | raise ValueError(f'Argument \'value\' should be of type \'{type(int)}\','
125 | f' but was \'{type(value)}\'!')
126 | if value < 0 or value > 100:
127 | raise ValueError(f'Argument \'value\' should be between \'0\' and \'100\', but was \'{value}\'!')
128 |
129 | audio_feature_hex = self.audio_feature_dict[audio_feature_enum].slider_hex
130 | value_hex = self.number_value_dict[value]
131 |
132 | return [
133 | self.__build_hex_line(RequestTypeEnum.DATA, audio_feature_hex, value_hex),
134 | self.__build_hex_line(RequestTypeEnum.COMMIT, audio_feature_hex, 0)
135 | ]
136 |
137 | def build_hex_lines_slider_special(self, audio_feature_enum, audio_feature_special_value_enum):
138 | """
139 | Build a list of 64 byte hex-line commands for the given AudioFeature's slider special value.
140 | :param audio_feature_enum: the enum value of the AudioFeature to build the hex-line for
141 | :param audio_feature_special_value_enum: the value to set as AudioFeatureSpecialValueEnum enum value
142 | :return: a list of hex-line commands, designated being sent to the G6.
143 | """
144 | if type(audio_feature_enum) is not AudioFeatureEnum:
145 | raise ValueError(f'Argument \'audio_feature_enum\' should be of type \'{type(AudioFeatureEnum)}\','
146 | f' but was \'{type(audio_feature_enum)}\'!')
147 | if type(audio_feature_special_value_enum) is not AudioFeatureSpecialValueEnum:
148 | raise ValueError(f'Argument \'audio_feature_special_value_enum\' should be of type '
149 | f'\'{type(AudioFeatureSpecialValueEnum)}\','
150 | f' but was \'{type(audio_feature_special_value_enum)}\'!')
151 |
152 | if audio_feature_enum is AudioFeatureEnum.SMART_VOLUME and \
153 | (audio_feature_special_value_enum is AudioFeatureSpecialValueEnum.SMART_VOLUME_NIGHT
154 | or audio_feature_special_value_enum is AudioFeatureSpecialValueEnum.SMART_VOLUME_LOUD):
155 | audio_feature_hex = self.audio_feature_dict[audio_feature_enum].slider_special_hex
156 | value_hex = self.audio_feature_dict[audio_feature_enum].slider_special_enabled_value_hex \
157 | if audio_feature_special_value_enum is AudioFeatureSpecialValueEnum.SMART_VOLUME_LOUD \
158 | else self.audio_feature_dict[audio_feature_enum].slider_special_disabled_value_hex
159 | else:
160 | raise ValueError(f'Unexpected combination of audio_feature_enum \'{audio_feature_enum}\' and '
161 | f'audio_feature_special_value_enum \'{audio_feature_special_value_enum}\'!')
162 |
163 | return [
164 | self.__build_hex_line(RequestTypeEnum.DATA, audio_feature_hex, value_hex),
165 | self.__build_hex_line(RequestTypeEnum.COMMIT, audio_feature_hex, 0)
166 | ]
167 |
168 | def __build_hex_line(self, request_type_enum, audio_feature_hex, value_hex):
169 | if type(request_type_enum) is not RequestTypeEnum:
170 | raise ValueError(f'Argument \'request_type_enum\' should be of type \'{type(RequestTypeEnum)}\','
171 | f' but was \'{type(request_type_enum)}\'!')
172 | if type(audio_feature_hex) is not int:
173 | raise ValueError(f'Argument \'audio_feature_hex\' should be of type \'{type(int)}\','
174 | f' but was \'{type(audio_feature_hex)}\'!')
175 | if type(value_hex) is not int:
176 | raise ValueError(f'Argument \'value_hex\' should be of type \'{type(int)}\','
177 | f' but was \'{type(value_hex)}\'!')
178 |
179 | static_prefix = self.__to_hex_str(self.static_dict[StaticsEnum.PREFIX]).zfill(2)
180 | request_type = self.__to_hex_str(self.request_type_dict[request_type_enum]).zfill(4)
181 | static_intermediate = self.__to_hex_str(self.static_dict[StaticsEnum.INTERMEDIATE]).zfill(4)
182 | audio_feature = self.__to_hex_str(audio_feature_hex).zfill(2)
183 | value = self.__to_hex_str(value_hex).zfill(8)
184 |
185 | assembled = f'{static_prefix}{request_type}{static_intermediate}{audio_feature}{value}'
186 | assembled_len = len(assembled)
187 | if assembled_len != 20:
188 | raise RuntimeError(f'The assembled hex_line part should have 20 characters, but it'
189 | f' had {assembled_len}: \'{assembled}\'!')
190 |
191 | hex_line = assembled + '0' * 108
192 | hex_line_len = len(hex_line)
193 | if hex_line_len != 128:
194 | raise RuntimeError(f'The assembled hex_line should have 128 characters, but it'
195 | f' had {hex_line_len}: \'{hex_line}\'!')
196 |
197 | return hex_line
198 |
199 | @staticmethod
200 | def __to_hex_str(int_value):
201 | return format(int_value, 'x')
202 |
--------------------------------------------------------------------------------
/doc/usb-protocol.md:
--------------------------------------------------------------------------------
1 | # USB protocol
2 |
3 | This chapter contains some notes about the USB protocol.
4 |
5 | **Note that most of the information has been generated
6 | using ChatGPT and is not verified by any literature!**
7 |
8 | ## USB Descriptors
9 |
10 | In a USB device's descriptor response, the association between an endpoint and an interface is explicitly defined within
11 | the Configuration Descriptor. The Configuration Descriptor contains one or more Interface Descriptors, and each
12 | Interface Descriptor can include one or more Endpoint Descriptors. This hierarchy is used to describe how endpoints are
13 | linked to interfaces.
14 |
15 | ### Configuration Descriptor
16 |
17 | The Configuration Descriptor provides an overview of the entire configuration, including the number of interfaces it
18 | contains.
19 |
20 | ```
21 | Configuration Descriptor:
22 | bLength 9
23 | bDescriptorType 2
24 | wTotalLength 34
25 | bNumInterfaces 1
26 | bConfigurationValue 1
27 | iConfiguration 0
28 | bmAttributes 0x80
29 | MaxPower 50
30 | ```
31 |
32 | ### Interface Descriptor
33 |
34 | Each Interface Descriptor provides information about a specific interface, including the number of endpoints associated
35 | with that interface.
36 |
37 | In the context of USB (Universal Serial Bus), `bDescriptorType` is a field within a descriptor that specifies the type
38 | of descriptor being used. Descriptors are data structures that provide information about the USB device, its
39 | configuration, interface, and endpoints. Each descriptor type is assigned a specific numerical value.
40 |
41 | When `bDescriptorType` has a value of `4`, it indicates an **Interface Descriptor**. The Interface Descriptor provides
42 | information about a specific interface within a configuration of the USB device. It includes details such as the number
43 | of endpoints used by the interface, the class, subclass, and protocol code, and the string descriptor describing the
44 | interface.
45 |
46 | Here’s a breakdown of the fields within an Interface Descriptor:
47 |
48 | - **bLength**: Size of this descriptor in bytes.
49 | - **bDescriptorType**: Descriptor type, which is `4` for an Interface Descriptor.
50 | - **bInterfaceNumber**: Number identifying this interface.
51 | - **bAlternateSetting**: Value used to select an alternate setting for this interface.
52 | - **bNumEndpoints**: Number of endpoints used by this interface (excluding the default control endpoint).
53 | - **bInterfaceClass**: Class code (assigned by the USB-IF).
54 | - **bInterfaceSubClass**: Subclass code (assigned by the USB-IF).
55 | - **bInterfaceProtocol**: Protocol code (assigned by the USB-IF).
56 | - **iInterface**: Index of string descriptor describing this interface.
57 |
58 | An example of an Interface Descriptor might look like this in a USB device descriptor table:
59 |
60 | ```
61 | Interface Descriptor:
62 | bLength 9
63 | bDescriptorType 4
64 | bInterfaceNumber 0
65 | bAlternateSetting 0
66 | bNumEndpoints 1
67 | bInterfaceClass 3 Human Interface Device
68 | bInterfaceSubClass 1 Boot Interface Subclass
69 | bInterfaceProtocol 1 Keyboard
70 | iInterface 0
71 | ```
72 |
73 | This example describes a Human Interface Device (HID) interface that uses one endpoint, belongs to the Boot Interface
74 | Subclass, and follows the Keyboard protocol.
75 |
76 | Understanding the value of `bDescriptorType` and its associated descriptor is crucial for correctly interpreting the
77 | capabilities and structure of a USB device.
78 |
79 | ### Endpoint Descriptor
80 |
81 | Each Endpoint Descriptor provides information about a specific endpoint, including its address and attributes.
82 |
83 | When `bDescriptorType` has a value of `5` in a USB descriptor, it refers to an **Endpoint Descriptor**. Endpoint
84 | Descriptors provide information about the endpoints used by a USB device interface. Each endpoint, other than the
85 | default control endpoint (endpoint 0), must have an associated Endpoint Descriptor.
86 |
87 | Here’s a breakdown of the fields within an Endpoint Descriptor:
88 |
89 | - **bLength**: Size of this descriptor in bytes.
90 | - **bDescriptorType**: Descriptor type, which is `5` for an Endpoint Descriptor.
91 | - **bEndpointAddress**: The address of the endpoint on the USB device. This field specifies the endpoint number and
92 | direction (IN or OUT).
93 | - **bmAttributes**: Attributes that specify the endpoint’s transfer type (Control, Isochronous, Bulk, or Interrupt) and
94 | other characteristics.
95 | - **wMaxPacketSize**: The maximum packet size this endpoint is capable of sending or receiving.
96 | - **bInterval**: Interval for polling the endpoint for data transfers, in milliseconds (relevant for interrupt and
97 | isochronous endpoints).
98 |
99 | An example of an Endpoint Descriptor might look like this:
100 |
101 | ```
102 | Endpoint Descriptor:
103 | bLength 7
104 | bDescriptorType 5
105 | bEndpointAddress 81h (EP 1 IN)
106 | bmAttributes 03h (Interrupt)
107 | wMaxPacketSize 0008h (8 bytes)
108 | bInterval 0Ah (10 ms)
109 | ```
110 |
111 | #### Detailed Explanation of Fields:
112 |
113 | 1. **bLength (1 byte)**:
114 | - The size of the descriptor in bytes. For an Endpoint Descriptor, this is typically 7 bytes.
115 |
116 | 2. **bDescriptorType (1 byte)**:
117 | - The type of descriptor. For an Endpoint Descriptor, this value is `5`.
118 |
119 | 3. **bEndpointAddress (1 byte)**:
120 | - The address of the endpoint. The most significant bit (bit 7) indicates the direction (0 for OUT, 1 for IN). The
121 | remaining bits (bits 0-3) specify the endpoint number.
122 |
123 | 4. **bmAttributes (1 byte)**:
124 | - Attributes of the endpoint. The lower two bits specify the transfer type (00 = Control, 01 = Isochronous, 10 =
125 | Bulk, 11 = Interrupt). The rest of the bits may specify additional characteristics depending on the transfer type.
126 |
127 | 5. **wMaxPacketSize (2 bytes)**:
128 | - The maximum packet size that the endpoint can handle. This value is expressed in bytes and may include additional
129 | information about the number of transactions per microframe for high-speed endpoints.
130 |
131 | 6. **bInterval (1 byte)**:
132 | - The polling interval for the endpoint in milliseconds. This field is mainly relevant for interrupt and isochronous
133 | endpoints, indicating how often the endpoint should be polled for data transfers.
134 |
135 | #### Example Breakdown:
136 |
137 | ```
138 | Endpoint Descriptor:
139 | bLength 7 // Descriptor size in bytes
140 | bDescriptorType 5 // Endpoint Descriptor type
141 | bEndpointAddress 81h (EP 1 IN) // Endpoint 1, IN direction
142 | bmAttributes 03h (Interrupt) // Interrupt transfer type
143 | wMaxPacketSize 0008h (8 bytes) // Max packet size is 8 bytes
144 | bInterval 0Ah (10 ms) // Polling interval is 10 ms
145 | ```
146 |
147 | This example describes an interrupt IN endpoint (endpoint 1) with a maximum packet size of 8 bytes and a polling
148 | interval of 10 milliseconds.
149 |
150 | ## USB Interface classes
151 |
152 | In the USB specification, the `bInterfaceClass` field in the Interface Descriptor indicates the class of the interface.
153 | USB defines several standard interface classes, each serving different purposes. Here are some of the most
154 | common `bInterfaceClass` values along with their descriptions:
155 |
156 | 1. **Audio (Class Code 01h)**:
157 | - This class is used for audio devices such as microphones, speakers, and audio interfaces.
158 |
159 | 2. **Communication and CDC Control (Class Code 02h)**:
160 | - This class includes devices such as modems, Ethernet adapters, and serial ports.
161 |
162 | 3. **Human Interface Device (HID) (Class Code 03h)**:
163 | - HID devices include keyboards, mice, game controllers, and other human interface devices.
164 |
165 | 4. **Physical Interface Device (PID) (Class Code 05h)**:
166 | - PID devices are used for physical input devices like joysticks, knobs, and buttons.
167 |
168 | 5. **Image (Class Code 06h)**:
169 | - This class includes imaging devices such as cameras and scanners.
170 |
171 | 6. **Printer (Class Code 07h)**:
172 | - Printers and printing-related devices belong to this class.
173 |
174 | 7. **Mass Storage (Class Code 08h)**:
175 | - Mass storage devices include USB flash drives, external hard drives, and memory card readers.
176 |
177 | 8. **Hub (Class Code 09h)**:
178 | - Hubs are devices that provide additional USB ports for connecting multiple devices.
179 |
180 | 9. **CDC-Data (Class Code 0Ah)**:
181 | - This class is used for communication devices that transfer data, such as Ethernet adapters.
182 |
183 | 10. **Smart Card (Class Code 0Bh)**:
184 | - Smart card readers and related devices are classified under this class.
185 |
186 | 11. **Content Security (Class Code 0Dh)**:
187 | - Devices related to content protection and security belong to this class.
188 |
189 | 12. **Video (Class Code 0Eh)**:
190 | - Video devices such as webcams and video capture devices fall under this class.
191 |
192 | 13. **Personal Healthcare (Class Code 0Fh)**:
193 | - Devices related to personal healthcare and fitness monitoring are classified under this class.
194 |
195 | 14. **Diagnostic Device (Class Code DC, Subclass FEh)**:
196 | - Diagnostic devices used for testing and debugging USB communications.
197 |
198 | These are just some of the standard USB interface classes defined by the USB specification. There are additional
199 | vendor-specific and proprietary classes as well. Each class defines a set of protocols and specifications that devices
200 | must adhere to for interoperability.
201 |
202 | ## USB data transfer types
203 |
204 | USB supports four main types of data transfers, each tailored for specific purposes and with distinct characteristics.
205 | These transfer types are:
206 |
207 | 1. **Control Transfers**:
208 | - **Purpose**: Control transfers are used for device configuration, enumeration, and control operations.
209 | - **Characteristics**:
210 | - Low speed (1.5 Mbps), full speed (12 Mbps), or high speed (480 Mbps).
211 | - Guaranteed delivery with error checking and retry mechanisms.
212 | - Bidirectional communication.
213 | - Limited bandwidth allocation.
214 | - **Usage**: Used for device initialization, configuration changes, and standard device requests (such as getting
215 | device descriptors or setting device configuration).
216 |
217 | 2. **Bulk Transfers**:
218 | - **Purpose**: Bulk transfers are used for large, non-time-sensitive data transfers.
219 | - **Characteristics**:
220 | - Typically used in high-speed and full-speed USB.
221 | - Reliability ensured through error detection and retransmission (in USB 2.0).
222 | - Not time-sensitive; designed for large data transfers that can tolerate delays.
223 | - **Usage**: Commonly used for transferring large amounts of data like file transfers, printing, or reading/writing
224 | from storage devices.
225 |
226 | 3. **Interrupt Transfers**:
227 | - **Purpose**: Interrupt transfers are used for low-volume, time-sensitive data transfers with bounded latency
228 | requirements.
229 | - **Characteristics**:
230 | - Low or full-speed USB.
231 | - Guaranteed maximum latency for each transfer.
232 | - Relatively low bandwidth allocation.
233 | - **Usage**: Suitable for time-sensitive data such as human interface devices (HID) like keyboards, mice, and game
234 | controllers, where low latency is crucial.
235 |
236 | 4. **Isochronous Transfers**:
237 | - **Purpose**: Isochronous transfers are used for streaming data with a fixed, guaranteed bandwidth and timing
238 | requirements.
239 | - **Characteristics**:
240 | - Continuous data streaming without error recovery.
241 | - No guaranteed delivery or error checking.
242 | - Used in real-time applications where maintaining a consistent data flow is more critical than ensuring
243 | error-free delivery.
244 | - **Usage**: Used for audio and video streaming, where maintaining a continuous flow of data is more important than
245 | ensuring every single piece of data arrives intact.
246 |
247 | ### Summary:
248 |
249 | - **Control Transfers**: Used for configuration and control operations.
250 | - **Bulk Transfers**: Suitable for large, non-time-sensitive data transfers.
251 | - **Interrupt Transfers**: Ideal for low-volume, time-sensitive data transfers.
252 | - **Isochronous Transfers**: Designed for streaming data with fixed bandwidth and timing requirements.
253 |
254 | Each transfer type offers unique advantages and is chosen based on the specific requirements of the USB device and its
255 | intended use case.
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 |
294 | Copyright (C)
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | , 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/g6_cli.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import os.path
3 | import re
4 | import tempfile
5 | import hid
6 |
7 | from g6_spec import Audio, AudioFeatureEnum, AudioFeatureSpecialValueEnum
8 | from g6_util import read_payload_as_hex_lines
9 |
10 | # G6 specific USB information
11 | G6_VENDOR_ID = 0x041e
12 | G6_PRODUCT_ID = 0x3256
13 | # The G6 has four interface (2 Audio and 2 HDI), the endpoint of the fourth interface is used by SoundBlaster Connect.
14 | # So will we, since data sent to the third interface is ignored by the device.
15 | G6_INTERFACE = 4
16 | # The name of the temporary file to remember the last toggle state in. If the file could not be found. The program
17 | # lets the G6 to toggle to Speakers by default.
18 | TOGGLE_STATE_TEMP_FILE_NAME = 'g6-cli-toggle-state'
19 | TOGGLE_STATE_SPEAKERS = 'Speakers'
20 | TOGGLE_STATE_HEADPHONES = 'Headphones'
21 | # The payloads available to send to the G6
22 | PAYLOAD_DIR_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'payloads')
23 | PAYLOAD_TOGGLE_TO_HEADPHONES_PATH = os.path.join(PAYLOAD_DIR_PATH, 'toggle-output-to-headphones.hex')
24 | PAYLOAD_TOGGLE_TO_SPEAKERS_PATH = os.path.join(PAYLOAD_DIR_PATH, 'toggle-output-to-speakers.hex')
25 | PAYLOAD_NUMBER_VALUES_PATH = os.path.join(PAYLOAD_DIR_PATH, '0-100.hex')
26 | PAYLOAD_HEX_LINE_PATTERN = r'^[a-f0-9]{128}$'
27 | # The udev rule to create in /etc/udev/rules.d/50-soundblaster-x-g6.rules
28 | UDEV_RULE = r'SUBSYSTEM=="usb", ATTRS{idVendor}=="041e", ATTRS{idProduct}=="3256", TAG+="uaccess"'
29 |
30 |
31 | def parse_cli_args():
32 | """
33 | Parse the CLI arguments using argparse.
34 | Prints the CLI help to console and raises an error, if the arguments are invalid.
35 | :return: the parsed cli args object
36 | """
37 | numbers = [i for i in range(0, 101)]
38 | enabled_disabled = ['Enabled', 'Disabled']
39 |
40 | parser = argparse.ArgumentParser(description='SoundBlaster X G6 CLI')
41 | #
42 | # Base options
43 | #
44 | # -- toggle-output
45 | parser.add_argument('--toggle-output', required=False, action='store_true',
46 | help='Toggles the sound output between Speakers and Headphones')
47 | # --set-output
48 | parser.add_argument('--set-output', required=False, type=str,
49 | choices=[TOGGLE_STATE_SPEAKERS, TOGGLE_STATE_HEADPHONES])
50 | # --dry-run
51 | parser.add_argument('--dry-run', required=False, action='store_true',
52 | help='Used to verify the available hex_line files, without making '
53 | 'any calls against the G6 device.')
54 | #
55 | # Sound Effects
56 | #
57 | # --set-surround
58 | parser.add_argument('--set-surround', required=False, type=str, choices=enabled_disabled,
59 | help='Enables or disables the Surround sound effect: [\'Enabled\', \'Disabled\']')
60 | parser.add_argument('--set-surround-value', required=False, type=int, choices=numbers,
61 | help='Set the value for the Surround sound effect as integer: [0 .. 100].')
62 | # --set-crystalizer
63 | parser.add_argument('--set-crystalizer', required=False, type=str, choices=enabled_disabled,
64 | help='Enables or disables the Crystalizer sound effect: [\'Enabled\', \'Disabled\']')
65 | parser.add_argument('--set-crystalizer-value', required=False, type=int, choices=numbers,
66 | help='Set the value for the Crystalizer sound effect as integer: [0 .. 100].')
67 | # --set-bass
68 | parser.add_argument('--set-bass', required=False, type=str, choices=enabled_disabled,
69 | help='Enables or disables the Bass sound effect: [\'Enabled\', \'Disabled\']')
70 | parser.add_argument('--set-bass-value', required=False, type=int, choices=numbers,
71 | help='Set the value for the Bass sound effect as integer: [0 .. 100].')
72 | # --set-smart-volume
73 | parser.add_argument('--set-smart-volume', required=False, type=str, choices=enabled_disabled,
74 | help='Enables or disables the Smart-Volume sound effect: [\'Enabled\', \'Disabled\']')
75 | parser.add_argument('--set-smart-volume-value', required=False, type=int, choices=numbers,
76 | help='Set the value for the Smart-Volume sound effect as value: [0 .. 100].')
77 | parser.add_argument('--set-smart-volume-special-value', required=False, type=str, choices=['Night', 'Loud'],
78 | help='Set the value for the Smart-Volume sound effect as string: \'Night\', \'Loud\'. '
79 | 'Supersedes the value from \'--set-smart-volume-value\'!')
80 | # --set-dialog-plus
81 | parser.add_argument('--set-dialog-plus', required=False, type=str, choices=enabled_disabled,
82 | help='Enables or disables the Dialog-Plus sound effect: [\'Enabled\', \'Disabled\']')
83 | parser.add_argument('--set-dialog-plus-value', required=False, type=int, choices=numbers,
84 | help='Set the value for the Dialog-Plus sound effect as integer: : [0 .. 100].')
85 |
86 | # parse args and verify
87 | args = parser.parse_args()
88 | if args.toggle_output is False \
89 | and args.set_output is None \
90 | and args.set_surround is None \
91 | and args.set_surround_value is None \
92 | and args.set_crystalizer is None \
93 | and args.set_crystalizer_value is None \
94 | and args.set_bass is None \
95 | and args.set_bass_value is None \
96 | and args.set_smart_volume is None \
97 | and args.set_smart_volume_value is None \
98 | and args.set_smart_volume_special_value is None \
99 | and args.set_dialog_plus is None \
100 | and args.set_dialog_plus_value is None:
101 | message = 'No meaningful argument has been specified!'
102 | print(message)
103 | parser.print_help()
104 | raise ValueError(message)
105 | elif args.toggle_output is True and args.set_output is not None:
106 | message = 'Only one of the following CLI arguments may be specified: \'--toggle-output', '--set-output\'!'
107 | print(message)
108 | parser.print_help()
109 | raise ValueError(message)
110 |
111 | return args
112 |
113 |
114 | def detect_device():
115 | """
116 | Tries to detect the SoundBlaster X G6 device and returns the device path to it.
117 |
118 | From all connected USB HID devices, we filter all devices which do not match the desired vendor_id and product_id.
119 | Since we know, that we have to communicate with USB-Interface 4, we also filter all other interfaces of the device.
120 | This approach is required, because the G6's endpoint of the third HID interface ignores any data transmitted to
121 | it. We have to use the endpoint of the fourth interface!
122 |
123 | If the device itself or the fourth interface could not be found, an IOError is risen to let the program terminate.
124 |
125 | Example for a device_path: "b'5-2.1:1.4'"
126 | - Bus 5
127 | - Port 2 (USB-Hub at Bus)
128 | - Port 1 (G6 at Hub)
129 | - bConfigurationValue 1
130 | - Interface 4
131 |
132 | A tree output of all connected USB devices can be generated with the command `lsusb -t`.
133 | :return: The unique device_path to the G6.
134 | """
135 | device_found = False
136 | for device_dict in hid.enumerate():
137 | if device_dict['vendor_id'] == G6_VENDOR_ID and device_dict['product_id']:
138 | device_found = True
139 | if G6_PRODUCT_ID and device_dict['interface_number'] == G6_INTERFACE:
140 | device_path = device_dict['path']
141 | print(f'Device detected at path: {device_path}')
142 | return device_path
143 | if device_found:
144 | raise IOError(
145 | f"The SoundBlaster X G6 device could be found having vendor_id='{G6_VENDOR_ID:#x}' and product_id"
146 | f"='{G6_PRODUCT_ID:#x}'. But the required fourth HDI interface does not seem to be available. "
147 | f"Something is wrong here, and thus, the program execution is terminated!")
148 | else:
149 | raise IOError(
150 | f"No SoundBlaster X G6 device could be found having vendor_id='{G6_VENDOR_ID:#x}' and "
151 | f"product_id='{G6_PRODUCT_ID:#x}'. Is the device connected to your system? Are you allowed to access the "
152 | f"device (missing udev-rules in linux)?")
153 |
154 |
155 | def list_all_devices():
156 | """
157 | Simply prints information of all detected usb devices to the console
158 | """
159 | for device_dict in hid.enumerate():
160 | keys = list(device_dict.keys())
161 | keys.sort()
162 | for key in keys:
163 | print("%s : %s" % (key, device_dict[key]))
164 | print()
165 |
166 |
167 | def read_toggle_state_file(toggle_state_file_path):
168 | """
169 | Read the toggle state from the temporary file to determine the state from previous runs.
170 | :param toggle_state_file_path: The path to the file, where the last toggle state has been remembered in.
171 | :return: The content of the file. Should be either 'Speakers' or 'Headphones'.
172 | """
173 | with open(toggle_state_file_path, 'r') as file:
174 | return file.read()
175 |
176 |
177 | def write_toggle_state_file(toggle_state_file_path, toggle_state_value):
178 | """
179 | Write the currently used toggle_state to the temporary file for next runs.
180 | :param toggle_state_file_path: The path to the file for remembering the last set toggle state.
181 | :param toggle_state_value: The toggle state to write to the file. Should be either 'Speakers' or 'Headphones'.
182 | """
183 | with open(toggle_state_file_path, 'w') as file:
184 | file.write(str(toggle_state_value))
185 |
186 |
187 | def determine_toggle_state():
188 | """
189 | Reads the last used toggle_state value from the temporary file to determine the next value.
190 | If the temporary file does not exist, 'Speakers' is used by default.
191 | :return: The just set and now active toggle state value.
192 | """
193 | toggle_state_file_path = os.path.join(tempfile.gettempdir(), TOGGLE_STATE_TEMP_FILE_NAME)
194 | # determine toggle state from temporary file or use SPEAKERS by default
195 | if os.path.exists(toggle_state_file_path):
196 | current_toggle_state = read_toggle_state_file(toggle_state_file_path)
197 | next_toggle_state = TOGGLE_STATE_SPEAKERS \
198 | if current_toggle_state == TOGGLE_STATE_HEADPHONES \
199 | else TOGGLE_STATE_HEADPHONES
200 | print(
201 | f'Toggle from '
202 | f'{current_toggle_state} -> {next_toggle_state}')
203 | else:
204 | next_toggle_state = TOGGLE_STATE_SPEAKERS
205 | print(f'Toggle to {next_toggle_state}')
206 | # write next toggle state to temporary file
207 | write_toggle_state_file(toggle_state_file_path, next_toggle_state)
208 | # return the next toggle state to send it to the G6
209 | return next_toggle_state
210 |
211 |
212 | def device_toggle_output(device_path, dry_run):
213 | """
214 | Toggles the device's output. Either Speakers -> Headphones or Headphones -> Speakers.
215 | :param device_path: The detected usb device path for the G6.
216 | :param dry_run: whether to simulate communication with the device for program testing purposes.
217 | If set to true, no data is sent to the G6!
218 | """
219 | # determine next toggle state
220 | toggle_state = determine_toggle_state()
221 | # determine payload to load
222 | payload_file_path = PAYLOAD_TOGGLE_TO_SPEAKERS_PATH \
223 | if toggle_state == TOGGLE_STATE_HEADPHONES \
224 | else PAYLOAD_TOGGLE_TO_HEADPHONES_PATH
225 | # read payload from file
226 | payload_hex_lines = read_payload_as_hex_lines(payload_file_path)
227 | # send the payload to the device
228 | print(f'About to send payload to device: {payload_file_path}')
229 | send_to_device(device_path, payload_hex_lines, dry_run)
230 |
231 |
232 | def device_set_output(device_path, toggle_state, dry_run):
233 | """
234 | Set a specific device output. Either 'Speakers' or 'Headphones'
235 | :param device_path: The detected usb device path for the G6.
236 | :param toggle_state: the toggle_state value to set the G6's output to. Should be either 'Speakers' or 'Headphones'.
237 | :param dry_run: whether to simulate communication with the device for program testing purposes.
238 | If set to true, no data is sent to the G6!
239 | """
240 | # determine payload to load
241 | if toggle_state == TOGGLE_STATE_SPEAKERS:
242 | payload_file_path = PAYLOAD_TOGGLE_TO_SPEAKERS_PATH
243 | elif toggle_state == TOGGLE_STATE_HEADPHONES:
244 | payload_file_path = PAYLOAD_TOGGLE_TO_HEADPHONES_PATH
245 | else:
246 | raise ValueError(
247 | f'The given toggle_state must either be {TOGGLE_STATE_SPEAKERS} or {TOGGLE_STATE_HEADPHONES}, '
248 | f'but was {toggle_state}!')
249 | # read payload from file
250 | payload_hex_lines = read_payload_as_hex_lines(payload_file_path)
251 | # send the payload to the device
252 | print(f'About to send payload to device: {payload_file_path}')
253 | send_to_device(device_path, payload_hex_lines, dry_run)
254 |
255 |
256 | def device_set_audio_effects(device_path, audio, args):
257 | """
258 | Sends all as CLI args given audio effects to the device.
259 | :param device_path: The detected usb device path for the G6.
260 | :param audio: An instance of the class Audio from g6_spec.py
261 | :param args: the CLI arguments, recently parsed by argparse in parse_cli_args()
262 | """
263 | # surround
264 | if args.set_surround is not None:
265 | hex_lines = audio.build_hex_lines_toggle(AudioFeatureEnum.SURROUND, to_bool(args.set_surround))
266 | send_to_device(device_path, hex_lines, args.dry_run)
267 | if args.set_surround_value is not None:
268 | hex_lines = audio.build_hex_lines_slider(AudioFeatureEnum.SURROUND, args.set_surround_value)
269 | send_to_device(device_path, hex_lines, args.dry_run)
270 | # crystalizer
271 | if args.set_crystalizer is not None:
272 | hex_lines = audio.build_hex_lines_toggle(AudioFeatureEnum.CRYSTALIZER, to_bool(args.set_crystalizer))
273 | send_to_device(device_path, hex_lines, args.dry_run)
274 | if args.set_crystalizer_value is not None:
275 | hex_lines = audio.build_hex_lines_slider(AudioFeatureEnum.CRYSTALIZER, args.set_crystalizer_value)
276 | send_to_device(device_path, hex_lines, args.dry_run)
277 | # bass
278 | if args.set_bass is not None:
279 | hex_lines = audio.build_hex_lines_toggle(AudioFeatureEnum.BASS, to_bool(args.set_bass))
280 | send_to_device(device_path, hex_lines, args.dry_run)
281 | if args.set_bass_value is not None:
282 | hex_lines = audio.build_hex_lines_slider(AudioFeatureEnum.BASS, args.set_bass_value)
283 | send_to_device(device_path, hex_lines, args.dry_run)
284 | # smart-volume
285 | if args.set_smart_volume is not None:
286 | hex_lines = audio.build_hex_lines_toggle(AudioFeatureEnum.SMART_VOLUME, to_bool(args.set_smart_volume))
287 | send_to_device(device_path, hex_lines, args.dry_run)
288 | if args.set_smart_volume_value is not None:
289 | hex_lines = audio.build_hex_lines_slider(AudioFeatureEnum.SMART_VOLUME, args.set_smart_volume_value)
290 | send_to_device(device_path, hex_lines, args.dry_run)
291 | if args.set_smart_volume_special_value is not None:
292 | smart_volume_special_value = None
293 | if args.set_smart_volume_special_value == 'Night':
294 | smart_volume_special_value = AudioFeatureSpecialValueEnum.SMART_VOLUME_NIGHT
295 | elif args.set_smart_volume_special_value == 'Loud':
296 | smart_volume_special_value = AudioFeatureSpecialValueEnum.SMART_VOLUME_LOUD
297 | else:
298 | raise ValueError(f'Expected one of the following values for --smart-volume-special-value: '
299 | f'[\'Night\', \'Loud\'], but was \'{args.set_smart_volume_special_value}\'!')
300 | hex_lines = audio.build_hex_lines_slider_special(AudioFeatureEnum.SMART_VOLUME, smart_volume_special_value)
301 | send_to_device(device_path, hex_lines, args.dry_run)
302 | # dialog-plus
303 | if args.set_dialog_plus is not None:
304 | hex_lines = audio.build_hex_lines_toggle(AudioFeatureEnum.DIALOG_PLUS, to_bool(args.set_dialog_plus))
305 | send_to_device(device_path, hex_lines, args.dry_run)
306 | if args.set_dialog_plus_value is not None:
307 | hex_lines = audio.build_hex_lines_slider(AudioFeatureEnum.DIALOG_PLUS, args.set_dialog_plus_value)
308 | send_to_device(device_path, hex_lines, args.dry_run)
309 |
310 |
311 | def to_bool(enabled_disabled):
312 | """
313 | Converts the given string to a boolean value or raises a ValueError, if an unexpected value is supplied.
314 | :param enabled_disabled: 'Enabled' -> true; 'Disabled' -> false
315 | :return: the converted boolean value
316 | """
317 | if enabled_disabled == 'Enabled':
318 | return True
319 | elif enabled_disabled == 'Disabled':
320 | return False
321 | else:
322 | raise ValueError(f'Argument \'enabled_disabled\' has an unexpected value! Expected either \'Enabled\' or'
323 | f' \'Disabled\', but was \'{enabled_disabled}\'!')
324 |
325 |
326 | def send_to_device(device_path, payload_hex_lines, dry_run):
327 | """
328 | Send the payload_hex_lines to an endpoint from the usb device, identified by the device_path.
329 | :param device_path: The detected usb device path for the G6.
330 | :param payload_hex_lines: A list of hexlines (raw usb payload) to send to the G6.
331 | Each line must be 128 characters long (64 bytes).
332 | :param dry_run: whether to simulate communication with the device for program testing purposes.
333 | If set to true, no data is sent to the G6!
334 | """
335 | try:
336 | print(f"Opening the device '{device_path}' ...")
337 | h = hid.device()
338 | h.open_path(device_path)
339 | print(f"Opening the device '{device_path}': ok.")
340 |
341 | print(f"Manufacturer: '{h.get_manufacturer_string()}'")
342 | print(f"Product: '{h.get_product_string()}'")
343 | print(f"Serial No: '{h.get_serial_number_string()}'")
344 |
345 | # enable non-blocking mode
346 | h.set_nonblocking(1)
347 |
348 | # Validate all hex_lines
349 | regex_pattern = re.compile(PAYLOAD_HEX_LINE_PATTERN)
350 | for hex_line in payload_hex_lines:
351 | if not regex_pattern.fullmatch(hex_line):
352 | raise ValueError(
353 | f"The following hex_line is part of the payload, but it did not match the expected regex pattern! "
354 | f"Pattern: '{PAYLOAD_HEX_LINE_PATTERN}'; "
355 | f"Hex-Line: '{hex_line}'")
356 |
357 | for hex_line in payload_hex_lines:
358 | # Prepend an additional zero byte as report_id to the hex_line. Otherwise, the first byte from the actual
359 | # 64 byte payload is cut off, since it is interpreted as report_id and thus, not sent to the device.
360 | hex_line = '00' + hex_line
361 |
362 | # Convert the hex string to a list of integers
363 | integer_list = [int(hex_line[i:i + 2], 16) for i in range(0, len(hex_line), 2)]
364 |
365 | # send the data to the device
366 | print("Sending data to G6 ...")
367 | print(hex_line)
368 | if dry_run:
369 | print("This is a dry run. No data has been sent!")
370 | else:
371 | h.write(integer_list)
372 | print("Sending data to G6: ok.")
373 |
374 | # read back the response
375 | if not dry_run:
376 | print("Read the response:")
377 | while True:
378 | d = h.read(64)
379 | if d:
380 | print(d)
381 | else:
382 | break
383 |
384 | print("Closing the device")
385 | h.close()
386 |
387 | except IOError as ex:
388 | print(f'Unable to open a connection to the device by path: {device_path}')
389 | print(ex)
390 | print('\nAre the udev rules set and used by the kernel?')
391 | print('Create a udev-rule file at `/etc/udev/rules.d/50-soundblaster-x-g6.rules` with the following content:')
392 | print(UDEV_RULE)
393 | print('\nIf the file already exists, it might not be used by the kernel. Try to reload the configuration with:')
394 | print("`sudo udevadm trigger`")
395 |
396 |
397 | def main():
398 | args = parse_cli_args()
399 | device_path = detect_device()
400 | audio = Audio(PAYLOAD_NUMBER_VALUES_PATH)
401 |
402 | # handle device output
403 | if args.toggle_output:
404 | device_toggle_output(device_path, args.dry_run)
405 | elif args.set_output is not None:
406 | device_set_output(device_path, args.set_output, args.dry_run)
407 |
408 | # handle audio effects
409 | device_set_audio_effects(device_path, audio, args)
410 |
411 |
412 | if __name__ == "__main__":
413 | main()
414 |
--------------------------------------------------------------------------------
/payloads/0-100.hex:
--------------------------------------------------------------------------------
1 | 5a120701960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3 | 5a12070196010ad7233c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5 | 5a12070196010ad7a33c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7 | 5a12070196018fc2f53c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
8 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
9 | 5a12070196010ad7233d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
10 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
11 | 5a1207019601cdcc4c3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
12 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
13 | 5a12070196018fc2753d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
15 | 5a1207019601295c8f3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
16 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
17 | 5a12070196010ad7a33d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
18 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
19 | 5a1207019601ec51b83d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
20 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
21 | 5a1207019601cdcccc3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
22 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
23 | 5a1207019601ae47e13d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
24 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
25 | 5a12070196018fc2f53d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
26 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
27 | 5a1207019601b81e053e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
28 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
29 | 5a1207019601295c0f3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
30 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
31 | 5a12070196019a99193e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
32 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
33 | 5a12070196010ad7233e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
35 | 5a12070196017b142e3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
36 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 | 5a1207019601ec51383e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
38 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
39 | 5a12070196015c8f423e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
40 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
41 | 5a1207019601cdcc4c3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
42 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
43 | 5a12070196013d0a573e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
44 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
45 | 5a1207019601ae47613e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
46 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
47 | 5a12070196011f856b3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
48 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
49 | 5a12070196018fc2753e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
50 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
51 | 5a12070196010000803e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
52 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
53 | 5a1207019601b81e853e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
54 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
55 | 5a1207019601713d8a3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
56 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
57 | 5a1207019601295c8f3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
58 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
59 | 5a1207019601e17a943e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
60 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
61 | 5a12070196019a99993e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
62 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
63 | 5a120701960152b89e3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
64 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
65 | 5a12070196010ad7a33e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
67 | 5a1207019601c3f5a83e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
68 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
69 | 5a12070196017b14ae3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
70 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
71 | 5a12070196013333b33e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
72 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
73 | 5a1207019601ec51b83e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
74 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
75 | 5a1207019601a470bd3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
76 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
77 | 5a12070196015c8fc23e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
78 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
79 | 5a120701960114aec73e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
80 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
81 | 5a1207019601cdcccc3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
82 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
83 | 5a120701960185ebd13e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
84 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
85 | 5a12070196013d0ad73e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
86 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
87 | 5a1207019601f628dc3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
88 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
89 | 5a1207019601ae47e13e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
90 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
91 | 5a12070196016666e63e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
92 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
93 | 5a12070196011f85eb3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
94 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
95 | 5a1207019601d7a3f03e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
96 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
97 | 5a12070196018fc2f53e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
98 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
99 | 5a120701960148e1fa3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
100 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
101 | 5a12070196010000003f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
102 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
103 | 5a12070196015c8f023f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
104 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
105 | 5a1207019601b81e053f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
106 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
107 | 5a120701960114ae073f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
108 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
109 | 5a1207019601713d0a3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
110 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
111 | 5a1207019601cdcc0c3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
112 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
113 | 5a1207019601295c0f3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
114 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
115 | 5a120701960185eb113f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
116 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
117 | 5a1207019601e17a143f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
118 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
119 | 5a12070196013d0a173f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
120 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
121 | 5a12070196019a99193f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
122 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
123 | 5a1207019601f6281c3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
124 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
125 | 5a120701960152b81e3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
126 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
127 | 5a1207019601ae47213f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
128 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
129 | 5a12070196010ad7233f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
130 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
131 | 5a12070196016666263f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
132 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
133 | 5a1207019601c3f5283f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
134 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
135 | 5a12070196011f852b3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
136 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
137 | 5a12070196017b142e3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
138 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
139 | 5a1207019601d7a3303f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
140 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
141 | 5a12070196013333333f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
142 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
143 | 5a12070196018fc2353f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
144 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
145 | 5a1207019601ec51383f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
146 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
147 | 5a120701960148e13a3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
148 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
149 | 5a1207019601a4703d3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
150 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
151 | 5a12070196010000403f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
152 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
153 | 5a12070196015c8f423f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
154 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
155 | 5a1207019601b81e453f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
156 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
157 | 5a120701960114ae473f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
158 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
159 | 5a1207019601713d4a3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
160 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
161 | 5a1207019601cdcc4c3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
162 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
163 | 5a1207019601295c4f3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
164 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
165 | 5a120701960185eb513f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
166 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
167 | 5a1207019601e17a543f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
168 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
169 | 5a12070196013d0a573f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
170 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
171 | 5a12070196019a99593f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
172 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
173 | 5a1207019601f6285c3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
174 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
175 | 5a120701960152b85e3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
176 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
177 | 5a1207019601ae47613f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
178 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
179 | 5a12070196010ad7633f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
180 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
181 | 5a12070196016666663f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
182 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
183 | 5a1207019601c3f5683f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
184 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
185 | 5a12070196011f856b3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
186 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
187 | 5a12070196017b146e3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
188 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
189 | 5a1207019601d7a3703f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
190 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
191 | 5a12070196013333733f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
192 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
193 | 5a12070196018fc2753f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
194 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
195 | 5a1207019601ec51783f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
196 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
197 | 5a120701960148e17a3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
198 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
199 | 5a1207019601a4707d3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
200 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
201 | 5a12070196010000803f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
202 | 5a110301960100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
203 |
--------------------------------------------------------------------------------
/doc/usb-spec.txt:
--------------------------------------------------------------------------------
1 | # Activate Surround
2 | 5a 1207 0196 00 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3 | 5a 1103 0196 00 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4 | =5a
5 | DATA=1207
6 | COMMIT=1103
7 | =0196
8 | Surround=00
9 | =0000
10 | on=803f
11 |
12 | # Deactivate Surround
13 | 5a 1207 0196 00 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14 | 5a 1103 0196 00 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
15 | off=0000
16 | ---
17 |
18 | # Activate Crystalizer
19 | 5a 1207 0196 07 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
20 | 5a 1103 0196 07 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
21 | Crystalizer=07
22 | on=803f
23 |
24 | # Deactivate Crystalizer
25 | 5a 1207 0196 07 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
26 | 5a 1103 0196 07 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
27 | Crystalizer=07
28 | off=0000
29 |
30 | ---
31 |
32 | # Activate Bass
33 | 5a 1207 0196 18 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34 | 5a 1103 0196 18 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
35 | Bass=18
36 |
37 | # Deactivate Bass
38 | 5a 1207 0196 18 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
39 | 5a 1103 0196 18 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
40 | Bass=18
41 |
42 | ---
43 |
44 | # Activate SmartVolume
45 | 5a 1207 0196 04 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
46 | 5a 1103 0196 04 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
47 | SmartVolume=04
48 |
49 | # Deactivate SmartVolume
50 | 5a 1207 0196 04 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
51 | 5a 1103 0196 04 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
52 | SmartVolume=04
53 |
54 | ---
55 |
56 | # Activate Dialog+
57 | 5a 1207 0196 02 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
58 | 5a 1103 0196 02 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
59 | Dialog+=02
60 |
61 | # Deactivate Dialog+
62 | 5a 1207 0196 02 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
63 | 5a 1103 0196 02 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
64 | Dialog+=02
65 |
66 | ---
67 |
68 | # Slider (Crystalizer)
69 |
70 | # 0:
71 | 5a 1207 0196 08 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
72 | 5a 1103 0196 08 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
73 | 08="Crystalizer-Slider" -> (07(=Crystalizer) + 1(=Slider))
74 | value=0000 0000
75 | # 1:
76 | 5a 1207 0196 08 0ad7 233c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
77 | 5a 1103 0196 08 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
78 | value=0ad7 233c
79 | # 2:
80 | 5a 1207 0196 08 0ad7 a33c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
81 | 5a 1103 0196 08 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
82 | # 3:
83 | 5a 1207 0196 08 8fc2 f53c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
84 | 5a 1103 0196 08 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
85 |
86 | ---
87 |
88 | # Slider (Surround)
89 |
90 | # 0:
91 | 5a 1207 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
92 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
93 | 01="Surround-Slider" -> (00(=Surround) + 1(=Slider))
94 | # 1:
95 | 5a 1207 0196 01 0ad7 233c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
96 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
97 | # 2:
98 | 5a 1207 0196 01 0ad7 a33c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
99 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
100 | # 3:
101 | 5a 1207 0196 01 8fc2 f53c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
102 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
103 |
104 | ---
105 |
106 | # Slider (Bass)
107 |
108 | # 1:
109 | 5a 1207 0196 19 0ad7 233c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
110 | 5a 1103 0196 19 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
111 | 19="Bass-Slider" -> (18(=Bass) + 1(=Slider))
112 |
113 | ---
114 |
115 | # Slider (SmartVolume)
116 |
117 | # 1:
118 | 5a 1207 0196 05 0ad7 233c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
119 | 5a 1103 0196 05 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
120 | 05="SmartVolume-Slider" -> (04(=SmartVolume) + 1(=Slider)
121 | # Night(Moon-Symbol)
122 | 5a 1207 0196 06 0000 0040 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
123 | 5a 1103 0196 06 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
124 | 06="SmartVolume-Slider" -> (04(=SmartVolume) + 2(=Slider-Special))
125 | Night=0000 0040
126 |
127 | # Loud(Explosion-Symbol)
128 | 5a 1207 0196 06 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
129 | 5a 1103 0196 06 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
130 | 06="SmartVolume-Slider" -> (04(=SmartVolume) + 2(=Slider-Special))
131 | Loud=0000 803f
132 |
133 | ---
134 |
135 | # Slider (Dialog+)
136 |
137 | # 1:
138 | 5a 1207 0196 03 0ad7 233c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
139 | 5a 1103 0196 03 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
140 | 03="Dialog+-Slider" -> (02(=Dialog+) + 1(=Slider))
141 |
142 | ---
143 |
144 | # Beim Profilwechsel werden nur Unterschiede zwischen den Profilen übertragen.
145 | # Dabei werden die Werte des Sliders (0-100) und des Toggles (on/off) einzeln übertragen.
146 | # Wenn beide (Slider und Toggle) unterschiedlich sind, wird zuerst der Toggle und dann der Slider übermittelt!
147 |
148 | ---
149 |
150 | # 0 - 100
151 | 5a 1207 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
152 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
153 | 5a 1207 0196 01 0ad7 233c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
154 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
155 | 5a 1207 0196 01 0ad7 a33c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
156 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
157 | 5a 1207 0196 01 8fc2 f53c 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
158 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
159 | 5a 1207 0196 01 0ad7 233d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
160 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
161 | 5a 1207 0196 01 cdcc 4c3d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
162 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
163 | 5a 1207 0196 01 8fc2 753d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
164 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
165 | 5a 1207 0196 01 295c 8f3d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
166 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
167 | 5a 1207 0196 01 0ad7 a33d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
168 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
169 | 5a 1207 0196 01 ec51 b83d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
170 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
171 | 5a 1207 0196 01 cdcc cc3d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
172 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
173 | 5a 1207 0196 01 ae47 e13d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
174 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
175 | 5a 1207 0196 01 8fc2 f53d 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
176 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
177 | 5a 1207 0196 01 b81e 053e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
178 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
179 | 5a 1207 0196 01 295c 0f3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
180 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
181 | 5a 1207 0196 01 9a99 193e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
182 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
183 | 5a 1207 0196 01 0ad7 233e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
184 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
185 | 5a 1207 0196 01 7b14 2e3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
186 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
187 | 5a 1207 0196 01 ec51 383e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
188 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
189 | 5a 1207 0196 01 5c8f 423e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
190 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
191 | 5a 1207 0196 01 cdcc 4c3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
192 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
193 | 5a 1207 0196 01 3d0a 573e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
194 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
195 | 5a 1207 0196 01 ae47 613e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
196 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
197 | 5a 1207 0196 01 1f85 6b3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
198 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
199 | 5a 1207 0196 01 8fc2 753e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
200 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
201 | 5a 1207 0196 01 0000 803e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
202 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
203 | 5a 1207 0196 01 b81e 853e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
205 | 5a 1207 0196 01 713d 8a3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
206 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
207 | 5a 1207 0196 01 295c 8f3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
209 | 5a 1207 0196 01 e17a 943e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
210 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
211 | 5a 1207 0196 01 9a99 993e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
212 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
213 | 5a 1207 0196 01 52b8 9e3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
215 | 5a 1207 0196 01 0ad7 a33e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
216 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
217 | 5a 1207 0196 01 c3f5 a83e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
218 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219 | 5a 1207 0196 01 7b14 ae3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
220 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
221 | 5a 1207 0196 01 3333 b33e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
222 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
223 | 5a 1207 0196 01 ec51 b83e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
224 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
225 | 5a 1207 0196 01 a470 bd3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
226 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
227 | 5a 1207 0196 01 5c8f c23e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
228 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
229 | 5a 1207 0196 01 14ae c73e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
230 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
231 | 5a 1207 0196 01 cdcc cc3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
232 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
233 | 5a 1207 0196 01 85eb d13e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
234 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
235 | 5a 1207 0196 01 3d0a d73e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
236 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
237 | 5a 1207 0196 01 f628 dc3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
238 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
239 | 5a 1207 0196 01 ae47 e13e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
240 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
241 | 5a 1207 0196 01 6666 e63e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
242 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
243 | 5a 1207 0196 01 1f85 eb3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
244 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
245 | 5a 1207 0196 01 d7a3 f03e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
246 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
247 | 5a 1207 0196 01 8fc2 f53e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
248 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
249 | 5a 1207 0196 01 48e1 fa3e 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
250 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
251 | 5a 1207 0196 01 0000 003f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
252 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
253 | 5a 1207 0196 01 5c8f 023f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
254 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
255 | 5a 1207 0196 01 b81e 053f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
256 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
257 | 5a 1207 0196 01 14ae 073f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
258 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
259 | 5a 1207 0196 01 713d 0a3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
260 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
261 | 5a 1207 0196 01 cdcc 0c3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
262 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
263 | 5a 1207 0196 01 295c 0f3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
264 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
265 | 5a 1207 0196 01 85eb 113f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
266 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
267 | 5a 1207 0196 01 e17a 143f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
268 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
269 | 5a 1207 0196 01 3d0a 173f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
270 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
271 | 5a 1207 0196 01 9a99 193f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
272 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
273 | 5a 1207 0196 01 f628 1c3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
274 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
275 | 5a 1207 0196 01 52b8 1e3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
276 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
277 | 5a 1207 0196 01 ae47 213f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
278 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
279 | 5a 1207 0196 01 0ad7 233f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
280 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
281 | 5a 1207 0196 01 6666 263f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
282 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
283 | 5a 1207 0196 01 c3f5 283f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
284 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
285 | 5a 1207 0196 01 1f85 2b3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
286 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
287 | 5a 1207 0196 01 7b14 2e3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
288 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
289 | 5a 1207 0196 01 d7a3 303f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
290 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
291 | 5a 1207 0196 01 3333 333f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
292 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
293 | 5a 1207 0196 01 8fc2 353f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
294 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
295 | 5a 1207 0196 01 ec51 383f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
296 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
297 | 5a 1207 0196 01 48e1 3a3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
298 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
299 | 5a 1207 0196 01 a470 3d3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
300 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
301 | 5a 1207 0196 01 0000 403f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
302 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
303 | 5a 1207 0196 01 5c8f 423f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
304 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
305 | 5a 1207 0196 01 b81e 453f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
306 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
307 | 5a 1207 0196 01 14ae 473f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
308 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
309 | 5a 1207 0196 01 713d 4a3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
310 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
311 | 5a 1207 0196 01 cdcc 4c3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
312 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
313 | 5a 1207 0196 01 295c 4f3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
314 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
315 | 5a 1207 0196 01 85eb 513f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
316 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
317 | 5a 1207 0196 01 e17a 543f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
318 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
319 | 5a 1207 0196 01 3d0a 573f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
320 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
321 | 5a 1207 0196 01 9a99 593f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
322 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
323 | 5a 1207 0196 01 f628 5c3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
324 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
325 | 5a 1207 0196 01 52b8 5e3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
326 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
327 | 5a 1207 0196 01 ae47 613f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
328 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
329 | 5a 1207 0196 01 0ad7 633f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
330 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
331 | 5a 1207 0196 01 6666 663f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
332 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
333 | 5a 1207 0196 01 c3f5 683f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
334 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
335 | 5a 1207 0196 01 1f85 6b3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
336 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
337 | 5a 1207 0196 01 7b14 6e3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
338 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
339 | 5a 1207 0196 01 d7a3 703f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
340 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
341 | 5a 1207 0196 01 3333 733f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
342 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
343 | 5a 1207 0196 01 8fc2 753f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
344 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
345 | 5a 1207 0196 01 ec51 783f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
346 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
347 | 5a 1207 0196 01 48e1 7a3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
348 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
349 | 5a 1207 0196 01 a470 7d3f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
350 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
351 | 5a 1207 0196 01 0000 803f 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
352 | 5a 1103 0196 01 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
353 |
--------------------------------------------------------------------------------