2010-02-25 23:35:16 +00:00
|
|
|
#include "../src/m_pd.h"
|
|
|
|
#include <../src/m_fixed.h>
|
2009-05-22 21:58:48 +00:00
|
|
|
|
|
|
|
typedef struct sigsamphold
|
|
|
|
{
|
|
|
|
t_object x_obj;
|
|
|
|
t_sample x_f;
|
|
|
|
t_sample x_lastin;
|
|
|
|
t_sample x_lastout;
|
|
|
|
} t_sigsamphold;
|
|
|
|
|
|
|
|
t_class *sigsamphold_class;
|
|
|
|
|
|
|
|
static void *sigsamphold_new(void)
|
|
|
|
{
|
|
|
|
t_sigsamphold *x = (t_sigsamphold *)pd_new(sigsamphold_class);
|
|
|
|
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
|
|
|
|
outlet_new(&x->x_obj, gensym("signal"));
|
|
|
|
x->x_lastin = 0;
|
|
|
|
x->x_lastout = 0;
|
|
|
|
x->x_f = 0;
|
|
|
|
return (x);
|
|
|
|
}
|
|
|
|
|
|
|
|
static t_int *sigsamphold_perform(t_int *w)
|
|
|
|
{
|
|
|
|
t_sample *in1 = (t_sample *)(w[1]);
|
|
|
|
t_sample *in2 = (t_sample *)(w[2]);
|
|
|
|
t_sample *out = (t_sample *)(w[3]);
|
|
|
|
t_sigsamphold *x = (t_sigsamphold *)(w[4]);
|
|
|
|
int n = (t_int)(w[5]);
|
|
|
|
int i;
|
|
|
|
t_sample lastin = x->x_lastin;
|
|
|
|
t_sample lastout = x->x_lastout;
|
2009-08-05 15:09:26 +00:00
|
|
|
for (i = 0; i < n; i++, in1++)
|
2009-05-22 21:58:48 +00:00
|
|
|
{
|
|
|
|
t_sample next = *in2++;
|
|
|
|
if (next < lastin) lastout = *in1;
|
|
|
|
*out++ = lastout;
|
|
|
|
lastin = next;
|
|
|
|
}
|
|
|
|
x->x_lastin = lastin;
|
|
|
|
x->x_lastout = lastout;
|
|
|
|
return (w+6);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sigsamphold_dsp(t_sigsamphold *x, t_signal **sp)
|
|
|
|
{
|
|
|
|
dsp_add(sigsamphold_perform, 5,
|
|
|
|
sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,
|
|
|
|
x, sp[0]->s_n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sigsamphold_reset(t_sigsamphold *x)
|
|
|
|
{
|
|
|
|
x->x_lastin = 0x7fffffff;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sigsamphold_set(t_sigsamphold *x, t_float f)
|
|
|
|
{
|
|
|
|
x->x_lastout = f;
|
|
|
|
}
|
|
|
|
|
|
|
|
void samphold_tilde_setup(void)
|
|
|
|
{
|
|
|
|
sigsamphold_class = class_new(gensym("samphold~"),
|
|
|
|
(t_newmethod)sigsamphold_new, 0, sizeof(t_sigsamphold), 0, 0);
|
|
|
|
CLASS_MAINSIGNALIN(sigsamphold_class, t_sigsamphold, x_f);
|
|
|
|
class_addmethod(sigsamphold_class, (t_method)sigsamphold_set,
|
|
|
|
gensym("set"), A_FLOAT, 0);
|
|
|
|
class_addmethod(sigsamphold_class, (t_method)sigsamphold_reset,
|
|
|
|
gensym("reset"), 0);
|
|
|
|
class_addmethod(sigsamphold_class, (t_method)sigsamphold_dsp,
|
|
|
|
gensym("dsp"), 0);
|
|
|
|
}
|
|
|
|
|