16 #include "TTClassWrapperMax.h"
19 #include "ext_strings.h"
20 #include "commonsyms.h"
24 #define MAX_NUM_CHANNELS 32
27 typedef struct _gain {
42 void* gain_new(t_symbol *s,
long argc, t_atom *argv);
43 void gain_free(t_gain *x);
44 void gain_dsp64(t_gain *x, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags);
45 void gain_assist(t_gain *x,
void *b,
long m,
long a,
char *s);
46 t_int* gain_perform(t_int *w);
47 t_max_err attr_set_gain(t_gain *x,
void *attr,
long argc, t_atom *argv);
48 t_max_err attr_set_mix(t_gain *x,
void *attr,
long argc, t_atom *argv);
49 t_max_err attr_set_bypass(t_gain *x,
void *attr,
long argc, t_atom *argv);
53 static t_class* s_gain_class;
64 common_symbols_init();
66 c = class_new(
"j.gain~", (method)gain_new, (method)gain_free,
sizeof(t_gain), (method)0L, A_GIMME, 0);
69 class_addmethod(c, (method)gain_dsp64,
"dsp64", A_CANT, 0);
70 class_addmethod(c, (method)gain_assist,
"assist", A_CANT, 0L);
72 CLASS_ATTR_CHAR(c,
"bypass", 0, t_gain, attrBypass);
73 CLASS_ATTR_ACCESSORS(c,
"bypass", NULL, attr_set_bypass);
75 CLASS_ATTR_FLOAT(c,
"mix", 0, t_gain, attrBypass);
76 CLASS_ATTR_ACCESSORS(c,
"mix", NULL, attr_set_mix);
78 CLASS_ATTR_FLOAT(c,
"gain", 0, t_gain, attrBypass);
79 CLASS_ATTR_ACCESSORS(c,
"gain", NULL, attr_set_gain);
85 class_register(CLASS_BOX, c);
95 void* gain_new(t_symbol* s,
long argc, t_atom* argv)
97 long attrstart = attr_args_offset(argc, argv);
99 t_gain* x = (t_gain*)object_alloc(s_gain_class);
103 if (attrstart && argv) {
104 int argument = atom_getlong(argv);
105 x->numChannels = TTClip(argument, 1, MAX_NUM_CHANNELS);
108 dsp_setup((t_pxobject*)x, x->numChannels * 2);
109 x->obj.z_misc = Z_NO_INPLACE;
110 for (i=0; i < x->numChannels; i++)
111 outlet_new((t_pxobject*)x,
"signal");
115 x->signalTemp =
new TTAudio(x->numChannels);
116 x->signalOut =
new TTAudio(x->numChannels);
117 x->signalIn =
new TTAudio(x->numChannels*2);
119 x->xfade->set(
"position", 1.0);
120 x->gain->set(
"linearGain", 0.0);
125 attr_args_process(x, argc, argv);
131 void gain_free(t_gain *x)
133 dsp_free((t_pxobject *)x);
136 delete x->signalTemp;
145 void gain_assist(t_gain *x,
void *b,
long msg,
long arg,
char *dst)
149 snprintf(dst, 256,
"(signal) raw audio (ch. %ld), control messages", arg+1);
150 else if (arg < x->numChannels)
151 snprintf(dst, 256,
"(signal) raw audio (ch. %ld)", arg+1);
152 else if (arg >= x->numChannels)
153 snprintf(dst, 256,
"(signal) wet audio (ch. %ld)", arg-x->numChannels+1);
156 snprintf(dst, 256,
"(signal) processed audio (ch. %ld)", arg+1);
162 t_max_err attr_set_gain(t_gain *x,
void *attr,
long argc, t_atom *argv)
164 x->attrGain = atom_getfloat(argv);
165 x->gain->set(
"midiGain", x->attrGain);
171 t_max_err attr_set_mix(t_gain *x,
void *attr,
long argc, t_atom *argv)
173 x->attrMix = atom_getfloat(argv);
174 if (x->attrBypass == 0)
175 x->xfade->set(
"position", x->attrMix * 0.01);
181 t_max_err attr_set_bypass(t_gain *x,
void *attr,
long argc, t_atom *argv)
183 x->attrBypass = atom_getlong(argv);
184 if (x->attrBypass == 0)
185 x->xfade->set(
"position", x->attrMix * 0.01);
187 x->xfade->set(
"position", 0.0);
192 void gain_perform64(t_gain *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
195 TTUInt16 vs = x->signalIn->getVectorSizeAsInt();
198 for (i=0; i < numouts; i++) {
199 x->signalIn->setVector(i, vs, ins[i]);
200 x->signalIn->setVector(i+numouts, vs, ins[i+numouts]);
203 x->xfade->process(x->signalIn, x->signalTemp);
204 x->gain->process(x->signalTemp, x->signalOut);
206 for (i=0; i < numouts; i++)
207 x->signalOut->getVectorCopy(i, vs, outs[i]);
212 void gain_dsp64(t_gain *x, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags)
217 for (i=0; i < x->numChannels; i++) {
218 j = x->numChannels + i;
219 k = x->numChannels*2 + i;
220 if (count[i] && count[j] && count[k]) {
225 x->signalIn->setNumChannels(numChannels*2);
226 x->signalOut->setNumChannels(numChannels);
227 x->signalTemp->setNumChannels(numChannels);
229 x->signalIn->setVectorSizeWithInt((
TTUInt16)maxvectorsize);
230 x->signalOut->setVectorSizeWithInt((
TTUInt16)maxvectorsize);
231 x->signalTemp->setVectorSizeWithInt((
TTUInt16)maxvectorsize);
234 x->signalOut->alloc();
235 x->signalTemp->alloc();
237 x->xfade->set(kTTSym_sampleRate, samplerate);
238 x->gain->set(kTTSym_sampleRate, samplerate);
239 x->gain->set(
"interpolated",
true);
240 object_method(dsp64, gensym(
"dsp_add64"), x, gain_perform64, 0, NULL);
std::uint16_t TTUInt16
16 bit unsigned integer
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
Wrap audio objects for convenience.
void TTDSP_EXPORT TTDSPInit(const char *pathToBinaries=NULL)
Initialise the Jamoma DSP library, as well as Jamoma Foundation foundation if needed.
Wrap TTAudioSignal instances for convenience.