#include #include #include #include #include #pragma pack(1) struct __attribute__((__packed__)) ft { double frequency; uint32_t duration; uint32_t padding; }; int main(int argc, char **argv) { // arguments: freq samplerate samples/bit if(argc < 4) { fprintf(stderr, "Error: set arguments: freq samplerate samples/bit\n"); exit(1); } int frequency = atoi(argv[1]); int samplerate = atoi(argv[2]); int samples = atoi(argv[3]); fprintf(stderr, "Frequency: %d, Samplerate: %d, Samples/bit: %d\n", frequency, samplerate, samples); freopen(NULL, "wb", stdout); // ft is a binary format size_t ilen = 64; char* input = calloc(ilen, sizeof(char)); for(size_t ch = 0; (input[ch] = getc(stdin)) != EOF && input[ch] != '\n'; ch++) { if(ch == ilen -1) { ilen *= 2; input = realloc(input, sizeof(char)*ilen); } } const char binary[16][5] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"}; const char digits[] = "0123456789abcdef"; char* bininput = calloc(strlen(input)*4+1, sizeof(char)); size_t bi = 0; while(input[bi]) { char *v = strchr(digits, tolower(input[bi++])); if(v) strcat(bininput, binary[v - digits]); } size_t i = 0; char prevchar = 0; size_t prevcharcount = 0; while(bininput[i]) { if((prevchar != bininput[i]) && (i > 0)) { struct ft* ftchunk = calloc(1, sizeof(struct ft)); if(prevchar == '1') ftchunk->frequency = (double)frequency; ftchunk->duration = (uint64_t)prevcharcount*samples*1000000000/samplerate; fwrite(ftchunk, sizeof(struct ft), 1, stdout); fprintf(stderr, "Writing chunk: %f %u\n", ftchunk->frequency, ftchunk->duration); free(ftchunk); prevcharcount = 0; } prevchar = bininput[i++]; prevcharcount++; } return 0; }