├── 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 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--toggle-output).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-bass Disabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-bass Enabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-bass-value 0).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-bass-value 50).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-bass-value 100).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-output Speakers).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-surround Disabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-surround Enabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-surround-value 0).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-surround-value 50).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-output Headphones).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-surround-value 100).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-crystalizer Enabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-crystalizer-value 0).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-dialog-plus Enabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-dialog-plus-value 0).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-crystalizer Disabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-crystalizer-value 100).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-crystalizer-value 50).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-dialog-plus Disabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-dialog-plus-value 100).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-dialog-plus-value 50).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume Enabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume-value 0).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume Disabled).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume-value 100).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume-value 50).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-output Headphones, --dry-run).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume-special-value Loud).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | -------------------------------------------------------------------------------- /.run/g6-cli (--set-smart-volume-special-value Night).run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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 | --------------------------------------------------------------------------------