21 #define MAX_LIST_LENGTH 256
27 void *outlets[NUM_OUTLETS];
28 void *inlets[NUM_INLETS];
31 float parameter_value;
32 float parameter_value_pp;
33 t_atom argv[MAX_LIST_LENGTH];
37 void *qelem_send_pattr;
38 void *qelem_send_scope;
42 void *gang_new(t_symbol *msg,
long argc, t_atom *argv);
43 void gang_free(t_gang *x);
44 void gang_assist(t_gang *x,
void *b,
long msg,
long arg,
char *dst);
45 void gang_int(t_gang *x,
long value);
46 void gang_float(t_gang *x,
double value);
47 void gang_list(t_gang *x, t_symbol *msg,
long argc, t_atom *argv);
48 void gang_qfn_send_pp(t_gang *x);
49 void gang_qfn_send_ui(t_gang *x);
50 void gang_qfn_send_pattr(t_gang *x);
51 void gang_qfn_send_scope(t_gang *x);
52 float gang_bitsafe(
double in);
61 int JAMOMA_EXPORT_MAXOBJ
main(
void)
65 common_symbols_init();
67 c = class_new(
"j.gang",(method)gang_new, (method)gang_free,
sizeof(t_gang), (method)0L, A_GIMME, 0);
69 class_addmethod(c, (method)gang_float,
"float", 0L);
70 class_addmethod(c, (method)gang_int,
"int", 0L);
71 class_addmethod(c, (method)gang_list,
"list", A_GIMME, 0L);
72 class_addmethod(c, (method)gang_assist,
"assist", A_CANT, 0L);
75 class_register(CLASS_BOX, c);
85 void *gang_new(t_symbol *msg,
long argc, t_atom *argv)
90 x = (t_gang *)object_alloc(gang_class);
93 object_obex_store((
void *)x, _sym_dumpout, (
object *)outlet_new(x,NULL));
94 for (i = NUM_OUTLETS-1; i>=0; i--)
95 x->outlets[i] = floatout(x);
98 for (i = NUM_INLETS-1; i >= 1; i--)
99 x->inlets[i] = proxy_new(x, i, 0L);
102 x->parameter_value = -2000000;
104 x->set_by_pp =
false;
107 x->qelem_send_ui = qelem_new(x, (method)gang_qfn_send_ui);
108 x->qelem_send_pp = qelem_new(x, (method)gang_qfn_send_pp);
109 x->qelem_send_pattr = qelem_new(x, (method)gang_qfn_send_pattr);
110 x->qelem_send_scope = qelem_new(x, (method)gang_qfn_send_scope);
113 attr_args_process(x, argc, argv);
118 void gang_free(t_gang *x)
122 qelem_free(x->qelem_send_ui);
123 qelem_free(x->qelem_send_pp);
124 qelem_free(x->qelem_send_pattr);
125 qelem_free(x->qelem_send_scope);
127 for (i = NUM_INLETS-1; i >= 1; i--)
128 freeobject((t_object *)x->inlets[i]);
135 void gang_assist(t_gang *x,
void *b,
long msg,
long arg,
char *dst)
139 case 0: strcpy(dst,
"connect to ui object");
break;
140 case 1: strcpy(dst,
"connect to pp");
break;
141 case 2: strcpy(dst,
"aux object 1");
break;
142 case 3: strcpy(dst,
"aux object 2");
break;
147 case 0: strcpy(dst,
"connect to ui object");
break;
148 case 1: strcpy(dst,
"connect to pp");
break;
149 case 2: strcpy(dst,
"aux object 1");
break;
150 case 3: strcpy(dst,
"aux object 2");
break;
151 default: strcpy(dst,
"dumpout");
break;
158 void gang_int(t_gang *x,
long value)
160 gang_float(x, value);
165 void gang_float(t_gang *x,
double value)
167 long inletnum = proxy_getinlet((
object *)x);
169 if (value == x->parameter_value)
return;
171 x->parameter_value = gang_bitsafe(value);
172 x->type_is_list =
false;
176 qelem_set(x->qelem_send_pp);
177 qelem_set(x->qelem_send_pattr);
178 qelem_set(x->qelem_send_scope);
182 x->parameter_value_pp = x->parameter_value;
183 qelem_set(x->qelem_send_ui);
184 qelem_set(x->qelem_send_pattr);
185 qelem_set(x->qelem_send_scope);
188 qelem_set(x->qelem_send_pp);
189 qelem_set(x->qelem_send_ui);
190 qelem_set(x->qelem_send_scope);
193 qelem_set(x->qelem_send_pp);
194 qelem_set(x->qelem_send_ui);
195 qelem_set(x->qelem_send_pattr);
202 void gang_list(t_gang *x, t_symbol *msg,
long argc, t_atom *argv)
204 long inletnum = proxy_getinlet((
object *)x);
210 n = MIN(MAX_LIST_LENGTH, argc);
212 x->type_is_list =
true;
215 for (i=0; i<n; i++) {
216 if (atom_getfloat(ap+i) != atom_getfloat(argv+i))
goto process;
222 for (i=0; i < n; i++, argv++, ap++) {
224 atom_setfloat(ap, gang_bitsafe(atom_getfloat(argv)));
231 qelem_set(x->qelem_send_pp);
232 qelem_set(x->qelem_send_pattr);
233 qelem_set(x->qelem_send_scope);
236 qelem_set(x->qelem_send_ui);
237 qelem_set(x->qelem_send_pattr);
238 qelem_set(x->qelem_send_scope);
241 qelem_set(x->qelem_send_pp);
242 qelem_set(x->qelem_send_ui);
243 qelem_set(x->qelem_send_scope);
246 qelem_set(x->qelem_send_pp);
247 qelem_set(x->qelem_send_ui);
248 qelem_set(x->qelem_send_pattr);
255 void gang_qfn_send_ui(t_gang *x)
258 outlet_list(x->outlets[0], _sym_list, x->argc, x->argv);
260 if (x->set_by_pp) outlet_float(x->outlets[0], x->parameter_value_pp);
261 else outlet_float(x->outlets[0], x->parameter_value);
263 x->set_by_pp =
false;
267 void gang_qfn_send_pp(t_gang *x)
270 outlet_list(x->outlets[1], _sym_list, x->argc, x->argv);
272 if (x->set_by_pp) outlet_float(x->outlets[1], x->parameter_value_pp);
273 else outlet_float(x->outlets[1], x->parameter_value);
275 x->set_by_pp =
false;
279 void gang_qfn_send_pattr(t_gang *x)
282 outlet_list(x->outlets[2], _sym_list, x->argc, x->argv);
284 if (x->set_by_pp) outlet_float(x->outlets[2], x->parameter_value_pp);
285 else outlet_float(x->outlets[2], x->parameter_value);
287 x->set_by_pp =
false;
291 void gang_qfn_send_scope(t_gang *x)
294 outlet_list(x->outlets[3], _sym_list, x->argc, x->argv);
296 if (x->set_by_pp) outlet_float(x->outlets[3], x->parameter_value_pp);
297 else outlet_float(x->outlets[3], x->parameter_value);
299 x->set_by_pp =
false;
304 float gang_bitsafe(
double in)
int JAMOMA_EXPORT_MAXOBJ main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.