
Creative Technology has released the first public version of its Aurora SDK (software dev kit) that allows developers to program lighting effects on Sound BlasterX RGB-enabled hardware like the Sound BlasterX AE-5 gaming sound card. Perfect to match the sound illumination with the rest of the computer.

MILPITAS, Calif., Sept. 29, 2017 /PRNewswire/ — Creative Technology Ltd today announced that it would be launching the Aurora Reactive SDK. This tool would effectively convert the Aurora Reactive Lighting System found on Sound BlasterX products into an open platform, allowing developers the freedom to customize, animate and synchronize its lighting behavior. The 16.8 million color Aurora Reactive Lighting System is currently found on the Sound BlasterX Katana, Vanguard K08, Siege M04, AE-5, and Kratos S5.
The Aurora Reactive SDK is a system with APIs (Application Programming Interfaces) that allow third party developers to program Creative’s Sound BlasterX RGB-enabled hardware. The SDK will come complete with sample codes, an API library, and documentation to enable even novice programmers to get started.
The SDK also comes with the Aurora Unity feature that synchronizes the behavior of the reactive lighting system across the supported Sound BlasterX products. Potentially, developers could create an ecosystem consisting of different products that function as one in terms of lighting behavior – lights could turn red when an in-game protagonist is hurt, turn orange when attacking an enemy, or breathe with an ebb and flow of light when searching for an enemy; the possibilities are endless.
The complete press release can be found HERE.
The SDK allows to program the following Sound BlasterX products:
- Sound BlasterX Katana under-monitor audio system
- Sound BlasterX Vanguard K08 mechanical gaming keyboard
- Sound BlasterX Siege M04 precision gaming mouse
- Sound Blaster AE-5 PCIe DAC with discrete headphone amp
- Sound BlasterX Kratos S5 2.1 USB gaming speakers
You can download the Aurora SDK from THIS PAGE.
Of course I downloaded this SDK just to see what’s included in. The SDK comes with four header files, DLLs, a C++ code sample and a reference guide. There are no libs to link with because the Aurora functions pointers are initialized by code.
Honestly, I think that Creative could have found some better names for the SDK header files and for the functions. I find this SDK a little bit… ugly for my compiler! A single header like aurora_sdk.h would have been enough. An example of a nice SDK is Logitech LED Illumination SDK (used by GeeXLab to drive Logitech G products like the G810 Orion Spectrum keyboard): a single header (with easy to use functions) and a static lib.
That said, there is an SDK and that’s the important thing. Here is the procedure found in the documentation to program the LED patterns and colours:
- Initialize the Creative LED Manager Library.
- Open the desired device.
- Set the LED.
- Note that this is the step in the procedure where the main bulk of the LED programming activities take place.
- The client software will be continuously performing this step of setting the LED into different patterns and colours.
- Close device.
- Shutdown the Creative LED Manager Library.
Here is a code snippet that shows how to use the SDK:
#include "ICTLEDMgr.h"
// Init the Creative LED Manager Library ----------------------------------
ICTLEDMgr *pICTLEDMgr = NULL;
CTCreateInstanceEx(CLSID_CCTLEDMgr, NULL, 0, IID_ICTLEDMgr, NULL, NULL, "CTLEDMgr.dll", NULL, (void **)&pICTLEDMgr);
pICTLEDMgr->Initialize(DEFINITION_CTLEDMgr_Interface_Version, 0);
// Open the desired device --------------------------------------------
USHORT usVendorID = 0x041E; // Vendor ID of the product.
USHORT usProductID = 0x3126; // Product ID of the product.
USHORT usLedInfoFlag = MAKEWORD(CTLED_ConnectionType_BuiltIn, CTLED_HardwareType_SeparateClockAndData);
USHORT usTotalNumLeds = 5;
//USHORT usLedInfoFlag = MAKEWORD(CTLED_ConnectionType_External, CTLED_HardwareType_ClockEncodedWithData);
//USHORT usTotalNumLeds = 40;
DWORD dwDetailErrorCode = 0;
pICTLEDMgr->Open(usVendorID, usProductID, NULL, NULL, usLedInfoFlag, usTotalNumLeds, NULL, &dwDetailErrorCode, 0);
// Prepare LED grouping ---------------------------------------------
DWORD dwTotalNumLeds = 0; // 0 denotes the default total number of LEDs for the device.
DWORD dwDesiredNumLedGroups = 7;
BOOL fMakeDesiredNumLedGroupsNotMoreThanTotalNumLeds = TRUE;
CTLEDGROUPINGCMDPARAM_ByDesiredNumLedGroups_Axis param =
{
dwTotalNumLeds,
dwDesiredNumLedGroups,
fMakeDesiredNumLedGroupsNotMoreThanTotalNumLeds,
DEFINITION_MaxNumColumns_LedGroupingArray,
&dwCustomLedGroupingArray2D_Desired[0][0], 0
};
pICTLEDMgr->PrepareLedGrouping(CTLEDGROUPINGCMD_ByDesiredNumLedGroups_xAxis, (LPARAM)¶m, 0);
// Init LED information -------------------------------------------------
const DWORD dwMaxNumLedGroups = DEFINITION_MaxNumLedGroups_SufficientlyLarge;
const DWORD dwMaxNumLedsInEachGroup = DEFINITION_MaxNumLedsPerLedGroup_SufficientlyLarge;
const DWORD dwMaxNumColourLayersInEachgroup = DEFINITION_MaxNumColourLayersPerLedGroup_SufficientlyLarge;
PCTLEDMGRCMDPARAM_SetLedSettings pSetLedSettings;
PCTColourLayerForMultipleLedGroups pinfoLed = &pSetLedSettings->colourLed;
CTLEDINFOCMDPARAM_Initialize infoLedInitialize =
{
dwMaxNumLedGroups,
dwMaxNumLedsInEachGroup,
dwMaxNumColourLayersInEachgroup,
pinfoLed
};
pICTLEDMgr->PrepareLedInfo(CTLEDINFOCMD_Initialize, (LPARAM)&infoLedInitialize, 0);
// Fill up LED information ---------------------------------------------------
CTLEDINFOCMDPARAM_FillupAll infoLedFillupAll;
infoLedFillupAll.dwNumLedGroups = dwNumLedGroups_Desired;
infoLedFillupAll.pPatternIndividualLedGroupArray1D = pPatternArray1D_Desired;
infoLedFillupAll.pdwLedGroupingArray2D = pdwLedGroupingArray2D_Desired;
infoLedFillupAll.dwNumColumnsOfLedGroupArray2D = dwNumColumnsOfLedGroupingArray2D;
infoLedFillupAll.dwNumColourLayers = dwNumColourLayers_Desired;
infoLedFillupAll.pColourIndividualLedGroupArray2D = pColourArray2D_Desired;
infoLedFillupAll.dwNumColumnsOfColourIndividualLedGroupArray2D = dwNumColumnsOfColourArray2D;
infoLedFillupAll.pLedInfo = pinfoLed;
pICTLEDMgr->PrepareLedInfo(CTLEDINFOCMD_FillupAll, (LPARAM)&infoLedFillupAll, 0);
// Fill up data structure for Set LED -------------------------------------------------
// pSetLedSettings is a pointer to the CTLEDMGRCMDPARAM_SetLedSettings data structure containing the desired LED settings
PCTLEDMGRCMDPARAM_SetLedSettings pSetLedSettings;
// Initialise the parameters (to default values).
CTInit_CTLEDMGRCMDPARAM_SetLedSettings(pSetLedSettings);
// Set the parameters to the desired values.
pSetLedSettings->fIgnorePattern = FALSE;
pSetLedSettings->patternLed = patternLED_Desired;
pSetLedSettings->fIgnorePatternDirection = ((patternLED_Desired == CTLED_Pattern_Wave) ? FALSE : TRUE);
pSetLedSettings->directionLedPattern = directionLedPattern_Desired;
pSetLedSettings->fIgnorePatternDirectionFlag = ((patternLED_Desired == CTLED_Pattern_Wave) ? FALSE : TRUE);
pSetLedSettings->flagLedPatternDirection = flagLedPatternDirection_Desired;
pSetLedSettings->fIgnorePeriodicTime = ((patternLED_Desired == CTLED_Pattern_Static) ? TRUE : FALSE);
pSetLedSettings->patternLedThePeriodicTimeIsFor = patternLED_Desired;
pSetLedSettings->dwPeriodicTimeInMilliseconds = dwPeriodicTimeInMilliseconds_Desired;
pSetLedSettings->dwPeriodicTimeInCyclesPerMinute = dwPeriodicTimeInCyclesPerMinute_Desired;
pSetLedSettings->fIgnoreColour = FALSE;
// Execute command for Set LED ------------------------------------------
pICTLEDMgr->ExecuteCommand(CTLEDMGRCMD_SetLedSettings, (LPARAM)pSetLedSettings, 0);
// Clean up LED information ----------------------------------------------
CTLEDINFOCMDPARAM_Cleanup infoLedCleanup =
{
dwMaxNumLedGroups,
pinfoLed
};
pICTLEDMgr->PrepareLedInfo(CTLEDINFOCMD_Cleanup, (LPARAM)&infoLedCleanup, 0);
// Close the device --------------------------------------------------
pICTLEDMgr->Close(0);
// Shutdown the Creative LED Manager Library ---------------------------
pICTLEDMgr->Shutdown(0);
pICTLEDMgr->Release();
pICTLEDMgr = NULL;
CTFreeUnusedLibrariesEx();