Purely out of interest :
While looking at the MSK144 coding process I noted there are two procedures in the Fortran code to generate the waveform for transmission.
First is to use the raw output from the coding process, ie. sync+message+CRC+parity and alternately modulate I and Q12kHz sampled NCO data streams to generate offset QPSK at audio.
This is what is actually done inside WSJT-X to generate MSK144
But there's a secondary bit of code in there whose output is used in the MSK144CODE.EXE utility. That differentially encodes that stream of '1's and '0's, inverting alternate bits to generate a pattern for modulating an FSK source for a frequency shift exactly half that of the symbol rate. Another way of generating MSK.
I've taken that bit pattern and applied it to a two channel quadrature DDS to generate the two frequencies [plus] +500Hz and [minus] -500Hz, ie FSK at 1000Hz shift centred on zero frequency. This can be done by swapping the I/Q channels, or inverting one of them, but in a quadrature output DDS it's easier to feed the NCO with +/- twos complement values of the increment for the wanted frequency.
The attached picture is of the two I/Q baseband streams from the DDS. As can be seen, the maximum of one channel flips at the zero crossing of the other - exactly what you'd expect of an offset QPSK baseband signal.
It is nice to see theory and practice come together once in a while!http://www.g4jnt.com/DropF/img3225.JPG