Sorry for the delay - I'd been asked to post my code here to help others.
So the following code works for 12 pixels. It's pretty easy to adapt to further, I just didn't as I was only using it for tests (There's also heavy optimisations and line reductions that could be had but again, it was a test so it was copy pasted quickly for results). Make sure that the Arduino and the Pixels share a common ground otherwise it wont work, then connect the clock lead of the pixels (Green on mine) to PIN5 and the data lead (Blue on mine) to PIN6 of the Arduino.
The following code is what I loaded onto my Arduino. It then communicates via the USB with Vixen using the Generic Serial plugin. There did seem to be a bug (At least on my Arduino but I've never updated it's bootloader which may or may not have an impact) where the Arduino would basically reset itself and go through the startup phase (I had code that flashed the pixels white > off quickly so I could see what it was doing. Feel free to omit that part of the code if desired) again and then cause the data going to the unit to be invalid and produce incorrect results. Every time this happened I reset the Arduino with it's reset button and it worked again but it only ever happened once each time it was unplugged/plugged in.
Anyhow - The code (Like I said, big, messy and a little buggy but it's great for testing. If you're capable feel free to refine and repost back here

)
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long int
// connect to digital 0,1
int Clkpin = 5;
int Datapin = 6;
void ClkProduce(void)
{
digitalWrite(Clkpin, LOW);
delayMicroseconds(20);
digitalWrite(Clkpin, HIGH);
delayMicroseconds(20);
}
void Send32Zero(void)
{
unsigned char i;
for (i=0; i<32; i++)
{
digitalWrite(Datapin, LOW);
ClkProduce();
}
}
uint8 TakeAntiCode(uint8 dat)
{
uint8 tmp = 0;
if ((dat & 0x80) == 0)
{
tmp |= 0x02;
}
if ((dat & 0x40) == 0)
{
tmp |= 0x01;
}
return tmp;
}
// gray data
void DatSend(uint32 dx)
{
uint8 i;
for (i=0; i<32; i++)
{
if ((dx & 0x80000000) != 0)
{
digitalWrite(Datapin, HIGH);
}
else
{
digitalWrite(Datapin, LOW);
}
dx <<= 1;
ClkProduce();
}
}
// data processing
void DataDealWithAndSend(uint8 r, uint8 g, uint8 b)
{
uint32 dx = 0;
dx |= (uint32)0x03 << 30; // highest two bits 1,flag bits
dx |= (uint32)TakeAntiCode(b) << 28;
dx |= (uint32)TakeAntiCode(g) << 26;
dx |= (uint32)TakeAntiCode(r) << 24;
dx |= (uint32)b << 16;
dx |= (uint32)g << 8;
dx |= r;
DatSend(dx);
}
int t = 0; // Loop counter
int incomingByte[10];
void setup() {
Serial.begin(9600); // set up Serial at 9600 bps
pinMode(Datapin, OUTPUT);
pinMode(Clkpin, OUTPUT);
Send32Zero(); // blank all outputs in string
//Feel free to leave this next section out until ^^^^ if you don't want to see when the Arduino inits
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
DataDealWithAndSend(255, 255, 255);
Send32Zero();
delay(50);
Send32Zero(); // blank all outputs in string
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
DataDealWithAndSend(0, 0, 0);
Send32Zero();
// ^^^^^^^
}
void loop()
{
if (Serial.available() >= 36) {
// read the oldest byte in the serial buffer:
for (int t=1; t<37; t++) {
// read each byte
incomingByte[t] = Serial.read();
}
Send32Zero(); // output data to first 3 nodes (The others are neglected for testing purposes)
DataDealWithAndSend(incomingByte[1], incomingByte[2], incomingByte[3]);
DataDealWithAndSend(incomingByte[4], incomingByte[5], incomingByte[6]);
DataDealWithAndSend(incomingByte[7], incomingByte[8], incomingByte[9]);
DataDealWithAndSend(incomingByte[10], incomingByte[11], incomingByte[12]);
DataDealWithAndSend(incomingByte[13], incomingByte[14], incomingByte[15]);
DataDealWithAndSend(incomingByte[16], incomingByte[17], incomingByte[18]);
DataDealWithAndSend(incomingByte[19], incomingByte[20], incomingByte[21]);
DataDealWithAndSend(incomingByte[22], incomingByte[23], incomingByte[24]);
DataDealWithAndSend(incomingByte[25], incomingByte[26], incomingByte[27]);
DataDealWithAndSend(incomingByte[28], incomingByte[29], incomingByte[30]);
DataDealWithAndSend(incomingByte[31], incomingByte[32], incomingByte[33]);
DataDealWithAndSend(incomingByte[34], incomingByte[35], incomingByte[36]);
Send32Zero();
}
} [/code]