UKHeliBob:
You could save memory by storing the data as an array of 7 ints using bits of the ints as your "boolean" values.
To transmit the data I'm simply iterating through the array. If I iterate through an int, won't I have loads of unnecessary zeros? It may also be important to mention that the data is a bit weird. The way I've encoded it, the 1s are HIGH for 516 microseconds, then LOW for 168 microseconds. 0s are HIGH for 168 and LOW for 516. And there's no clock signal. So 0 is not the same as no data. Here's what it looks like on the scope:

This is 0000 0001 0101 0111 0000 0011 0
The output above is from the IC I'm attempting to replace. Sending the 1s and 0s into this function replicates that pretty much exactly:
void fskWrite(uint8_t pin, bool data) {
if (data) { // 1, long-short
digitalWrite(pin, HIGH);
delayMicroseconds(515);
digitalWrite(pin, LOW);
delayMicroseconds(167);
} else { // 0, short-long
digitalWrite(pin, HIGH);
delayMicroseconds(167);
digitalWrite(pin, LOW);
delayMicroseconds(515);
}
}
*I called it fsk(frequency shift keying) but I'm not really sure that's what it is
UKHeliBob:
You could store the array in EEPROM or SD card but unless the program itself needs to change the values, why bother ? As the variables are declared as const I presume that this is not a requirement.
They will be constant. Different objects will be assigned to an OUTx[8]. The transmit function take the object as a parameter to use its number.