#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "synth.h"

/* shape.c: waveshape a waveform */

static void shape(float range, float gradation);

int main(int argc, char *argv[])
{
	float range = 1.0f;
	float gradation = 3.0f;
	int i;

	/* read options */
	for (i = 1; i < argc; i++)
	{
		if (!strcmp(argv[i], "-range") && i+1 < argc)
			range = atof(argv[++i]);
		else if (!strcmp(argv[i], "-gradation") && i+1 < argc)
			gradation = atof(argv[++i]);
		else if (!strcmp(argv[i], "-help"))
		{
			fprintf(stderr, "options: -range arg, -gradation "
				"arg\n");
			exit(0);
		}
	}

	/* check options */
	range     = CLAMP(-2.0f, range, 2.0f);
	gradation = CLAMP(0.1f, gradation, 15.0f);

	SET_BINARY_MODE
	shape(range, gradation);
	return 0;
}

static float shapeval(float val, float r, float g)
{
	float x = val;

	if (x < -r/(g+1))
		x = x/g - r/(g+1) * (g-1/g);
	else if (x > r/(g+1))
		x = x/g + r/(g+1) * (g-1/g);
	else
		x *= g;

	return x;
}

static void shape(float range, float gradation)
{
	float f;

	while (fread(&f, sizeof f, 1, stdin) == 1)
	{
		f = shapeval(f, range, gradation);

		if (fwrite(&f, sizeof f, 1, stdout) < 1)
			return;
	}
}