Waxwing Bluetooth API Tutorial (Updated 7/24/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". The list of available TX commands is described below in the HTML table.
  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.
  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:

Hopefully, these examples and the tables 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.

Three Different Formats

This API involves three related but separate numbering schemes, and the same function can sit at a different index in each one. Don't assume a function's position in one table tells you its position in another — always look it up by name.

TX Commands (write)

Sent as the 3-byte write described above: [TX Command, Value, 0]. If a row's "RX Stream Index" differs from its TX Command, that's the index where you'll see its current value reported back in the RX stream instead.

TX Command RX Stream Index Function Default Value Min Value Max Value Notes
0 0 Volume 32 0 32
1 1 Gain 42 0 76
2 2 Warmth 6 0 12
3 3 Air 6 0 12
4 4 Treble 6 0 12
5 5 Bass 6 0 12
6 6 Bass Boost 0 0 1
7 7 Hi 26 0 28
8 8 Lo 4 0 28
9 9 Mode 0 0 4
10 10 Grade 0 0 3 Saved as 0
11 11 Magic 0 0 1
12 12 FX 0 0 4
13 13 DeRumble 0 0 1
14 14 PEQ 0 0 1
15 15 Load 1 0 1
16 16 Balance 15 0 30
17 17 Phase 0 0 3
18 18 Output 0 0 2
19 19 EQ 1 0 12
20 20 Log 16 0 31 Bit 0: on/off, Bits1-4: 16 threshold settings
21 21 Bypass 0 0 1 Saved as 0
22 22 Levels 0 0 1
23 23 RESERVED Not Used
24 24 Test 0 0 1 Saved as 0
25 25 RESERVED Not Used
26 26 RPM33 0 0 1
27 27 RPM45 0 0 1
28 28 RPM78 0 0 1
29 29 Azimuth 0 0 1
30 30 Fine Balance 40 0 80
31 31 SineGen 38 0 87
32 32 SineGen2 0 0 1
33 33 Turnover 8 0 11
34 34 Bass Shelf 5 0 5
35 35 Treble Cut 14 0 19
36 36 Frequency (Hz) 56 0 63
37 37 Gain (dB) 44 0 46
38 38 Filter Q 4 0 10
94 N/A Edit LOG Time 0 0 65535 Two bytes
100 90 BLE TX Power 2 0 2

RX Settings Stream (read)

The 100-byte packet broadcast every 500ms once you've enabled the stream (TX Command 99). This packet is described below as well as by this publicly shared Google spreadsheet.

RX Stream Index Function Default Value Min Value Max Value Notes
0 Volume 32 0 32
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 31 Bit 0: on/off, Bits1-4: 16 threshold settings
21 Bypass 0 0 1 Saved as 0
22 Levels 0 0 1
23 RESERVED Not Used
24 Test 0 0 1 Saved as 0
25 RESERVED Not Used
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
61 reserved for future fw 0
62 reserved for future fw 0
63 Grade Score 0 0 16 A+=16…P=1
64 Grade Seconds LSB 0 0 255
65 Grade Seconds MSB 0 0 255
66 Log Time B0(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
75 reserved for future fw 0
76 reserved for future fw 0
77 reserved for future fw 0
78 reserved for future fw 0
79 reserved for future fw 0
80 reserved for future fw 0
81 reserved for future fw 0
82 reserved for future fw 0
83 reserved for future fw 0
84 reserved for future fw 0
85 reserved for future ble 0
86 reserved for future ble 0
87 reserved for future ble 0
88 reserved for future ble 0
89 reserved for future ble 0
90 BLE TX Power 2 0 2
91 System Resets random byte 0 255 initial state garbage data - must reset to 0
92 Flash Saves random byte 0 255 initial state garbage data - must reset to 0
93 BLE FW Bootloader Ver 1 0 255
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

fileSlot Format (app save/load)

The format the Waxwing app uses to save and load a full settings file. This is a 63-element array, not something transmitted over Bluetooth — it's purely how the app stores settings on disk.

fileSlot Index Function Default Value Min Value Max Value Notes
0 Volume 32 0 32
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 31 Bit 0: on/off, Bits1-4: 16 threshold settings
21 Bypass 0 0 1 Saved as 0
22 Levels 0 0 1
23 File 0 0 25
24 Test 0 0 1 Saved as 0
25 Unlock Sort 0 0 1
26 Fine Balance 40 0 80
27 Turnover 8 0 11
28 Bass Shelf 5 0 5
29 Treble Cut 14 0 19
30 Frequency (Hz) 56 0 63
31 Gain (dB) 44 0 46
32 Filter Q 4 0 10
33 Volume Lock 1 0 1
34 Gain Lock 1 0 1
35 Warmth Lock 1 0 1
36 Air Lock 1 0 1
37 Treble Lock 1 0 1
38 Bass Lock 1 0 1
39 Bass Boost Lock 1 0 1
40 Hi Lock 1 0 1
41 Lo Lock 1 0 1
42 Mode Lock 1 0 1
43 Grade Lock 1 0 1
44 Magic Lock 1 0 1
45 FX Lock 1 0 1
46 DeRumble Lock 1 0 1
47 PeakNotch Lock 1 0 1
48 Load Lock 1 0 1
49 Balance Lock 1 0 1
50 Phase Lock 1 0 1
51 Output Lock 1 0 1
52 EQ Lock 1 0 1
53 Log Lock 1 0 1
54 Bypass Lock 1 0 1
55 Levels Lock 1 0 1
56 File Lock 1 0 1
57 Test Menu Lock 1 0 1 Saved as 1
58 Unlock Sort Lock 1 0 1 Saved as 1
59 Filename 'MM 38dB'
60 Log Hours (LSB) 0 0 255 12 minute units
61 Log Hours (MSB) 0 0 255 or 0.2 hours
62 fileSlot Version 0 (as of 9/2023) 0 255

Notes: