示例#1
0
// new PFieldSet sending command.
Instrument *
RTcmix::cmd(const char *name, const PFieldSet &pfSet)
{
	int nFields = pfSet.size();
	Arg	*arglist = new Arg[nFields];
	Arg retArg;
	
	// Copy PField pointers into arglist
	
	for (int field = 0; field < nFields; ++field) {
		arglist[field] = createPFieldHandle(&pfSet[field]);
	}

	(void) dispatch(name, arglist, nFields, &retArg);

	delete [] arglist;
	
	// Extract and return instrument pointer.
	
	Handle rethandle = (Handle) retArg;
	if (rethandle->type == InstrumentPtrType)
		return (Instrument *) rethandle->ptr;
	else
		return NULL;
}
示例#2
0
Handle
create_handle(const Arg args[], const int nargs)
{
	PField *pField = create_pfield(args, nargs);
	Handle handle = NULL;
	if (pField != NULL) {
		handle = createPFieldHandle(pField);
	}
	return handle;
}
示例#3
0
Handle
create_pfbus_handle(const Arg args[], const int nargs)
{
	// BGG mm -- see note aboove
	PField *pField = create_pfbus_pfield(args, nargs);
	Handle handle = NULL;
	if (pField != NULL) {
		handle = createPFieldHandle(pField);
	}
	return handle;
}
Handle
#ifdef MAXMSP
create_pfbus_handle(const Arg args[], const int nargs)
{
	PField *pField = create_pfbus_pfield(args, nargs);
#else
create_handle(const Arg args[], const int nargs)
{
	PField *pField = create_pfield(args, nargs);
#endif
	Handle handle = NULL;
	if (pField != NULL) {
		handle = createPFieldHandle(pField);
	}
	return handle;
}
示例#5
0
// ----------------------------------------------------------- makeconverter ---
Handle
makeconverter(const Arg args[], const int nargs)
{
	if (!args[0].isType(HandleType)) {
		die("makeconverter", "First argument must be a valid pfield handle.");
		return NULL;
	}
	PField *pfield = (PField *) args[0];

	if (!args[1].isType(StringType)) {
		die("makeconverter", "Second argument must be a string giving "
									"converter type, e.g. \"ampdb\", \"cpsoct\".");
		return NULL;
	}

	ConverterPField *converter = NULL;

	if (args[1] == "ampdb")
		converter = new ConverterPField(pfield, ConverterPField::ampdb);
	else if (args[1] == "cpsoct")
		converter = new ConverterPField(pfield, ConverterPField::cpsoct);
	else if (args[1] == "octcps")
		converter = new ConverterPField(pfield, ConverterPField::octcps);
	else if (args[1] == "octpch")
		converter = new ConverterPField(pfield, ConverterPField::octpch);
	else if (args[1] == "cpspch")
		converter = new ConverterPField(pfield, ConverterPField::cpspch);
	else if (args[1] == "pchoct")
		converter = new ConverterPField(pfield, ConverterPField::pchoct);
	else if (args[1] == "pchcps")
		converter = new ConverterPField(pfield, ConverterPField::pchcps);
	else if (args[1] == "midipch")
		converter = new ConverterPField(pfield, ConverterPField::midipch);
	else if (args[1] == "pchmidi")
		converter = new ConverterPField(pfield, ConverterPField::pchmidi);
	else if (args[1] == "octmidi")
		converter = new ConverterPField(pfield, ConverterPField::octmidi);
	else if (args[1] == "boost")
		converter = new ConverterPField(pfield, ConverterPField::boost);

	if (converter == NULL) {
		die("makeconverter", "Invalid converter type \"%s\".", (const char *) args[1]);
		return NULL;
	}

	return createPFieldHandle(converter);
}
示例#6
0
Handle
makeLFO(const Arg args[], const int nargs)
{
	if (nargs < 3)
		return _makeLFO_usage();

	TablePField *tablePField = (TablePField *) ((PField *) args[0]);
	if (tablePField == NULL || tablePField->values() < 2) {	// not a TablePField
		if (args[0].isType(StringType)) {
			const int len = kLFOWavetableSize;
			double *wavetable = new double [len];
			if (wavetable_from_string(args[0], wavetable, len, "makeLFO") != 0) {
				delete[] wavetable;
				return NULL;
			}
			tablePField = new TablePField(wavetable, len);
		}
		else
			return _makeLFO_usage();
	}

	InterpType interp = kInterp1stOrder;
	int index = 1;
	if (args[index].isType(StringType)) {
		if (args[index] == "nointerp")
			interp = kTruncate;
		else if (args[index] == "interp")
			interp = kInterp1stOrder;
		else {
			die("makeLFO", "Invalid string option \"%s\".",
													(const char *) args[index]);
			return NULL;
		}
		index++;
	}

	PField *freqpf = (PField *) args[index];
	if (freqpf == NULL) {
		if (args[index].isType(DoubleType))
			freqpf = new ConstPField((double) args[index]);
		else
			return _makeLFO_usage();
	}
	index++;
	if (index >= nargs)
		return _makeLFO_usage();

	PField *amppf = NULL;
	PField *minpf = NULL;
	PField *maxpf = NULL;
	if (nargs - index > 1) {		// min, max instead of amp
		minpf = (PField *) args[index];
		if (minpf == NULL) {
			if (args[index].isType(DoubleType))
				minpf = new ConstPField((double) args[index]);
			else
				return _makeLFO_usage();
		}
		index++;
		if (index >= nargs)
			return _makeLFO_usage();
		maxpf = (PField *) args[index];
		if (maxpf == NULL) {
			if (args[index].isType(DoubleType))
				maxpf = new ConstPField((double) args[index]);
			else
				return _makeLFO_usage();
		}
	}
	else {
		amppf = (PField *) args[index];
		if (amppf == NULL) {
			if (args[index].isType(DoubleType))
				amppf = new ConstPField((double) args[index]);
			else
				return _makeLFO_usage();
		}
	}

	PField *lfo = NULL;
	if (interp == kInterp1stOrder)
		lfo = new LFOPField(resetval, tablePField, freqpf);
	else // (interp == kTruncate)
		lfo = new LFOPField(resetval, tablePField, freqpf, LFOPField::Truncate);

	if (amppf != NULL)
		lfo = new MultPField(lfo, amppf);
	else
		lfo = new RangePField(lfo, minpf, maxpf, RangePField::BipolarSource);

	return createPFieldHandle(lfo);
}
示例#7
0
Handle
makerandom(const Arg args[], const int nargs)
{
	if (nargs < 4)
		return _makerandom_usage();

	int type;
	if (args[0].isType(StringType)) {
		if (args[0] == "even" || args[0] == "linear")
			type = kLinearRandom;
		else if (args[0] == "low")
			type = kLowLinearRandom;
		else if (args[0] == "high")
			type = kHighLinearRandom;
		else if (args[0] == "triangle")
			type = kTriangleRandom;
		else if (args[0] == "gaussian")
			type = kGaussianRandom;
		else if (args[0] == "cauchy")
			type = kCauchyRandom;
		else if (args[0] == "prob")
			type = kProbRandom;
		else
			return _makerandom_usage();
	}
	else
		return _makerandom_usage();

	int index = 1;
	PField *freqpf = (PField *) args[index];
	if (freqpf == NULL) {
		if (args[index].isType(DoubleType))
			freqpf = new ConstPField((double) args[index]);
		else
			return _makerandom_usage();
	}
	index++;

	PField *minpf = (PField *) args[index];
	if (minpf == NULL) {
		if (args[index].isType(DoubleType))
			minpf = new ConstPField((double) args[index]);
		else
			return _makerandom_usage();
	}
	double min = minpf->doubleValue(0);
	index++;
	if (index >= nargs)
		return _makerandom_usage();

	PField *maxpf = (PField *) args[index];
	if (maxpf == NULL) {
		if (args[index].isType(DoubleType))
			maxpf = new ConstPField((double) args[index]);
		else
			return _makerandom_usage();
	}
	double max = maxpf->doubleValue(0);
	index++;

	PField *midpf = NULL;
	if (type == kProbRandom) {
		if (index >= nargs)
			return _makerandom_usage();
		midpf = (PField *) args[index];
		if (midpf == NULL) {
			if (args[index].isType(DoubleType))
				midpf = new ConstPField((double) args[index]);
			else
				return _makerandom_usage();
		}
		index++;
		if (index >= nargs)
			return _makerandom_usage();
	}
	double mid = midpf ? midpf->doubleValue(0) : 0.0;

	PField *tightpf = NULL;
	if (type == kProbRandom) {
		tightpf = (PField *) args[index];
		if (tightpf == NULL) {
			if (args[index].isType(DoubleType))
				tightpf = new ConstPField((double) args[index]);
			else
				return _makerandom_usage();
		}
		index++;
	}
	double tight = tightpf ? tightpf->doubleValue(0) : 0.0;

	int seed = 0;
	if (nargs - index > 0)		// explicit seed
		seed = (int) args[index];
	if (seed == 0) {
		struct timeval tv;
		gettimeofday(&tv, NULL);
		seed = (int) tv.tv_usec;
	}

	// check initial values
	if (min > max) {
		die("makerandom", "<min> must be less than or equal to <max>.");
		return NULL;
	}
	if (tight < 0.0) {
		die("makerandom", "<tight> must be zero or greater.");
		return NULL;
	}

	Random *gen = NULL;
	switch (type) {
		case kLinearRandom:
			gen = new LinearRandom(min, max, seed);
			break;
		case kLowLinearRandom:
			gen = new LowLinearRandom(min, max, seed);
			break;
		case kHighLinearRandom:
			gen = new HighLinearRandom(min, max, seed);
			break;
		case kTriangleRandom:
			gen = new TriangleRandom(min, max, seed);
			break;
		case kGaussianRandom:
			gen = new GaussianRandom(min, max, seed);
			break;
		case kCauchyRandom:
			gen = new CauchyRandom(min, max, seed);
			break;
		case kProbRandom:
			gen = new ProbRandom(min, max, mid, tight, seed);
			break;
		default:		// can't get here if type inited correctly above
			break;
	}

	PField *rand = new RandomPField(resetval, gen, freqpf, minpf, maxpf, midpf, tightpf);

	return createPFieldHandle(rand);
}