Waxwing Bluetooth API Tutorial (Updated 7/11/26)

Using a 3rd party Bluetooth LE app - like LightBlue - you can look for a Waxwing's name in a scan of advertising BLE devices. It will be advertised in the format of a hashtag plus the serial number. For example, you'll see #525 as a nearby peripheral in the scan list for Waxwing S/N 525. For your own software, it is easiest to scan for the Waxwing's main Service (4dddd48d-cf30-492e-850b-76d57dd76900). That is how the Parks Audio Waxwing app scans for devices.

The Waxwing BLE Service:

4dddd48d-cf30-492e-850b-76d57dd76900

The Service's characteristics:

The TX command is a characteristic of the main service. It is three bytes of data. The first byte is the Function ID, the second byte is the Function Value, and the third byte does not matter (used for other commands to be documented) so just use zero. The table below shows the values in decimal, but 3rd party programs like LightBlue will typically want hexadecimal.

Tutorial examples:

    Sending commands to Waxwing:
  1. Start the LightBlue app and find your Waxwing in the list of devices. It shows up as its serial number. Press "Connect".
  2. Scroll down to the Waxwing Service (0x4dddd48d-cf30-492e-850b-76d57dd76900).
  3. Click on "TX command to Waxwing".
  4. Click "Write new value". Now let's set the Waxwing's Volume to Mute. This would be 0 for the function, 0 for the value, and 0 for the unused third byte. In hexadecimal this will be 0x000000. Type 000000 and press send.
  5. Click "Write new value". Now let's set the Waxwing's Volume back to 100%. This would be 0 for the function, 32 for the value, and 0 for the unused third byte. In hexadecimal this will be 0x002000. Type 002000 and press send.
  6. Click "Write new value". Now let's turn on Magic. This would be 11 for the function, 1 for the value, and 0 for the unused third byte. In hexadecimal this will be 0x0B0100. Type 0B0100 and press send.
  7. Click "Write new value". Now let's turn off Magic. This would be 11 for the function, 0 for the value, and 0 for the unused third byte. In hexadecimal this will be 0x0B0000. Type 0B0000 and press send.
    Reading Waxwing settings:
  1. Start the LightBlue app and find your Waxwing in the list of devices. It shows up as its serial number. Press "Connect".
  2. Scroll down to the Waxwing Service (0x4dddd48d-cf30-492e-850b-76d57dd76900).
  3. Click on "RX Stream from Waxwing".
  4. Press the Subscribe button.
  5. Go back by pressing the "<Peripheral" at the top left.
  6. Click "TX command to Waxwing".
  7. Click "Write new value". Now let's turn ON the RX stream. This would be 99 for the function, 1 for the value, and 0 for the unused third byte. In hexadecimal this will be 0x630100. Type 630100 and press send.
  8. Now you'll be receiving a 100-byte packet every 500ms. This packet is described below in the HTML table as well as by this publically shared Google spreadsheet.
  9. Click "Write new value". Now let's turn OFF the RX stream. This would be 99 for the function, 0 for the value, and 0 for the unused third byte. In hexadecimal this will be 0x630000. Type 630000 and press send.

Hopefully, these examples and the table below are all you need to get rolling. There's still a lot to document, so don't hesitate to email me for more assistance.

Waxwing API Terms:

The use of this API is permitted for any lawful purpose - private or commercial - provided that the following restrictions are adhered to:

  1. Prohibited Uses:
  2. Liability:
