diff options
-rw-r--r-- | mfmdecode.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/mfmdecode.c b/mfmdecode.c index e092bdc..6eeec0f 100644 --- a/mfmdecode.c +++ b/mfmdecode.c @@ -1,10 +1,14 @@ /* - * Decode ABC80 cassette files + * Decode ABC80 cassette files (by H. Peter Anvin, + * modified by Mikael O. Bonnier 2012-07-23) * - * Convert to 44100 Hz single channel 16-bit with appropriate endianness + * Convert to samples Hz single channel 16-bit with appropriate endianness * and normalized gain first: * * sox muzak.wav --endian little -c 1 -s muzak.raw + * mfmdecode muzak.raw 44100 5300 + * + * This program doesn't work with 96 kHz. */ #include <stdio.h> @@ -13,8 +17,10 @@ #include <math.h> #include <inttypes.h> -#define THRESH 14300 -static unsigned int xtime = 44100/700; /* Samples/baud */ +static unsigned int thresh; /* threshold e.g. 5300 */ +static unsigned int samples; /* sample frequency in Hz e.g. 44100 or 96000 +*/ +static unsigned int xtime; /* samples/baud */ static const char my_tolower[256] = "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" @@ -70,12 +76,12 @@ static void output_block(uint8_t *buf, uint8_t *csum) csum1 = 0x03; /* Checksum includes ETX */ for (i = 0; i < 256; i++) csum1 += buf[i]; - + if (csum1 == csum2) { if (!memcmp(buf, "\xff\xff\xff", 3)) { if (f) fclose(f); - + unmangle_filename(filename, buf+3); f = fopen(filename, "wb"); if (!f) { @@ -223,30 +229,30 @@ int main(int argc, char *argv[]) double v; unsigned int state; unsigned int time, ptime; - const double k = exp(-10000.0/44100); + double k; f = fopen(argv[1], "rb"); - + sscanf(argv[2], "%u", &samples); + sscanf(argv[3], "%u", &thresh); + xtime = samples/700; + k = exp(-10000.0/samples); state = time = ptime = 0; samp = osamp = 0; v = 0.0; while (fread(&samp, 1, 2, f) == 2) { + /* Emulate high pass filter in ABC80 */ -#if 0 v = (v * k) + (samp - osamp); -#else - v = samp; -#endif osamp = samp; - if (v >= THRESH) { + if (v >= thresh) { if (!state) { state = 1; process_flank(time - ptime); ptime = time; } - } else if (v <= -THRESH) { + } else if (v <= -thresh) { if (state) { state = 0; process_flank(time - ptime); |