~ubuntu-branches/ubuntu/saucy/pd-smlib/saucy

« back to all changes in this revision

Viewing changes to vlrange.c

  • Committer: Bazaar Package Importer
  • Author(s): Hans-Christoph Steiner
  • Date: 2010-11-10 15:17:58 UTC
  • Revision ID: james.westby@ubuntu.com-20101110151758-3acjf69kiudo3gh4
Tags: upstream-0.12.1
ImportĀ upstreamĀ versionĀ 0.12.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "defines.h"
 
2
 
 
3
/*--------------- vlrange -----------------------*/
 
4
/* leaky range of each element in a list     */
 
5
/* arguments: [halfdecay] */
 
6
 
 
7
static t_class *vlrange_class;
 
8
 
 
9
typedef struct _vlrange
 
10
{
 
11
    t_object x_obj;
 
12
        float m_c_leak;
 
13
        float m_leak;
 
14
        float *m_min;
 
15
        float *m_max;
 
16
        int m_n;
 
17
} t_vlrange;
 
18
 
 
19
 
 
20
static void vlrange_perform(t_vlrange *x, t_symbol *s, int argc, t_atom *argv)
 
21
{
 
22
        int i;
 
23
        t_atom *ap,*app;
 
24
        float *fmin, *fmax;
 
25
        float m_leak;
 
26
        float m_c_leak;
 
27
        m_leak=x->m_leak;
 
28
        m_c_leak=x->m_c_leak;
 
29
 
 
30
        if (argc!=x->m_n)
 
31
        {
 
32
                int i;
 
33
                if (x->m_min)
 
34
                {
 
35
                        freebytes(x->m_min,x->m_n);
 
36
                        freebytes(x->m_max,x->m_n);
 
37
                }
 
38
                x->m_min=(float*)getbytes(argc*sizeof(float));
 
39
                x->m_max=(float*)getbytes(argc*sizeof(float));
 
40
                for(i=0;i<argc;i++)
 
41
                {
 
42
                        x->m_min[i]=0.0f;
 
43
                        x->m_max[i]=0.0f;
 
44
                }
 
45
                x->m_n=argc;
 
46
        }
 
47
 
 
48
        fmin=x->m_min;
 
49
        fmax=x->m_max;
 
50
    ap = (t_atom *)getbytes(sizeof(t_atom)*argc);
 
51
        app=ap;
 
52
        for (i = 0; i < argc; i++)
 
53
        {
 
54
                float f=atom_getfloat(argv++);
 
55
                *fmax =(f > *fmax ) ? f : *fmax *m_c_leak + f*m_leak;
 
56
                *fmin =(f < *fmin ) ? f : *fmin *m_c_leak + f*m_leak;
 
57
                SETFLOAT(app, *fmax-*fmin);
 
58
                app++;
 
59
                fmax++;
 
60
                fmin++;
 
61
        }
 
62
        outlet_list(x->x_obj.ob_outlet,gensym("list"),argc,ap);
 
63
    freebytes(ap,argc);
 
64
}
 
65
 
 
66
static void vlrange_setHalfDecay(t_vlrange *x, t_floatarg halfDecayTime)
 
67
{
 
68
        x->m_c_leak=(float)powf(.5,(1.0f/halfDecayTime));
 
69
        x->m_leak=1.0f-x->m_c_leak;
 
70
}
 
71
 
 
72
static void *vlrange_new(t_float halfDecayTime)
 
73
{
 
74
        t_vlrange *x=(t_vlrange *)pd_new(vlrange_class);
 
75
        outlet_new(&x->x_obj, gensym("list"));
 
76
        vlrange_setHalfDecay(x, halfDecayTime);
 
77
        x->m_n=0;
 
78
        x->m_min=0;
 
79
        x->m_max=0;
 
80
        return (void *)x;
 
81
}
 
82
 
 
83
static void vlrange_free(t_vlrange *x)
 
84
{
 
85
        freebytes(x->m_max,x->m_n);
 
86
        freebytes(x->m_min,x->m_n);
 
87
}
 
88
 
 
89
void vlrange_setup(void)
 
90
{
 
91
    vlrange_class = class_new(gensym("vlrange"),
 
92
        (t_newmethod)vlrange_new, (t_method)vlrange_free,
 
93
                sizeof(t_vlrange), 
 
94
                CLASS_DEFAULT,
 
95
            A_DEFFLOAT, 0);
 
96
        class_addmethod(vlrange_class, (t_method)vlrange_setHalfDecay,
 
97
        gensym("decay"), A_DEFFLOAT, NULL);
 
98
    class_addlist(vlrange_class, (t_method)vlrange_perform);
 
99
}