Files
pitxft/ask2ft.c
2021-06-14 22:53:26 +02:00

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;
}