|
Subject: Re: [stella] TIA polynomials revisited From: Adam Wozniak <adam@xxxxxxxxxxxxxxxx> Date: Sun, 7 Dec 2003 07:57:42 -0800 (PST) |
See if this is more palatable:
#include <stdio.h>
// sound.c
// version 0.5
//
// Copyright (c) 2003 Adam Wozniak (adam@xxxxxxxxxxxxxxxx)
// All Rights Reserved
//
// Permission granted to freely copy and use for any purpose, provided
// this copyright header remains intact.
#define DIV(name, hi, lo) \
int div_ ## name (void) \
{ \
static int spot = 0; \
static int count = 0; \
static const int array[] = { hi, lo, -1 }; \
static int lastval = 0; \
count++; \
if (count == array[spot]) \
{ \
spot++; \
count = 0; \
} \
if (array[spot] == -1) spot = 0; \
if (lastval == !(spot^1)) \
{ \
return 0; \
} \
else \
{ \
lastval = !lastval; \
return 1; \
} \
}
#define LFSR(name, t1, t2) \
int lfsr_ ## name (void) \
{ \
static int lastval = 1; \
static int value = 1; \
static const int taps[] = { t1, t2 }; \
int next = ((value & (1 << (taps[0] - 1))) ? 1 : 0) ^ \
((value & (1 << (taps[1] - 1))) ? 1 : 0); \
value = value << 1; \
value |= next; \
if ((value & 1) == lastval) \
{ \
return 0; \
} \
else \
{ \
lastval = !lastval; \
return 1; \
} \
}
DIV(2, 1, 1);
DIV(6, 3, 3);
DIV(31, 13, 18);
LFSR(poly4, 4, 3);
LFSR(poly5, 5, 3);
LFSR(poly9, 9, 5);
int vardiv(int count)
{
static int lastval = 1;
static int value = 1;
static int counter;
counter++;
if (counter >= count)
{
(value = !value);
counter = -1;
}
if (value == lastval)
{
return 0;
}
else
{
lastval = !lastval;
return 1;
}
}
void TIASOUND_fill(int F, int V, int C,
int infrequency, int outfrequency, int channels,
char *buf, int size)
{
static int value = 1;
static int rate = 0;
while(size > 0)
{
switch (C)
{
case 0:
value = 1;
break;
case 1:
vardiv(F) && lfsr_poly4() && (value = !value);
break;
case 2:
vardiv(F) && div_31() && lfsr_poly4() && (value = !value);
break;
case 3:
vardiv(F) && lfsr_poly5() && lfsr_poly4() && (value = !value);
break;
case 4:
vardiv(F) && div_2() && (value = !value);
break;
case 5:
vardiv(F) && div_2() && (value = !value);
break;
case 6:
vardiv(F) && div_31() && (value = !value);
break;
case 7:
vardiv(F) && lfsr_poly5() && div_2() && (value = !value);
// yes it looks different from 9, but it has the same output
break;
case 8:
vardiv(F) && lfsr_poly9() && (value = !value);
break;
case 9:
vardiv(F) && lfsr_poly5() && (value = !value);
break;
case 10:
vardiv(F) && div_31() && (value = !value);
break;
case 11:
value = 1;
break;
case 12:
vardiv(F) && div_6() && (value = !value);
break;
case 13:
vardiv(F) && div_6() && (value = !value);
break;
case 14:
vardiv(F) && div_31() && div_6() && (value = !value);
break;
case 15:
vardiv(F) && lfsr_poly5() && div_6() && (value = !value);
break;
}
rate += outfrequency;
while (rate >= infrequency && size)
{
*buf += value ? (V << 3) : 0;
rate -= infrequency;
buf += channels;
size -= channels;
}
}
}
void main(int argc, char **argv)
{
char buf[44100];
int i;
// usage
if (argc != 4)
{
fprintf(stderr, "Usage: %s <F:0-31> <V:0-15> <C:0-15>\n", argv[0]);
exit(-1);
}
// clear the buffer
bzero(buf, sizeof(buf));
// fill the buffer
TIASOUND_fill(atoi(argv[1]),
atoi(argv[2]),
atoi(argv[3]),
31400, 44100, 1,
buf, sizeof(buf));
// write it to stdout
write(1, buf, sizeof(buf));
}
--
adam@xxxxxxxxxxxxxxxx http://cuddlepuddle.org/~adam/pgp.html
Will code for food. http://cuddlepuddle.org/~adam/resume.html
"The dinosaurs are not around today because they did not have a space program."
-- Arthur C. Clarke
----------------------------------------------------------------------------------------------
Archives (includes files) at http://www.biglist.com/lists/stella/archives/
Unsub & more at http://www.biglist.com/lists/stella/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] TIA polynomials revisi, Adam Wozniak | Thread | Re: [stella] tia hue luminance, Eric Ball |
| Re: [stella] Video/Computer Chess, David | Date | Re: [stella] tia hue luminance, Adam Wozniak |
| Month |