69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include <ctype.h>
|
|
|
|
#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;
|
|
}
|