Setting Index Function Default Value Min Value Max Value Notes
0 Volume 32 0 33
1 Gain 42 0 76
2 Warmth 6 0 12
3 Air 6 0 12
4 Treble 6 0 12
5 Bass 6 0 12
6 Bass Boost 0 0 1
7 Hi 26 0 28
8 Lo 4 0 28
9 Mode 0 0 4
10 Grade 0 0 3 Saved as 0
11 Magic 0 0 1
12 FX 0 0 4
13 DeRumble 0 0 1
14 PEQ 0 0 1
15 Load 1 0 1
16 Balance 15 0 30
17 Phase 0 0 3
18 Output 0 0 2
19 EQ 1 0 12
20 Log 16 0 33
21 Bypass 0 0 1 Saved as 0
22 Levels 0 0 2
23 File 0 0 25 ***
24 Test 0 0 1 Saved as 0
25 Sort 0 0 1
26 RPM33 0 0 1
27 RPM45 0 0 1
28 RPM78 0 0 1
29 Azimuth 0 0 1
30 Fine Balance 40 0 80
31 SineGen 38 0 87
32 SineGen2 0 0 1
33 Turnover 8 0 11
34 Bass Shelf 5 0 5
35 Treble Cut 14 0 19
36 Frequency (Hz) 56 0 63
37 Gain (dB) 44 0 46
38 Filter Q 4 0 10
39 L ADC AVG LSB N/A 0 99 XX.XX
40 L ADC AVG MSB N/A 0 99 XX.xx
41 R ADC AVG LSB N/A 0 99 xx.XX
42 R ADC AVG MSB N/A 0 99 XX.xx
43 L DAC AVG LSB N/A 0 99 xx.XX
44 L DAC AVG MSB N/A 0 99 XX.xx
45 R DAC AVG LSB N/A 0 99 xx.XX
46 R DAC AVG MSB N/A 0 99 XX.xx
47 L ADC PEAK LSB N/A 0 99 xx.XX
48 L ADC PEAK MSB N/A 0 99 XX.xx
49 R ADC PEAK LSB N/A 0 99 xx.XX
50 R ADC PEAK MSB N/A 0 99 XX.xx
51 L DAC PEAK LSB N/A 0 99 xx.XX
52 L DAC PEAK MSB N/A 0 99 XX.xx
53 R DAC PEAK LSB N/A 0 99 xx.XX
54 R DAC PEAK MSB N/A 0 99 XX.xx
55 ADC clips 0 0 255
56 DAC clips 0 0 255
57 Stereo Detect (SM) 0 0 1
58 RPM LSB 0 0 99 xx.XX
59 RPM MSB 0 0 99 XX.xx
60 reserved for future fw 0 0
61 reserved for future fw 0 0
62 reserved for future fw 0 0
63 Grade Score 0 0 13 A+=13... F=1
64 Grade Seconds LSB 0 0 255
65 Grade Seconds MSB 0 0 255
66 Log Time BO(LSB) 0 0 255 10ms incr
67 Log Time B1 0 0 255
68 Log Time B2 0 0 255
69 Log Time B3(MSB) 0 0 255
70 Main FW Ver Min 1 0 99
71 Main FW Ver Maj 1 0 255
72 Main FW Image Slot 0 0 2
73 Main FW Bootloader Ver 2 0 255
74 reserved for future fw 0 0
75 reserved for future fw 0 0
76 reserved for future fw 0 0
77 reserved for future fw 0 0
78 reserved for future fw 0 0
79 reserved for future fw 0 0
80 reserved for future fw 0 0
81 reserved for future fw 0 0
82 reserved for future fw 0 0
83 reserved for future fw 0 0
84 reserved for future fw 0 0
85 reserved for future ble 0 0
86 reserved for future ble 0 0
87 reserved for future ble 0 0
88 reserved for future ble 0 0
89 reserved for future ble 0 0
90 reserved for future ble 0 0
91 reserved for future ble 0 0
92 reserved for future ble 0 0
93 reserved for future ble 0 0
94 Serial Number LSB N/A S/N from 1 to
95 Serial Number MSB N/A 65536 (16bit)
96 Bluetooth FW Ver Min 2 0 99
97 Bluetooth FW Ver Maj 1 0 255
98 Bluetooth FW Image Bank 0 0 2
99 SUM8 (8bit SUM of 0-84) 0 255