1
/*************************************************************************
2
* Copyright 2010 Olivier Belanger *
4
* This file is part of pyo, a python module to help digital signal *
5
* processing script creation. *
7
* pyo is free software: you can redistribute it and/or modify *
8
* it under the terms of the GNU General Public License as published by *
9
* the Free Software Foundation, either version 3 of the License, or *
10
* (at your option) any later version. *
12
* pyo is distributed in the hope that it will be useful, *
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
* GNU General Public License for more details. *
17
* You should have received a copy of the GNU General Public License *
18
* along with pyo. If not, see <http://www.gnu.org/licenses/>. *
19
*************************************************************************/
22
#include "structmember.h"
23
#include "pyomodule.h"
24
#include "streammodule.h"
25
#include "servermodule.h"
26
#include "dummymodule.h"
27
#include "tablemodule.h"
28
#include "interpolation.h"
37
int modebuffer[3]; // need at least 2 slots for mul & add
41
TrigRandInt_generate_i(TrigRandInt *self) {
43
MYFLT *in = Stream_getData((Stream *)self->input_stream);
44
MYFLT ma = PyFloat_AS_DOUBLE(self->max);
46
for (i=0; i<self->bufsize; i++) {
48
self->value = (MYFLT)((int)(rand()/((MYFLT)(RAND_MAX)+1)*ma));
50
self->data[i] = self->value;
55
TrigRandInt_generate_a(TrigRandInt *self) {
57
MYFLT *in = Stream_getData((Stream *)self->input_stream);
58
MYFLT *ma = Stream_getData((Stream *)self->max_stream);
60
for (i=0; i<self->bufsize; i++) {
62
self->value = (MYFLT)((int)(rand()/((MYFLT)(RAND_MAX)+1)*ma[i]));
64
self->data[i] = self->value;
68
static void TrigRandInt_postprocessing_ii(TrigRandInt *self) { POST_PROCESSING_II };
69
static void TrigRandInt_postprocessing_ai(TrigRandInt *self) { POST_PROCESSING_AI };
70
static void TrigRandInt_postprocessing_ia(TrigRandInt *self) { POST_PROCESSING_IA };
71
static void TrigRandInt_postprocessing_aa(TrigRandInt *self) { POST_PROCESSING_AA };
72
static void TrigRandInt_postprocessing_ireva(TrigRandInt *self) { POST_PROCESSING_IREVA };
73
static void TrigRandInt_postprocessing_areva(TrigRandInt *self) { POST_PROCESSING_AREVA };
74
static void TrigRandInt_postprocessing_revai(TrigRandInt *self) { POST_PROCESSING_REVAI };
75
static void TrigRandInt_postprocessing_revaa(TrigRandInt *self) { POST_PROCESSING_REVAA };
76
static void TrigRandInt_postprocessing_revareva(TrigRandInt *self) { POST_PROCESSING_REVAREVA };
79
TrigRandInt_setProcMode(TrigRandInt *self)
81
int procmode, muladdmode;
82
procmode = self->modebuffer[2];
83
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
87
self->proc_func_ptr = TrigRandInt_generate_i;
90
self->proc_func_ptr = TrigRandInt_generate_a;
95
self->muladd_func_ptr = TrigRandInt_postprocessing_ii;
98
self->muladd_func_ptr = TrigRandInt_postprocessing_ai;
101
self->muladd_func_ptr = TrigRandInt_postprocessing_revai;
104
self->muladd_func_ptr = TrigRandInt_postprocessing_ia;
107
self->muladd_func_ptr = TrigRandInt_postprocessing_aa;
110
self->muladd_func_ptr = TrigRandInt_postprocessing_revaa;
113
self->muladd_func_ptr = TrigRandInt_postprocessing_ireva;
116
self->muladd_func_ptr = TrigRandInt_postprocessing_areva;
119
self->muladd_func_ptr = TrigRandInt_postprocessing_revareva;
125
TrigRandInt_compute_next_data_frame(TrigRandInt *self)
127
(*self->proc_func_ptr)(self);
128
(*self->muladd_func_ptr)(self);
132
TrigRandInt_traverse(TrigRandInt *self, visitproc visit, void *arg)
135
Py_VISIT(self->input);
136
Py_VISIT(self->input_stream);
138
Py_VISIT(self->max_stream);
143
TrigRandInt_clear(TrigRandInt *self)
146
Py_CLEAR(self->input);
147
Py_CLEAR(self->input_stream);
149
Py_CLEAR(self->max_stream);
154
TrigRandInt_dealloc(TrigRandInt* self)
157
TrigRandInt_clear(self);
158
self->ob_type->tp_free((PyObject*)self);
161
static PyObject * TrigRandInt_deleteStream(TrigRandInt *self) { DELETE_STREAM };
164
TrigRandInt_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
168
self = (TrigRandInt *)type->tp_alloc(type, 0);
170
self->max = PyFloat_FromDouble(100.);
172
self->modebuffer[0] = 0;
173
self->modebuffer[1] = 0;
174
self->modebuffer[2] = 0;
177
Stream_setFunctionPtr(self->stream, TrigRandInt_compute_next_data_frame);
178
self->mode_func_ptr = TrigRandInt_setProcMode;
179
return (PyObject *)self;
183
TrigRandInt_init(TrigRandInt *self, PyObject *args, PyObject *kwds)
186
PyObject *inputtmp, *input_streamtmp, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
188
static char *kwlist[] = {"input", "max", "mul", "add", NULL};
190
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &maxtmp, &multmp, &addtmp))
196
PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
200
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
204
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
207
Py_INCREF(self->stream);
208
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
210
Server_generateSeed((Server *)self->server, TRIGRANDINT_ID);
212
if (self->modebuffer[2] == 0)
213
ma = PyFloat_AS_DOUBLE(PyNumber_Float(self->max));
215
ma = Stream_getData((Stream *)self->max_stream)[0];
216
self->value = (MYFLT)((int)(rand()/((MYFLT)(RAND_MAX)+1)*ma));
218
(*self->mode_func_ptr)(self);
224
static PyObject * TrigRandInt_getServer(TrigRandInt* self) { GET_SERVER };
225
static PyObject * TrigRandInt_getStream(TrigRandInt* self) { GET_STREAM };
226
static PyObject * TrigRandInt_setMul(TrigRandInt *self, PyObject *arg) { SET_MUL };
227
static PyObject * TrigRandInt_setAdd(TrigRandInt *self, PyObject *arg) { SET_ADD };
228
static PyObject * TrigRandInt_setSub(TrigRandInt *self, PyObject *arg) { SET_SUB };
229
static PyObject * TrigRandInt_setDiv(TrigRandInt *self, PyObject *arg) { SET_DIV };
231
static PyObject * TrigRandInt_play(TrigRandInt *self, PyObject *args, PyObject *kwds) { PLAY };
232
static PyObject * TrigRandInt_out(TrigRandInt *self, PyObject *args, PyObject *kwds) { OUT };
233
static PyObject * TrigRandInt_stop(TrigRandInt *self) { STOP };
235
static PyObject * TrigRandInt_multiply(TrigRandInt *self, PyObject *arg) { MULTIPLY };
236
static PyObject * TrigRandInt_inplace_multiply(TrigRandInt *self, PyObject *arg) { INPLACE_MULTIPLY };
237
static PyObject * TrigRandInt_add(TrigRandInt *self, PyObject *arg) { ADD };
238
static PyObject * TrigRandInt_inplace_add(TrigRandInt *self, PyObject *arg) { INPLACE_ADD };
239
static PyObject * TrigRandInt_sub(TrigRandInt *self, PyObject *arg) { SUB };
240
static PyObject * TrigRandInt_inplace_sub(TrigRandInt *self, PyObject *arg) { INPLACE_SUB };
241
static PyObject * TrigRandInt_div(TrigRandInt *self, PyObject *arg) { DIV };
242
static PyObject * TrigRandInt_inplace_div(TrigRandInt *self, PyObject *arg) { INPLACE_DIV };
245
TrigRandInt_setMax(TrigRandInt *self, PyObject *arg)
247
PyObject *tmp, *streamtmp;
254
int isNumber = PyNumber_Check(arg);
258
Py_DECREF(self->max);
260
self->max = PyNumber_Float(tmp);
261
self->modebuffer[2] = 0;
265
streamtmp = PyObject_CallMethod((PyObject *)self->max, "_getStream", NULL);
266
Py_INCREF(streamtmp);
267
Py_XDECREF(self->max_stream);
268
self->max_stream = (Stream *)streamtmp;
269
self->modebuffer[2] = 1;
272
(*self->mode_func_ptr)(self);
278
static PyMemberDef TrigRandInt_members[] = {
279
{"server", T_OBJECT_EX, offsetof(TrigRandInt, server), 0, "Pyo server."},
280
{"stream", T_OBJECT_EX, offsetof(TrigRandInt, stream), 0, "Stream object."},
281
{"input", T_OBJECT_EX, offsetof(TrigRandInt, input), 0, "Input sound object."},
282
{"max", T_OBJECT_EX, offsetof(TrigRandInt, max), 0, "Maximum possible value."},
283
{"mul", T_OBJECT_EX, offsetof(TrigRandInt, mul), 0, "Mul factor."},
284
{"add", T_OBJECT_EX, offsetof(TrigRandInt, add), 0, "Add factor."},
285
{NULL} /* Sentinel */
288
static PyMethodDef TrigRandInt_methods[] = {
289
{"getServer", (PyCFunction)TrigRandInt_getServer, METH_NOARGS, "Returns server object."},
290
{"_getStream", (PyCFunction)TrigRandInt_getStream, METH_NOARGS, "Returns stream object."},
291
{"deleteStream", (PyCFunction)TrigRandInt_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
292
{"play", (PyCFunction)TrigRandInt_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
293
{"out", (PyCFunction)TrigRandInt_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
294
{"stop", (PyCFunction)TrigRandInt_stop, METH_NOARGS, "Stops computing."},
295
{"setMax", (PyCFunction)TrigRandInt_setMax, METH_O, "Sets maximum possible value."},
296
{"setMul", (PyCFunction)TrigRandInt_setMul, METH_O, "Sets oscillator mul factor."},
297
{"setAdd", (PyCFunction)TrigRandInt_setAdd, METH_O, "Sets oscillator add factor."},
298
{"setSub", (PyCFunction)TrigRandInt_setSub, METH_O, "Sets inverse add factor."},
299
{"setDiv", (PyCFunction)TrigRandInt_setDiv, METH_O, "Sets inverse mul factor."},
300
{NULL} /* Sentinel */
303
static PyNumberMethods TrigRandInt_as_number = {
304
(binaryfunc)TrigRandInt_add, /*nb_add*/
305
(binaryfunc)TrigRandInt_sub, /*nb_subtract*/
306
(binaryfunc)TrigRandInt_multiply, /*nb_multiply*/
307
(binaryfunc)TrigRandInt_div, /*nb_divide*/
313
0, /*(unaryfunc)array_abs,*/
327
(binaryfunc)TrigRandInt_inplace_add, /*inplace_add*/
328
(binaryfunc)TrigRandInt_inplace_sub, /*inplace_subtract*/
329
(binaryfunc)TrigRandInt_inplace_multiply, /*inplace_multiply*/
330
(binaryfunc)TrigRandInt_inplace_div, /*inplace_divide*/
331
0, /*inplace_remainder*/
333
0, /*inplace_lshift*/
334
0, /*inplace_rshift*/
338
0, /*nb_floor_divide*/
339
0, /*nb_true_divide*/
340
0, /*nb_inplace_floor_divide*/
341
0, /*nb_inplace_true_divide*/
345
PyTypeObject TrigRandIntType = {
346
PyObject_HEAD_INIT(NULL)
348
"_pyo.TrigRandInt_base", /*tp_name*/
349
sizeof(TrigRandInt), /*tp_basicsize*/
351
(destructor)TrigRandInt_dealloc, /*tp_dealloc*/
357
&TrigRandInt_as_number, /*tp_as_number*/
358
0, /*tp_as_sequence*/
366
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
367
"TrigRandInt objects. Generates a new random integer value on a trigger signal.", /* tp_doc */
368
(traverseproc)TrigRandInt_traverse, /* tp_traverse */
369
(inquiry)TrigRandInt_clear, /* tp_clear */
370
0, /* tp_richcompare */
371
0, /* tp_weaklistoffset */
374
TrigRandInt_methods, /* tp_methods */
375
TrigRandInt_members, /* tp_members */
379
0, /* tp_descr_get */
380
0, /* tp_descr_set */
381
0, /* tp_dictoffset */
382
(initproc)TrigRandInt_init, /* tp_init */
384
TrigRandInt_new, /* tp_new */
390
Stream *input_stream;
401
int modebuffer[4]; // need at least 2 slots for mul & add
405
TrigRand_generate_ii(TrigRand *self) {
407
MYFLT *in = Stream_getData((Stream *)self->input_stream);
408
MYFLT mi = PyFloat_AS_DOUBLE(self->min);
409
MYFLT ma = PyFloat_AS_DOUBLE(self->max);
410
MYFLT range = ma - mi;
412
for (i=0; i<self->bufsize; i++) {
415
self->value = range * (rand()/((MYFLT)(RAND_MAX)+1)) + mi;
416
if (self->time <= 0.0)
417
self->currentValue = self->value;
419
self->stepVal = (self->value - self->currentValue) / self->timeStep;
422
if (self->timeCount == (self->timeStep - 1)) {
423
self->currentValue = self->value;
426
else if (self->timeCount < self->timeStep) {
427
self->currentValue += self->stepVal;
431
self->data[i] = self->currentValue;
436
TrigRand_generate_ai(TrigRand *self) {
438
MYFLT *in = Stream_getData((Stream *)self->input_stream);
439
MYFLT *mi = Stream_getData((Stream *)self->min_stream);
440
MYFLT ma = PyFloat_AS_DOUBLE(self->max);
442
for (i=0; i<self->bufsize; i++) {
443
MYFLT range = ma - mi[i];
446
self->value = range * (rand()/((MYFLT)(RAND_MAX)+1)) + mi[i];
447
if (self->time <= 0.0)
448
self->currentValue = self->value;
450
self->stepVal = (self->value - self->currentValue) / self->timeStep;
453
if (self->timeCount == (self->timeStep - 1)) {
454
self->currentValue = self->value;
457
else if (self->timeCount < self->timeStep) {
458
self->currentValue += self->stepVal;
462
self->data[i] = self->currentValue;
467
TrigRand_generate_ia(TrigRand *self) {
469
MYFLT *in = Stream_getData((Stream *)self->input_stream);
470
MYFLT mi = PyFloat_AS_DOUBLE(self->min);
471
MYFLT *ma = Stream_getData((Stream *)self->max_stream);
473
for (i=0; i<self->bufsize; i++) {
474
MYFLT range = ma[i] - mi;
477
self->value = range * (rand()/((MYFLT)(RAND_MAX)+1)) + mi;
478
if (self->time <= 0.0)
479
self->currentValue = self->value;
481
self->stepVal = (self->value - self->currentValue) / self->timeStep;
484
if (self->timeCount == (self->timeStep - 1)) {
485
self->currentValue = self->value;
488
else if (self->timeCount < self->timeStep) {
489
self->currentValue += self->stepVal;
493
self->data[i] = self->currentValue;
498
TrigRand_generate_aa(TrigRand *self) {
500
MYFLT *in = Stream_getData((Stream *)self->input_stream);
501
MYFLT *mi = Stream_getData((Stream *)self->min_stream);
502
MYFLT *ma = Stream_getData((Stream *)self->max_stream);
504
for (i=0; i<self->bufsize; i++) {
505
MYFLT range = ma[i] - mi[i];
508
self->value = range * (rand()/((MYFLT)(RAND_MAX)+1)) + mi[i];
509
if (self->time <= 0.0)
510
self->currentValue = self->value;
512
self->stepVal = (self->value - self->currentValue) / self->timeStep;
515
if (self->timeCount == (self->timeStep - 1)) {
516
self->currentValue = self->value;
519
else if (self->timeCount < self->timeStep) {
520
self->currentValue += self->stepVal;
524
self->data[i] = self->currentValue;
528
static void TrigRand_postprocessing_ii(TrigRand *self) { POST_PROCESSING_II };
529
static void TrigRand_postprocessing_ai(TrigRand *self) { POST_PROCESSING_AI };
530
static void TrigRand_postprocessing_ia(TrigRand *self) { POST_PROCESSING_IA };
531
static void TrigRand_postprocessing_aa(TrigRand *self) { POST_PROCESSING_AA };
532
static void TrigRand_postprocessing_ireva(TrigRand *self) { POST_PROCESSING_IREVA };
533
static void TrigRand_postprocessing_areva(TrigRand *self) { POST_PROCESSING_AREVA };
534
static void TrigRand_postprocessing_revai(TrigRand *self) { POST_PROCESSING_REVAI };
535
static void TrigRand_postprocessing_revaa(TrigRand *self) { POST_PROCESSING_REVAA };
536
static void TrigRand_postprocessing_revareva(TrigRand *self) { POST_PROCESSING_REVAREVA };
539
TrigRand_setProcMode(TrigRand *self)
541
int procmode, muladdmode;
542
procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
543
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
547
self->proc_func_ptr = TrigRand_generate_ii;
550
self->proc_func_ptr = TrigRand_generate_ai;
553
self->proc_func_ptr = TrigRand_generate_ia;
556
self->proc_func_ptr = TrigRand_generate_aa;
559
switch (muladdmode) {
561
self->muladd_func_ptr = TrigRand_postprocessing_ii;
564
self->muladd_func_ptr = TrigRand_postprocessing_ai;
567
self->muladd_func_ptr = TrigRand_postprocessing_revai;
570
self->muladd_func_ptr = TrigRand_postprocessing_ia;
573
self->muladd_func_ptr = TrigRand_postprocessing_aa;
576
self->muladd_func_ptr = TrigRand_postprocessing_revaa;
579
self->muladd_func_ptr = TrigRand_postprocessing_ireva;
582
self->muladd_func_ptr = TrigRand_postprocessing_areva;
585
self->muladd_func_ptr = TrigRand_postprocessing_revareva;
591
TrigRand_compute_next_data_frame(TrigRand *self)
593
(*self->proc_func_ptr)(self);
594
(*self->muladd_func_ptr)(self);
598
TrigRand_traverse(TrigRand *self, visitproc visit, void *arg)
601
Py_VISIT(self->input);
602
Py_VISIT(self->input_stream);
604
Py_VISIT(self->min_stream);
606
Py_VISIT(self->max_stream);
611
TrigRand_clear(TrigRand *self)
614
Py_CLEAR(self->input);
615
Py_CLEAR(self->input_stream);
617
Py_CLEAR(self->min_stream);
619
Py_CLEAR(self->max_stream);
624
TrigRand_dealloc(TrigRand* self)
627
TrigRand_clear(self);
628
self->ob_type->tp_free((PyObject*)self);
631
static PyObject * TrigRand_deleteStream(TrigRand *self) { DELETE_STREAM };
634
TrigRand_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
638
self = (TrigRand *)type->tp_alloc(type, 0);
640
self->min = PyFloat_FromDouble(0.);
641
self->max = PyFloat_FromDouble(1.);
642
self->value = self->currentValue = 0.;
646
self->modebuffer[0] = 0;
647
self->modebuffer[1] = 0;
648
self->modebuffer[2] = 0;
649
self->modebuffer[3] = 0;
652
Stream_setFunctionPtr(self->stream, TrigRand_compute_next_data_frame);
653
self->mode_func_ptr = TrigRand_setProcMode;
654
return (PyObject *)self;
658
TrigRand_init(TrigRand *self, PyObject *args, PyObject *kwds)
661
PyObject *inputtmp, *input_streamtmp, *mintmp=NULL, *maxtmp=NULL, *multmp=NULL, *addtmp=NULL;
663
static char *kwlist[] = {"input", "min", "max", "port", "init", "mul", "add", NULL};
665
if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_O_OOFFOO, kwlist, &inputtmp, &mintmp, &maxtmp, &self->time, &inittmp, &multmp, &addtmp))
671
PyObject_CallMethod((PyObject *)self, "setMin", "O", mintmp);
675
PyObject_CallMethod((PyObject *)self, "setMax", "O", maxtmp);
679
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
683
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
686
Py_INCREF(self->stream);
687
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
689
Server_generateSeed((Server *)self->server, TRIGRAND_ID);
691
self->value = self->currentValue = inittmp;
692
self->timeStep = (int)(self->time * self->sr);
694
(*self->mode_func_ptr)(self);
700
static PyObject * TrigRand_getServer(TrigRand* self) { GET_SERVER };
701
static PyObject * TrigRand_getStream(TrigRand* self) { GET_STREAM };
702
static PyObject * TrigRand_setMul(TrigRand *self, PyObject *arg) { SET_MUL };
703
static PyObject * TrigRand_setAdd(TrigRand *self, PyObject *arg) { SET_ADD };
704
static PyObject * TrigRand_setSub(TrigRand *self, PyObject *arg) { SET_SUB };
705
static PyObject * TrigRand_setDiv(TrigRand *self, PyObject *arg) { SET_DIV };
707
static PyObject * TrigRand_play(TrigRand *self, PyObject *args, PyObject *kwds) { PLAY };
708
static PyObject * TrigRand_out(TrigRand *self, PyObject *args, PyObject *kwds) { OUT };
709
static PyObject * TrigRand_stop(TrigRand *self) { STOP };
711
static PyObject * TrigRand_multiply(TrigRand *self, PyObject *arg) { MULTIPLY };
712
static PyObject * TrigRand_inplace_multiply(TrigRand *self, PyObject *arg) { INPLACE_MULTIPLY };
713
static PyObject * TrigRand_add(TrigRand *self, PyObject *arg) { ADD };
714
static PyObject * TrigRand_inplace_add(TrigRand *self, PyObject *arg) { INPLACE_ADD };
715
static PyObject * TrigRand_sub(TrigRand *self, PyObject *arg) { SUB };
716
static PyObject * TrigRand_inplace_sub(TrigRand *self, PyObject *arg) { INPLACE_SUB };
717
static PyObject * TrigRand_div(TrigRand *self, PyObject *arg) { DIV };
718
static PyObject * TrigRand_inplace_div(TrigRand *self, PyObject *arg) { INPLACE_DIV };
721
TrigRand_setMin(TrigRand *self, PyObject *arg)
723
PyObject *tmp, *streamtmp;
730
int isNumber = PyNumber_Check(arg);
734
Py_DECREF(self->min);
736
self->min = PyNumber_Float(tmp);
737
self->modebuffer[2] = 0;
741
streamtmp = PyObject_CallMethod((PyObject *)self->min, "_getStream", NULL);
742
Py_INCREF(streamtmp);
743
Py_XDECREF(self->min_stream);
744
self->min_stream = (Stream *)streamtmp;
745
self->modebuffer[2] = 1;
748
(*self->mode_func_ptr)(self);
755
TrigRand_setMax(TrigRand *self, PyObject *arg)
757
PyObject *tmp, *streamtmp;
764
int isNumber = PyNumber_Check(arg);
768
Py_DECREF(self->max);
770
self->max = PyNumber_Float(tmp);
771
self->modebuffer[3] = 0;
775
streamtmp = PyObject_CallMethod((PyObject *)self->max, "_getStream", NULL);
776
Py_INCREF(streamtmp);
777
Py_XDECREF(self->max_stream);
778
self->max_stream = (Stream *)streamtmp;
779
self->modebuffer[3] = 1;
782
(*self->mode_func_ptr)(self);
789
TrigRand_setPort(TrigRand *self, PyObject *arg)
798
int isNumber = PyNumber_Check(arg);
803
self->time = PyFloat_AS_DOUBLE(PyNumber_Float(tmp));
804
self->timeStep = (int)(self->time * self->sr);
811
static PyMemberDef TrigRand_members[] = {
812
{"server", T_OBJECT_EX, offsetof(TrigRand, server), 0, "Pyo server."},
813
{"stream", T_OBJECT_EX, offsetof(TrigRand, stream), 0, "Stream object."},
814
{"input", T_OBJECT_EX, offsetof(TrigRand, input), 0, "Input sound object."},
815
{"min", T_OBJECT_EX, offsetof(TrigRand, min), 0, "Minimum possible value."},
816
{"max", T_OBJECT_EX, offsetof(TrigRand, max), 0, "Maximum possible value."},
817
{"mul", T_OBJECT_EX, offsetof(TrigRand, mul), 0, "Mul factor."},
818
{"add", T_OBJECT_EX, offsetof(TrigRand, add), 0, "Add factor."},
819
{NULL} /* Sentinel */
822
static PyMethodDef TrigRand_methods[] = {
823
{"getServer", (PyCFunction)TrigRand_getServer, METH_NOARGS, "Returns server object."},
824
{"_getStream", (PyCFunction)TrigRand_getStream, METH_NOARGS, "Returns stream object."},
825
{"deleteStream", (PyCFunction)TrigRand_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
826
{"play", (PyCFunction)TrigRand_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
827
{"out", (PyCFunction)TrigRand_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
828
{"stop", (PyCFunction)TrigRand_stop, METH_NOARGS, "Stops computing."},
829
{"setMin", (PyCFunction)TrigRand_setMin, METH_O, "Sets minimum possible value."},
830
{"setMax", (PyCFunction)TrigRand_setMax, METH_O, "Sets maximum possible value."},
831
{"setPort", (PyCFunction)TrigRand_setPort, METH_O, "Sets a new ramp time value."},
832
{"setMul", (PyCFunction)TrigRand_setMul, METH_O, "Sets oscillator mul factor."},
833
{"setAdd", (PyCFunction)TrigRand_setAdd, METH_O, "Sets oscillator add factor."},
834
{"setSub", (PyCFunction)TrigRand_setSub, METH_O, "Sets inverse add factor."},
835
{"setDiv", (PyCFunction)TrigRand_setDiv, METH_O, "Sets inverse mul factor."},
836
{NULL} /* Sentinel */
839
static PyNumberMethods TrigRand_as_number = {
840
(binaryfunc)TrigRand_add, /*nb_add*/
841
(binaryfunc)TrigRand_sub, /*nb_subtract*/
842
(binaryfunc)TrigRand_multiply, /*nb_multiply*/
843
(binaryfunc)TrigRand_div, /*nb_divide*/
849
0, /*(unaryfunc)array_abs,*/
863
(binaryfunc)TrigRand_inplace_add, /*inplace_add*/
864
(binaryfunc)TrigRand_inplace_sub, /*inplace_subtract*/
865
(binaryfunc)TrigRand_inplace_multiply, /*inplace_multiply*/
866
(binaryfunc)TrigRand_inplace_div, /*inplace_divide*/
867
0, /*inplace_remainder*/
869
0, /*inplace_lshift*/
870
0, /*inplace_rshift*/
874
0, /*nb_floor_divide*/
875
0, /*nb_true_divide*/
876
0, /*nb_inplace_floor_divide*/
877
0, /*nb_inplace_true_divide*/
881
PyTypeObject TrigRandType = {
882
PyObject_HEAD_INIT(NULL)
884
"_pyo.TrigRand_base", /*tp_name*/
885
sizeof(TrigRand), /*tp_basicsize*/
887
(destructor)TrigRand_dealloc, /*tp_dealloc*/
893
&TrigRand_as_number, /*tp_as_number*/
894
0, /*tp_as_sequence*/
902
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
903
"TrigRand objects. Generates a new random value on a trigger signal.", /* tp_doc */
904
(traverseproc)TrigRand_traverse, /* tp_traverse */
905
(inquiry)TrigRand_clear, /* tp_clear */
906
0, /* tp_richcompare */
907
0, /* tp_weaklistoffset */
910
TrigRand_methods, /* tp_methods */
911
TrigRand_members, /* tp_members */
915
0, /* tp_descr_get */
916
0, /* tp_descr_set */
917
0, /* tp_dictoffset */
918
(initproc)TrigRand_init, /* tp_init */
920
TrigRand_new, /* tp_new */
923
/*********************************************************************************************/
924
/* TrigChoice ********************************************************************************/
925
/*********************************************************************************************/
929
Stream *input_stream;
938
int modebuffer[2]; // need at least 2 slots for mul & add
942
TrigChoice_generate(TrigChoice *self) {
944
MYFLT *in = Stream_getData((Stream *)self->input_stream);
946
for (i=0; i<self->bufsize; i++) {
949
self->value = self->choice[(int)((rand()/((MYFLT)(RAND_MAX))) * self->chSize)];
950
if (self->time <= 0.0)
951
self->currentValue = self->value;
953
self->stepVal = (self->value - self->currentValue) / self->timeStep;
956
if (self->timeCount == (self->timeStep - 1)) {
957
self->currentValue = self->value;
960
else if (self->timeCount < self->timeStep) {
961
self->currentValue += self->stepVal;
965
self->data[i] = self->currentValue;
969
static void TrigChoice_postprocessing_ii(TrigChoice *self) { POST_PROCESSING_II };
970
static void TrigChoice_postprocessing_ai(TrigChoice *self) { POST_PROCESSING_AI };
971
static void TrigChoice_postprocessing_ia(TrigChoice *self) { POST_PROCESSING_IA };
972
static void TrigChoice_postprocessing_aa(TrigChoice *self) { POST_PROCESSING_AA };
973
static void TrigChoice_postprocessing_ireva(TrigChoice *self) { POST_PROCESSING_IREVA };
974
static void TrigChoice_postprocessing_areva(TrigChoice *self) { POST_PROCESSING_AREVA };
975
static void TrigChoice_postprocessing_revai(TrigChoice *self) { POST_PROCESSING_REVAI };
976
static void TrigChoice_postprocessing_revaa(TrigChoice *self) { POST_PROCESSING_REVAA };
977
static void TrigChoice_postprocessing_revareva(TrigChoice *self) { POST_PROCESSING_REVAREVA };
980
TrigChoice_setProcMode(TrigChoice *self)
983
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
985
self->proc_func_ptr = TrigChoice_generate;
987
switch (muladdmode) {
989
self->muladd_func_ptr = TrigChoice_postprocessing_ii;
992
self->muladd_func_ptr = TrigChoice_postprocessing_ai;
995
self->muladd_func_ptr = TrigChoice_postprocessing_revai;
998
self->muladd_func_ptr = TrigChoice_postprocessing_ia;
1001
self->muladd_func_ptr = TrigChoice_postprocessing_aa;
1004
self->muladd_func_ptr = TrigChoice_postprocessing_revaa;
1007
self->muladd_func_ptr = TrigChoice_postprocessing_ireva;
1010
self->muladd_func_ptr = TrigChoice_postprocessing_areva;
1013
self->muladd_func_ptr = TrigChoice_postprocessing_revareva;
1019
TrigChoice_compute_next_data_frame(TrigChoice *self)
1021
(*self->proc_func_ptr)(self);
1022
(*self->muladd_func_ptr)(self);
1026
TrigChoice_traverse(TrigChoice *self, visitproc visit, void *arg)
1029
Py_VISIT(self->input);
1030
Py_VISIT(self->input_stream);
1035
TrigChoice_clear(TrigChoice *self)
1038
Py_CLEAR(self->input);
1039
Py_CLEAR(self->input_stream);
1044
TrigChoice_dealloc(TrigChoice* self)
1048
TrigChoice_clear(self);
1049
self->ob_type->tp_free((PyObject*)self);
1052
static PyObject * TrigChoice_deleteStream(TrigChoice *self) { DELETE_STREAM };
1055
TrigChoice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1059
self = (TrigChoice *)type->tp_alloc(type, 0);
1061
self->value = self->currentValue = 0.;
1063
self->timeCount = 0;
1064
self->stepVal = 0.0;
1065
self->modebuffer[0] = 0;
1066
self->modebuffer[1] = 0;
1069
Stream_setFunctionPtr(self->stream, TrigChoice_compute_next_data_frame);
1070
self->mode_func_ptr = TrigChoice_setProcMode;
1071
return (PyObject *)self;
1075
TrigChoice_init(TrigChoice *self, PyObject *args, PyObject *kwds)
1077
MYFLT inittmp = 0.0;
1078
PyObject *inputtmp, *input_streamtmp, *choicetmp=NULL, *multmp=NULL, *addtmp=NULL;
1080
static char *kwlist[] = {"input", "choice", "port", "init", "mul", "add", NULL};
1082
if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_FFOO, kwlist, &inputtmp, &choicetmp, &self->time, &inittmp, &multmp, &addtmp))
1088
PyObject_CallMethod((PyObject *)self, "setChoice", "O", choicetmp);
1092
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
1096
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
1099
Py_INCREF(self->stream);
1100
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
1102
Server_generateSeed((Server *)self->server, TRIGCHOICE_ID);
1104
self->value = self->currentValue = inittmp;
1105
self->timeStep = (int)(self->time * self->sr);
1107
(*self->mode_func_ptr)(self);
1113
static PyObject * TrigChoice_getServer(TrigChoice* self) { GET_SERVER };
1114
static PyObject * TrigChoice_getStream(TrigChoice* self) { GET_STREAM };
1115
static PyObject * TrigChoice_setMul(TrigChoice *self, PyObject *arg) { SET_MUL };
1116
static PyObject * TrigChoice_setAdd(TrigChoice *self, PyObject *arg) { SET_ADD };
1117
static PyObject * TrigChoice_setSub(TrigChoice *self, PyObject *arg) { SET_SUB };
1118
static PyObject * TrigChoice_setDiv(TrigChoice *self, PyObject *arg) { SET_DIV };
1120
static PyObject * TrigChoice_play(TrigChoice *self, PyObject *args, PyObject *kwds) { PLAY };
1121
static PyObject * TrigChoice_out(TrigChoice *self, PyObject *args, PyObject *kwds) { OUT };
1122
static PyObject * TrigChoice_stop(TrigChoice *self) { STOP };
1124
static PyObject * TrigChoice_multiply(TrigChoice *self, PyObject *arg) { MULTIPLY };
1125
static PyObject * TrigChoice_inplace_multiply(TrigChoice *self, PyObject *arg) { INPLACE_MULTIPLY };
1126
static PyObject * TrigChoice_add(TrigChoice *self, PyObject *arg) { ADD };
1127
static PyObject * TrigChoice_inplace_add(TrigChoice *self, PyObject *arg) { INPLACE_ADD };
1128
static PyObject * TrigChoice_sub(TrigChoice *self, PyObject *arg) { SUB };
1129
static PyObject * TrigChoice_inplace_sub(TrigChoice *self, PyObject *arg) { INPLACE_SUB };
1130
static PyObject * TrigChoice_div(TrigChoice *self, PyObject *arg) { DIV };
1131
static PyObject * TrigChoice_inplace_div(TrigChoice *self, PyObject *arg) { INPLACE_DIV };
1134
TrigChoice_setChoice(TrigChoice *self, PyObject *arg)
1139
if (! PyList_Check(arg)) {
1140
PyErr_SetString(PyExc_TypeError, "The choice attribute must be a list.");
1146
self->chSize = PyList_Size(tmp);
1147
self->choice = (MYFLT *)realloc(self->choice, self->chSize * sizeof(MYFLT));
1148
for (i=0; i<self->chSize; i++) {
1149
self->choice[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(tmp, i)));
1152
(*self->mode_func_ptr)(self);
1159
TrigChoice_setPort(TrigChoice *self, PyObject *arg)
1168
int isNumber = PyNumber_Check(arg);
1172
if (isNumber == 1) {
1173
self->time = PyFloat_AS_DOUBLE(PyNumber_Float(tmp));
1174
self->timeStep = (int)(self->time * self->sr);
1181
static PyMemberDef TrigChoice_members[] = {
1182
{"server", T_OBJECT_EX, offsetof(TrigChoice, server), 0, "Pyo server."},
1183
{"stream", T_OBJECT_EX, offsetof(TrigChoice, stream), 0, "Stream object."},
1184
{"input", T_OBJECT_EX, offsetof(TrigChoice, input), 0, "Input sound object."},
1185
{"mul", T_OBJECT_EX, offsetof(TrigChoice, mul), 0, "Mul factor."},
1186
{"add", T_OBJECT_EX, offsetof(TrigChoice, add), 0, "Add factor."},
1187
{NULL} /* Sentinel */
1190
static PyMethodDef TrigChoice_methods[] = {
1191
{"getServer", (PyCFunction)TrigChoice_getServer, METH_NOARGS, "Returns server object."},
1192
{"_getStream", (PyCFunction)TrigChoice_getStream, METH_NOARGS, "Returns stream object."},
1193
{"deleteStream", (PyCFunction)TrigChoice_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
1194
{"play", (PyCFunction)TrigChoice_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
1195
{"out", (PyCFunction)TrigChoice_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
1196
{"stop", (PyCFunction)TrigChoice_stop, METH_NOARGS, "Stops computing."},
1197
{"setChoice", (PyCFunction)TrigChoice_setChoice, METH_O, "Sets possible values."},
1198
{"setPort", (PyCFunction)TrigChoice_setPort, METH_O, "Sets new portamento time."},
1199
{"setMul", (PyCFunction)TrigChoice_setMul, METH_O, "Sets oscillator mul factor."},
1200
{"setAdd", (PyCFunction)TrigChoice_setAdd, METH_O, "Sets oscillator add factor."},
1201
{"setSub", (PyCFunction)TrigChoice_setSub, METH_O, "Sets inverse add factor."},
1202
{"setDiv", (PyCFunction)TrigChoice_setDiv, METH_O, "Sets inverse mul factor."},
1203
{NULL} /* Sentinel */
1206
static PyNumberMethods TrigChoice_as_number = {
1207
(binaryfunc)TrigChoice_add, /*nb_add*/
1208
(binaryfunc)TrigChoice_sub, /*nb_subtract*/
1209
(binaryfunc)TrigChoice_multiply, /*nb_multiply*/
1210
(binaryfunc)TrigChoice_div, /*nb_divide*/
1216
0, /*(unaryfunc)array_abs,*/
1230
(binaryfunc)TrigChoice_inplace_add, /*inplace_add*/
1231
(binaryfunc)TrigChoice_inplace_sub, /*inplace_subtract*/
1232
(binaryfunc)TrigChoice_inplace_multiply, /*inplace_multiply*/
1233
(binaryfunc)TrigChoice_inplace_div, /*inplace_divide*/
1234
0, /*inplace_remainder*/
1235
0, /*inplace_power*/
1236
0, /*inplace_lshift*/
1237
0, /*inplace_rshift*/
1241
0, /*nb_floor_divide*/
1242
0, /*nb_true_divide*/
1243
0, /*nb_inplace_floor_divide*/
1244
0, /*nb_inplace_true_divide*/
1248
PyTypeObject TrigChoiceType = {
1249
PyObject_HEAD_INIT(NULL)
1251
"_pyo.TrigChoice_base", /*tp_name*/
1252
sizeof(TrigChoice), /*tp_basicsize*/
1254
(destructor)TrigChoice_dealloc, /*tp_dealloc*/
1260
&TrigChoice_as_number, /*tp_as_number*/
1261
0, /*tp_as_sequence*/
1262
0, /*tp_as_mapping*/
1269
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
1270
"TrigChoice objects. Generates a new random value pick in a user choice on a trigger signal.", /* tp_doc */
1271
(traverseproc)TrigChoice_traverse, /* tp_traverse */
1272
(inquiry)TrigChoice_clear, /* tp_clear */
1273
0, /* tp_richcompare */
1274
0, /* tp_weaklistoffset */
1276
0, /* tp_iternext */
1277
TrigChoice_methods, /* tp_methods */
1278
TrigChoice_members, /* tp_members */
1282
0, /* tp_descr_get */
1283
0, /* tp_descr_set */
1284
0, /* tp_dictoffset */
1285
(initproc)TrigChoice_init, /* tp_init */
1287
TrigChoice_new, /* tp_new */
1290
/*********************************************************************************************/
1291
/* TrigFunc ********************************************************************************/
1292
/*********************************************************************************************/
1297
Stream *input_stream;
1302
TrigFunc_generate(TrigFunc *self) {
1304
PyObject *tuple, *result;
1305
MYFLT *in = Stream_getData((Stream *)self->input_stream);
1307
for (i=0; i<self->bufsize; i++) {
1309
if (self->arg == Py_None) {
1310
result = PyObject_Call(self->func, PyTuple_New(0), NULL);
1311
if (result == NULL) {
1317
tuple = PyTuple_New(1);
1318
PyTuple_SET_ITEM(tuple, 0, self->arg);
1319
result = PyObject_Call(self->func, tuple, NULL);
1320
if (result == NULL) {
1330
TrigFunc_compute_next_data_frame(TrigFunc *self)
1332
TrigFunc_generate(self);
1336
TrigFunc_traverse(TrigFunc *self, visitproc visit, void *arg)
1339
Py_VISIT(self->input);
1340
Py_VISIT(self->input_stream);
1341
Py_VISIT(self->func);
1342
Py_VISIT(self->arg);
1347
TrigFunc_clear(TrigFunc *self)
1350
Py_CLEAR(self->input);
1351
Py_CLEAR(self->input_stream);
1352
Py_CLEAR(self->func);
1353
Py_CLEAR(self->arg);
1358
TrigFunc_dealloc(TrigFunc* self)
1361
TrigFunc_clear(self);
1362
self->ob_type->tp_free((PyObject*)self);
1365
static PyObject * TrigFunc_deleteStream(TrigFunc *self) { DELETE_STREAM };
1368
TrigFunc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1372
self = (TrigFunc *)type->tp_alloc(type, 0);
1374
self->arg = Py_None;
1377
Stream_setFunctionPtr(self->stream, TrigFunc_compute_next_data_frame);
1378
return (PyObject *)self;
1382
TrigFunc_init(TrigFunc *self, PyObject *args, PyObject *kwds)
1384
PyObject *inputtmp, *input_streamtmp, *functmp=NULL, *argtmp=NULL;
1386
static char *kwlist[] = {"input", "function", "arg", NULL};
1388
if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|O", kwlist, &inputtmp, &functmp, &argtmp))
1394
PyObject_CallMethod((PyObject *)self, "setFunction", "O", functmp);
1398
PyObject_CallMethod((PyObject *)self, "setArg", "O", argtmp);
1401
Py_INCREF(self->stream);
1402
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
1408
static PyObject * TrigFunc_getServer(TrigFunc* self) { GET_SERVER };
1409
static PyObject * TrigFunc_getStream(TrigFunc* self) { GET_STREAM };
1411
static PyObject * TrigFunc_play(TrigFunc *self, PyObject *args, PyObject *kwds) { PLAY };
1412
static PyObject * TrigFunc_stop(TrigFunc *self) { STOP };
1415
TrigFunc_setFunction(TrigFunc *self, PyObject *arg)
1419
if (! PyCallable_Check(arg)) {
1420
PyErr_SetString(PyExc_TypeError, "The function attribute must be callable.");
1426
Py_XDECREF(self->func);
1435
TrigFunc_setArg(TrigFunc *self, PyObject *arg)
1440
Py_DECREF(self->arg);
1448
static PyMemberDef TrigFunc_members[] = {
1449
{"server", T_OBJECT_EX, offsetof(TrigFunc, server), 0, "Pyo server."},
1450
{"stream", T_OBJECT_EX, offsetof(TrigFunc, stream), 0, "Stream object."},
1451
{"input", T_OBJECT_EX, offsetof(TrigFunc, input), 0, "Input sound object."},
1452
{NULL} /* Sentinel */
1455
static PyMethodDef TrigFunc_methods[] = {
1456
{"getServer", (PyCFunction)TrigFunc_getServer, METH_NOARGS, "Returns server object."},
1457
{"_getStream", (PyCFunction)TrigFunc_getStream, METH_NOARGS, "Returns stream object."},
1458
{"deleteStream", (PyCFunction)TrigFunc_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
1459
{"play", (PyCFunction)TrigFunc_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
1460
{"stop", (PyCFunction)TrigFunc_stop, METH_NOARGS, "Stops computing."},
1461
{"setFunction", (PyCFunction)TrigFunc_setFunction, METH_O, "Sets function to be called."},
1462
{"setArg", (PyCFunction)TrigFunc_setArg, METH_O, "Sets function's argument."},
1463
{NULL} /* Sentinel */
1466
PyTypeObject TrigFuncType = {
1467
PyObject_HEAD_INIT(NULL)
1469
"_pyo.TrigFunc_base", /*tp_name*/
1470
sizeof(TrigFunc), /*tp_basicsize*/
1472
(destructor)TrigFunc_dealloc, /*tp_dealloc*/
1479
0, /*tp_as_sequence*/
1480
0, /*tp_as_mapping*/
1487
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
1488
"TrigFunc objects. Called a function on a trigger signal.", /* tp_doc */
1489
(traverseproc)TrigFunc_traverse, /* tp_traverse */
1490
(inquiry)TrigFunc_clear, /* tp_clear */
1491
0, /* tp_richcompare */
1492
0, /* tp_weaklistoffset */
1494
0, /* tp_iternext */
1495
TrigFunc_methods, /* tp_methods */
1496
TrigFunc_members, /* tp_members */
1500
0, /* tp_descr_get */
1501
0, /* tp_descr_set */
1502
0, /* tp_dictoffset */
1503
(initproc)TrigFunc_init, /* tp_init */
1505
TrigFunc_new, /* tp_new */
1508
/*********************************************************************************************/
1509
/* TrigEnv *********************************************************************************/
1510
/*********************************************************************************************/
1515
Stream *input_stream;
1520
MYFLT current_dur; // duration in samples
1521
MYFLT inc; // table size / current_dur
1522
double pointerPos; // reading position in sample
1524
TriggerStream *trig_stream;
1525
int interp; /* 0 = default to 2, 1 = nointerp, 2 = linear, 3 = cos, 4 = cubic */
1526
MYFLT (*interp_func_ptr)(MYFLT *, int, MYFLT, int);
1530
TrigEnv_readframes_i(TrigEnv *self) {
1533
MYFLT *in = Stream_getData((Stream *)self->input_stream);
1534
MYFLT *tablelist = TableStream_getData(self->table);
1535
int size = TableStream_getSize(self->table);
1537
for (i=0; i<self->bufsize; i++) {
1538
self->trigsBuffer[i] = 0.0;
1540
MYFLT dur = PyFloat_AS_DOUBLE(self->dur);
1541
self->current_dur = self->sr * dur;
1542
if (self->current_dur <= 0.0) {
1543
self->current_dur = 0.0;
1548
self->inc = (MYFLT)size / self->current_dur;
1551
self->pointerPos = 0.;
1553
if (self->active == 1) {
1554
ipart = (int)self->pointerPos;
1555
fpart = self->pointerPos - ipart;
1556
self->data[i] = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
1557
self->pointerPos += self->inc;
1562
if (self->pointerPos > size && self->active == 1) {
1563
self->trigsBuffer[i] = 1.0;
1570
TrigEnv_readframes_a(TrigEnv *self) {
1573
MYFLT *in = Stream_getData((Stream *)self->input_stream);
1574
MYFLT *dur_st = Stream_getData((Stream *)self->dur_stream);
1575
MYFLT *tablelist = TableStream_getData(self->table);
1576
int size = TableStream_getSize(self->table);
1578
for (i=0; i<self->bufsize; i++) {
1579
self->trigsBuffer[i] = 0.0;
1582
self->current_dur = self->sr * dur;
1583
if (self->current_dur <= 0.0) {
1584
self->current_dur = 0.0;
1589
self->inc = (MYFLT)size / self->current_dur;
1592
self->pointerPos = 0.;
1594
if (self->active == 1) {
1595
ipart = (int)self->pointerPos;
1596
fpart = self->pointerPos - ipart;
1597
self->data[i] = (*self->interp_func_ptr)(tablelist, ipart, fpart, size);
1598
self->pointerPos += self->inc;
1603
if (self->pointerPos > size && self->active == 1) {
1604
self->trigsBuffer[i] = 1.0;
1610
static void TrigEnv_postprocessing_ii(TrigEnv *self) { POST_PROCESSING_II };
1611
static void TrigEnv_postprocessing_ai(TrigEnv *self) { POST_PROCESSING_AI };
1612
static void TrigEnv_postprocessing_ia(TrigEnv *self) { POST_PROCESSING_IA };
1613
static void TrigEnv_postprocessing_aa(TrigEnv *self) { POST_PROCESSING_AA };
1614
static void TrigEnv_postprocessing_ireva(TrigEnv *self) { POST_PROCESSING_IREVA };
1615
static void TrigEnv_postprocessing_areva(TrigEnv *self) { POST_PROCESSING_AREVA };
1616
static void TrigEnv_postprocessing_revai(TrigEnv *self) { POST_PROCESSING_REVAI };
1617
static void TrigEnv_postprocessing_revaa(TrigEnv *self) { POST_PROCESSING_REVAA };
1618
static void TrigEnv_postprocessing_revareva(TrigEnv *self) { POST_PROCESSING_REVAREVA };
1621
TrigEnv_setProcMode(TrigEnv *self)
1623
int procmode, muladdmode;
1624
procmode = self->modebuffer[2];
1625
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
1629
self->proc_func_ptr = TrigEnv_readframes_i;
1632
self->proc_func_ptr = TrigEnv_readframes_a;
1635
switch (muladdmode) {
1637
self->muladd_func_ptr = TrigEnv_postprocessing_ii;
1640
self->muladd_func_ptr = TrigEnv_postprocessing_ai;
1643
self->muladd_func_ptr = TrigEnv_postprocessing_revai;
1646
self->muladd_func_ptr = TrigEnv_postprocessing_ia;
1649
self->muladd_func_ptr = TrigEnv_postprocessing_aa;
1652
self->muladd_func_ptr = TrigEnv_postprocessing_revaa;
1655
self->muladd_func_ptr = TrigEnv_postprocessing_ireva;
1658
self->muladd_func_ptr = TrigEnv_postprocessing_areva;
1661
self->muladd_func_ptr = TrigEnv_postprocessing_revareva;
1667
TrigEnv_compute_next_data_frame(TrigEnv *self)
1669
(*self->proc_func_ptr)(self);
1670
(*self->muladd_func_ptr)(self);
1674
TrigEnv_traverse(TrigEnv *self, visitproc visit, void *arg)
1677
Py_VISIT(self->table);
1678
Py_VISIT(self->input);
1679
Py_VISIT(self->input_stream);
1680
Py_VISIT(self->dur);
1681
Py_VISIT(self->dur_stream);
1682
Py_VISIT(self->trig_stream);
1687
TrigEnv_clear(TrigEnv *self)
1690
Py_CLEAR(self->table);
1691
Py_CLEAR(self->input);
1692
Py_CLEAR(self->input_stream);
1693
Py_CLEAR(self->dur);
1694
Py_CLEAR(self->dur_stream);
1695
Py_CLEAR(self->trig_stream);
1700
TrigEnv_dealloc(TrigEnv* self)
1703
free(self->trigsBuffer);
1704
TrigEnv_clear(self);
1705
self->ob_type->tp_free((PyObject*)self);
1708
static PyObject * TrigEnv_deleteStream(TrigEnv *self) { DELETE_STREAM };
1711
TrigEnv_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1715
self = (TrigEnv *)type->tp_alloc(type, 0);
1717
self->modebuffer[0] = 0;
1718
self->modebuffer[1] = 0;
1719
self->modebuffer[2] = 0;
1721
self->pointerPos = 0.;
1726
Stream_setFunctionPtr(self->stream, TrigEnv_compute_next_data_frame);
1727
self->mode_func_ptr = TrigEnv_setProcMode;
1729
self->dur = PyFloat_FromDouble(1.);
1730
self->current_dur = self->sr;
1732
return (PyObject *)self;
1736
TrigEnv_init(TrigEnv *self, PyObject *args, PyObject *kwds)
1739
PyObject *inputtmp, *input_streamtmp, *tabletmp, *durtmp=NULL, *multmp=NULL, *addtmp=NULL;
1741
static char *kwlist[] = {"input", "table", "dur", "interp", "mul", "add", NULL};
1743
if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OiOO", kwlist, &inputtmp, &tabletmp, &durtmp, &self->interp, &multmp, &addtmp))
1748
Py_XDECREF(self->table);
1749
self->table = PyObject_CallMethod((PyObject *)tabletmp, "getTableStream", "");
1752
PyObject_CallMethod((PyObject *)self, "setDur", "O", durtmp);
1756
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
1760
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
1763
Py_INCREF(self->stream);
1764
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
1766
self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
1768
for (i=0; i<self->bufsize; i++) {
1769
self->trigsBuffer[i] = 0.0;
1772
MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
1773
TriggerStream_setData(self->trig_stream, self->trigsBuffer);
1775
(*self->mode_func_ptr)(self);
1783
static PyObject * TrigEnv_getServer(TrigEnv* self) { GET_SERVER };
1784
static PyObject * TrigEnv_getStream(TrigEnv* self) { GET_STREAM };
1785
static PyObject * TrigEnv_getTriggerStream(TrigEnv* self) { GET_TRIGGER_STREAM };
1786
static PyObject * TrigEnv_setMul(TrigEnv *self, PyObject *arg) { SET_MUL };
1787
static PyObject * TrigEnv_setAdd(TrigEnv *self, PyObject *arg) { SET_ADD };
1788
static PyObject * TrigEnv_setSub(TrigEnv *self, PyObject *arg) { SET_SUB };
1789
static PyObject * TrigEnv_setDiv(TrigEnv *self, PyObject *arg) { SET_DIV };
1791
static PyObject * TrigEnv_play(TrigEnv *self, PyObject *args, PyObject *kwds) { PLAY };
1792
static PyObject * TrigEnv_out(TrigEnv *self, PyObject *args, PyObject *kwds) { OUT };
1793
static PyObject * TrigEnv_stop(TrigEnv *self) { STOP };
1795
static PyObject * TrigEnv_multiply(TrigEnv *self, PyObject *arg) { MULTIPLY };
1796
static PyObject * TrigEnv_inplace_multiply(TrigEnv *self, PyObject *arg) { INPLACE_MULTIPLY };
1797
static PyObject * TrigEnv_add(TrigEnv *self, PyObject *arg) { ADD };
1798
static PyObject * TrigEnv_inplace_add(TrigEnv *self, PyObject *arg) { INPLACE_ADD };
1799
static PyObject * TrigEnv_sub(TrigEnv *self, PyObject *arg) { SUB };
1800
static PyObject * TrigEnv_inplace_sub(TrigEnv *self, PyObject *arg) { INPLACE_SUB };
1801
static PyObject * TrigEnv_div(TrigEnv *self, PyObject *arg) { DIV };
1802
static PyObject * TrigEnv_inplace_div(TrigEnv *self, PyObject *arg) { INPLACE_DIV };
1805
TrigEnv_getTable(TrigEnv* self)
1807
Py_INCREF(self->table);
1812
TrigEnv_setTable(TrigEnv *self, PyObject *arg)
1822
Py_DECREF(self->table);
1823
self->table = PyObject_CallMethod((PyObject *)tmp, "getTableStream", "");
1830
TrigEnv_setDur(TrigEnv *self, PyObject *arg)
1832
PyObject *tmp, *streamtmp;
1839
int isNumber = PyNumber_Check(arg);
1843
Py_DECREF(self->dur);
1844
if (isNumber == 1) {
1845
self->dur = PyNumber_Float(tmp);
1846
self->modebuffer[2] = 0;
1850
streamtmp = PyObject_CallMethod((PyObject *)self->dur, "_getStream", NULL);
1851
Py_INCREF(streamtmp);
1852
Py_XDECREF(self->dur_stream);
1853
self->dur_stream = (Stream *)streamtmp;
1854
self->modebuffer[2] = 1;
1857
(*self->mode_func_ptr)(self);
1864
TrigEnv_setInterp(TrigEnv *self, PyObject *arg)
1871
int isNumber = PyNumber_Check(arg);
1873
if (isNumber == 1) {
1874
self->interp = PyInt_AsLong(PyNumber_Int(arg));
1883
static PyMemberDef TrigEnv_members[] = {
1884
{"server", T_OBJECT_EX, offsetof(TrigEnv, server), 0, "Pyo server."},
1885
{"stream", T_OBJECT_EX, offsetof(TrigEnv, stream), 0, "Stream object."},
1886
{"trig_stream", T_OBJECT_EX, offsetof(TrigEnv, trig_stream), 0, "Trigger Stream object."},
1887
{"table", T_OBJECT_EX, offsetof(TrigEnv, table), 0, "Envelope table."},
1888
{"dur", T_OBJECT_EX, offsetof(TrigEnv, dur), 0, "Envelope duration in seconds."},
1889
{"mul", T_OBJECT_EX, offsetof(TrigEnv, mul), 0, "Mul factor."},
1890
{"add", T_OBJECT_EX, offsetof(TrigEnv, add), 0, "Add factor."},
1891
{NULL} /* Sentinel */
1894
static PyMethodDef TrigEnv_methods[] = {
1895
{"getTable", (PyCFunction)TrigEnv_getTable, METH_NOARGS, "Returns waveform table object."},
1896
{"getServer", (PyCFunction)TrigEnv_getServer, METH_NOARGS, "Returns server object."},
1897
{"_getStream", (PyCFunction)TrigEnv_getStream, METH_NOARGS, "Returns stream object."},
1898
{"_getTriggerStream", (PyCFunction)TrigEnv_getTriggerStream, METH_NOARGS, "Returns trigger stream object."},
1899
{"deleteStream", (PyCFunction)TrigEnv_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
1900
{"play", (PyCFunction)TrigEnv_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
1901
{"out", (PyCFunction)TrigEnv_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
1902
{"stop", (PyCFunction)TrigEnv_stop, METH_NOARGS, "Stops computing."},
1903
{"setTable", (PyCFunction)TrigEnv_setTable, METH_O, "Sets envelope table."},
1904
{"setDur", (PyCFunction)TrigEnv_setDur, METH_O, "Sets envelope duration in second."},
1905
{"setInterp", (PyCFunction)TrigEnv_setInterp, METH_O, "Sets oscillator interpolation mode."},
1906
{"setMul", (PyCFunction)TrigEnv_setMul, METH_O, "Sets mul factor."},
1907
{"setAdd", (PyCFunction)TrigEnv_setAdd, METH_O, "Sets add factor."},
1908
{"setSub", (PyCFunction)TrigEnv_setSub, METH_O, "Sets inverse add factor."},
1909
{"setDiv", (PyCFunction)TrigEnv_setDiv, METH_O, "Sets inverse mul factor."},
1910
{NULL} /* Sentinel */
1913
static PyNumberMethods TrigEnv_as_number = {
1914
(binaryfunc)TrigEnv_add, /*nb_add*/
1915
(binaryfunc)TrigEnv_sub, /*nb_subtract*/
1916
(binaryfunc)TrigEnv_multiply, /*nb_multiply*/
1917
(binaryfunc)TrigEnv_div, /*nb_divide*/
1923
0, /*(unaryfunc)array_abs,*/
1937
(binaryfunc)TrigEnv_inplace_add, /*inplace_add*/
1938
(binaryfunc)TrigEnv_inplace_sub, /*inplace_subtract*/
1939
(binaryfunc)TrigEnv_inplace_multiply, /*inplace_multiply*/
1940
(binaryfunc)TrigEnv_inplace_div, /*inplace_divide*/
1941
0, /*inplace_remainder*/
1942
0, /*inplace_power*/
1943
0, /*inplace_lshift*/
1944
0, /*inplace_rshift*/
1948
0, /*nb_floor_divide*/
1949
0, /*nb_true_divide*/
1950
0, /*nb_inplace_floor_divide*/
1951
0, /*nb_inplace_true_divide*/
1955
PyTypeObject TrigEnvType = {
1956
PyObject_HEAD_INIT(NULL)
1958
"_pyo.TrigEnv_base", /*tp_name*/
1959
sizeof(TrigEnv), /*tp_basicsize*/
1961
(destructor)TrigEnv_dealloc, /*tp_dealloc*/
1967
&TrigEnv_as_number, /*tp_as_number*/
1968
0, /*tp_as_sequence*/
1969
0, /*tp_as_mapping*/
1976
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
1977
"TrigEnv objects. Starts an envelope on a trigger signal.", /* tp_doc */
1978
(traverseproc)TrigEnv_traverse, /* tp_traverse */
1979
(inquiry)TrigEnv_clear, /* tp_clear */
1980
0, /* tp_richcompare */
1981
0, /* tp_weaklistoffset */
1983
0, /* tp_iternext */
1984
TrigEnv_methods, /* tp_methods */
1985
TrigEnv_members, /* tp_members */
1989
0, /* tp_descr_get */
1990
0, /* tp_descr_set */
1991
0, /* tp_dictoffset */
1992
(initproc)TrigEnv_init, /* tp_init */
1994
TrigEnv_new, /* tp_new */
1997
/*********************************************************************************************/
1998
/* TrigLinseg *********************************************************************************/
1999
/*********************************************************************************************/
2002
PyObject *pointslist;
2004
Stream *input_stream;
2007
double currentValue;
2017
TriggerStream *trig_stream;
2021
TrigLinseg_convert_pointslist(TrigLinseg *self) {
2025
self->listsize = PyList_Size(self->pointslist);
2026
self->targets = (MYFLT *)realloc(self->targets, self->listsize * sizeof(MYFLT));
2027
self->times = (MYFLT *)realloc(self->times, self->listsize * sizeof(MYFLT));
2028
for (i=0; i<self->listsize; i++) {
2029
tup = PyList_GET_ITEM(self->pointslist, i);
2030
self->times[i] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 0)));
2031
self->targets[i] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));
2036
TrigLinseg_reinit(TrigLinseg *self) {
2037
if (self->newlist == 1) {
2038
TrigLinseg_convert_pointslist((TrigLinseg *)self);
2041
self->currentTime = 0.0;
2042
self->currentValue = self->targets[0];
2048
TrigLinseg_generate(TrigLinseg *self) {
2050
MYFLT *in = Stream_getData((Stream *)self->input_stream);
2052
for (i=0; i<self->bufsize; i++) {
2053
self->trigsBuffer[i] = 0.0;
2055
TrigLinseg_reinit((TrigLinseg *)self);
2057
if (self->flag == 1) {
2058
if (self->currentTime >= self->times[self->which]) {
2060
if (self->which == self->listsize) {
2061
self->trigsBuffer[i] = 1.0;
2063
self->currentValue = self->targets[self->which-1];
2066
if ((self->times[self->which] - self->times[self->which-1]) <= 0)
2067
self->increment = self->targets[self->which] - self->currentValue;
2069
self->increment = (self->targets[self->which] - self->targets[self->which-1]) / ((self->times[self->which] - self->times[self->which-1]) / self->sampleToSec);
2071
if (self->currentTime <= self->times[self->listsize-1])
2072
self->currentValue += self->increment;
2073
self->data[i] = (MYFLT)self->currentValue;
2074
self->currentTime += self->sampleToSec;
2077
self->data[i] = (MYFLT)self->currentValue;
2081
static void TrigLinseg_postprocessing_ii(TrigLinseg *self) { POST_PROCESSING_II };
2082
static void TrigLinseg_postprocessing_ai(TrigLinseg *self) { POST_PROCESSING_AI };
2083
static void TrigLinseg_postprocessing_ia(TrigLinseg *self) { POST_PROCESSING_IA };
2084
static void TrigLinseg_postprocessing_aa(TrigLinseg *self) { POST_PROCESSING_AA };
2085
static void TrigLinseg_postprocessing_ireva(TrigLinseg *self) { POST_PROCESSING_IREVA };
2086
static void TrigLinseg_postprocessing_areva(TrigLinseg *self) { POST_PROCESSING_AREVA };
2087
static void TrigLinseg_postprocessing_revai(TrigLinseg *self) { POST_PROCESSING_REVAI };
2088
static void TrigLinseg_postprocessing_revaa(TrigLinseg *self) { POST_PROCESSING_REVAA };
2089
static void TrigLinseg_postprocessing_revareva(TrigLinseg *self) { POST_PROCESSING_REVAREVA };
2092
TrigLinseg_setProcMode(TrigLinseg *self)
2095
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
2097
self->proc_func_ptr = TrigLinseg_generate;
2099
switch (muladdmode) {
2101
self->muladd_func_ptr = TrigLinseg_postprocessing_ii;
2104
self->muladd_func_ptr = TrigLinseg_postprocessing_ai;
2107
self->muladd_func_ptr = TrigLinseg_postprocessing_revai;
2110
self->muladd_func_ptr = TrigLinseg_postprocessing_ia;
2113
self->muladd_func_ptr = TrigLinseg_postprocessing_aa;
2116
self->muladd_func_ptr = TrigLinseg_postprocessing_revaa;
2119
self->muladd_func_ptr = TrigLinseg_postprocessing_ireva;
2122
self->muladd_func_ptr = TrigLinseg_postprocessing_areva;
2125
self->muladd_func_ptr = TrigLinseg_postprocessing_revareva;
2131
TrigLinseg_compute_next_data_frame(TrigLinseg *self)
2133
(*self->proc_func_ptr)(self);
2134
(*self->muladd_func_ptr)(self);
2138
TrigLinseg_traverse(TrigLinseg *self, visitproc visit, void *arg)
2141
Py_VISIT(self->pointslist);
2142
Py_VISIT(self->trig_stream);
2147
TrigLinseg_clear(TrigLinseg *self)
2150
Py_CLEAR(self->pointslist);
2151
Py_CLEAR(self->trig_stream);
2156
TrigLinseg_dealloc(TrigLinseg* self)
2159
free(self->targets);
2161
free(self->trigsBuffer);
2162
TrigLinseg_clear(self);
2163
self->ob_type->tp_free((PyObject*)self);
2166
static PyObject * TrigLinseg_deleteStream(TrigLinseg *self) { DELETE_STREAM };
2169
TrigLinseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2173
self = (TrigLinseg *)type->tp_alloc(type, 0);
2176
self->modebuffer[0] = 0;
2177
self->modebuffer[1] = 0;
2180
Stream_setFunctionPtr(self->stream, TrigLinseg_compute_next_data_frame);
2181
self->mode_func_ptr = TrigLinseg_setProcMode;
2183
self->sampleToSec = 1. / self->sr;
2185
return (PyObject *)self;
2189
TrigLinseg_init(TrigLinseg *self, PyObject *args, PyObject *kwds)
2191
PyObject *inputtmp, *input_streamtmp, *pointslist=NULL, *multmp=NULL, *addtmp=NULL;
2194
static char *kwlist[] = {"input", "list", "mul", "add", NULL};
2196
if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &inputtmp, &pointslist, &multmp, &addtmp))
2201
Py_INCREF(pointslist);
2202
Py_XDECREF(self->pointslist);
2203
self->pointslist = pointslist;
2204
TrigLinseg_convert_pointslist((TrigLinseg *)self);
2207
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
2211
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
2214
Py_INCREF(self->stream);
2215
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
2217
self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
2219
for (i=0; i<self->bufsize; i++) {
2220
self->trigsBuffer[i] = 0.0;
2223
MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
2224
TriggerStream_setData(self->trig_stream, self->trigsBuffer);
2226
(*self->mode_func_ptr)(self);
2232
static PyObject * TrigLinseg_getServer(TrigLinseg* self) { GET_SERVER };
2233
static PyObject * TrigLinseg_getStream(TrigLinseg* self) { GET_STREAM };
2234
static PyObject * TrigLinseg_getTriggerStream(TrigLinseg* self) { GET_TRIGGER_STREAM };
2235
static PyObject * TrigLinseg_setMul(TrigLinseg *self, PyObject *arg) { SET_MUL };
2236
static PyObject * TrigLinseg_setAdd(TrigLinseg *self, PyObject *arg) { SET_ADD };
2237
static PyObject * TrigLinseg_setSub(TrigLinseg *self, PyObject *arg) { SET_SUB };
2238
static PyObject * TrigLinseg_setDiv(TrigLinseg *self, PyObject *arg) { SET_DIV };
2240
static PyObject * TrigLinseg_play(TrigLinseg *self, PyObject *args, PyObject *kwds) { PLAY };
2241
static PyObject * TrigLinseg_stop(TrigLinseg *self) { STOP };
2243
static PyObject * TrigLinseg_multiply(TrigLinseg *self, PyObject *arg) { MULTIPLY };
2244
static PyObject * TrigLinseg_inplace_multiply(TrigLinseg *self, PyObject *arg) { INPLACE_MULTIPLY };
2245
static PyObject * TrigLinseg_add(TrigLinseg *self, PyObject *arg) { ADD };
2246
static PyObject * TrigLinseg_inplace_add(TrigLinseg *self, PyObject *arg) { INPLACE_ADD };
2247
static PyObject * TrigLinseg_sub(TrigLinseg *self, PyObject *arg) { SUB };
2248
static PyObject * TrigLinseg_inplace_sub(TrigLinseg *self, PyObject *arg) { INPLACE_SUB };
2249
static PyObject * TrigLinseg_div(TrigLinseg *self, PyObject *arg) { DIV };
2250
static PyObject * TrigLinseg_inplace_div(TrigLinseg *self, PyObject *arg) { INPLACE_DIV };
2253
TrigLinseg_setList(TrigLinseg *self, PyObject *value)
2255
if (value == NULL) {
2256
PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
2257
return PyInt_FromLong(-1);
2260
if (! PyList_Check(value)) {
2261
PyErr_SetString(PyExc_TypeError, "The points list attribute value must be a list of tuples.");
2262
return PyInt_FromLong(-1);
2266
Py_DECREF(self->pointslist);
2267
self->pointslist = value;
2275
static PyMemberDef TrigLinseg_members[] = {
2276
{"server", T_OBJECT_EX, offsetof(TrigLinseg, server), 0, "Pyo server."},
2277
{"stream", T_OBJECT_EX, offsetof(TrigLinseg, stream), 0, "Stream object."},
2278
{"trig_stream", T_OBJECT_EX, offsetof(TrigLinseg, trig_stream), 0, "Trigger Stream object."},
2279
{"pointslist", T_OBJECT_EX, offsetof(TrigLinseg, pointslist), 0, "List of target points."},
2280
{"mul", T_OBJECT_EX, offsetof(TrigLinseg, mul), 0, "Mul factor."},
2281
{"add", T_OBJECT_EX, offsetof(TrigLinseg, add), 0, "Add factor."},
2282
{NULL} /* Sentinel */
2285
static PyMethodDef TrigLinseg_methods[] = {
2286
{"getServer", (PyCFunction)TrigLinseg_getServer, METH_NOARGS, "Returns server object."},
2287
{"_getStream", (PyCFunction)TrigLinseg_getStream, METH_NOARGS, "Returns stream object."},
2288
{"_getTriggerStream", (PyCFunction)TrigLinseg_getTriggerStream, METH_NOARGS, "Returns trigger stream object."},
2289
{"deleteStream", (PyCFunction)TrigLinseg_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
2290
{"play", (PyCFunction)TrigLinseg_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
2291
{"stop", (PyCFunction)TrigLinseg_stop, METH_NOARGS, "Starts fadeout and stops computing."},
2292
{"setList", (PyCFunction)TrigLinseg_setList, METH_O, "Sets target points list."},
2293
{"setMul", (PyCFunction)TrigLinseg_setMul, METH_O, "Sets TrigLinseg mul factor."},
2294
{"setAdd", (PyCFunction)TrigLinseg_setAdd, METH_O, "Sets TrigLinseg add factor."},
2295
{"setSub", (PyCFunction)TrigLinseg_setSub, METH_O, "Sets inverse add factor."},
2296
{"setDiv", (PyCFunction)TrigLinseg_setDiv, METH_O, "Sets inverse mul factor."},
2297
{NULL} /* Sentinel */
2300
static PyNumberMethods TrigLinseg_as_number = {
2301
(binaryfunc)TrigLinseg_add, /*nb_add*/
2302
(binaryfunc)TrigLinseg_sub, /*nb_subtract*/
2303
(binaryfunc)TrigLinseg_multiply, /*nb_multiply*/
2304
(binaryfunc)TrigLinseg_div, /*nb_divide*/
2310
0, /*(unaryfunc)array_abs,*/
2324
(binaryfunc)TrigLinseg_inplace_add, /*inplace_add*/
2325
(binaryfunc)TrigLinseg_inplace_sub, /*inplace_subtract*/
2326
(binaryfunc)TrigLinseg_inplace_multiply, /*inplace_multiply*/
2327
(binaryfunc)TrigLinseg_inplace_div, /*inplace_divide*/
2328
0, /*inplace_remainder*/
2329
0, /*inplace_power*/
2330
0, /*inplace_lshift*/
2331
0, /*inplace_rshift*/
2335
0, /*nb_floor_divide*/
2336
0, /*nb_true_divide*/
2337
0, /*nb_inplace_floor_divide*/
2338
0, /*nb_inplace_true_divide*/
2342
PyTypeObject TrigLinsegType = {
2343
PyObject_HEAD_INIT(NULL)
2345
"_pyo.TrigLinseg_base", /*tp_name*/
2346
sizeof(TrigLinseg), /*tp_basicsize*/
2348
(destructor)TrigLinseg_dealloc, /*tp_dealloc*/
2354
&TrigLinseg_as_number, /*tp_as_number*/
2355
0, /*tp_as_sequence*/
2356
0, /*tp_as_mapping*/
2363
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
2364
"TrigLinseg objects. Generates a linear segments break-points line.", /* tp_doc */
2365
(traverseproc)TrigLinseg_traverse, /* tp_traverse */
2366
(inquiry)TrigLinseg_clear, /* tp_clear */
2367
0, /* tp_richcompare */
2368
0, /* tp_weaklistoffset */
2370
0, /* tp_iternext */
2371
TrigLinseg_methods, /* tp_methods */
2372
TrigLinseg_members, /* tp_members */
2376
0, /* tp_descr_get */
2377
0, /* tp_descr_set */
2378
0, /* tp_dictoffset */
2379
(initproc)TrigLinseg_init, /* tp_init */
2381
TrigLinseg_new, /* tp_new */
2384
/*********************************************************************************************/
2385
/* TrigExpseg *********************************************************************************/
2386
/*********************************************************************************************/
2389
PyObject *pointslist;
2391
Stream *input_stream;
2394
double currentValue;
2411
TriggerStream *trig_stream;
2415
TrigExpseg_convert_pointslist(TrigExpseg *self) {
2419
self->listsize = PyList_Size(self->pointslist);
2420
self->targets = (MYFLT *)realloc(self->targets, self->listsize * sizeof(MYFLT));
2421
self->times = (MYFLT *)realloc(self->times, self->listsize * sizeof(MYFLT));
2422
for (i=0; i<self->listsize; i++) {
2423
tup = PyList_GET_ITEM(self->pointslist, i);
2424
self->times[i] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 0)));
2425
self->targets[i] = PyFloat_AsDouble(PyNumber_Float(PyTuple_GET_ITEM(tup, 1)));
2430
TrigExpseg_reinit(TrigExpseg *self) {
2431
if (self->newlist == 1) {
2432
TrigExpseg_convert_pointslist((TrigExpseg *)self);
2435
self->currentTime = 0.0;
2436
self->currentValue = self->targets[0];
2439
self->exp = self->exp_tmp;
2440
self->inverse = self->inverse_tmp;
2444
TrigExpseg_generate(TrigExpseg *self) {
2447
MYFLT *in = Stream_getData((Stream *)self->input_stream);
2449
for (i=0; i<self->bufsize; i++) {
2450
self->trigsBuffer[i] = 0.0;
2452
TrigExpseg_reinit((TrigExpseg *)self);
2454
if (self->flag == 1) {
2455
if (self->currentTime >= self->times[self->which]) {
2457
if (self->which == self->listsize) {
2458
self->trigsBuffer[i] = 1.0;
2460
self->currentValue = self->targets[self->which-1];
2463
self->range = self->targets[self->which] - self->targets[self->which-1];
2464
self->steps = (self->times[self->which] - self->times[self->which-1]) * self->sr;
2465
if (self->steps <= 0)
2468
self->inc = 1.0 / self->steps;
2469
self->pointer = 0.0;
2472
if (self->currentTime <= self->times[self->listsize-1]) {
2473
if (self->pointer >= 1.0)
2474
self->pointer = 1.0;
2475
if (self->inverse == 1 && self->range < 0.0)
2476
scl = 1.0 - MYPOW(1.0 - self->pointer, self->exp);
2478
scl = MYPOW(self->pointer, self->exp);
2480
self->currentValue = scl * self->range + self->targets[self->which-1];
2481
self->pointer += self->inc;
2483
self->data[i] = (MYFLT)self->currentValue;
2484
self->currentTime += self->sampleToSec;
2487
self->data[i] = (MYFLT)self->currentValue;
2491
static void TrigExpseg_postprocessing_ii(TrigExpseg *self) { POST_PROCESSING_II };
2492
static void TrigExpseg_postprocessing_ai(TrigExpseg *self) { POST_PROCESSING_AI };
2493
static void TrigExpseg_postprocessing_ia(TrigExpseg *self) { POST_PROCESSING_IA };
2494
static void TrigExpseg_postprocessing_aa(TrigExpseg *self) { POST_PROCESSING_AA };
2495
static void TrigExpseg_postprocessing_ireva(TrigExpseg *self) { POST_PROCESSING_IREVA };
2496
static void TrigExpseg_postprocessing_areva(TrigExpseg *self) { POST_PROCESSING_AREVA };
2497
static void TrigExpseg_postprocessing_revai(TrigExpseg *self) { POST_PROCESSING_REVAI };
2498
static void TrigExpseg_postprocessing_revaa(TrigExpseg *self) { POST_PROCESSING_REVAA };
2499
static void TrigExpseg_postprocessing_revareva(TrigExpseg *self) { POST_PROCESSING_REVAREVA };
2502
TrigExpseg_setProcMode(TrigExpseg *self)
2505
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
2507
self->proc_func_ptr = TrigExpseg_generate;
2509
switch (muladdmode) {
2511
self->muladd_func_ptr = TrigExpseg_postprocessing_ii;
2514
self->muladd_func_ptr = TrigExpseg_postprocessing_ai;
2517
self->muladd_func_ptr = TrigExpseg_postprocessing_revai;
2520
self->muladd_func_ptr = TrigExpseg_postprocessing_ia;
2523
self->muladd_func_ptr = TrigExpseg_postprocessing_aa;
2526
self->muladd_func_ptr = TrigExpseg_postprocessing_revaa;
2529
self->muladd_func_ptr = TrigExpseg_postprocessing_ireva;
2532
self->muladd_func_ptr = TrigExpseg_postprocessing_areva;
2535
self->muladd_func_ptr = TrigExpseg_postprocessing_revareva;
2541
TrigExpseg_compute_next_data_frame(TrigExpseg *self)
2543
(*self->proc_func_ptr)(self);
2544
(*self->muladd_func_ptr)(self);
2548
TrigExpseg_traverse(TrigExpseg *self, visitproc visit, void *arg)
2551
Py_VISIT(self->pointslist);
2552
Py_VISIT(self->trig_stream);
2557
TrigExpseg_clear(TrigExpseg *self)
2560
Py_CLEAR(self->pointslist);
2561
Py_CLEAR(self->trig_stream);
2566
TrigExpseg_dealloc(TrigExpseg* self)
2569
free(self->targets);
2571
free(self->trigsBuffer);
2572
TrigExpseg_clear(self);
2573
self->ob_type->tp_free((PyObject*)self);
2576
static PyObject * TrigExpseg_deleteStream(TrigExpseg *self) { DELETE_STREAM };
2579
TrigExpseg_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2583
self = (TrigExpseg *)type->tp_alloc(type, 0);
2586
self->exp = self->exp_tmp = 10;
2587
self->inverse = self->inverse_tmp = 1;
2588
self->modebuffer[0] = 0;
2589
self->modebuffer[1] = 0;
2592
Stream_setFunctionPtr(self->stream, TrigExpseg_compute_next_data_frame);
2593
self->mode_func_ptr = TrigExpseg_setProcMode;
2595
self->sampleToSec = 1. / self->sr;
2597
return (PyObject *)self;
2601
TrigExpseg_init(TrigExpseg *self, PyObject *args, PyObject *kwds)
2603
PyObject *inputtmp, *input_streamtmp, *pointslist=NULL, *multmp=NULL, *addtmp=NULL;
2606
static char *kwlist[] = {"input", "list", "exp", "inverse", "mul", "add", NULL};
2608
if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|diOO", kwlist, &inputtmp, &pointslist, &self->exp_tmp, &self->inverse_tmp, &multmp, &addtmp))
2613
Py_INCREF(pointslist);
2614
Py_XDECREF(self->pointslist);
2615
self->pointslist = pointslist;
2616
TrigExpseg_convert_pointslist((TrigExpseg *)self);
2619
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
2623
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
2626
Py_INCREF(self->stream);
2627
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
2629
self->trigsBuffer = (MYFLT *)realloc(self->trigsBuffer, self->bufsize * sizeof(MYFLT));
2631
for (i=0; i<self->bufsize; i++) {
2632
self->trigsBuffer[i] = 0.0;
2635
MAKE_NEW_TRIGGER_STREAM(self->trig_stream, &TriggerStreamType, NULL);
2636
TriggerStream_setData(self->trig_stream, self->trigsBuffer);
2638
(*self->mode_func_ptr)(self);
2644
static PyObject * TrigExpseg_getServer(TrigExpseg* self) { GET_SERVER };
2645
static PyObject * TrigExpseg_getStream(TrigExpseg* self) { GET_STREAM };
2646
static PyObject * TrigExpseg_getTriggerStream(TrigExpseg* self) { GET_TRIGGER_STREAM };
2647
static PyObject * TrigExpseg_setMul(TrigExpseg *self, PyObject *arg) { SET_MUL };
2648
static PyObject * TrigExpseg_setAdd(TrigExpseg *self, PyObject *arg) { SET_ADD };
2649
static PyObject * TrigExpseg_setSub(TrigExpseg *self, PyObject *arg) { SET_SUB };
2650
static PyObject * TrigExpseg_setDiv(TrigExpseg *self, PyObject *arg) { SET_DIV };
2652
static PyObject * TrigExpseg_play(TrigExpseg *self, PyObject *args, PyObject *kwds) { PLAY };
2653
static PyObject * TrigExpseg_stop(TrigExpseg *self) { STOP };
2655
static PyObject * TrigExpseg_multiply(TrigExpseg *self, PyObject *arg) { MULTIPLY };
2656
static PyObject * TrigExpseg_inplace_multiply(TrigExpseg *self, PyObject *arg) { INPLACE_MULTIPLY };
2657
static PyObject * TrigExpseg_add(TrigExpseg *self, PyObject *arg) { ADD };
2658
static PyObject * TrigExpseg_inplace_add(TrigExpseg *self, PyObject *arg) { INPLACE_ADD };
2659
static PyObject * TrigExpseg_sub(TrigExpseg *self, PyObject *arg) { SUB };
2660
static PyObject * TrigExpseg_inplace_sub(TrigExpseg *self, PyObject *arg) { INPLACE_SUB };
2661
static PyObject * TrigExpseg_div(TrigExpseg *self, PyObject *arg) { DIV };
2662
static PyObject * TrigExpseg_inplace_div(TrigExpseg *self, PyObject *arg) { INPLACE_DIV };
2665
TrigExpseg_setList(TrigExpseg *self, PyObject *value)
2667
if (value == NULL) {
2668
PyErr_SetString(PyExc_TypeError, "Cannot delete the list attribute.");
2669
return PyInt_FromLong(-1);
2672
if (! PyList_Check(value)) {
2673
PyErr_SetString(PyExc_TypeError, "The points list attribute value must be a list of tuples.");
2674
return PyInt_FromLong(-1);
2678
Py_DECREF(self->pointslist);
2679
self->pointslist = value;
2688
TrigExpseg_setExp(TrigExpseg *self, PyObject *arg)
2695
self->exp_tmp = PyFloat_AsDouble(PyNumber_Float(arg));
2702
TrigExpseg_setInverse(TrigExpseg *self, PyObject *arg)
2709
self->inverse_tmp = PyInt_AsLong(PyNumber_Int(arg));
2715
static PyMemberDef TrigExpseg_members[] = {
2716
{"server", T_OBJECT_EX, offsetof(TrigExpseg, server), 0, "Pyo server."},
2717
{"stream", T_OBJECT_EX, offsetof(TrigExpseg, stream), 0, "Stream object."},
2718
{"trig_stream", T_OBJECT_EX, offsetof(TrigExpseg, trig_stream), 0, "Trigger Stream object."},
2719
{"pointslist", T_OBJECT_EX, offsetof(TrigExpseg, pointslist), 0, "List of target points."},
2720
{"mul", T_OBJECT_EX, offsetof(TrigExpseg, mul), 0, "Mul factor."},
2721
{"add", T_OBJECT_EX, offsetof(TrigExpseg, add), 0, "Add factor."},
2722
{NULL} /* Sentinel */
2725
static PyMethodDef TrigExpseg_methods[] = {
2726
{"getServer", (PyCFunction)TrigExpseg_getServer, METH_NOARGS, "Returns server object."},
2727
{"_getStream", (PyCFunction)TrigExpseg_getStream, METH_NOARGS, "Returns stream object."},
2728
{"_getTriggerStream", (PyCFunction)TrigExpseg_getTriggerStream, METH_NOARGS, "Returns trigger stream object."},
2729
{"deleteStream", (PyCFunction)TrigExpseg_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
2730
{"play", (PyCFunction)TrigExpseg_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
2731
{"stop", (PyCFunction)TrigExpseg_stop, METH_NOARGS, "Starts fadeout and stops computing."},
2732
{"setList", (PyCFunction)TrigExpseg_setList, METH_O, "Sets target points list."},
2733
{"setExp", (PyCFunction)TrigExpseg_setExp, METH_O, "Sets exponent factor."},
2734
{"setInverse", (PyCFunction)TrigExpseg_setInverse, METH_O, "Sets inverse factor."},
2735
{"setMul", (PyCFunction)TrigExpseg_setMul, METH_O, "Sets TrigExpseg mul factor."},
2736
{"setAdd", (PyCFunction)TrigExpseg_setAdd, METH_O, "Sets TrigExpseg add factor."},
2737
{"setSub", (PyCFunction)TrigExpseg_setSub, METH_O, "Sets inverse add factor."},
2738
{"setDiv", (PyCFunction)TrigExpseg_setDiv, METH_O, "Sets inverse mul factor."},
2739
{NULL} /* Sentinel */
2742
static PyNumberMethods TrigExpseg_as_number = {
2743
(binaryfunc)TrigExpseg_add, /*nb_add*/
2744
(binaryfunc)TrigExpseg_sub, /*nb_subtract*/
2745
(binaryfunc)TrigExpseg_multiply, /*nb_multiply*/
2746
(binaryfunc)TrigExpseg_div, /*nb_divide*/
2752
0, /*(unaryfunc)array_abs,*/
2766
(binaryfunc)TrigExpseg_inplace_add, /*inplace_add*/
2767
(binaryfunc)TrigExpseg_inplace_sub, /*inplace_subtract*/
2768
(binaryfunc)TrigExpseg_inplace_multiply, /*inplace_multiply*/
2769
(binaryfunc)TrigExpseg_inplace_div, /*inplace_divide*/
2770
0, /*inplace_remainder*/
2771
0, /*inplace_power*/
2772
0, /*inplace_lshift*/
2773
0, /*inplace_rshift*/
2777
0, /*nb_floor_divide*/
2778
0, /*nb_true_divide*/
2779
0, /*nb_inplace_floor_divide*/
2780
0, /*nb_inplace_true_divide*/
2784
PyTypeObject TrigExpsegType = {
2785
PyObject_HEAD_INIT(NULL)
2787
"_pyo.TrigExpseg_base", /*tp_name*/
2788
sizeof(TrigExpseg), /*tp_basicsize*/
2790
(destructor)TrigExpseg_dealloc, /*tp_dealloc*/
2796
&TrigExpseg_as_number, /*tp_as_number*/
2797
0, /*tp_as_sequence*/
2798
0, /*tp_as_mapping*/
2805
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
2806
"TrigExpseg objects. Generates a linear segments break-points line.", /* tp_doc */
2807
(traverseproc)TrigExpseg_traverse, /* tp_traverse */
2808
(inquiry)TrigExpseg_clear, /* tp_clear */
2809
0, /* tp_richcompare */
2810
0, /* tp_weaklistoffset */
2812
0, /* tp_iternext */
2813
TrigExpseg_methods, /* tp_methods */
2814
TrigExpseg_members, /* tp_members */
2818
0, /* tp_descr_get */
2819
0, /* tp_descr_set */
2820
0, /* tp_dictoffset */
2821
(initproc)TrigExpseg_init, /* tp_init */
2823
TrigExpseg_new, /* tp_new */
2827
/**** TrigXnoise *****/
2832
Stream *input_stream;
2837
MYFLT (*type_func_ptr)();
2842
MYFLT lastPoissonX1;
2844
MYFLT poisson_buffer[2000];
2846
MYFLT loop_buffer[15];
2853
int modebuffer[4]; // need at least 2 slots for mul & add
2858
TrigXnoise_uniform(TrigXnoise *self) {
2859
return RANDOM_UNIFORM;
2863
TrigXnoise_linear_min(TrigXnoise *self) {
2864
MYFLT a = RANDOM_UNIFORM;
2865
MYFLT b = RANDOM_UNIFORM;
2866
if (a < b) return a;
2871
TrigXnoise_linear_max(TrigXnoise *self) {
2872
MYFLT a = RANDOM_UNIFORM;
2873
MYFLT b = RANDOM_UNIFORM;
2874
if (a > b) return a;
2879
TrigXnoise_triangle(TrigXnoise *self) {
2880
MYFLT a = RANDOM_UNIFORM;
2881
MYFLT b = RANDOM_UNIFORM;
2882
return ((a + b) * 0.5);
2887
TrigXnoise_expon_min(TrigXnoise *self) {
2888
if (self->xx1 <= 0.0) self->xx1 = 0.00001;
2889
MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;
2890
if (val < 0.0) return 0.0;
2891
else if (val > 1.0) return 1.0;
2896
TrigXnoise_expon_max(TrigXnoise *self) {
2897
if (self->xx1 <= 0.0) self->xx1 = 0.00001;
2898
MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);
2899
if (val < 0.0) return 0.0;
2900
else if (val > 1.0) return 1.0;
2906
TrigXnoise_biexpon(TrigXnoise *self) {
2908
if (self->xx1 <= 0.0) self->xx1 = 0.00001;
2909
MYFLT sum = RANDOM_UNIFORM * 2.0;
2918
val = 0.5 * (polar * MYLOG(sum) / self->xx1) + 0.5;
2920
if (val < 0.0) return 0.0;
2921
else if (val > 1.0) return 1.0;
2926
TrigXnoise_cauchy(TrigXnoise *self) {
2927
MYFLT rnd, val, dir;
2929
rnd = RANDOM_UNIFORM;
2933
if (rand() < (RAND_MAX / 2))
2938
val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
2940
if (val < 0.0) return 0.0;
2941
else if (val > 1.0) return 1.0;
2945
// x1 = locator, x2 = shape
2947
TrigXnoise_weibull(TrigXnoise *self) {
2949
if (self->xx2 <= 0.0) self->xx2 = 0.00001;
2951
rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
2952
val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
2954
if (val < 0.0) return 0.0;
2955
else if (val > 1.0) return 1.0;
2959
// x1 = locator, x2 = bandwidth
2961
TrigXnoise_gaussian(TrigXnoise *self) {
2964
rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
2965
val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
2967
if (val < 0.0) return 0.0;
2968
else if (val > 1.0) return 1.0;
2972
// x1 = gravity center, x2 = compress/expand
2974
TrigXnoise_poisson(TrigXnoise *self) {
2975
int i, j, factorial;
2978
if (self->xx1 < 0.1) self->xx1 = 0.1;
2979
if (self->xx2 < 0.1) self->xx2 = 0.1;
2981
if (self->xx1 != self->lastPoissonX1) {
2982
self->lastPoissonX1 = self->xx1;
2983
self->poisson_tab = 0;
2985
for (i=1; i<12; i++) {
2987
tot = (long)(1000.0 * (MYPOW(2.7182818, -self->xx1) * MYPOW(self->xx1, i) / factorial));
2988
for (j=0; j<tot; j++) {
2989
self->poisson_buffer[self->poisson_tab] = i;
2990
self->poisson_tab++;
2994
val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
2996
if (val < 0.0) return 0.0;
2997
else if (val > 1.0) return 1.0;
3001
// x1 = max value, x2 = max step
3003
TrigXnoise_walker(TrigXnoise *self) {
3006
if (self->xx2 < 0.002) self->xx2 = 0.002;
3008
modulo = (int)(self->xx2 * 1000.0);
3012
self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
3014
self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
3016
if (self->walkerValue > self->xx1)
3017
self->walkerValue = self->xx1;
3018
if (self->walkerValue < 0.0)
3019
self->walkerValue = 0.0;
3021
return self->walkerValue;
3024
// x1 = max value, x2 = max step
3026
TrigXnoise_loopseg(TrigXnoise *self) {
3029
if (self->loopChoice == 0) {
3031
self->loopCountPlay = self->loopTime = 0;
3033
if (self->xx2 < 0.002) self->xx2 = 0.002;
3035
modulo = (int)(self->xx2 * 1000.0);
3039
self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
3041
self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
3043
if (self->walkerValue > self->xx1)
3044
self->walkerValue = self->xx1;
3045
if (self->walkerValue < 0.0)
3046
self->walkerValue = 0.0;
3048
self->loop_buffer[self->loopCountRec++] = self->walkerValue;
3050
if (self->loopCountRec < self->loopLen)
3051
self->loopChoice = 0;
3053
self->loopChoice = 1;
3054
self->loopStop = (rand() % 4) + 1;
3058
self->loopCountRec = 0;
3060
self->walkerValue = self->loop_buffer[self->loopCountPlay++];
3062
if (self->loopCountPlay < self->loopLen)
3063
self->loopChoice = 1;
3065
self->loopCountPlay = 0;
3069
if (self->loopTime == self->loopStop) {
3070
self->loopChoice = 0;
3071
self->loopLen = (rand() % 10) + 3;
3075
return self->walkerValue;
3079
TrigXnoise_generate_ii(TrigXnoise *self) {
3081
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3082
self->xx1 = PyFloat_AS_DOUBLE(self->x1);
3083
self->xx2 = PyFloat_AS_DOUBLE(self->x2);
3085
for (i=0; i<self->bufsize; i++) {
3087
self->value = (*self->type_func_ptr)(self);
3088
self->data[i] = self->value;
3093
TrigXnoise_generate_ai(TrigXnoise *self) {
3095
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3096
MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
3097
self->xx2 = PyFloat_AS_DOUBLE(self->x2);
3099
for (i=0; i<self->bufsize; i++) {
3102
self->value = (*self->type_func_ptr)(self);
3104
self->data[i] = self->value;
3109
TrigXnoise_generate_ia(TrigXnoise *self) {
3111
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3112
self->xx1 = PyFloat_AS_DOUBLE(self->x1);
3113
MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
3115
for (i=0; i<self->bufsize; i++) {
3118
self->value = (*self->type_func_ptr)(self);
3120
self->data[i] = self->value;
3125
TrigXnoise_generate_aa(TrigXnoise *self) {
3127
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3128
MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
3129
MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
3131
for (i=0; i<self->bufsize; i++) {
3135
self->value = (*self->type_func_ptr)(self);
3137
self->data[i] = self->value;
3141
static void TrigXnoise_postprocessing_ii(TrigXnoise *self) { POST_PROCESSING_II };
3142
static void TrigXnoise_postprocessing_ai(TrigXnoise *self) { POST_PROCESSING_AI };
3143
static void TrigXnoise_postprocessing_ia(TrigXnoise *self) { POST_PROCESSING_IA };
3144
static void TrigXnoise_postprocessing_aa(TrigXnoise *self) { POST_PROCESSING_AA };
3145
static void TrigXnoise_postprocessing_ireva(TrigXnoise *self) { POST_PROCESSING_IREVA };
3146
static void TrigXnoise_postprocessing_areva(TrigXnoise *self) { POST_PROCESSING_AREVA };
3147
static void TrigXnoise_postprocessing_revai(TrigXnoise *self) { POST_PROCESSING_REVAI };
3148
static void TrigXnoise_postprocessing_revaa(TrigXnoise *self) { POST_PROCESSING_REVAA };
3149
static void TrigXnoise_postprocessing_revareva(TrigXnoise *self) { POST_PROCESSING_REVAREVA };
3152
TrigXnoise_setRandomType(TrigXnoise *self)
3155
switch (self->type) {
3157
self->type_func_ptr = TrigXnoise_uniform;
3160
self->type_func_ptr = TrigXnoise_linear_min;
3163
self->type_func_ptr = TrigXnoise_linear_max;
3166
self->type_func_ptr = TrigXnoise_triangle;
3169
self->type_func_ptr = TrigXnoise_expon_min;
3172
self->type_func_ptr = TrigXnoise_expon_max;
3175
self->type_func_ptr = TrigXnoise_biexpon;
3178
self->type_func_ptr = TrigXnoise_cauchy;
3181
self->type_func_ptr = TrigXnoise_weibull;
3184
self->type_func_ptr = TrigXnoise_gaussian;
3187
self->type_func_ptr = TrigXnoise_poisson;
3190
self->type_func_ptr = TrigXnoise_walker;
3193
self->type_func_ptr = TrigXnoise_loopseg;
3199
TrigXnoise_setProcMode(TrigXnoise *self)
3201
int procmode, muladdmode;
3202
procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
3203
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
3207
self->proc_func_ptr = TrigXnoise_generate_ii;
3210
self->proc_func_ptr = TrigXnoise_generate_ai;
3213
self->proc_func_ptr = TrigXnoise_generate_ia;
3216
self->proc_func_ptr = TrigXnoise_generate_aa;
3219
switch (muladdmode) {
3221
self->muladd_func_ptr = TrigXnoise_postprocessing_ii;
3224
self->muladd_func_ptr = TrigXnoise_postprocessing_ai;
3227
self->muladd_func_ptr = TrigXnoise_postprocessing_revai;
3230
self->muladd_func_ptr = TrigXnoise_postprocessing_ia;
3233
self->muladd_func_ptr = TrigXnoise_postprocessing_aa;
3236
self->muladd_func_ptr = TrigXnoise_postprocessing_revaa;
3239
self->muladd_func_ptr = TrigXnoise_postprocessing_ireva;
3242
self->muladd_func_ptr = TrigXnoise_postprocessing_areva;
3245
self->muladd_func_ptr = TrigXnoise_postprocessing_revareva;
3251
TrigXnoise_compute_next_data_frame(TrigXnoise *self)
3253
(*self->proc_func_ptr)(self);
3254
(*self->muladd_func_ptr)(self);
3258
TrigXnoise_traverse(TrigXnoise *self, visitproc visit, void *arg)
3261
Py_VISIT(self->input);
3262
Py_VISIT(self->input_stream);
3264
Py_VISIT(self->x1_stream);
3266
Py_VISIT(self->x2_stream);
3271
TrigXnoise_clear(TrigXnoise *self)
3274
Py_CLEAR(self->input);
3275
Py_CLEAR(self->input_stream);
3277
Py_CLEAR(self->x1_stream);
3279
Py_CLEAR(self->x2_stream);
3284
TrigXnoise_dealloc(TrigXnoise* self)
3287
TrigXnoise_clear(self);
3288
self->ob_type->tp_free((PyObject*)self);
3291
static PyObject * TrigXnoise_deleteStream(TrigXnoise *self) { DELETE_STREAM };
3294
TrigXnoise_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3298
self = (TrigXnoise *)type->tp_alloc(type, 0);
3300
self->x1 = PyFloat_FromDouble(0.5);
3301
self->x2 = PyFloat_FromDouble(0.5);
3302
self->xx1 = self->xx2 = self->walkerValue = 0.5;
3304
self->modebuffer[0] = 0;
3305
self->modebuffer[1] = 0;
3306
self->modebuffer[2] = 0;
3307
self->modebuffer[3] = 0;
3311
Server_generateSeed((Server *)self->server, TRIGXNOISE_ID);
3313
self->poisson_tab = 0;
3314
self->lastPoissonX1 = -99.0;
3315
for (i=0; i<2000; i++) {
3316
self->poisson_buffer[i] = 0.0;
3318
for (i=0; i<15; i++) {
3319
self->loop_buffer[i] = 0.0;
3321
self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
3322
self->loopLen = (rand() % 10) + 3;
3324
Stream_setFunctionPtr(self->stream, TrigXnoise_compute_next_data_frame);
3325
self->mode_func_ptr = TrigXnoise_setProcMode;
3326
return (PyObject *)self;
3330
TrigXnoise_init(TrigXnoise *self, PyObject *args, PyObject *kwds)
3332
PyObject *inputtmp, *input_streamtmp, *x1tmp=NULL, *x2tmp=NULL, *multmp=NULL, *addtmp=NULL;
3334
static char *kwlist[] = {"input", "type", "x1", "x2", "mul", "add", NULL};
3336
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOOOO", kwlist, &inputtmp, &self->type, &x1tmp, &x2tmp, &multmp, &addtmp))
3342
PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
3346
PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
3350
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
3354
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
3357
Py_INCREF(self->stream);
3358
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
3360
TrigXnoise_setRandomType(self);
3362
(*self->mode_func_ptr)(self);
3368
static PyObject * TrigXnoise_getServer(TrigXnoise* self) { GET_SERVER };
3369
static PyObject * TrigXnoise_getStream(TrigXnoise* self) { GET_STREAM };
3370
static PyObject * TrigXnoise_setMul(TrigXnoise *self, PyObject *arg) { SET_MUL };
3371
static PyObject * TrigXnoise_setAdd(TrigXnoise *self, PyObject *arg) { SET_ADD };
3372
static PyObject * TrigXnoise_setSub(TrigXnoise *self, PyObject *arg) { SET_SUB };
3373
static PyObject * TrigXnoise_setDiv(TrigXnoise *self, PyObject *arg) { SET_DIV };
3375
static PyObject * TrigXnoise_play(TrigXnoise *self, PyObject *args, PyObject *kwds) { PLAY };
3376
static PyObject * TrigXnoise_out(TrigXnoise *self, PyObject *args, PyObject *kwds) { OUT };
3377
static PyObject * TrigXnoise_stop(TrigXnoise *self) { STOP };
3379
static PyObject * TrigXnoise_multiply(TrigXnoise *self, PyObject *arg) { MULTIPLY };
3380
static PyObject * TrigXnoise_inplace_multiply(TrigXnoise *self, PyObject *arg) { INPLACE_MULTIPLY };
3381
static PyObject * TrigXnoise_add(TrigXnoise *self, PyObject *arg) { ADD };
3382
static PyObject * TrigXnoise_inplace_add(TrigXnoise *self, PyObject *arg) { INPLACE_ADD };
3383
static PyObject * TrigXnoise_sub(TrigXnoise *self, PyObject *arg) { SUB };
3384
static PyObject * TrigXnoise_inplace_sub(TrigXnoise *self, PyObject *arg) { INPLACE_SUB };
3385
static PyObject * TrigXnoise_div(TrigXnoise *self, PyObject *arg) { DIV };
3386
static PyObject * TrigXnoise_inplace_div(TrigXnoise *self, PyObject *arg) { INPLACE_DIV };
3389
TrigXnoise_setType(TrigXnoise *self, PyObject *arg)
3396
int isNumber = PyInt_Check(arg);
3398
if (isNumber == 1) {
3399
self->type = PyInt_AsLong(arg);
3400
TrigXnoise_setRandomType(self);
3408
TrigXnoise_setX1(TrigXnoise *self, PyObject *arg)
3410
PyObject *tmp, *streamtmp;
3417
int isNumber = PyNumber_Check(arg);
3421
Py_DECREF(self->x1);
3422
if (isNumber == 1) {
3423
self->x1 = PyNumber_Float(tmp);
3424
self->modebuffer[2] = 0;
3428
streamtmp = PyObject_CallMethod((PyObject *)self->x1, "_getStream", NULL);
3429
Py_INCREF(streamtmp);
3430
Py_XDECREF(self->x1_stream);
3431
self->x1_stream = (Stream *)streamtmp;
3432
self->modebuffer[2] = 1;
3435
(*self->mode_func_ptr)(self);
3442
TrigXnoise_setX2(TrigXnoise *self, PyObject *arg)
3444
PyObject *tmp, *streamtmp;
3451
int isNumber = PyNumber_Check(arg);
3455
Py_DECREF(self->x2);
3456
if (isNumber == 1) {
3457
self->x2 = PyNumber_Float(tmp);
3458
self->modebuffer[3] = 0;
3462
streamtmp = PyObject_CallMethod((PyObject *)self->x2, "_getStream", NULL);
3463
Py_INCREF(streamtmp);
3464
Py_XDECREF(self->x2_stream);
3465
self->x2_stream = (Stream *)streamtmp;
3466
self->modebuffer[3] = 1;
3469
(*self->mode_func_ptr)(self);
3475
static PyMemberDef TrigXnoise_members[] = {
3476
{"server", T_OBJECT_EX, offsetof(TrigXnoise, server), 0, "Pyo server."},
3477
{"stream", T_OBJECT_EX, offsetof(TrigXnoise, stream), 0, "Stream object."},
3478
{"input", T_OBJECT_EX, offsetof(TrigXnoise, input), 0, "Trigger input."},
3479
{"x1", T_OBJECT_EX, offsetof(TrigXnoise, x1), 0, "first param."},
3480
{"x2", T_OBJECT_EX, offsetof(TrigXnoise, x2), 0, "second param."},
3481
{"mul", T_OBJECT_EX, offsetof(TrigXnoise, mul), 0, "Mul factor."},
3482
{"add", T_OBJECT_EX, offsetof(TrigXnoise, add), 0, "Add factor."},
3483
{NULL} /* Sentinel */
3486
static PyMethodDef TrigXnoise_methods[] = {
3487
{"getServer", (PyCFunction)TrigXnoise_getServer, METH_NOARGS, "Returns server object."},
3488
{"_getStream", (PyCFunction)TrigXnoise_getStream, METH_NOARGS, "Returns stream object."},
3489
{"deleteStream", (PyCFunction)TrigXnoise_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
3490
{"play", (PyCFunction)TrigXnoise_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
3491
{"out", (PyCFunction)TrigXnoise_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
3492
{"stop", (PyCFunction)TrigXnoise_stop, METH_NOARGS, "Stops computing."},
3493
{"setType", (PyCFunction)TrigXnoise_setType, METH_O, "Sets distribution type."},
3494
{"setX1", (PyCFunction)TrigXnoise_setX1, METH_O, "Sets first param."},
3495
{"setX2", (PyCFunction)TrigXnoise_setX2, METH_O, "Sets second param."},
3496
{"setMul", (PyCFunction)TrigXnoise_setMul, METH_O, "Sets oscillator mul factor."},
3497
{"setAdd", (PyCFunction)TrigXnoise_setAdd, METH_O, "Sets oscillator add factor."},
3498
{"setSub", (PyCFunction)TrigXnoise_setSub, METH_O, "Sets inverse add factor."},
3499
{"setDiv", (PyCFunction)TrigXnoise_setDiv, METH_O, "Sets inverse mul factor."},
3500
{NULL} /* Sentinel */
3503
static PyNumberMethods TrigXnoise_as_number = {
3504
(binaryfunc)TrigXnoise_add, /*nb_add*/
3505
(binaryfunc)TrigXnoise_sub, /*nb_subtract*/
3506
(binaryfunc)TrigXnoise_multiply, /*nb_multiply*/
3507
(binaryfunc)TrigXnoise_div, /*nb_divide*/
3513
0, /*(unaryfunc)array_abs,*/
3527
(binaryfunc)TrigXnoise_inplace_add, /*inplace_add*/
3528
(binaryfunc)TrigXnoise_inplace_sub, /*inplace_subtract*/
3529
(binaryfunc)TrigXnoise_inplace_multiply, /*inplace_multiply*/
3530
(binaryfunc)TrigXnoise_inplace_div, /*inplace_divide*/
3531
0, /*inplace_remainder*/
3532
0, /*inplace_power*/
3533
0, /*inplace_lshift*/
3534
0, /*inplace_rshift*/
3538
0, /*nb_floor_divide*/
3539
0, /*nb_true_divide*/
3540
0, /*nb_inplace_floor_divide*/
3541
0, /*nb_inplace_true_divide*/
3545
PyTypeObject TrigXnoiseType = {
3546
PyObject_HEAD_INIT(NULL)
3548
"_pyo.TrigXnoise_base", /*tp_name*/
3549
sizeof(TrigXnoise), /*tp_basicsize*/
3551
(destructor)TrigXnoise_dealloc, /*tp_dealloc*/
3557
&TrigXnoise_as_number, /*tp_as_number*/
3558
0, /*tp_as_sequence*/
3559
0, /*tp_as_mapping*/
3566
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
3567
"TrigXnoise objects. Periodically generates a new random value.", /* tp_doc */
3568
(traverseproc)TrigXnoise_traverse, /* tp_traverse */
3569
(inquiry)TrigXnoise_clear, /* tp_clear */
3570
0, /* tp_richcompare */
3571
0, /* tp_weaklistoffset */
3573
0, /* tp_iternext */
3574
TrigXnoise_methods, /* tp_methods */
3575
TrigXnoise_members, /* tp_members */
3579
0, /* tp_descr_get */
3580
0, /* tp_descr_set */
3581
0, /* tp_dictoffset */
3582
(initproc)TrigXnoise_init, /* tp_init */
3584
TrigXnoise_new, /* tp_new */
3588
/**** TrigXnoiseMidi *****/
3593
Stream *input_stream;
3598
MYFLT (*type_func_ptr)();
3599
int scale; // 0 = Midi, 1 = frequency, 2 = transpo
3607
MYFLT lastPoissonX1;
3609
MYFLT poisson_buffer[2000];
3611
MYFLT loop_buffer[15];
3618
int modebuffer[4]; // need at least 2 slots for mul & add
3622
TrigXnoiseMidi_convert(TrigXnoiseMidi *self) {
3626
midival = (int)((self->value * (self->range_max-self->range_min)) + self->range_min);
3630
else if (midival > 127)
3633
if (self->scale == 0)
3634
val = (MYFLT)midival;
3635
else if (self->scale == 1)
3636
val = 8.1757989156437 * MYPOW(1.0594630943593, midival);
3637
else if (self->scale == 2)
3638
val = MYPOW(1.0594630943593, midival - self->centralkey);
3648
TrigXnoiseMidi_uniform(TrigXnoiseMidi *self) {
3649
return RANDOM_UNIFORM;
3653
TrigXnoiseMidi_linear_min(TrigXnoiseMidi *self) {
3654
MYFLT a = RANDOM_UNIFORM;
3655
MYFLT b = RANDOM_UNIFORM;
3656
if (a < b) return a;
3661
TrigXnoiseMidi_linear_max(TrigXnoiseMidi *self) {
3662
MYFLT a = RANDOM_UNIFORM;
3663
MYFLT b = RANDOM_UNIFORM;
3664
if (a > b) return a;
3669
TrigXnoiseMidi_triangle(TrigXnoiseMidi *self) {
3670
MYFLT a = RANDOM_UNIFORM;
3671
MYFLT b = RANDOM_UNIFORM;
3672
return ((a + b) * 0.5);
3677
TrigXnoiseMidi_expon_min(TrigXnoiseMidi *self) {
3678
if (self->xx1 <= 0.0) self->xx1 = 0.00001;
3679
MYFLT val = -MYLOG(RANDOM_UNIFORM) / self->xx1;
3680
if (val < 0.0) return 0.0;
3681
else if (val > 1.0) return 1.0;
3686
TrigXnoiseMidi_expon_max(TrigXnoiseMidi *self) {
3687
if (self->xx1 <= 0.0) self->xx1 = 0.00001;
3688
MYFLT val = 1.0 - (-MYLOG(RANDOM_UNIFORM) / self->xx1);
3689
if (val < 0.0) return 0.0;
3690
else if (val > 1.0) return 1.0;
3696
TrigXnoiseMidi_biexpon(TrigXnoiseMidi *self) {
3698
if (self->xx1 <= 0.0) self->xx1 = 0.00001;
3699
MYFLT sum = RANDOM_UNIFORM * 2.0;
3708
val = 0.5 * (polar * MYLOG(sum) / self->xx1) + 0.5;
3710
if (val < 0.0) return 0.0;
3711
else if (val > 1.0) return 1.0;
3716
TrigXnoiseMidi_cauchy(TrigXnoiseMidi *self) {
3717
MYFLT rnd, val, dir;
3719
rnd = RANDOM_UNIFORM;
3723
if (rand() < (RAND_MAX / 2))
3728
val = 0.5 * (MYTAN(rnd) * self->xx1 * dir) + 0.5;
3730
if (val < 0.0) return 0.0;
3731
else if (val > 1.0) return 1.0;
3735
// x1 = locator, x2 = shape
3737
TrigXnoiseMidi_weibull(TrigXnoiseMidi *self) {
3739
if (self->xx2 <= 0.0) self->xx2 = 0.00001;
3741
rnd = 1.0 / (1.0 - RANDOM_UNIFORM);
3742
val = self->xx1 * MYPOW(MYLOG(rnd), (1.0 / self->xx2));
3744
if (val < 0.0) return 0.0;
3745
else if (val > 1.0) return 1.0;
3749
// x1 = locator, x2 = bandwidth
3751
TrigXnoiseMidi_gaussian(TrigXnoiseMidi *self) {
3754
rnd = (RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM + RANDOM_UNIFORM);
3755
val = (self->xx2 * (rnd - 3.0) * 0.33 + self->xx1);
3757
if (val < 0.0) return 0.0;
3758
else if (val > 1.0) return 1.0;
3762
// x1 = gravity center, x2 = compress/expand
3764
TrigXnoiseMidi_poisson(TrigXnoiseMidi *self) {
3765
int i, j, factorial;
3768
if (self->xx1 < 0.1) self->xx1 = 0.1;
3769
if (self->xx2 < 0.1) self->xx2 = 0.1;
3771
if (self->xx1 != self->lastPoissonX1) {
3772
self->lastPoissonX1 = self->xx1;
3773
self->poisson_tab = 0;
3775
for (i=1; i<12; i++) {
3777
tot = (long)(1000.0 * (MYPOW(2.7182818, -self->xx1) * MYPOW(self->xx1, i) / factorial));
3778
for (j=0; j<tot; j++) {
3779
self->poisson_buffer[self->poisson_tab] = i;
3780
self->poisson_tab++;
3784
val = self->poisson_buffer[rand() % self->poisson_tab] / 12.0 * self->xx2;
3786
if (val < 0.0) return 0.0;
3787
else if (val > 1.0) return 1.0;
3791
// x1 = max value, x2 = max step
3793
TrigXnoiseMidi_walker(TrigXnoiseMidi *self) {
3796
if (self->xx2 < 0.002) self->xx2 = 0.002;
3798
modulo = (int)(self->xx2 * 1000.0);
3802
self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
3804
self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
3806
if (self->walkerValue > self->xx1)
3807
self->walkerValue = self->xx1;
3808
if (self->walkerValue < 0.0)
3809
self->walkerValue = 0.0;
3811
return self->walkerValue;
3814
// x1 = max value, x2 = max step
3816
TrigXnoiseMidi_loopseg(TrigXnoiseMidi *self) {
3819
if (self->loopChoice == 0) {
3821
self->loopCountPlay = self->loopTime = 0;
3823
if (self->xx2 < 0.002) self->xx2 = 0.002;
3825
modulo = (int)(self->xx2 * 1000.0);
3829
self->walkerValue = self->walkerValue + (((rand() % modulo) - (modulo / 2)) * 0.001);
3831
self->walkerValue = self->walkerValue - (((rand() % modulo) - (modulo / 2)) * 0.001);
3833
if (self->walkerValue > self->xx1)
3834
self->walkerValue = self->xx1;
3835
if (self->walkerValue < 0.0)
3836
self->walkerValue = 0.0;
3838
self->loop_buffer[self->loopCountRec++] = self->walkerValue;
3840
if (self->loopCountRec < self->loopLen)
3841
self->loopChoice = 0;
3843
self->loopChoice = 1;
3844
self->loopStop = (rand() % 4) + 1;
3848
self->loopCountRec = 0;
3850
self->walkerValue = self->loop_buffer[self->loopCountPlay++];
3852
if (self->loopCountPlay < self->loopLen)
3853
self->loopChoice = 1;
3855
self->loopCountPlay = 0;
3859
if (self->loopTime == self->loopStop) {
3860
self->loopChoice = 0;
3861
self->loopLen = (rand() % 10) + 3;
3865
return self->walkerValue;
3869
TrigXnoiseMidi_generate_ii(TrigXnoiseMidi *self) {
3871
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3872
self->xx1 = PyFloat_AS_DOUBLE(self->x1);
3873
self->xx2 = PyFloat_AS_DOUBLE(self->x2);
3875
for (i=0; i<self->bufsize; i++) {
3877
self->value = (*self->type_func_ptr)(self);
3878
self->value = TrigXnoiseMidi_convert(self);
3880
self->data[i] = self->value;
3885
TrigXnoiseMidi_generate_ai(TrigXnoiseMidi *self) {
3887
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3888
MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
3889
self->xx2 = PyFloat_AS_DOUBLE(self->x2);
3891
for (i=0; i<self->bufsize; i++) {
3894
self->value = (*self->type_func_ptr)(self);
3895
self->value = TrigXnoiseMidi_convert(self);
3897
self->data[i] = self->value;
3902
TrigXnoiseMidi_generate_ia(TrigXnoiseMidi *self) {
3904
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3905
self->xx1 = PyFloat_AS_DOUBLE(self->x1);
3906
MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
3908
for (i=0; i<self->bufsize; i++) {
3911
self->value = (*self->type_func_ptr)(self);
3912
self->value = TrigXnoiseMidi_convert(self);
3914
self->data[i] = self->value;
3919
TrigXnoiseMidi_generate_aa(TrigXnoiseMidi *self) {
3921
MYFLT *in = Stream_getData((Stream *)self->input_stream);
3922
MYFLT *x1 = Stream_getData((Stream *)self->x1_stream);
3923
MYFLT *x2 = Stream_getData((Stream *)self->x2_stream);
3925
for (i=0; i<self->bufsize; i++) {
3929
self->value = (*self->type_func_ptr)(self);
3930
self->value = TrigXnoiseMidi_convert(self);
3932
self->data[i] = self->value;
3936
static void TrigXnoiseMidi_postprocessing_ii(TrigXnoiseMidi *self) { POST_PROCESSING_II };
3937
static void TrigXnoiseMidi_postprocessing_ai(TrigXnoiseMidi *self) { POST_PROCESSING_AI };
3938
static void TrigXnoiseMidi_postprocessing_ia(TrigXnoiseMidi *self) { POST_PROCESSING_IA };
3939
static void TrigXnoiseMidi_postprocessing_aa(TrigXnoiseMidi *self) { POST_PROCESSING_AA };
3940
static void TrigXnoiseMidi_postprocessing_ireva(TrigXnoiseMidi *self) { POST_PROCESSING_IREVA };
3941
static void TrigXnoiseMidi_postprocessing_areva(TrigXnoiseMidi *self) { POST_PROCESSING_AREVA };
3942
static void TrigXnoiseMidi_postprocessing_revai(TrigXnoiseMidi *self) { POST_PROCESSING_REVAI };
3943
static void TrigXnoiseMidi_postprocessing_revaa(TrigXnoiseMidi *self) { POST_PROCESSING_REVAA };
3944
static void TrigXnoiseMidi_postprocessing_revareva(TrigXnoiseMidi *self) { POST_PROCESSING_REVAREVA };
3947
TrigXnoiseMidi_setRandomType(TrigXnoiseMidi *self)
3950
switch (self->type) {
3952
self->type_func_ptr = TrigXnoiseMidi_uniform;
3955
self->type_func_ptr = TrigXnoiseMidi_linear_min;
3958
self->type_func_ptr = TrigXnoiseMidi_linear_max;
3961
self->type_func_ptr = TrigXnoiseMidi_triangle;
3964
self->type_func_ptr = TrigXnoiseMidi_expon_min;
3967
self->type_func_ptr = TrigXnoiseMidi_expon_max;
3970
self->type_func_ptr = TrigXnoiseMidi_biexpon;
3973
self->type_func_ptr = TrigXnoiseMidi_cauchy;
3976
self->type_func_ptr = TrigXnoiseMidi_weibull;
3979
self->type_func_ptr = TrigXnoiseMidi_gaussian;
3982
self->type_func_ptr = TrigXnoiseMidi_poisson;
3985
self->type_func_ptr = TrigXnoiseMidi_walker;
3988
self->type_func_ptr = TrigXnoiseMidi_loopseg;
3994
TrigXnoiseMidi_setProcMode(TrigXnoiseMidi *self)
3996
int procmode, muladdmode;
3997
procmode = self->modebuffer[2] + self->modebuffer[3] * 10;
3998
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
4002
self->proc_func_ptr = TrigXnoiseMidi_generate_ii;
4005
self->proc_func_ptr = TrigXnoiseMidi_generate_ai;
4008
self->proc_func_ptr = TrigXnoiseMidi_generate_ia;
4011
self->proc_func_ptr = TrigXnoiseMidi_generate_aa;
4014
switch (muladdmode) {
4016
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ii;
4019
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ai;
4022
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_revai;
4025
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ia;
4028
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_aa;
4031
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_revaa;
4034
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_ireva;
4037
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_areva;
4040
self->muladd_func_ptr = TrigXnoiseMidi_postprocessing_revareva;
4046
TrigXnoiseMidi_compute_next_data_frame(TrigXnoiseMidi *self)
4048
(*self->proc_func_ptr)(self);
4049
(*self->muladd_func_ptr)(self);
4053
TrigXnoiseMidi_traverse(TrigXnoiseMidi *self, visitproc visit, void *arg)
4056
Py_VISIT(self->input);
4057
Py_VISIT(self->input_stream);
4059
Py_VISIT(self->x1_stream);
4061
Py_VISIT(self->x2_stream);
4066
TrigXnoiseMidi_clear(TrigXnoiseMidi *self)
4069
Py_CLEAR(self->input);
4070
Py_CLEAR(self->input_stream);
4072
Py_CLEAR(self->x1_stream);
4074
Py_CLEAR(self->x2_stream);
4079
TrigXnoiseMidi_dealloc(TrigXnoiseMidi* self)
4082
TrigXnoiseMidi_clear(self);
4083
self->ob_type->tp_free((PyObject*)self);
4086
static PyObject * TrigXnoiseMidi_deleteStream(TrigXnoiseMidi *self) { DELETE_STREAM };
4089
TrigXnoiseMidi_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4092
TrigXnoiseMidi *self;
4093
self = (TrigXnoiseMidi *)type->tp_alloc(type, 0);
4095
self->x1 = PyFloat_FromDouble(0.5);
4096
self->x2 = PyFloat_FromDouble(0.5);
4097
self->xx1 = self->xx2 = self->walkerValue = 0.5;
4100
self->range_min = 0;
4101
self->range_max = 127;
4102
self->centralkey = 64;
4103
self->modebuffer[0] = 0;
4104
self->modebuffer[1] = 0;
4105
self->modebuffer[2] = 0;
4106
self->modebuffer[3] = 0;
4110
Server_generateSeed((Server *)self->server, TRIGXNOISEMIDI_ID);
4112
self->poisson_tab = 0;
4113
self->lastPoissonX1 = -99.0;
4114
for (i=0; i<2000; i++) {
4115
self->poisson_buffer[i] = 0.0;
4117
for (i=0; i<15; i++) {
4118
self->loop_buffer[i] = 0.0;
4120
self->loopChoice = self->loopCountPlay = self->loopTime = self->loopCountRec = self->loopStop = 0;
4121
self->loopLen = (rand() % 10) + 3;
4123
Stream_setFunctionPtr(self->stream, TrigXnoiseMidi_compute_next_data_frame);
4124
self->mode_func_ptr = TrigXnoiseMidi_setProcMode;
4125
return (PyObject *)self;
4129
TrigXnoiseMidi_init(TrigXnoiseMidi *self, PyObject *args, PyObject *kwds)
4131
PyObject *inputtmp, *input_streamtmp, *x1tmp=NULL, *x2tmp=NULL, *rangetmp=NULL, *multmp=NULL, *addtmp=NULL;
4133
static char *kwlist[] = {"input", "type", "x1", "x2", "scale", "range", "mul", "add", NULL};
4135
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|iOOiOOO", kwlist, &inputtmp, &self->type, &x1tmp, &x2tmp, &self->scale, &rangetmp, &multmp, &addtmp))
4141
PyObject_CallMethod((PyObject *)self, "setX1", "O", x1tmp);
4145
PyObject_CallMethod((PyObject *)self, "setX2", "O", x2tmp);
4149
PyObject_CallMethod((PyObject *)self, "setRange", "O", rangetmp);
4153
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
4157
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
4160
Py_INCREF(self->stream);
4161
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
4163
TrigXnoiseMidi_setRandomType(self);
4165
(*self->mode_func_ptr)(self);
4171
static PyObject * TrigXnoiseMidi_getServer(TrigXnoiseMidi* self) { GET_SERVER };
4172
static PyObject * TrigXnoiseMidi_getStream(TrigXnoiseMidi* self) { GET_STREAM };
4173
static PyObject * TrigXnoiseMidi_setMul(TrigXnoiseMidi *self, PyObject *arg) { SET_MUL };
4174
static PyObject * TrigXnoiseMidi_setAdd(TrigXnoiseMidi *self, PyObject *arg) { SET_ADD };
4175
static PyObject * TrigXnoiseMidi_setSub(TrigXnoiseMidi *self, PyObject *arg) { SET_SUB };
4176
static PyObject * TrigXnoiseMidi_setDiv(TrigXnoiseMidi *self, PyObject *arg) { SET_DIV };
4178
static PyObject * TrigXnoiseMidi_play(TrigXnoiseMidi *self, PyObject *args, PyObject *kwds) { PLAY };
4179
static PyObject * TrigXnoiseMidi_out(TrigXnoiseMidi *self, PyObject *args, PyObject *kwds) { OUT };
4180
static PyObject * TrigXnoiseMidi_stop(TrigXnoiseMidi *self) { STOP };
4182
static PyObject * TrigXnoiseMidi_multiply(TrigXnoiseMidi *self, PyObject *arg) { MULTIPLY };
4183
static PyObject * TrigXnoiseMidi_inplace_multiply(TrigXnoiseMidi *self, PyObject *arg) { INPLACE_MULTIPLY };
4184
static PyObject * TrigXnoiseMidi_add(TrigXnoiseMidi *self, PyObject *arg) { ADD };
4185
static PyObject * TrigXnoiseMidi_inplace_add(TrigXnoiseMidi *self, PyObject *arg) { INPLACE_ADD };
4186
static PyObject * TrigXnoiseMidi_sub(TrigXnoiseMidi *self, PyObject *arg) { SUB };
4187
static PyObject * TrigXnoiseMidi_inplace_sub(TrigXnoiseMidi *self, PyObject *arg) { INPLACE_SUB };
4188
static PyObject * TrigXnoiseMidi_div(TrigXnoiseMidi *self, PyObject *arg) { DIV };
4189
static PyObject * TrigXnoiseMidi_inplace_div(TrigXnoiseMidi *self, PyObject *arg) { INPLACE_DIV };
4192
TrigXnoiseMidi_setType(TrigXnoiseMidi *self, PyObject *arg)
4199
int isNumber = PyInt_Check(arg);
4201
if (isNumber == 1) {
4202
self->type = PyInt_AsLong(arg);
4203
TrigXnoiseMidi_setRandomType(self);
4211
TrigXnoiseMidi_setScale(TrigXnoiseMidi *self, PyObject *arg)
4219
int isNumber = PyInt_Check(arg);
4221
if (isNumber == 1) {
4222
tmp = PyInt_AsLong(arg);
4223
if (tmp >= 0 && tmp <= 2)
4226
printf("scale attribute must be an integer {0, 1, 2}\n");
4234
TrigXnoiseMidi_setRange(TrigXnoiseMidi *self, PyObject *args)
4241
int isTuple = PyTuple_Check(args);
4244
self->range_min = PyInt_AsLong(PyTuple_GET_ITEM(args, 0));
4245
self->range_max = PyInt_AsLong(PyTuple_GET_ITEM(args, 1));
4246
self->centralkey = (int)((self->range_max + self->range_min) / 2);
4254
TrigXnoiseMidi_setX1(TrigXnoiseMidi *self, PyObject *arg)
4256
PyObject *tmp, *streamtmp;
4263
int isNumber = PyNumber_Check(arg);
4267
Py_DECREF(self->x1);
4268
if (isNumber == 1) {
4269
self->x1 = PyNumber_Float(tmp);
4270
self->modebuffer[2] = 0;
4274
streamtmp = PyObject_CallMethod((PyObject *)self->x1, "_getStream", NULL);
4275
Py_INCREF(streamtmp);
4276
Py_XDECREF(self->x1_stream);
4277
self->x1_stream = (Stream *)streamtmp;
4278
self->modebuffer[2] = 1;
4281
(*self->mode_func_ptr)(self);
4288
TrigXnoiseMidi_setX2(TrigXnoiseMidi *self, PyObject *arg)
4290
PyObject *tmp, *streamtmp;
4297
int isNumber = PyNumber_Check(arg);
4301
Py_DECREF(self->x2);
4302
if (isNumber == 1) {
4303
self->x2 = PyNumber_Float(tmp);
4304
self->modebuffer[3] = 0;
4308
streamtmp = PyObject_CallMethod((PyObject *)self->x2, "_getStream", NULL);
4309
Py_INCREF(streamtmp);
4310
Py_XDECREF(self->x2_stream);
4311
self->x2_stream = (Stream *)streamtmp;
4312
self->modebuffer[3] = 1;
4315
(*self->mode_func_ptr)(self);
4321
static PyMemberDef TrigXnoiseMidi_members[] = {
4322
{"server", T_OBJECT_EX, offsetof(TrigXnoiseMidi, server), 0, "Pyo server."},
4323
{"stream", T_OBJECT_EX, offsetof(TrigXnoiseMidi, stream), 0, "Stream object."},
4324
{"input", T_OBJECT_EX, offsetof(TrigXnoiseMidi, input), 0, "Trigger input."},
4325
{"x1", T_OBJECT_EX, offsetof(TrigXnoiseMidi, x1), 0, "first param."},
4326
{"x2", T_OBJECT_EX, offsetof(TrigXnoiseMidi, x2), 0, "second param."},
4327
{"mul", T_OBJECT_EX, offsetof(TrigXnoiseMidi, mul), 0, "Mul factor."},
4328
{"add", T_OBJECT_EX, offsetof(TrigXnoiseMidi, add), 0, "Add factor."},
4329
{NULL} /* Sentinel */
4332
static PyMethodDef TrigXnoiseMidi_methods[] = {
4333
{"getServer", (PyCFunction)TrigXnoiseMidi_getServer, METH_NOARGS, "Returns server object."},
4334
{"_getStream", (PyCFunction)TrigXnoiseMidi_getStream, METH_NOARGS, "Returns stream object."},
4335
{"deleteStream", (PyCFunction)TrigXnoiseMidi_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
4336
{"play", (PyCFunction)TrigXnoiseMidi_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
4337
{"out", (PyCFunction)TrigXnoiseMidi_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
4338
{"stop", (PyCFunction)TrigXnoiseMidi_stop, METH_NOARGS, "Stops computing."},
4339
{"setType", (PyCFunction)TrigXnoiseMidi_setType, METH_O, "Sets distribution type."},
4340
{"setScale", (PyCFunction)TrigXnoiseMidi_setScale, METH_O, "Sets output scale."},
4341
{"setRange", (PyCFunction)TrigXnoiseMidi_setRange, METH_VARARGS, "Sets range in midi notes (min, max)."},
4342
{"setX1", (PyCFunction)TrigXnoiseMidi_setX1, METH_O, "Sets first param."},
4343
{"setX2", (PyCFunction)TrigXnoiseMidi_setX2, METH_O, "Sets second param."},
4344
{"setMul", (PyCFunction)TrigXnoiseMidi_setMul, METH_O, "Sets oscillator mul factor."},
4345
{"setAdd", (PyCFunction)TrigXnoiseMidi_setAdd, METH_O, "Sets oscillator add factor."},
4346
{"setSub", (PyCFunction)TrigXnoiseMidi_setSub, METH_O, "Sets inverse add factor."},
4347
{"setDiv", (PyCFunction)TrigXnoiseMidi_setDiv, METH_O, "Sets inverse mul factor."},
4348
{NULL} /* Sentinel */
4351
static PyNumberMethods TrigXnoiseMidi_as_number = {
4352
(binaryfunc)TrigXnoiseMidi_add, /*nb_add*/
4353
(binaryfunc)TrigXnoiseMidi_sub, /*nb_subtract*/
4354
(binaryfunc)TrigXnoiseMidi_multiply, /*nb_multiply*/
4355
(binaryfunc)TrigXnoiseMidi_div, /*nb_divide*/
4361
0, /*(unaryfunc)array_abs,*/
4375
(binaryfunc)TrigXnoiseMidi_inplace_add, /*inplace_add*/
4376
(binaryfunc)TrigXnoiseMidi_inplace_sub, /*inplace_subtract*/
4377
(binaryfunc)TrigXnoiseMidi_inplace_multiply, /*inplace_multiply*/
4378
(binaryfunc)TrigXnoiseMidi_inplace_div, /*inplace_divide*/
4379
0, /*inplace_remainder*/
4380
0, /*inplace_power*/
4381
0, /*inplace_lshift*/
4382
0, /*inplace_rshift*/
4386
0, /*nb_floor_divide*/
4387
0, /*nb_true_divide*/
4388
0, /*nb_inplace_floor_divide*/
4389
0, /*nb_inplace_true_divide*/
4393
PyTypeObject TrigXnoiseMidiType = {
4394
PyObject_HEAD_INIT(NULL)
4396
"_pyo.TrigXnoiseMidi_base", /*tp_name*/
4397
sizeof(TrigXnoiseMidi), /*tp_basicsize*/
4399
(destructor)TrigXnoiseMidi_dealloc, /*tp_dealloc*/
4405
&TrigXnoiseMidi_as_number, /*tp_as_number*/
4406
0, /*tp_as_sequence*/
4407
0, /*tp_as_mapping*/
4414
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
4415
"TrigXnoiseMidi objects. Periodically generates a new random value.", /* tp_doc */
4416
(traverseproc)TrigXnoiseMidi_traverse, /* tp_traverse */
4417
(inquiry)TrigXnoiseMidi_clear, /* tp_clear */
4418
0, /* tp_richcompare */
4419
0, /* tp_weaklistoffset */
4421
0, /* tp_iternext */
4422
TrigXnoiseMidi_methods, /* tp_methods */
4423
TrigXnoiseMidi_members, /* tp_members */
4427
0, /* tp_descr_get */
4428
0, /* tp_descr_set */
4429
0, /* tp_dictoffset */
4430
(initproc)TrigXnoiseMidi_init, /* tp_init */
4432
TrigXnoiseMidi_new, /* tp_new */
4435
/***************************************************/
4436
/******* Counter ***********/
4437
/***************************************************/
4441
Stream *input_stream;
4448
int modebuffer[2]; // need at least 2 slots for mul & add
4452
Counter_generates(Counter *self) {
4454
MYFLT *in = Stream_getData((Stream *)self->input_stream);
4456
for (i=0; i<self->bufsize; i++) {
4458
if (self->dir == 0) {
4459
self->value = (MYFLT)self->tmp;
4461
if (self->tmp >= self->max)
4462
self->tmp = self->min;
4464
else if (self->dir == 1) {
4465
self->value = (MYFLT)self->tmp;
4467
if (self->tmp < self->min)
4468
self->tmp = self->max - 1;
4470
else if (self->dir == 2) {
4471
self->value = (MYFLT)self->tmp;
4472
self->tmp = self->tmp + self->direction;
4473
if (self->tmp >= self->max) {
4474
self->direction = -1;
4477
else if (self->tmp <= self->min) {
4478
self->direction = 1;
4482
self->data[i] = self->value;
4486
static void Counter_postprocessing_ii(Counter *self) { POST_PROCESSING_II };
4487
static void Counter_postprocessing_ai(Counter *self) { POST_PROCESSING_AI };
4488
static void Counter_postprocessing_ia(Counter *self) { POST_PROCESSING_IA };
4489
static void Counter_postprocessing_aa(Counter *self) { POST_PROCESSING_AA };
4490
static void Counter_postprocessing_ireva(Counter *self) { POST_PROCESSING_IREVA };
4491
static void Counter_postprocessing_areva(Counter *self) { POST_PROCESSING_AREVA };
4492
static void Counter_postprocessing_revai(Counter *self) { POST_PROCESSING_REVAI };
4493
static void Counter_postprocessing_revaa(Counter *self) { POST_PROCESSING_REVAA };
4494
static void Counter_postprocessing_revareva(Counter *self) { POST_PROCESSING_REVAREVA };
4497
Counter_setProcMode(Counter *self)
4500
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
4502
self->proc_func_ptr = Counter_generates;
4504
switch (muladdmode) {
4506
self->muladd_func_ptr = Counter_postprocessing_ii;
4509
self->muladd_func_ptr = Counter_postprocessing_ai;
4512
self->muladd_func_ptr = Counter_postprocessing_revai;
4515
self->muladd_func_ptr = Counter_postprocessing_ia;
4518
self->muladd_func_ptr = Counter_postprocessing_aa;
4521
self->muladd_func_ptr = Counter_postprocessing_revaa;
4524
self->muladd_func_ptr = Counter_postprocessing_ireva;
4527
self->muladd_func_ptr = Counter_postprocessing_areva;
4530
self->muladd_func_ptr = Counter_postprocessing_revareva;
4536
Counter_compute_next_data_frame(Counter *self)
4538
(*self->proc_func_ptr)(self);
4539
(*self->muladd_func_ptr)(self);
4543
Counter_traverse(Counter *self, visitproc visit, void *arg)
4546
Py_VISIT(self->input);
4547
Py_VISIT(self->input_stream);
4552
Counter_clear(Counter *self)
4555
Py_CLEAR(self->input);
4556
Py_CLEAR(self->input_stream);
4561
Counter_dealloc(Counter* self)
4564
Counter_clear(self);
4565
self->ob_type->tp_free((PyObject*)self);
4568
static PyObject * Counter_deleteStream(Counter *self) { DELETE_STREAM };
4571
Counter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4575
self = (Counter *)type->tp_alloc(type, 0);
4580
self->direction = 1;
4581
self->modebuffer[0] = 0;
4582
self->modebuffer[1] = 0;
4585
Stream_setFunctionPtr(self->stream, Counter_compute_next_data_frame);
4586
self->mode_func_ptr = Counter_setProcMode;
4587
return (PyObject *)self;
4591
Counter_init(Counter *self, PyObject *args, PyObject *kwds)
4593
PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
4595
static char *kwlist[] = {"input", "min", "max", "dir", "mul", "add", NULL};
4597
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|lliOO", kwlist, &inputtmp, &self->min, &self->max, &self->dir, &multmp, &addtmp))
4603
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
4607
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
4610
Py_INCREF(self->stream);
4611
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
4613
if (self->dir == 0 || self->dir == 2)
4614
self->tmp = self->min;
4616
self->tmp = self->max - 1;
4618
(*self->mode_func_ptr)(self);
4624
static PyObject * Counter_getServer(Counter* self) { GET_SERVER };
4625
static PyObject * Counter_getStream(Counter* self) { GET_STREAM };
4626
static PyObject * Counter_setMul(Counter *self, PyObject *arg) { SET_MUL };
4627
static PyObject * Counter_setAdd(Counter *self, PyObject *arg) { SET_ADD };
4628
static PyObject * Counter_setSub(Counter *self, PyObject *arg) { SET_SUB };
4629
static PyObject * Counter_setDiv(Counter *self, PyObject *arg) { SET_DIV };
4631
static PyObject * Counter_play(Counter *self, PyObject *args, PyObject *kwds) { PLAY };
4632
static PyObject * Counter_stop(Counter *self) { STOP };
4634
static PyObject * Counter_multiply(Counter *self, PyObject *arg) { MULTIPLY };
4635
static PyObject * Counter_inplace_multiply(Counter *self, PyObject *arg) { INPLACE_MULTIPLY };
4636
static PyObject * Counter_add(Counter *self, PyObject *arg) { ADD };
4637
static PyObject * Counter_inplace_add(Counter *self, PyObject *arg) { INPLACE_ADD };
4638
static PyObject * Counter_sub(Counter *self, PyObject *arg) { SUB };
4639
static PyObject * Counter_inplace_sub(Counter *self, PyObject *arg) { INPLACE_SUB };
4640
static PyObject * Counter_div(Counter *self, PyObject *arg) { DIV };
4641
static PyObject * Counter_inplace_div(Counter *self, PyObject *arg) { INPLACE_DIV };
4644
Counter_setMin(Counter *self, PyObject *arg)
4651
if (PyLong_Check(arg) || PyInt_Check(arg)) {
4652
self->min = PyLong_AsLong(arg);
4660
Counter_setMax(Counter *self, PyObject *arg)
4667
if (PyLong_Check(arg) || PyInt_Check(arg)) {
4668
self->max = PyLong_AsLong(arg);
4676
Counter_setDir(Counter *self, PyObject *arg)
4683
if (PyInt_Check(arg)) {
4684
self->dir = PyInt_AsLong(arg);
4692
Counter_reset(Counter *self, PyObject *arg)
4696
if (arg == Py_None) {
4697
if (self->dir == 0 || self->dir == 2)
4700
val = self->max - 1;
4704
else if (PyInt_Check(arg)) {
4705
val = PyInt_AsLong(arg);
4713
static PyMemberDef Counter_members[] = {
4714
{"server", T_OBJECT_EX, offsetof(Counter, server), 0, "Pyo server."},
4715
{"stream", T_OBJECT_EX, offsetof(Counter, stream), 0, "Stream object."},
4716
{"input", T_OBJECT_EX, offsetof(Counter, input), 0, "Input sound object."},
4717
{"mul", T_OBJECT_EX, offsetof(Counter, mul), 0, "Mul factor."},
4718
{"add", T_OBJECT_EX, offsetof(Counter, add), 0, "Add factor."},
4719
{NULL} /* Sentinel */
4722
static PyMethodDef Counter_methods[] = {
4723
{"getServer", (PyCFunction)Counter_getServer, METH_NOARGS, "Returns server object."},
4724
{"_getStream", (PyCFunction)Counter_getStream, METH_NOARGS, "Returns stream object."},
4725
{"deleteStream", (PyCFunction)Counter_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
4726
{"play", (PyCFunction)Counter_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
4727
{"stop", (PyCFunction)Counter_stop, METH_NOARGS, "Stops computing."},
4728
{"setMin", (PyCFunction)Counter_setMin, METH_O, "Sets minimum value."},
4729
{"setMax", (PyCFunction)Counter_setMax, METH_O, "Sets maximum value."},
4730
{"setDir", (PyCFunction)Counter_setDir, METH_O, "Sets direction. 0 = forward, 1 = backward, 2 = back and forth"},
4731
{"reset", (PyCFunction)Counter_reset, METH_O, "Resets the current count of the counter."},
4732
{"setMul", (PyCFunction)Counter_setMul, METH_O, "Sets oscillator mul factor."},
4733
{"setAdd", (PyCFunction)Counter_setAdd, METH_O, "Sets oscillator add factor."},
4734
{"setSub", (PyCFunction)Counter_setSub, METH_O, "Sets inverse add factor."},
4735
{"setDiv", (PyCFunction)Counter_setDiv, METH_O, "Sets inverse mul factor."},
4736
{NULL} /* Sentinel */
4739
static PyNumberMethods Counter_as_number = {
4740
(binaryfunc)Counter_add, /*nb_add*/
4741
(binaryfunc)Counter_sub, /*nb_subtract*/
4742
(binaryfunc)Counter_multiply, /*nb_multiply*/
4743
(binaryfunc)Counter_div, /*nb_divide*/
4749
0, /*(unaryfunc)array_abs,*/
4763
(binaryfunc)Counter_inplace_add, /*inplace_add*/
4764
(binaryfunc)Counter_inplace_sub, /*inplace_subtract*/
4765
(binaryfunc)Counter_inplace_multiply, /*inplace_multiply*/
4766
(binaryfunc)Counter_inplace_div, /*inplace_divide*/
4767
0, /*inplace_remainder*/
4768
0, /*inplace_power*/
4769
0, /*inplace_lshift*/
4770
0, /*inplace_rshift*/
4774
0, /*nb_floor_divide*/
4775
0, /*nb_true_divide*/
4776
0, /*nb_inplace_floor_divide*/
4777
0, /*nb_inplace_true_divide*/
4781
PyTypeObject CounterType = {
4782
PyObject_HEAD_INIT(NULL)
4784
"_pyo.Counter_base", /*tp_name*/
4785
sizeof(Counter), /*tp_basicsize*/
4787
(destructor)Counter_dealloc, /*tp_dealloc*/
4793
&Counter_as_number, /*tp_as_number*/
4794
0, /*tp_as_sequence*/
4795
0, /*tp_as_mapping*/
4802
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
4803
"Counter objects. Integer incrementor.", /* tp_doc */
4804
(traverseproc)Counter_traverse, /* tp_traverse */
4805
(inquiry)Counter_clear, /* tp_clear */
4806
0, /* tp_richcompare */
4807
0, /* tp_weaklistoffset */
4809
0, /* tp_iternext */
4810
Counter_methods, /* tp_methods */
4811
Counter_members, /* tp_members */
4815
0, /* tp_descr_get */
4816
0, /* tp_descr_set */
4817
0, /* tp_dictoffset */
4818
(initproc)Counter_init, /* tp_init */
4820
Counter_new, /* tp_new */
4823
/***************************************************/
4824
/******* Thresh ***********/
4825
/***************************************************/
4829
Stream *input_stream;
4830
PyObject *threshold;
4831
Stream *threshold_stream;
4838
Thresh_generates_i(Thresh *self) {
4840
MYFLT *in = Stream_getData((Stream *)self->input_stream);
4841
MYFLT thresh = PyFloat_AS_DOUBLE(self->threshold);
4843
switch (self->dir) {
4845
for (i=0; i<self->bufsize; i++) {
4846
self->data[i] = 0.0;
4847
if (in[i] > thresh && self->ready == 1) {
4848
self->data[i] = 1.0;
4851
else if (in[i] <= thresh && self->ready == 0)
4856
for (i=0; i<self->bufsize; i++) {
4857
self->data[i] = 0.0;
4858
if (in[i] < thresh && self->ready == 1) {
4859
self->data[i] = 1.0;
4862
else if (in[i] >= thresh && self->ready == 0)
4867
for (i=0; i<self->bufsize; i++) {
4868
self->data[i] = 0.0;
4869
if (in[i] > thresh && self->ready == 1) {
4870
self->data[i] = 1.0;
4873
else if (in[i] <= thresh && self->ready == 0) {
4874
self->data[i] = 1.0;
4883
Thresh_generates_a(Thresh *self) {
4885
MYFLT *in = Stream_getData((Stream *)self->input_stream);
4886
MYFLT *thresh = Stream_getData((Stream *)self->threshold_stream);
4888
switch (self->dir) {
4890
for (i=0; i<self->bufsize; i++) {
4891
self->data[i] = 0.0;
4892
if (in[i] > thresh[i] && self->ready == 1) {
4893
self->data[i] = 1.0;
4896
else if (in[i] <= thresh[i] && self->ready == 0)
4901
for (i=0; i<self->bufsize; i++) {
4902
self->data[i] = 0.0;
4903
if (in[i] < thresh[i] && self->ready == 1) {
4904
self->data[i] = 1.0;
4907
else if (in[i] >= thresh[i] && self->ready == 0)
4912
for (i=0; i<self->bufsize; i++) {
4913
self->data[i] = 0.0;
4914
if (in[i] > thresh[i] && self->ready == 1) {
4915
self->data[i] = 1.0;
4918
else if (in[i] <= thresh[i] && self->ready == 0)
4919
self->data[i] = 1.0;
4926
static void Thresh_postprocessing_ii(Thresh *self) { POST_PROCESSING_II };
4927
static void Thresh_postprocessing_ai(Thresh *self) { POST_PROCESSING_AI };
4928
static void Thresh_postprocessing_ia(Thresh *self) { POST_PROCESSING_IA };
4929
static void Thresh_postprocessing_aa(Thresh *self) { POST_PROCESSING_AA };
4930
static void Thresh_postprocessing_ireva(Thresh *self) { POST_PROCESSING_IREVA };
4931
static void Thresh_postprocessing_areva(Thresh *self) { POST_PROCESSING_AREVA };
4932
static void Thresh_postprocessing_revai(Thresh *self) { POST_PROCESSING_REVAI };
4933
static void Thresh_postprocessing_revaa(Thresh *self) { POST_PROCESSING_REVAA };
4934
static void Thresh_postprocessing_revareva(Thresh *self) { POST_PROCESSING_REVAREVA };
4937
Thresh_setProcMode(Thresh *self)
4939
int procmode = self->modebuffer[2];
4940
int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
4944
self->proc_func_ptr = Thresh_generates_i;
4947
self->proc_func_ptr = Thresh_generates_a;
4950
switch (muladdmode) {
4952
self->muladd_func_ptr = Thresh_postprocessing_ii;
4955
self->muladd_func_ptr = Thresh_postprocessing_ai;
4958
self->muladd_func_ptr = Thresh_postprocessing_revai;
4961
self->muladd_func_ptr = Thresh_postprocessing_ia;
4964
self->muladd_func_ptr = Thresh_postprocessing_aa;
4967
self->muladd_func_ptr = Thresh_postprocessing_revaa;
4970
self->muladd_func_ptr = Thresh_postprocessing_ireva;
4973
self->muladd_func_ptr = Thresh_postprocessing_areva;
4976
self->muladd_func_ptr = Thresh_postprocessing_revareva;
4982
Thresh_compute_next_data_frame(Thresh *self)
4984
(*self->proc_func_ptr)(self);
4985
(*self->muladd_func_ptr)(self);
4989
Thresh_traverse(Thresh *self, visitproc visit, void *arg)
4992
Py_VISIT(self->input);
4993
Py_VISIT(self->input_stream);
4994
Py_VISIT(self->threshold);
4995
Py_VISIT(self->threshold_stream);
5000
Thresh_clear(Thresh *self)
5003
Py_CLEAR(self->input);
5004
Py_CLEAR(self->input_stream);
5005
Py_CLEAR(self->threshold);
5006
Py_CLEAR(self->threshold_stream);
5011
Thresh_dealloc(Thresh* self)
5015
self->ob_type->tp_free((PyObject*)self);
5018
static PyObject * Thresh_deleteStream(Thresh *self) { DELETE_STREAM };
5021
Thresh_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5025
self = (Thresh *)type->tp_alloc(type, 0);
5027
self->threshold = PyFloat_FromDouble(0.);
5030
self->modebuffer[0] = 0;
5031
self->modebuffer[1] = 0;
5032
self->modebuffer[2] = 0;
5035
Stream_setFunctionPtr(self->stream, Thresh_compute_next_data_frame);
5036
self->mode_func_ptr = Thresh_setProcMode;
5037
return (PyObject *)self;
5041
Thresh_init(Thresh *self, PyObject *args, PyObject *kwds)
5043
PyObject *inputtmp, *input_streamtmp, *thresholdtmp, *multmp=NULL, *addtmp=NULL;
5045
static char *kwlist[] = {"input", "threshold", "dir", "mul", "add", NULL};
5047
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OiOO", kwlist, &inputtmp, &thresholdtmp, &self->dir, &multmp, &addtmp))
5053
PyObject_CallMethod((PyObject *)self, "setThreshold", "O", thresholdtmp);
5056
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
5060
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
5063
Py_INCREF(self->stream);
5064
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
5066
(*self->mode_func_ptr)(self);
5072
static PyObject * Thresh_getServer(Thresh* self) { GET_SERVER };
5073
static PyObject * Thresh_getStream(Thresh* self) { GET_STREAM };
5074
static PyObject * Thresh_setMul(Thresh *self, PyObject *arg) { SET_MUL };
5075
static PyObject * Thresh_setAdd(Thresh *self, PyObject *arg) { SET_ADD };
5076
static PyObject * Thresh_setSub(Thresh *self, PyObject *arg) { SET_SUB };
5077
static PyObject * Thresh_setDiv(Thresh *self, PyObject *arg) { SET_DIV };
5079
static PyObject * Thresh_play(Thresh *self, PyObject *args, PyObject *kwds) { PLAY };
5080
static PyObject * Thresh_stop(Thresh *self) { STOP };
5082
static PyObject * Thresh_multiply(Thresh *self, PyObject *arg) { MULTIPLY };
5083
static PyObject * Thresh_inplace_multiply(Thresh *self, PyObject *arg) { INPLACE_MULTIPLY };
5084
static PyObject * Thresh_add(Thresh *self, PyObject *arg) { ADD };
5085
static PyObject * Thresh_inplace_add(Thresh *self, PyObject *arg) { INPLACE_ADD };
5086
static PyObject * Thresh_sub(Thresh *self, PyObject *arg) { SUB };
5087
static PyObject * Thresh_inplace_sub(Thresh *self, PyObject *arg) { INPLACE_SUB };
5088
static PyObject * Thresh_div(Thresh *self, PyObject *arg) { DIV };
5089
static PyObject * Thresh_inplace_div(Thresh *self, PyObject *arg) { INPLACE_DIV };
5092
Thresh_setThreshold(Thresh *self, PyObject *arg)
5094
PyObject *tmp, *streamtmp;
5101
int isNumber = PyNumber_Check(arg);
5105
Py_DECREF(self->threshold);
5106
if (isNumber == 1) {
5107
self->threshold = PyNumber_Float(tmp);
5108
self->modebuffer[2] = 0;
5111
self->threshold = tmp;
5112
streamtmp = PyObject_CallMethod((PyObject *)self->threshold, "_getStream", NULL);
5113
Py_INCREF(streamtmp);
5114
Py_XDECREF(self->threshold_stream);
5115
self->threshold_stream = (Stream *)streamtmp;
5116
self->modebuffer[2] = 1;
5119
(*self->mode_func_ptr)(self);
5126
Thresh_setDir(Thresh *self, PyObject *arg)
5133
if (PyInt_Check(arg)) {
5134
self->dir = PyInt_AsLong(arg);
5141
static PyMemberDef Thresh_members[] = {
5142
{"server", T_OBJECT_EX, offsetof(Thresh, server), 0, "Pyo server."},
5143
{"stream", T_OBJECT_EX, offsetof(Thresh, stream), 0, "Stream object."},
5144
{"input", T_OBJECT_EX, offsetof(Thresh, input), 0, "Input sound object."},
5145
{"threshold", T_OBJECT_EX, offsetof(Thresh, threshold), 0, "Threshold object."},
5146
{"mul", T_OBJECT_EX, offsetof(Thresh, mul), 0, "Mul factor."},
5147
{"add", T_OBJECT_EX, offsetof(Thresh, add), 0, "Add factor."},
5148
{NULL} /* Sentinel */
5151
static PyMethodDef Thresh_methods[] = {
5152
{"getServer", (PyCFunction)Thresh_getServer, METH_NOARGS, "Returns server object."},
5153
{"_getStream", (PyCFunction)Thresh_getStream, METH_NOARGS, "Returns stream object."},
5154
{"deleteStream", (PyCFunction)Thresh_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
5155
{"play", (PyCFunction)Thresh_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
5156
{"stop", (PyCFunction)Thresh_stop, METH_NOARGS, "Stops computing."},
5157
{"setThreshold", (PyCFunction)Thresh_setThreshold, METH_O, "Sets threshold value."},
5158
{"setDir", (PyCFunction)Thresh_setDir, METH_O, "Sets direction. 0 = upward, 1 = downward, 2 = up and down"},
5159
{"setMul", (PyCFunction)Thresh_setMul, METH_O, "Sets mul factor."},
5160
{"setAdd", (PyCFunction)Thresh_setAdd, METH_O, "Sets add factor."},
5161
{"setSub", (PyCFunction)Thresh_setSub, METH_O, "Sets inverse add factor."},
5162
{"setDiv", (PyCFunction)Thresh_setDiv, METH_O, "Sets inverse mul factor."},
5163
{NULL} /* Sentinel */
5166
static PyNumberMethods Thresh_as_number = {
5167
(binaryfunc)Thresh_add, /*nb_add*/
5168
(binaryfunc)Thresh_sub, /*nb_subtract*/
5169
(binaryfunc)Thresh_multiply, /*nb_multiply*/
5170
(binaryfunc)Thresh_div, /*nb_divide*/
5176
0, /*(unaryfunc)array_abs,*/
5190
(binaryfunc)Thresh_inplace_add, /*inplace_add*/
5191
(binaryfunc)Thresh_inplace_sub, /*inplace_subtract*/
5192
(binaryfunc)Thresh_inplace_multiply, /*inplace_multiply*/
5193
(binaryfunc)Thresh_inplace_div, /*inplace_divide*/
5194
0, /*inplace_remainder*/
5195
0, /*inplace_power*/
5196
0, /*inplace_lshift*/
5197
0, /*inplace_rshift*/
5201
0, /*nb_floor_divide*/
5202
0, /*nb_true_divide*/
5203
0, /*nb_inplace_floor_divide*/
5204
0, /*nb_inplace_true_divide*/
5208
PyTypeObject ThreshType = {
5209
PyObject_HEAD_INIT(NULL)
5211
"_pyo.Thresh_base", /*tp_name*/
5212
sizeof(Thresh), /*tp_basicsize*/
5214
(destructor)Thresh_dealloc, /*tp_dealloc*/
5220
&Thresh_as_number, /*tp_as_number*/
5221
0, /*tp_as_sequence*/
5222
0, /*tp_as_mapping*/
5229
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
5230
"Thresh objects. Threshold detector.", /* tp_doc */
5231
(traverseproc)Thresh_traverse, /* tp_traverse */
5232
(inquiry)Thresh_clear, /* tp_clear */
5233
0, /* tp_richcompare */
5234
0, /* tp_weaklistoffset */
5236
0, /* tp_iternext */
5237
Thresh_methods, /* tp_methods */
5238
Thresh_members, /* tp_members */
5242
0, /* tp_descr_get */
5243
0, /* tp_descr_set */
5244
0, /* tp_dictoffset */
5245
(initproc)Thresh_init, /* tp_init */
5247
Thresh_new, /* tp_new */
5250
/***************************************************/
5251
/******* Percent ***********/
5252
/***************************************************/
5256
Stream *input_stream;
5258
Stream *percent_stream;
5263
Percent_generates_i(Percent *self) {
5266
MYFLT *in = Stream_getData((Stream *)self->input_stream);
5267
MYFLT perc = PyFloat_AS_DOUBLE(self->percent);
5268
for (i=0; i<self->bufsize; i++) {
5269
self->data[i] = 0.0;
5271
guess = (rand()/((MYFLT)(RAND_MAX)+1)) * 100.0;
5273
self->data[i] = 1.0;
5279
Percent_generates_a(Percent *self) {
5282
MYFLT *in = Stream_getData((Stream *)self->input_stream);
5283
MYFLT *perc = Stream_getData((Stream *)self->percent_stream);
5285
for (i=0; i<self->bufsize; i++) {
5286
self->data[i] = 0.0;
5288
guess = (rand()/((MYFLT)(RAND_MAX)+1)) * 100.0;
5289
if (guess <= perc[i])
5290
self->data[i] = 1.0;
5295
static void Percent_postprocessing_ii(Percent *self) { POST_PROCESSING_II };
5296
static void Percent_postprocessing_ai(Percent *self) { POST_PROCESSING_AI };
5297
static void Percent_postprocessing_ia(Percent *self) { POST_PROCESSING_IA };
5298
static void Percent_postprocessing_aa(Percent *self) { POST_PROCESSING_AA };
5299
static void Percent_postprocessing_ireva(Percent *self) { POST_PROCESSING_IREVA };
5300
static void Percent_postprocessing_areva(Percent *self) { POST_PROCESSING_AREVA };
5301
static void Percent_postprocessing_revai(Percent *self) { POST_PROCESSING_REVAI };
5302
static void Percent_postprocessing_revaa(Percent *self) { POST_PROCESSING_REVAA };
5303
static void Percent_postprocessing_revareva(Percent *self) { POST_PROCESSING_REVAREVA };
5306
Percent_setProcMode(Percent *self)
5308
int muladdmode, procmode
5310
procmode = self->modebuffer[2];
5311
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
5314
self->proc_func_ptr = Percent_generates_i;
5317
self->proc_func_ptr = Percent_generates_a;
5320
switch (muladdmode) {
5322
self->muladd_func_ptr = Percent_postprocessing_ii;
5325
self->muladd_func_ptr = Percent_postprocessing_ai;
5328
self->muladd_func_ptr = Percent_postprocessing_revai;
5331
self->muladd_func_ptr = Percent_postprocessing_ia;
5334
self->muladd_func_ptr = Percent_postprocessing_aa;
5337
self->muladd_func_ptr = Percent_postprocessing_revaa;
5340
self->muladd_func_ptr = Percent_postprocessing_ireva;
5343
self->muladd_func_ptr = Percent_postprocessing_areva;
5346
self->muladd_func_ptr = Percent_postprocessing_revareva;
5352
Percent_compute_next_data_frame(Percent *self)
5354
(*self->proc_func_ptr)(self);
5355
(*self->muladd_func_ptr)(self);
5359
Percent_traverse(Percent *self, visitproc visit, void *arg)
5362
Py_VISIT(self->input);
5363
Py_VISIT(self->input_stream);
5364
Py_VISIT(self->percent);
5365
Py_VISIT(self->percent_stream);
5370
Percent_clear(Percent *self)
5373
Py_CLEAR(self->input);
5374
Py_CLEAR(self->input_stream);
5375
Py_CLEAR(self->percent);
5376
Py_CLEAR(self->percent_stream);
5381
Percent_dealloc(Percent* self)
5384
Percent_clear(self);
5385
self->ob_type->tp_free((PyObject*)self);
5388
static PyObject * Percent_deleteStream(Percent *self) { DELETE_STREAM };
5391
Percent_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5395
self = (Percent *)type->tp_alloc(type, 0);
5397
self->percent = PyFloat_FromDouble(50.);
5398
self->modebuffer[0] = 0;
5399
self->modebuffer[1] = 0;
5400
self->modebuffer[2] = 0;
5403
Stream_setFunctionPtr(self->stream, Percent_compute_next_data_frame);
5404
self->mode_func_ptr = Percent_setProcMode;
5405
return (PyObject *)self;
5409
Percent_init(Percent *self, PyObject *args, PyObject *kwds)
5411
PyObject *inputtmp, *input_streamtmp, *percenttmp, *multmp=NULL, *addtmp=NULL;
5413
static char *kwlist[] = {"input", "percent", "mul", "add", NULL};
5415
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|OOO", kwlist, &inputtmp, &percenttmp, &multmp, &addtmp))
5421
PyObject_CallMethod((PyObject *)self, "setPercent", "O", percenttmp);
5424
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
5428
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
5431
Py_INCREF(self->stream);
5432
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
5434
Server_generateSeed((Server *)self->server, PERCENT_ID);
5436
(*self->mode_func_ptr)(self);
5442
static PyObject * Percent_getServer(Percent* self) { GET_SERVER };
5443
static PyObject * Percent_getStream(Percent* self) { GET_STREAM };
5444
static PyObject * Percent_setMul(Percent *self, PyObject *arg) { SET_MUL };
5445
static PyObject * Percent_setAdd(Percent *self, PyObject *arg) { SET_ADD };
5446
static PyObject * Percent_setSub(Percent *self, PyObject *arg) { SET_SUB };
5447
static PyObject * Percent_setDiv(Percent *self, PyObject *arg) { SET_DIV };
5449
static PyObject * Percent_play(Percent *self, PyObject *args, PyObject *kwds) { PLAY };
5450
static PyObject * Percent_stop(Percent *self) { STOP };
5452
static PyObject * Percent_multiply(Percent *self, PyObject *arg) { MULTIPLY };
5453
static PyObject * Percent_inplace_multiply(Percent *self, PyObject *arg) { INPLACE_MULTIPLY };
5454
static PyObject * Percent_add(Percent *self, PyObject *arg) { ADD };
5455
static PyObject * Percent_inplace_add(Percent *self, PyObject *arg) { INPLACE_ADD };
5456
static PyObject * Percent_sub(Percent *self, PyObject *arg) { SUB };
5457
static PyObject * Percent_inplace_sub(Percent *self, PyObject *arg) { INPLACE_SUB };
5458
static PyObject * Percent_div(Percent *self, PyObject *arg) { DIV };
5459
static PyObject * Percent_inplace_div(Percent *self, PyObject *arg) { INPLACE_DIV };
5462
Percent_setPercent(Percent *self, PyObject *arg)
5464
PyObject *tmp, *streamtmp;
5471
int isNumber = PyNumber_Check(arg);
5475
Py_DECREF(self->percent);
5476
if (isNumber == 1) {
5477
self->percent = PyNumber_Float(tmp);
5478
self->modebuffer[2] = 0;
5481
self->percent = tmp;
5482
streamtmp = PyObject_CallMethod((PyObject *)self->percent, "_getStream", NULL);
5483
Py_INCREF(streamtmp);
5484
Py_XDECREF(self->percent_stream);
5485
self->percent_stream = (Stream *)streamtmp;
5486
self->modebuffer[2] = 1;
5489
(*self->mode_func_ptr)(self);
5495
static PyMemberDef Percent_members[] = {
5496
{"server", T_OBJECT_EX, offsetof(Percent, server), 0, "Pyo server."},
5497
{"stream", T_OBJECT_EX, offsetof(Percent, stream), 0, "Stream object."},
5498
{"input", T_OBJECT_EX, offsetof(Percent, input), 0, "Input sound object."},
5499
{"percent", T_OBJECT_EX, offsetof(Percent, percent), 0, "percent attribute."},
5500
{"mul", T_OBJECT_EX, offsetof(Percent, mul), 0, "Mul factor."},
5501
{"add", T_OBJECT_EX, offsetof(Percent, add), 0, "Add factor."},
5502
{NULL} /* Sentinel */
5505
static PyMethodDef Percent_methods[] = {
5506
{"getServer", (PyCFunction)Percent_getServer, METH_NOARGS, "Returns server object."},
5507
{"_getStream", (PyCFunction)Percent_getStream, METH_NOARGS, "Returns stream object."},
5508
{"deleteStream", (PyCFunction)Percent_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
5509
{"play", (PyCFunction)Percent_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
5510
{"stop", (PyCFunction)Percent_stop, METH_NOARGS, "Stops computing."},
5511
{"setPercent", (PyCFunction)Percent_setPercent, METH_O, "Sets percentange value."},
5512
{"setMul", (PyCFunction)Percent_setMul, METH_O, "Sets mul factor."},
5513
{"setAdd", (PyCFunction)Percent_setAdd, METH_O, "Sets add factor."},
5514
{"setSub", (PyCFunction)Percent_setSub, METH_O, "Sets inverse add factor."},
5515
{"setDiv", (PyCFunction)Percent_setDiv, METH_O, "Sets inverse mul factor."},
5516
{NULL} /* Sentinel */
5519
static PyNumberMethods Percent_as_number = {
5520
(binaryfunc)Percent_add, /*nb_add*/
5521
(binaryfunc)Percent_sub, /*nb_subtract*/
5522
(binaryfunc)Percent_multiply, /*nb_multiply*/
5523
(binaryfunc)Percent_div, /*nb_divide*/
5529
0, /*(unaryfunc)array_abs,*/
5543
(binaryfunc)Percent_inplace_add, /*inplace_add*/
5544
(binaryfunc)Percent_inplace_sub, /*inplace_subtract*/
5545
(binaryfunc)Percent_inplace_multiply, /*inplace_multiply*/
5546
(binaryfunc)Percent_inplace_div, /*inplace_divide*/
5547
0, /*inplace_remainder*/
5548
0, /*inplace_power*/
5549
0, /*inplace_lshift*/
5550
0, /*inplace_rshift*/
5554
0, /*nb_floor_divide*/
5555
0, /*nb_true_divide*/
5556
0, /*nb_inplace_floor_divide*/
5557
0, /*nb_inplace_true_divide*/
5561
PyTypeObject PercentType = {
5562
PyObject_HEAD_INIT(NULL)
5564
"_pyo.Percent_base", /*tp_name*/
5565
sizeof(Percent), /*tp_basicsize*/
5567
(destructor)Percent_dealloc, /*tp_dealloc*/
5573
&Percent_as_number, /*tp_as_number*/
5574
0, /*tp_as_sequence*/
5575
0, /*tp_as_mapping*/
5582
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
5583
"Percent objects. Looks for input triggers and sets how much percentage of it to let pass.", /* tp_doc */
5584
(traverseproc)Percent_traverse, /* tp_traverse */
5585
(inquiry)Percent_clear, /* tp_clear */
5586
0, /* tp_richcompare */
5587
0, /* tp_weaklistoffset */
5589
0, /* tp_iternext */
5590
Percent_methods, /* tp_methods */
5591
Percent_members, /* tp_members */
5595
0, /* tp_descr_get */
5596
0, /* tp_descr_set */
5597
0, /* tp_dictoffset */
5598
(initproc)Percent_init, /* tp_init */
5600
Percent_new, /* tp_new */
5603
/*************************/
5604
/******* Timer ***********/
5605
/*************************/
5609
Stream *input_stream;
5611
Stream *input2_stream;
5612
unsigned long count;
5619
Timer_generates(Timer *self) {
5621
MYFLT *in = Stream_getData((Stream *)self->input_stream);
5622
MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
5624
for (i=0; i<self->bufsize; i++) {
5625
if (self->started == 1) {
5628
self->lasttime = self->count / self->sr;
5633
if (in2[i] == 1 && self->started == 0) {
5638
self->data[i] = self->lasttime;
5642
static void Timer_postprocessing_ii(Timer *self) { POST_PROCESSING_II };
5643
static void Timer_postprocessing_ai(Timer *self) { POST_PROCESSING_AI };
5644
static void Timer_postprocessing_ia(Timer *self) { POST_PROCESSING_IA };
5645
static void Timer_postprocessing_aa(Timer *self) { POST_PROCESSING_AA };
5646
static void Timer_postprocessing_ireva(Timer *self) { POST_PROCESSING_IREVA };
5647
static void Timer_postprocessing_areva(Timer *self) { POST_PROCESSING_AREVA };
5648
static void Timer_postprocessing_revai(Timer *self) { POST_PROCESSING_REVAI };
5649
static void Timer_postprocessing_revaa(Timer *self) { POST_PROCESSING_REVAA };
5650
static void Timer_postprocessing_revareva(Timer *self) { POST_PROCESSING_REVAREVA };
5653
Timer_setProcMode(Timer *self)
5655
int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
5657
self->proc_func_ptr = Timer_generates;
5659
switch (muladdmode) {
5661
self->muladd_func_ptr = Timer_postprocessing_ii;
5664
self->muladd_func_ptr = Timer_postprocessing_ai;
5667
self->muladd_func_ptr = Timer_postprocessing_revai;
5670
self->muladd_func_ptr = Timer_postprocessing_ia;
5673
self->muladd_func_ptr = Timer_postprocessing_aa;
5676
self->muladd_func_ptr = Timer_postprocessing_revaa;
5679
self->muladd_func_ptr = Timer_postprocessing_ireva;
5682
self->muladd_func_ptr = Timer_postprocessing_areva;
5685
self->muladd_func_ptr = Timer_postprocessing_revareva;
5691
Timer_compute_next_data_frame(Timer *self)
5693
(*self->proc_func_ptr)(self);
5694
(*self->muladd_func_ptr)(self);
5698
Timer_traverse(Timer *self, visitproc visit, void *arg)
5701
Py_VISIT(self->input);
5702
Py_VISIT(self->input_stream);
5703
Py_VISIT(self->input2);
5704
Py_VISIT(self->input2_stream);
5709
Timer_clear(Timer *self)
5712
Py_CLEAR(self->input);
5713
Py_CLEAR(self->input_stream);
5714
Py_CLEAR(self->input2);
5715
Py_CLEAR(self->input2_stream);
5720
Timer_dealloc(Timer* self)
5724
self->ob_type->tp_free((PyObject*)self);
5727
static PyObject * Timer_deleteStream(Timer *self) { DELETE_STREAM };
5730
Timer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5734
self = (Timer *)type->tp_alloc(type, 0);
5738
self->lasttime = 0.0;
5739
self->modebuffer[0] = 0;
5740
self->modebuffer[1] = 0;
5743
Stream_setFunctionPtr(self->stream, Timer_compute_next_data_frame);
5744
self->mode_func_ptr = Timer_setProcMode;
5745
return (PyObject *)self;
5749
Timer_init(Timer *self, PyObject *args, PyObject *kwds)
5751
PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *multmp=NULL, *addtmp=NULL;
5753
static char *kwlist[] = {"input", "input2", "mul", "add", NULL};
5755
if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &inputtmp, &input2tmp, &multmp, &addtmp))
5760
Py_XDECREF(self->input2);
5761
self->input2 = input2tmp;
5762
input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
5763
Py_INCREF(input2_streamtmp);
5764
Py_XDECREF(self->input2_stream);
5765
self->input2_stream = (Stream *)input2_streamtmp;
5768
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
5772
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
5775
Py_INCREF(self->stream);
5776
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
5778
(*self->mode_func_ptr)(self);
5784
static PyObject * Timer_getServer(Timer* self) { GET_SERVER };
5785
static PyObject * Timer_getStream(Timer* self) { GET_STREAM };
5786
static PyObject * Timer_setMul(Timer *self, PyObject *arg) { SET_MUL };
5787
static PyObject * Timer_setAdd(Timer *self, PyObject *arg) { SET_ADD };
5788
static PyObject * Timer_setSub(Timer *self, PyObject *arg) { SET_SUB };
5789
static PyObject * Timer_setDiv(Timer *self, PyObject *arg) { SET_DIV };
5791
static PyObject * Timer_play(Timer *self, PyObject *args, PyObject *kwds) { PLAY };
5792
static PyObject * Timer_stop(Timer *self) { STOP };
5794
static PyObject * Timer_multiply(Timer *self, PyObject *arg) { MULTIPLY };
5795
static PyObject * Timer_inplace_multiply(Timer *self, PyObject *arg) { INPLACE_MULTIPLY };
5796
static PyObject * Timer_add(Timer *self, PyObject *arg) { ADD };
5797
static PyObject * Timer_inplace_add(Timer *self, PyObject *arg) { INPLACE_ADD };
5798
static PyObject * Timer_sub(Timer *self, PyObject *arg) { SUB };
5799
static PyObject * Timer_inplace_sub(Timer *self, PyObject *arg) { INPLACE_SUB };
5800
static PyObject * Timer_div(Timer *self, PyObject *arg) { DIV };
5801
static PyObject * Timer_inplace_div(Timer *self, PyObject *arg) { INPLACE_DIV };
5803
static PyMemberDef Timer_members[] = {
5804
{"server", T_OBJECT_EX, offsetof(Timer, server), 0, "Pyo server."},
5805
{"stream", T_OBJECT_EX, offsetof(Timer, stream), 0, "Stream object."},
5806
{"input", T_OBJECT_EX, offsetof(Timer, input), 0, "Stops timer and output time elapsed."},
5807
{"input2", T_OBJECT_EX, offsetof(Timer, input2), 0, "Starts timer."},
5808
{"mul", T_OBJECT_EX, offsetof(Timer, mul), 0, "Mul factor."},
5809
{"add", T_OBJECT_EX, offsetof(Timer, add), 0, "Add factor."},
5810
{NULL} /* Sentinel */
5813
static PyMethodDef Timer_methods[] = {
5814
{"getServer", (PyCFunction)Timer_getServer, METH_NOARGS, "Returns server object."},
5815
{"_getStream", (PyCFunction)Timer_getStream, METH_NOARGS, "Returns stream object."},
5816
{"deleteStream", (PyCFunction)Timer_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
5817
{"play", (PyCFunction)Timer_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
5818
{"stop", (PyCFunction)Timer_stop, METH_NOARGS, "Stops computing."},
5819
{"setMul", (PyCFunction)Timer_setMul, METH_O, "Sets mul factor."},
5820
{"setAdd", (PyCFunction)Timer_setAdd, METH_O, "Sets add factor."},
5821
{"setSub", (PyCFunction)Timer_setSub, METH_O, "Sets inverse add factor."},
5822
{"setDiv", (PyCFunction)Timer_setDiv, METH_O, "Sets inverse mul factor."},
5823
{NULL} /* Sentinel */
5826
static PyNumberMethods Timer_as_number = {
5827
(binaryfunc)Timer_add, /*nb_add*/
5828
(binaryfunc)Timer_sub, /*nb_subtract*/
5829
(binaryfunc)Timer_multiply, /*nb_multiply*/
5830
(binaryfunc)Timer_div, /*nb_divide*/
5836
0, /*(unaryfunc)array_abs,*/
5850
(binaryfunc)Timer_inplace_add, /*inplace_add*/
5851
(binaryfunc)Timer_inplace_sub, /*inplace_subtract*/
5852
(binaryfunc)Timer_inplace_multiply, /*inplace_multiply*/
5853
(binaryfunc)Timer_inplace_div, /*inplace_divide*/
5854
0, /*inplace_remainder*/
5855
0, /*inplace_power*/
5856
0, /*inplace_lshift*/
5857
0, /*inplace_rshift*/
5861
0, /*nb_floor_divide*/
5862
0, /*nb_true_divide*/
5863
0, /*nb_inplace_floor_divide*/
5864
0, /*nb_inplace_true_divide*/
5868
PyTypeObject TimerType = {
5869
PyObject_HEAD_INIT(NULL)
5871
"_pyo.Timer_base", /*tp_name*/
5872
sizeof(Timer), /*tp_basicsize*/
5874
(destructor)Timer_dealloc, /*tp_dealloc*/
5880
&Timer_as_number, /*tp_as_number*/
5881
0, /*tp_as_sequence*/
5882
0, /*tp_as_mapping*/
5889
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
5890
"Timer objects. Returns elapsed time between two triggers.", /* tp_doc */
5891
(traverseproc)Timer_traverse, /* tp_traverse */
5892
(inquiry)Timer_clear, /* tp_clear */
5893
0, /* tp_richcompare */
5894
0, /* tp_weaklistoffset */
5896
0, /* tp_iternext */
5897
Timer_methods, /* tp_methods */
5898
Timer_members, /* tp_members */
5902
0, /* tp_descr_get */
5903
0, /* tp_descr_set */
5904
0, /* tp_dictoffset */
5905
(initproc)Timer_init, /* tp_init */
5907
Timer_new, /* tp_new */
5910
/*********************************************************************************************/
5911
/* Iter ********************************************************************************/
5912
/*********************************************************************************************/
5916
Stream *input_stream;
5921
int modebuffer[2]; // need at least 2 slots for mul & add
5925
Iter_generate(Iter *self) {
5927
MYFLT *in = Stream_getData((Stream *)self->input_stream);
5929
for (i=0; i<self->bufsize; i++) {
5931
if (self->chCount >= self->chSize)
5933
self->value = self->choice[self->chCount];
5936
self->data[i] = self->value;
5940
static void Iter_postprocessing_ii(Iter *self) { POST_PROCESSING_II };
5941
static void Iter_postprocessing_ai(Iter *self) { POST_PROCESSING_AI };
5942
static void Iter_postprocessing_ia(Iter *self) { POST_PROCESSING_IA };
5943
static void Iter_postprocessing_aa(Iter *self) { POST_PROCESSING_AA };
5944
static void Iter_postprocessing_ireva(Iter *self) { POST_PROCESSING_IREVA };
5945
static void Iter_postprocessing_areva(Iter *self) { POST_PROCESSING_AREVA };
5946
static void Iter_postprocessing_revai(Iter *self) { POST_PROCESSING_REVAI };
5947
static void Iter_postprocessing_revaa(Iter *self) { POST_PROCESSING_REVAA };
5948
static void Iter_postprocessing_revareva(Iter *self) { POST_PROCESSING_REVAREVA };
5951
Iter_setProcMode(Iter *self)
5954
muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
5956
self->proc_func_ptr = Iter_generate;
5958
switch (muladdmode) {
5960
self->muladd_func_ptr = Iter_postprocessing_ii;
5963
self->muladd_func_ptr = Iter_postprocessing_ai;
5966
self->muladd_func_ptr = Iter_postprocessing_revai;
5969
self->muladd_func_ptr = Iter_postprocessing_ia;
5972
self->muladd_func_ptr = Iter_postprocessing_aa;
5975
self->muladd_func_ptr = Iter_postprocessing_revaa;
5978
self->muladd_func_ptr = Iter_postprocessing_ireva;
5981
self->muladd_func_ptr = Iter_postprocessing_areva;
5984
self->muladd_func_ptr = Iter_postprocessing_revareva;
5990
Iter_compute_next_data_frame(Iter *self)
5992
(*self->proc_func_ptr)(self);
5993
(*self->muladd_func_ptr)(self);
5997
Iter_traverse(Iter *self, visitproc visit, void *arg)
6000
Py_VISIT(self->input);
6001
Py_VISIT(self->input_stream);
6006
Iter_clear(Iter *self)
6009
Py_CLEAR(self->input);
6010
Py_CLEAR(self->input_stream);
6015
Iter_dealloc(Iter* self)
6020
self->ob_type->tp_free((PyObject*)self);
6023
static PyObject * Iter_deleteStream(Iter *self) { DELETE_STREAM };
6026
Iter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6030
self = (Iter *)type->tp_alloc(type, 0);
6034
self->modebuffer[0] = 0;
6035
self->modebuffer[1] = 0;
6038
Stream_setFunctionPtr(self->stream, Iter_compute_next_data_frame);
6039
self->mode_func_ptr = Iter_setProcMode;
6040
return (PyObject *)self;
6044
Iter_init(Iter *self, PyObject *args, PyObject *kwds)
6046
MYFLT inittmp = 0.0;
6047
PyObject *inputtmp, *input_streamtmp, *choicetmp=NULL, *multmp=NULL, *addtmp=NULL;
6049
static char *kwlist[] = {"input", "choice", "init", "mul", "add", NULL};
6051
if (! PyArg_ParseTupleAndKeywords(args, kwds, TYPE_OO_FOO, kwlist, &inputtmp, &choicetmp, &inittmp, &multmp, &addtmp))
6057
PyObject_CallMethod((PyObject *)self, "setChoice", "O", choicetmp);
6061
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
6065
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
6068
Py_INCREF(self->stream);
6069
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
6071
self->value = inittmp;
6073
(*self->mode_func_ptr)(self);
6079
static PyObject * Iter_getServer(Iter* self) { GET_SERVER };
6080
static PyObject * Iter_getStream(Iter* self) { GET_STREAM };
6081
static PyObject * Iter_setMul(Iter *self, PyObject *arg) { SET_MUL };
6082
static PyObject * Iter_setAdd(Iter *self, PyObject *arg) { SET_ADD };
6083
static PyObject * Iter_setSub(Iter *self, PyObject *arg) { SET_SUB };
6084
static PyObject * Iter_setDiv(Iter *self, PyObject *arg) { SET_DIV };
6086
static PyObject * Iter_play(Iter *self, PyObject *args, PyObject *kwds) { PLAY };
6087
static PyObject * Iter_out(Iter *self, PyObject *args, PyObject *kwds) { OUT };
6088
static PyObject * Iter_stop(Iter *self) { STOP };
6090
static PyObject * Iter_multiply(Iter *self, PyObject *arg) { MULTIPLY };
6091
static PyObject * Iter_inplace_multiply(Iter *self, PyObject *arg) { INPLACE_MULTIPLY };
6092
static PyObject * Iter_add(Iter *self, PyObject *arg) { ADD };
6093
static PyObject * Iter_inplace_add(Iter *self, PyObject *arg) { INPLACE_ADD };
6094
static PyObject * Iter_sub(Iter *self, PyObject *arg) { SUB };
6095
static PyObject * Iter_inplace_sub(Iter *self, PyObject *arg) { INPLACE_SUB };
6096
static PyObject * Iter_div(Iter *self, PyObject *arg) { DIV };
6097
static PyObject * Iter_inplace_div(Iter *self, PyObject *arg) { INPLACE_DIV };
6100
Iter_setChoice(Iter *self, PyObject *arg)
6105
if (! PyList_Check(arg)) {
6106
PyErr_SetString(PyExc_TypeError, "The choice attribute must be a list.");
6112
self->chSize = PyList_Size(tmp);
6113
self->choice = (MYFLT *)realloc(self->choice, self->chSize * sizeof(MYFLT));
6114
for (i=0; i<self->chSize; i++) {
6115
self->choice[i] = PyFloat_AS_DOUBLE(PyNumber_Float(PyList_GET_ITEM(tmp, i)));
6118
(*self->mode_func_ptr)(self);
6125
Iter_reset(Iter *self, PyObject *arg)
6128
if (PyInt_Check(arg)) {
6129
tmp = PyInt_AsLong(arg);
6130
if (tmp < self->chSize)
6131
self->chCount = tmp;
6139
static PyMemberDef Iter_members[] = {
6140
{"server", T_OBJECT_EX, offsetof(Iter, server), 0, "Pyo server."},
6141
{"stream", T_OBJECT_EX, offsetof(Iter, stream), 0, "Stream object."},
6142
{"input", T_OBJECT_EX, offsetof(Iter, input), 0, "Input sound object."},
6143
{"mul", T_OBJECT_EX, offsetof(Iter, mul), 0, "Mul factor."},
6144
{"add", T_OBJECT_EX, offsetof(Iter, add), 0, "Add factor."},
6145
{NULL} /* Sentinel */
6148
static PyMethodDef Iter_methods[] = {
6149
{"getServer", (PyCFunction)Iter_getServer, METH_NOARGS, "Returns server object."},
6150
{"_getStream", (PyCFunction)Iter_getStream, METH_NOARGS, "Returns stream object."},
6151
{"deleteStream", (PyCFunction)Iter_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
6152
{"play", (PyCFunction)Iter_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
6153
{"out", (PyCFunction)Iter_out, METH_VARARGS|METH_KEYWORDS, "Starts computing and sends sound to soundcard channel speficied by argument."},
6154
{"stop", (PyCFunction)Iter_stop, METH_NOARGS, "Stops computing."},
6155
{"setChoice", (PyCFunction)Iter_setChoice, METH_O, "Sets possible values."},
6156
{"reset", (PyCFunction)Iter_reset, METH_O, "Resets count to 0."},
6157
{"setMul", (PyCFunction)Iter_setMul, METH_O, "Sets oscillator mul factor."},
6158
{"setAdd", (PyCFunction)Iter_setAdd, METH_O, "Sets oscillator add factor."},
6159
{"setSub", (PyCFunction)Iter_setSub, METH_O, "Sets inverse add factor."},
6160
{"setDiv", (PyCFunction)Iter_setDiv, METH_O, "Sets inverse mul factor."},
6161
{NULL} /* Sentinel */
6164
static PyNumberMethods Iter_as_number = {
6165
(binaryfunc)Iter_add, /*nb_add*/
6166
(binaryfunc)Iter_sub, /*nb_subtract*/
6167
(binaryfunc)Iter_multiply, /*nb_multiply*/
6168
(binaryfunc)Iter_div, /*nb_divide*/
6174
0, /*(unaryfunc)array_abs,*/
6188
(binaryfunc)Iter_inplace_add, /*inplace_add*/
6189
(binaryfunc)Iter_inplace_sub, /*inplace_subtract*/
6190
(binaryfunc)Iter_inplace_multiply, /*inplace_multiply*/
6191
(binaryfunc)Iter_inplace_div, /*inplace_divide*/
6192
0, /*inplace_remainder*/
6193
0, /*inplace_power*/
6194
0, /*inplace_lshift*/
6195
0, /*inplace_rshift*/
6199
0, /*nb_floor_divide*/
6200
0, /*nb_true_divide*/
6201
0, /*nb_inplace_floor_divide*/
6202
0, /*nb_inplace_true_divide*/
6206
PyTypeObject IterType = {
6207
PyObject_HEAD_INIT(NULL)
6209
"_pyo.Iter_base", /*tp_name*/
6210
sizeof(Iter), /*tp_basicsize*/
6212
(destructor)Iter_dealloc, /*tp_dealloc*/
6218
&Iter_as_number, /*tp_as_number*/
6219
0, /*tp_as_sequence*/
6220
0, /*tp_as_mapping*/
6227
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
6228
"Iter objects. Triggers iterate over a list of values.", /* tp_doc */
6229
(traverseproc)Iter_traverse, /* tp_traverse */
6230
(inquiry)Iter_clear, /* tp_clear */
6231
0, /* tp_richcompare */
6232
0, /* tp_weaklistoffset */
6234
0, /* tp_iternext */
6235
Iter_methods, /* tp_methods */
6236
Iter_members, /* tp_members */
6240
0, /* tp_descr_get */
6241
0, /* tp_descr_set */
6242
0, /* tp_dictoffset */
6243
(initproc)Iter_init, /* tp_init */
6245
Iter_new, /* tp_new */
6248
/*************************/
6249
/******* Count ***********/
6250
/*************************/
6254
Stream *input_stream;
6255
unsigned long count;
6263
Count_generates(Count *self) {
6265
MYFLT *in = Stream_getData((Stream *)self->input_stream);
6267
for (i=0; i<self->bufsize; i++) {
6269
self->count = self->min;
6272
if (self->started == 1) {
6273
self->data[i] = (MYFLT)self->count;
6274
if (self->count++ >= self->max && self->max != 0)
6275
self->count = self->min;
6278
self->data[i] = self->min;
6283
static void Count_postprocessing_ii(Count *self) { POST_PROCESSING_II };
6284
static void Count_postprocessing_ai(Count *self) { POST_PROCESSING_AI };
6285
static void Count_postprocessing_ia(Count *self) { POST_PROCESSING_IA };
6286
static void Count_postprocessing_aa(Count *self) { POST_PROCESSING_AA };
6287
static void Count_postprocessing_ireva(Count *self) { POST_PROCESSING_IREVA };
6288
static void Count_postprocessing_areva(Count *self) { POST_PROCESSING_AREVA };
6289
static void Count_postprocessing_revai(Count *self) { POST_PROCESSING_REVAI };
6290
static void Count_postprocessing_revaa(Count *self) { POST_PROCESSING_REVAA };
6291
static void Count_postprocessing_revareva(Count *self) { POST_PROCESSING_REVAREVA };
6294
Count_setProcMode(Count *self)
6296
int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
6298
self->proc_func_ptr = Count_generates;
6300
switch (muladdmode) {
6302
self->muladd_func_ptr = Count_postprocessing_ii;
6305
self->muladd_func_ptr = Count_postprocessing_ai;
6308
self->muladd_func_ptr = Count_postprocessing_revai;
6311
self->muladd_func_ptr = Count_postprocessing_ia;
6314
self->muladd_func_ptr = Count_postprocessing_aa;
6317
self->muladd_func_ptr = Count_postprocessing_revaa;
6320
self->muladd_func_ptr = Count_postprocessing_ireva;
6323
self->muladd_func_ptr = Count_postprocessing_areva;
6326
self->muladd_func_ptr = Count_postprocessing_revareva;
6332
Count_compute_next_data_frame(Count *self)
6334
(*self->proc_func_ptr)(self);
6335
(*self->muladd_func_ptr)(self);
6339
Count_traverse(Count *self, visitproc visit, void *arg)
6342
Py_VISIT(self->input);
6343
Py_VISIT(self->input_stream);
6348
Count_clear(Count *self)
6351
Py_CLEAR(self->input);
6352
Py_CLEAR(self->input_stream);
6357
Count_dealloc(Count* self)
6361
self->ob_type->tp_free((PyObject*)self);
6364
static PyObject * Count_deleteStream(Count *self) { DELETE_STREAM };
6367
Count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6371
self = (Count *)type->tp_alloc(type, 0);
6377
self->modebuffer[0] = 0;
6378
self->modebuffer[1] = 0;
6381
Stream_setFunctionPtr(self->stream, Count_compute_next_data_frame);
6382
self->mode_func_ptr = Count_setProcMode;
6383
return (PyObject *)self;
6387
Count_init(Count *self, PyObject *args, PyObject *kwds)
6389
PyObject *inputtmp, *input_streamtmp, *multmp=NULL, *addtmp=NULL;
6391
static char *kwlist[] = {"input", "min", "max", "mul", "add", NULL};
6393
if (! PyArg_ParseTupleAndKeywords(args, kwds, "O|kkOO", kwlist, &inputtmp, &self->min, &self->max, &multmp, &addtmp))
6399
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
6403
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
6406
Py_INCREF(self->stream);
6407
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
6409
(*self->mode_func_ptr)(self);
6415
static PyObject * Count_getServer(Count* self) { GET_SERVER };
6416
static PyObject * Count_getStream(Count* self) { GET_STREAM };
6417
static PyObject * Count_setMul(Count *self, PyObject *arg) { SET_MUL };
6418
static PyObject * Count_setAdd(Count *self, PyObject *arg) { SET_ADD };
6419
static PyObject * Count_setSub(Count *self, PyObject *arg) { SET_SUB };
6420
static PyObject * Count_setDiv(Count *self, PyObject *arg) { SET_DIV };
6422
static PyObject * Count_play(Count *self, PyObject *args, PyObject *kwds) { PLAY };
6423
static PyObject * Count_stop(Count *self) { STOP };
6425
static PyObject * Count_multiply(Count *self, PyObject *arg) { MULTIPLY };
6426
static PyObject * Count_inplace_multiply(Count *self, PyObject *arg) { INPLACE_MULTIPLY };
6427
static PyObject * Count_add(Count *self, PyObject *arg) { ADD };
6428
static PyObject * Count_inplace_add(Count *self, PyObject *arg) { INPLACE_ADD };
6429
static PyObject * Count_sub(Count *self, PyObject *arg) { SUB };
6430
static PyObject * Count_inplace_sub(Count *self, PyObject *arg) { INPLACE_SUB };
6431
static PyObject * Count_div(Count *self, PyObject *arg) { DIV };
6432
static PyObject * Count_inplace_div(Count *self, PyObject *arg) { INPLACE_DIV };
6435
Count_setMin(Count *self, PyObject *arg)
6437
if (PyLong_Check(arg) || PyInt_Check(arg))
6438
self->min = PyLong_AsLong(arg);
6445
Count_setMax(Count *self, PyObject *arg)
6449
else if (PyLong_Check(arg) || PyInt_Check(arg))
6450
self->max = PyLong_AsLong(arg);
6456
static PyMemberDef Count_members[] = {
6457
{"server", T_OBJECT_EX, offsetof(Count, server), 0, "Pyo server."},
6458
{"stream", T_OBJECT_EX, offsetof(Count, stream), 0, "Stream object."},
6459
{"input", T_OBJECT_EX, offsetof(Count, input), 0, "Starts the count."},
6460
{"mul", T_OBJECT_EX, offsetof(Count, mul), 0, "Mul factor."},
6461
{"add", T_OBJECT_EX, offsetof(Count, add), 0, "Add factor."},
6462
{NULL} /* Sentinel */
6465
static PyMethodDef Count_methods[] = {
6466
{"getServer", (PyCFunction)Count_getServer, METH_NOARGS, "Returns server object."},
6467
{"_getStream", (PyCFunction)Count_getStream, METH_NOARGS, "Returns stream object."},
6468
{"deleteStream", (PyCFunction)Count_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
6469
{"play", (PyCFunction)Count_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
6470
{"stop", (PyCFunction)Count_stop, METH_NOARGS, "Stops computing."},
6471
{"setMin", (PyCFunction)Count_setMin, METH_O, "Sets the minimum value."},
6472
{"setMax", (PyCFunction)Count_setMax, METH_O, "Sets the maximum value."},
6473
{"setMul", (PyCFunction)Count_setMul, METH_O, "Sets mul factor."},
6474
{"setAdd", (PyCFunction)Count_setAdd, METH_O, "Sets add factor."},
6475
{"setSub", (PyCFunction)Count_setSub, METH_O, "Sets inverse add factor."},
6476
{"setDiv", (PyCFunction)Count_setDiv, METH_O, "Sets inverse mul factor."},
6477
{NULL} /* Sentinel */
6480
static PyNumberMethods Count_as_number = {
6481
(binaryfunc)Count_add, /*nb_add*/
6482
(binaryfunc)Count_sub, /*nb_subtract*/
6483
(binaryfunc)Count_multiply, /*nb_multiply*/
6484
(binaryfunc)Count_div, /*nb_divide*/
6490
0, /*(unaryfunc)array_abs,*/
6504
(binaryfunc)Count_inplace_add, /*inplace_add*/
6505
(binaryfunc)Count_inplace_sub, /*inplace_subtract*/
6506
(binaryfunc)Count_inplace_multiply, /*inplace_multiply*/
6507
(binaryfunc)Count_inplace_div, /*inplace_divide*/
6508
0, /*inplace_remainder*/
6509
0, /*inplace_power*/
6510
0, /*inplace_lshift*/
6511
0, /*inplace_rshift*/
6515
0, /*nb_floor_divide*/
6516
0, /*nb_true_divide*/
6517
0, /*nb_inplace_floor_divide*/
6518
0, /*nb_inplace_true_divide*/
6522
PyTypeObject CountType = {
6523
PyObject_HEAD_INIT(NULL)
6525
"_pyo.Count_base", /*tp_name*/
6526
sizeof(Count), /*tp_basicsize*/
6528
(destructor)Count_dealloc, /*tp_dealloc*/
6534
&Count_as_number, /*tp_as_number*/
6535
0, /*tp_as_sequence*/
6536
0, /*tp_as_mapping*/
6543
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
6544
"Count objects. Counts integer at audio rate.", /* tp_doc */
6545
(traverseproc)Count_traverse, /* tp_traverse */
6546
(inquiry)Count_clear, /* tp_clear */
6547
0, /* tp_richcompare */
6548
0, /* tp_weaklistoffset */
6550
0, /* tp_iternext */
6551
Count_methods, /* tp_methods */
6552
Count_members, /* tp_members */
6556
0, /* tp_descr_get */
6557
0, /* tp_descr_set */
6558
0, /* tp_dictoffset */
6559
(initproc)Count_init, /* tp_init */
6561
Count_new, /* tp_new */
6564
/*************************/
6565
/******* NextTrig ********/
6566
/*************************/
6570
Stream *input_stream;
6572
Stream *input2_stream;
6578
NextTrig_generates(NextTrig *self) {
6580
MYFLT *in = Stream_getData((Stream *)self->input_stream);
6581
MYFLT *in2 = Stream_getData((Stream *)self->input2_stream);
6583
for (i=0; i<self->bufsize; i++) {
6584
self->data[i] = 0.0;
6585
if (self->gate == 1 && in[i] == 1.0) {
6586
self->data[i] = 1.0;
6590
if (in2[i] == 1 && self->gate == 0)
6595
static void NextTrig_postprocessing_ii(NextTrig *self) { POST_PROCESSING_II };
6596
static void NextTrig_postprocessing_ai(NextTrig *self) { POST_PROCESSING_AI };
6597
static void NextTrig_postprocessing_ia(NextTrig *self) { POST_PROCESSING_IA };
6598
static void NextTrig_postprocessing_aa(NextTrig *self) { POST_PROCESSING_AA };
6599
static void NextTrig_postprocessing_ireva(NextTrig *self) { POST_PROCESSING_IREVA };
6600
static void NextTrig_postprocessing_areva(NextTrig *self) { POST_PROCESSING_AREVA };
6601
static void NextTrig_postprocessing_revai(NextTrig *self) { POST_PROCESSING_REVAI };
6602
static void NextTrig_postprocessing_revaa(NextTrig *self) { POST_PROCESSING_REVAA };
6603
static void NextTrig_postprocessing_revareva(NextTrig *self) { POST_PROCESSING_REVAREVA };
6606
NextTrig_setProcMode(NextTrig *self)
6608
int muladdmode = self->modebuffer[0] + self->modebuffer[1] * 10;
6610
self->proc_func_ptr = NextTrig_generates;
6612
switch (muladdmode) {
6614
self->muladd_func_ptr = NextTrig_postprocessing_ii;
6617
self->muladd_func_ptr = NextTrig_postprocessing_ai;
6620
self->muladd_func_ptr = NextTrig_postprocessing_revai;
6623
self->muladd_func_ptr = NextTrig_postprocessing_ia;
6626
self->muladd_func_ptr = NextTrig_postprocessing_aa;
6629
self->muladd_func_ptr = NextTrig_postprocessing_revaa;
6632
self->muladd_func_ptr = NextTrig_postprocessing_ireva;
6635
self->muladd_func_ptr = NextTrig_postprocessing_areva;
6638
self->muladd_func_ptr = NextTrig_postprocessing_revareva;
6644
NextTrig_compute_next_data_frame(NextTrig *self)
6646
(*self->proc_func_ptr)(self);
6647
(*self->muladd_func_ptr)(self);
6651
NextTrig_traverse(NextTrig *self, visitproc visit, void *arg)
6654
Py_VISIT(self->input);
6655
Py_VISIT(self->input_stream);
6656
Py_VISIT(self->input2);
6657
Py_VISIT(self->input2_stream);
6662
NextTrig_clear(NextTrig *self)
6665
Py_CLEAR(self->input);
6666
Py_CLEAR(self->input_stream);
6667
Py_CLEAR(self->input2);
6668
Py_CLEAR(self->input2_stream);
6673
NextTrig_dealloc(NextTrig* self)
6676
NextTrig_clear(self);
6677
self->ob_type->tp_free((PyObject*)self);
6680
static PyObject * NextTrig_deleteStream(NextTrig *self) { DELETE_STREAM };
6683
NextTrig_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6687
self = (NextTrig *)type->tp_alloc(type, 0);
6690
self->modebuffer[0] = 0;
6691
self->modebuffer[1] = 0;
6694
Stream_setFunctionPtr(self->stream, NextTrig_compute_next_data_frame);
6695
self->mode_func_ptr = NextTrig_setProcMode;
6696
return (PyObject *)self;
6700
NextTrig_init(NextTrig *self, PyObject *args, PyObject *kwds)
6702
PyObject *inputtmp, *input_streamtmp, *input2tmp, *input2_streamtmp, *multmp=NULL, *addtmp=NULL;
6704
static char *kwlist[] = {"input", "input2", "mul", "add", NULL};
6706
if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, &inputtmp, &input2tmp, &multmp, &addtmp))
6711
Py_XDECREF(self->input2);
6712
self->input2 = input2tmp;
6713
input2_streamtmp = PyObject_CallMethod((PyObject *)self->input2, "_getStream", NULL);
6714
Py_INCREF(input2_streamtmp);
6715
Py_XDECREF(self->input2_stream);
6716
self->input2_stream = (Stream *)input2_streamtmp;
6719
PyObject_CallMethod((PyObject *)self, "setMul", "O", multmp);
6723
PyObject_CallMethod((PyObject *)self, "setAdd", "O", addtmp);
6726
Py_INCREF(self->stream);
6727
PyObject_CallMethod(self->server, "addStream", "O", self->stream);
6729
(*self->mode_func_ptr)(self);
6735
static PyObject * NextTrig_getServer(NextTrig* self) { GET_SERVER };
6736
static PyObject * NextTrig_getStream(NextTrig* self) { GET_STREAM };
6737
static PyObject * NextTrig_setMul(NextTrig *self, PyObject *arg) { SET_MUL };
6738
static PyObject * NextTrig_setAdd(NextTrig *self, PyObject *arg) { SET_ADD };
6739
static PyObject * NextTrig_setSub(NextTrig *self, PyObject *arg) { SET_SUB };
6740
static PyObject * NextTrig_setDiv(NextTrig *self, PyObject *arg) { SET_DIV };
6742
static PyObject * NextTrig_play(NextTrig *self, PyObject *args, PyObject *kwds) { PLAY };
6743
static PyObject * NextTrig_stop(NextTrig *self) { STOP };
6745
static PyObject * NextTrig_multiply(NextTrig *self, PyObject *arg) { MULTIPLY };
6746
static PyObject * NextTrig_inplace_multiply(NextTrig *self, PyObject *arg) { INPLACE_MULTIPLY };
6747
static PyObject * NextTrig_add(NextTrig *self, PyObject *arg) { ADD };
6748
static PyObject * NextTrig_inplace_add(NextTrig *self, PyObject *arg) { INPLACE_ADD };
6749
static PyObject * NextTrig_sub(NextTrig *self, PyObject *arg) { SUB };
6750
static PyObject * NextTrig_inplace_sub(NextTrig *self, PyObject *arg) { INPLACE_SUB };
6751
static PyObject * NextTrig_div(NextTrig *self, PyObject *arg) { DIV };
6752
static PyObject * NextTrig_inplace_div(NextTrig *self, PyObject *arg) { INPLACE_DIV };
6754
static PyMemberDef NextTrig_members[] = {
6755
{"server", T_OBJECT_EX, offsetof(NextTrig, server), 0, "Pyo server."},
6756
{"stream", T_OBJECT_EX, offsetof(NextTrig, stream), 0, "Stream object."},
6757
{"input", T_OBJECT_EX, offsetof(NextTrig, input), 0, "Stops NextTrig and output time elapsed."},
6758
{"input2", T_OBJECT_EX, offsetof(NextTrig, input2), 0, "Starts NextTrig."},
6759
{"mul", T_OBJECT_EX, offsetof(NextTrig, mul), 0, "Mul factor."},
6760
{"add", T_OBJECT_EX, offsetof(NextTrig, add), 0, "Add factor."},
6761
{NULL} /* Sentinel */
6764
static PyMethodDef NextTrig_methods[] = {
6765
{"getServer", (PyCFunction)NextTrig_getServer, METH_NOARGS, "Returns server object."},
6766
{"_getStream", (PyCFunction)NextTrig_getStream, METH_NOARGS, "Returns stream object."},
6767
{"deleteStream", (PyCFunction)NextTrig_deleteStream, METH_NOARGS, "Remove stream from server and delete the object."},
6768
{"play", (PyCFunction)NextTrig_play, METH_VARARGS|METH_KEYWORDS, "Starts computing without sending sound to soundcard."},
6769
{"stop", (PyCFunction)NextTrig_stop, METH_NOARGS, "Stops computing."},
6770
{"setMul", (PyCFunction)NextTrig_setMul, METH_O, "Sets mul factor."},
6771
{"setAdd", (PyCFunction)NextTrig_setAdd, METH_O, "Sets add factor."},
6772
{"setSub", (PyCFunction)NextTrig_setSub, METH_O, "Sets inverse add factor."},
6773
{"setDiv", (PyCFunction)NextTrig_setDiv, METH_O, "Sets inverse mul factor."},
6774
{NULL} /* Sentinel */
6777
static PyNumberMethods NextTrig_as_number = {
6778
(binaryfunc)NextTrig_add, /*nb_add*/
6779
(binaryfunc)NextTrig_sub, /*nb_subtract*/
6780
(binaryfunc)NextTrig_multiply, /*nb_multiply*/
6781
(binaryfunc)NextTrig_div, /*nb_divide*/
6787
0, /*(unaryfunc)array_abs,*/
6801
(binaryfunc)NextTrig_inplace_add, /*inplace_add*/
6802
(binaryfunc)NextTrig_inplace_sub, /*inplace_subtract*/
6803
(binaryfunc)NextTrig_inplace_multiply, /*inplace_multiply*/
6804
(binaryfunc)NextTrig_inplace_div, /*inplace_divide*/
6805
0, /*inplace_remainder*/
6806
0, /*inplace_power*/
6807
0, /*inplace_lshift*/
6808
0, /*inplace_rshift*/
6812
0, /*nb_floor_divide*/
6813
0, /*nb_true_divide*/
6814
0, /*nb_inplace_floor_divide*/
6815
0, /*nb_inplace_true_divide*/
6819
PyTypeObject NextTrigType = {
6820
PyObject_HEAD_INIT(NULL)
6822
"_pyo.NextTrig_base", /*tp_name*/
6823
sizeof(NextTrig), /*tp_basicsize*/
6825
(destructor)NextTrig_dealloc, /*tp_dealloc*/
6831
&NextTrig_as_number, /*tp_as_number*/
6832
0, /*tp_as_sequence*/
6833
0, /*tp_as_mapping*/
6840
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
6841
"NextTrig objects. A trig opens a gate only for the next one.", /* tp_doc */
6842
(traverseproc)NextTrig_traverse, /* tp_traverse */
6843
(inquiry)NextTrig_clear, /* tp_clear */
6844
0, /* tp_richcompare */
6845
0, /* tp_weaklistoffset */
6847
0, /* tp_iternext */
6848
NextTrig_methods, /* tp_methods */
6849
NextTrig_members, /* tp_members */
6853
0, /* tp_descr_get */
6854
0, /* tp_descr_set */
6855
0, /* tp_dictoffset */
6856
(initproc)NextTrig_init, /* tp_init */
6858
NextTrig_new, /* tp_new */