Max 5 API Reference
00001 /* 00002 * jit.transfer.pulse.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * functor for a "pulse" transfer function 00008 * 00009 */ 00010 00011 // ----------------------------------------------------------------------------- 00012 00013 #include "jit.common.h" 00014 #include "jit.functor.h" 00015 00016 // ----------------------------------------------------------------------------- 00017 00018 typedef struct _jit_functor_transfer_pulse 00019 { 00020 t_jit_object ob; 00021 double low; 00022 double high; 00023 } t_jit_functor_transfer_pulse; 00024 00025 // ----------------------------------------------------------------------------- 00026 00027 t_jit_object *jit_functor_transfer_pulse_new(void); 00028 t_jit_err jit_functor_transfer_pulse_free(t_jit_functor_transfer_pulse *x); 00029 t_jit_err jit_functor_transfer_pulse_low(t_jit_functor_transfer_pulse *x, void *attr, long argc, t_atom *argv); 00030 t_jit_err jit_functor_transfer_pulse_high(t_jit_functor_transfer_pulse *x, void *attr, long argc, t_atom *argv); 00031 t_jit_err jit_functor_transfer_pulse_recalc(t_jit_functor_transfer_pulse *x); 00032 00033 long jit_functor_transfer_pulse_eval_fixed(t_jit_functor_transfer_pulse *x, long dimcount, long *vals); 00034 float jit_functor_transfer_pulse_eval_float32(t_jit_functor_transfer_pulse *x, long dimcount, float *vals); 00035 double jit_functor_transfer_pulse_eval_float64(t_jit_functor_transfer_pulse *x, long dimcount, double *vals); 00036 00037 long jit_functor_transfer_pulse_eval_fixed_scalar(t_jit_functor_transfer_pulse *x, long val); 00038 float jit_functor_transfer_pulse_eval_float32_scalar(t_jit_functor_transfer_pulse *x, float val); 00039 double jit_functor_transfer_pulse_eval_float64_scalar(t_jit_functor_transfer_pulse *x, double val); 00040 00041 t_class * _jit_functor_transfer_pulse_class; 00042 00043 // ----------------------------------------------------------------------------- 00044 00045 t_jit_err jit_functor_transfer_pulse_init(void) 00046 { 00047 t_jit_object *attr; 00048 00049 // create the functor class 00050 _jit_functor_transfer_pulse_class = jit_class_new("jit_functor_transfer_pulse", 00051 (method)jit_functor_transfer_pulse_new,(method)jit_functor_transfer_pulse_free, 00052 sizeof(t_jit_functor_transfer_pulse),0L); 00053 00054 // add attribute methods 00055 attr = jit_object_new(_jit_sym_jit_attr_offset,"low",_jit_sym_float64,0, 00056 (method)0L,(method)jit_functor_transfer_pulse_low, 00057 calcoffset(t_jit_functor_transfer_pulse,low)); 00058 jit_class_addattr(_jit_functor_transfer_pulse_class,attr); 00059 attr = jit_object_new(_jit_sym_jit_attr_offset,"high",_jit_sym_float64,0, 00060 (method)0L,(method)jit_functor_transfer_pulse_high, 00061 calcoffset(t_jit_functor_transfer_pulse,high)); 00062 jit_class_addattr(_jit_functor_transfer_pulse_class,attr); 00063 00064 // add evaluation methods 00065 jit_class_addmethod(_jit_functor_transfer_pulse_class, 00066 (method)jit_functor_transfer_pulse_eval_fixed, "evalfixed", A_CANT, 0L); 00067 jit_class_addmethod(_jit_functor_transfer_pulse_class, 00068 (method)jit_functor_transfer_pulse_eval_float32, "evalfloat32", A_CANT, 0L); 00069 jit_class_addmethod(_jit_functor_transfer_pulse_class, 00070 (method)jit_functor_transfer_pulse_eval_float64, "evalfloat64", A_CANT, 0L); 00071 00072 // important to add last for subclassing methods 00073 jit_functor_setup_class(_jit_functor_transfer_pulse_class,"transfer","pulse"); 00074 jit_class_register(_jit_functor_transfer_pulse_class); 00075 00076 return JIT_ERR_NONE; 00077 } 00078 00079 t_jit_object *jit_functor_transfer_pulse_new(void) 00080 { 00081 t_jit_functor_transfer_pulse *x; 00082 00083 if (x = (t_jit_functor_transfer_pulse *)jit_object_alloc(_jit_functor_transfer_pulse_class)) { 00084 00085 // initialization 00086 x->low = 0.0; 00087 x->high = 1.0; 00088 jit_functor_transfer_pulse_recalc(x); 00089 } 00090 00091 return (t_jit_object *)x; 00092 } 00093 00094 t_jit_err jit_functor_transfer_pulse_free(t_jit_functor_transfer_pulse *x) 00095 { 00096 return JIT_ERR_NONE; 00097 } 00098 00099 // ----------------------------------------------------------------------------- 00100 00101 t_jit_err jit_functor_transfer_pulse_low( 00102 t_jit_functor_transfer_pulse *x, void *attr, long argc, t_atom *argv) 00103 { 00104 double v; 00105 00106 if (x) { 00107 v=jit_atom_getfloat(argv); 00108 if (x->low != v) { 00109 x->low = v; 00110 jit_functor_transfer_pulse_recalc(x); 00111 } 00112 return JIT_ERR_NONE; 00113 } 00114 return JIT_ERR_INVALID_PTR; 00115 } 00116 00117 t_jit_err jit_functor_transfer_pulse_high( 00118 t_jit_functor_transfer_pulse *x, void *attr, long argc, t_atom *argv) 00119 { 00120 double v; 00121 00122 if (x) { 00123 v=jit_atom_getfloat(argv); 00124 if (x->high != v) { 00125 x->high = v; 00126 jit_functor_transfer_pulse_recalc(x); 00127 } 00128 return JIT_ERR_NONE; 00129 } 00130 return JIT_ERR_INVALID_PTR; 00131 } 00132 00133 // ----------------------------------------------------------------------------- 00134 00135 t_jit_err jit_functor_transfer_pulse_recalc(t_jit_functor_transfer_pulse *x) 00136 { 00137 // calculate intermediary values for efficiency 00138 double t; 00139 if(x->low > x->high) 00140 { 00141 t = x->low; 00142 x->low = x->high; 00143 x->high = t; 00144 } 00145 return JIT_ERR_NONE; 00146 } 00147 00148 // ----------------------------------------------------------------------------- 00149 // vector evaluation functions 00150 // ----------------------------------------------------------------------------- 00151 00152 long jit_functor_transfer_pulse_eval_fixed( 00153 t_jit_functor_transfer_pulse *x, long dimcount, long *vals) 00154 { 00155 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00156 (t_jit_functor_float64_sig)jit_functor_transfer_pulse_eval_float64); 00157 } 00158 00159 float jit_functor_transfer_pulse_eval_float32( 00160 t_jit_functor_transfer_pulse *x, long dimcount, float *vals) 00161 { 00162 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x,dimcount,vals, 00163 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_pulse_eval_float32_scalar); 00164 } 00165 00166 double jit_functor_transfer_pulse_eval_float64( 00167 t_jit_functor_transfer_pulse *x, long dimcount, double *vals) 00168 { 00169 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x,dimcount,vals, 00170 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_pulse_eval_float64_scalar); 00171 } 00172 00173 // ----------------------------------------------------------------------------- 00174 // scalar evaluation functions 00175 // ----------------------------------------------------------------------------- 00176 00177 long jit_functor_transfer_pulse_eval_fixed_scalar( 00178 t_jit_functor_transfer_pulse *x, long val) 00179 { 00180 return FloatToFixed(jit_functor_transfer_pulse_eval_float32_scalar(x,FixedToFloat(val))); 00181 } 00182 00183 float jit_functor_transfer_pulse_eval_float32_scalar( 00184 t_jit_functor_transfer_pulse *x, float val) 00185 { 00186 return (val < x->low || val >= x->high) ? 0.0f : 1.0f; 00187 } 00188 00189 double jit_functor_transfer_pulse_eval_float64_scalar( 00190 t_jit_functor_transfer_pulse *x, double val) 00191 { 00192 return (val < x->low || val >= x->high) ? 0.0 : 1.0; 00193 } 00194 00195 // -----------------------------------------------------------------------------
Copyright © 2008, Cycling '74