コード例 #1
0
//----------------------------------------------------------------------------------------------------------------
// udmx_int: 	a list received in the main inlet
//
// 				update dmx buffer, send immediately if we can
//----------------------------------------------------------------------------------------------------------------
void udmx_int(t_udmx *x, t_int16 n){
    // x = the instance of the object; n = the int received in the left inlet
    
    if (n > 255) n=255;
    if (n < 0) n=0;
    
    
    if (x->dmx_buffer[x->channel] == n) return; // do nothing if value did not change
    
    x->dmx_buffer[x->channel] = n;
    
    if (x->clock_running) { // we're over the speed limit, track changes for later
        if (x->channel > x->channel_changed_max) x->channel_changed_max = x->channel;
        if (x->channel < x->channel_changed_min)  x->channel_changed_min = x->channel;
        
    } else {
        
        udmx_send_single(x,x->channel);
        
        if (x->speedlim) {
            // start clock
#ifdef PUREDATA   	// compiling for PUREDATA
            clock_delay(x->m_clock,x->speedlim);
#else				// compiling for MaxMSP
            clock_fdelay(x->m_clock,x->speedlim);
#endif				// Max/PD switch
            x->clock_running  = 1;
        }
    }
    
}
コード例 #2
0
//----------------------------------------------------------------------------------------------------------------
// object creation
void *udmx_new(t_symbol *s, long argc, t_atom *argv)	{
    

    t_atom *ap;
    t_int16 n;
    n = 0;
    
 
    // n = int argument typed into object box (A_DEFLONG) -- defaults to 0 if no args are typed
    
    t_udmx *x = (t_udmx *)object_alloc(udmx_class);
    intin(x,1);					// create a second int inlet (leftmost inlet is automatic - all objects have one inlet by default)
    x->m_clock = clock_new(x,(method)udmx_tick); 	// make new clock for polling and attach tick function to it
    x->m_qelem = qelem_new((t_object *)x, (method)find_device);
    
    x->msgOutlet = outlet_new(x,0L);	//create right outlet
    x->statusOutlet = outlet_new(x,0L);	//create an outlet for connected flag
    
    x->correct_adressing = 1;
    
    if (argc) {
        ap = argv;
        switch (atom_gettype(ap)) {
            case A_LONG:
                n = atom_getlong(ap);
                break;
            default:
                break;
        }
        ap = &argv[argc-1];
        
        switch (atom_gettype(ap)) {
            case A_LONG:
                if (atom_getlong(ap) == 0 ) {
                    x->correct_adressing = 0;
                }
                break;
            default:
                break;
        }
     }
    if(x->correct_adressing) {n = n - 1;}
    if (n < 0) n = 0;
    if (n > 511) n = 511;

    x->channel = n;
    x->debug_flag = 0;
    x->channel_changed_min = 512;
    x->channel_changed_max = -1;
    x->clock_running = 0;
    x->dev_handle = NULL;
    x->speedlim = SPEED_LIMIT;
    x->usb_devices_seen = -1;

    
    clock_fdelay(x->m_clock,100);
    usb_init();
    
    return(x);					// return a reference to the object instance
}
コード例 #3
0
void meter_tick(t_meter *x)
{
    meter_output(x);
    
    if(x->f_ramp == x->f_vector->getNumberOfChannels())
        x->f_ramp = 0;
    
    x->f_vector->process(x->f_signals, x->f_vector_coords + x->f_vector->getNumberOfChannels() * x->f_ramp);
    
    for(int i = 0; i < x->f_meter->getNumberOfChannels(); i++)
    {
        if(x->f_meter->getChannelEnergy(i) >= 0.)
            x->f_overled[i] = OVERLED_DRAWTIME;
        else
            x->f_overled[i] -= x->f_interval;
        
        if(x->f_overled[i] < 0)
            x->f_overled[i] = 0;
    }
    
	jbox_invalidate_layer((t_object *)x, NULL, s_leds_layer);
	jbox_invalidate_layer((t_object *)x, NULL, s_energy_layer);
    jbox_invalidate_layer((t_object *)x, NULL, s_velocity_layer);
	jbox_redraw((t_jbox *)x);
	if (sys_getdspstate())
		clock_fdelay(x->f_clock, x->f_interval);
}
コード例 #4
0
void simpleFloat(t_simpleNeuron *s, double input) // input current
{
	s->d_I = input;
	int i;
	
	if (s->l_ref == 0)
	{
		if (s->l_mode == 0)
			s->d_V = s->d_V + s->d_I/s->d_C;
		else if (s->l_mode == 1)
		{
			s->d_V = s->d_V + s->d_I/s->d_C - s->d_V/(s->d_R*s->d_C);
			clock_fdelay(s->m_clock2, s->d_leakPer);
		}
		else if (s->l_mode == 2)
		{
			for (i = 0; i < 20; i++)
			{
				s->d_V = s->d_V + s->d_stepSize*(s->d_V - (s->d_V*s->d_V*s->d_V)/3 - s->d_W + s->d_I);
				s->d_W = s->d_W + s->d_stepSize*(s->d_V - s->d_a - s->d_b*s->d_W)/s->d_tao; // calculate dW/dt
				if (s->d_V > 1.9 && s->l_bangFlag == 0)
					{
						clock_fdelay(s->m_clock3, s->d_bangD);
						s->l_bangFlag = 1;
					}
			}
		}
		
		if (s->l_mode == 2)
		{
			if (s->d_V > 1.9 && s->l_bangFlag == 0)
			{
				clock_fdelay(s->m_clock3, s->d_bangD);
				s->l_bangFlag = 1;
			} else if (s->d_W < 1 && s->l_bangFlag == 1)
				s->l_bangFlag = 0;
		}
		else if (s->d_V > s->d_Vth)
			{
				clock_fdelay(s->m_clock3, s->d_bangD);
				s->l_ref = 1;
				clock_fdelay(s->m_clock1, s->d_absRef);
			}
	}
}
コード例 #5
0
void hoa_scope_tick(t_hoa_scope *x)
{
    x->f_scope->process(x->f_signals + x->f_index * x->f_scope->getNumberOfHarmonics());

	jbox_invalidate_layer((t_object *)x, NULL, hoa_sym_harmonics_layer);
	jbox_redraw((t_jbox *)x);
	if (sys_getdspstate())
		clock_fdelay(x->f_clock, x->f_interval);
}
コード例 #6
0
ファイル: hoa.scope~.cpp プロジェクト: dimibil/HoaLibrary
void scope_tick(t_scope *x)
{
    x->f_viewer->processContribAndRep(x->f_harmonicsValues);
	jbox_invalidate_layer((t_object *)x, NULL, gensym("contrib_layer"));
	jbox_invalidate_layer((t_object *)x, NULL, gensym("harmonics_layer"));
	jbox_redraw((t_jbox *)x);
	if (sys_getdspstate())
		clock_fdelay(x->f_clock, x->f_interval);
}
コード例 #7
0
//----------------------------------------------------------------------------------------------------------------
// udmx_list: 	a list received in the main inlet
//
// 				update dmx buffer, send immediately if we can
//----------------------------------------------------------------------------------------------------------------
void udmx_list(t_udmx *x, t_symbol *s, short ac, t_atom *av) {
    
    t_uint16 i,chan,val,change_min,change_max;
    change_min = 512;
    change_max = 0;
    
    for(i=0; i<ac; ++i,av++) {
        
        
#ifdef PUREDATA   	// compiling for PUREDATA
        if (av->a_type==A_FLOAT)	val = av->a_w.w_float;
        else val = 0;
        if (val > 255) val = 255;
        if (val < 255) val = 0;
        
#else				// compiling for MaxMSP
        if (av->a_type==A_LONG)	val = MIN(MAX(av->a_w.w_long, 0), 255);
        else  if (av->a_type==A_FLOAT) {
         val = MIN(MAX(av->a_w.w_float * 255., 0), 255);
        }
        else val = 0;
#endif				// Max/PD switch
        
        
        chan = x->channel+i;
        
        if (val != x->dmx_buffer[chan]) {
            x->dmx_buffer[chan] = val;
            if (change_min > chan) change_min = chan;
            if (change_max < chan) change_max = chan;
        }
    }
    
    if (change_min > change_max) return;	// if there are no changes do nothing
    
    if (x->clock_running) { 				// we're over the speed limit, track changes for later
        if (change_min < x->channel_changed_min)  	x->channel_changed_min = change_min;
        if (change_max > x->channel_changed_max) 	x->channel_changed_max = change_max;
        
    } else {
        if (change_max - change_min) udmx_send_range(x,change_min,change_max);
        else udmx_send_single (x,change_min);
        
        if (x->speedlim) {
            // start clock -> prevent sending over speed limit
#ifdef PUREDATA   	// compiling for PUREDATA
            clock_delay(x->m_clock,x->speedlim);
#else				// compiling for MaxMSP
            clock_fdelay(x->m_clock,x->speedlim);
#endif				// Max/PD switch			x->clock_running  = 1;
        }
        
    }
}
コード例 #8
0
void leak(t_simpleNeuron *s)
{
	if (s->d_V > 0 && s->d_V < s->d_Vth)
	{
		s->d_V = s->d_V - s->d_V/(s->d_R*s->d_C);
		//post("leak");
	}
	
	if(s->d_V > 0)
		clock_fdelay(s->m_clock2, s->d_leakPer);
	else
		s->d_V = 0;
}
/*! \param tm relative time between periodic events (in seconds)
    \param data user data
    \return true on success
    \note the first event will be delayed by tm
*/
bool flext::Timer::Periodic(double tm,void *data) 
{
    userdata = data;
	period = tm;
#if FLEXT_SYS == FLEXT_SYS_PD 
    clock_delay(clk,tm*1000.);
#elif FLEXT_SYS == FLEXT_SYS_MAX
    clock_fdelay(clk,tm*1000.);
#else
    #error Not implemented
#endif
    return true;
}
/*! \param tm absolute time (in seconds)
    \param data user data
    \param dopast if set events with times lying in the past will be triggered immediately, if not set they are ignored
    \return true on success
*/
bool flext::Timer::At(double tm,void *data,bool dopast)
{
    userdata = data;
    period = 0;
#if FLEXT_SYS == FLEXT_SYS_PD 
    const double systm = clock_gettimesince(0);
    double df = tm*1000.-systm;
    if(dopast && df < 0) df = 0;
    if(df >= 0)
        clock_delay(clk,df);
#elif FLEXT_SYS == FLEXT_SYS_MAX
    const double ms = tm*1000.;
    double cur;
    clock_getftime(&cur);
    if(cur <= ms)
        clock_fdelay(clk,ms-cur);
    else if(dopast) // trigger timer is past
        clock_fdelay(clk,0);
#else
    #error Not implemented
#endif
    return true;
}
コード例 #11
0
ファイル: wsserver.cpp プロジェクト: diemoschwarz/wsserver
void wsserver::start(long inlet, t_symbol *s, long ac, t_atom *av)
{
  if (ac) 
  {
    if (atom_gettype(av) == A_SYM)
    {
      // TODO: check that webroot path is valid
      if (mCtx == NULL) 
      {
        const char *options[] = {
          "listening_ports", mPortNumber.Get(),
          "document_root", atom_getsym(av)->s_name,
          NULL
        };
      
        mServerName.SetFormatted(128, "ol.wsserver v. %s", VERSION);
      
        memset(&mCallbacks, 0, sizeof(mCallbacks));
        mCallbacks.websocket_connect = websocket_connect_handler;
        mCallbacks.websocket_ready = websocket_ready_handler;
        mCallbacks.websocket_data = websocket_data_handler;
        mCallbacks.connection_close = websocket_close_handler;
      
        for (int i=0; i<mNumConnectionsToAllocate; i++)
          mConnections.Add(new ws_connection());
      
        mCtx = mg_start(&mCallbacks, this /* so that we can get a pointer to this in the static mCallbacks */, options);
      
        if(mCtx)
        {
          post("%s started on port(s) %s with web root [%s]\n", mServerName.Get(), mg_get_option(mCtx, "listening_ports"), mg_get_option(mCtx, "document_root"));
          post("maximium %i clients\n", mNumConnectionsToAllocate);
        
          clock_fdelay(mClock, 0.);
        }
        else
          error("couldn't start server: perhaps port is allready being used?");
      }
      else
        error("server already started");
    }
    else
      error("missing argument for message start");
  } 
  else
    error("missing argument for message start");
}
//! \brief Callback function for system clock.
void flext::Timer::callback(Timer *tmr)
{
#if FLEXT_SYS == FLEXT_SYS_MAX
    if(tmr->queued) 
        qelem_set(tmr->qelem);
    else
#endif
        tmr->Work();

    if(tmr->period) {
		// reschedule
#if FLEXT_SYS == FLEXT_SYS_PD 
        clock_delay(tmr->clk,tmr->period*1000.);
#elif FLEXT_SYS == FLEXT_SYS_MAX
        clock_fdelay(tmr->clk,tmr->period*1000.);
#else
    #error Not implemented
#endif
    }
}
コード例 #13
0
ファイル: tralalaMouse.c プロジェクト: SergAbys/Grenadine
void tralala_mouseDown(t_tll *x, t_object *pv, t_pt pt, long m)
{	
    if (TLL_PT_INSIDE(pt)) {
    //
    long k;
    
    x->cursor.x = pt.x - 1.;
    x->cursor.y = pt.y - 1.;
    x->origin.x = pt.x - 1.;
    x->origin.y = pt.y - 1.;
    
    if (m & eCapsLock) {
        tralala_mouseUnselectAll(x);
        tralala_mouseHitZone(x);
    
    } else if (m & eCommandKey) {
        tralala_mouseUnselectZone(x);
        tralala_mouseAddNote(x);

    } else if (!(k = tralala_mouseHitNote(x, m))) {
        TLL_FLAG_SET(TLL_FLAG_LASSO);
        
    } else {
        if ((k == TLL_HIT_GRAB) || (k == TLL_HIT_PULL)) {
            TLL_FLAG_SET(TLL_FLAG_GRAB);
        }
    }
    
    if (TLL_FLAG_FALSE(TLL_FLAG_DAEMON)) {
        clock_fdelay(x->daemonClock, TLL_CLOCK_DAEMON_WORK);
    }
            
    TLL_FLAG_SET(TLL_DIRTY_ZONE | TLL_DIRTY_NOTE);
    jbox_redraw((t_jbox *)x);  
    //
    }
}
コード例 #14
0
ファイル: pictmeter~.c プロジェクト: AlvaroBuitrago/max-test
void pictmeter_tick(t_pictmeter *x)
{
	// for the astute student of the Max SDK:
	//
	// this method is called by the scheduler thread
	// x->p_max is also accessed by the perform method in the audio thread
	// we could use a mutex or critical region to protect the following block of code from having the value of x->p_max modified during its execution.
	// however, mutexes and critical regions carry a performance penalty.
	//
	// in this case, due to the nature of what we are doing (drawing something every tenth of second showing the history of the previous samples),
	// the mutex or critical region will not add anything to the object, or protect us from crashes, and it carries a performance penalty.
	// so we have made a conscious decision to not use the aforementioned thread locking mechanisms.

	if (x->p_value != x->p_max) {
		x->p_value = x->p_max;
		if (x->p_value > 1.)
			x->p_value = 1.;
		x->p_max = 0;
		jbox_redraw((t_jbox *)x);
	}

	if (sys_getdspstate())	// if the dsp is still on, schedule a next pictmeter_tick() call
		clock_fdelay(x->p_clock, 100);
}
コード例 #15
0
ファイル: wsserver.cpp プロジェクト: diemoschwarz/wsserver
void wsserver::onTimer()
{
  outputData();
  clock_fdelay(mClock, 5.); // schedule the next clock
}
コード例 #16
0
void hoa_scope_tick(t_hoa_scope *x)
{
    float value;
    float one, two;
    t_atom av[3];
    t_atom red[3];
    t_atom blue[3];
    x->f_scope->process(x->f_signals + x->f_index * x->f_scope->getNumberOfHarmonics());
	if (sys_getdspstate())
		clock_fdelay(x->f_clock, 500.);
    
    outlet_anything(x->f_out, gensym("reset"), 0, NULL);
    atom_setfloat(red, 1);
    atom_setfloat(red+1, 0);
    atom_setfloat(red+2, 0);
    atom_setfloat(blue, 0);
    atom_setfloat(blue+1, 0);
    atom_setfloat(blue+2, 1);

    for(int i = 0; i < x->f_scope->getNumberOfRows(); i++)
    {
        one  =   0;
        two = (double)i / (double)(x->f_scope->getNumberOfRows() - 1) * CICM_PI;
        value = x->f_scope->getValue(i, 0);
        if(value < 0)
        {
            outlet_anything(x->f_out, gensym("glcolor"), 3, blue);
            value= -value;
        }
        else
            outlet_anything(x->f_out, gensym("glcolor"), 3, red);
        
        atom_setfloat(av, value * sin(two) * cos(one));
        atom_setfloat(av+1, value * cos(two));
        atom_setfloat(av+2, value * sin(two) * sin(one));
        outlet_anything(x->f_out, gensym("moveto"), 3, av);
        for(int j = 1; j < x->f_scope->getNumberOfColumns(); j++)
        {
            one  =   (double)j / (double)x->f_scope->getNumberOfColumns() * CICM_2PI;
            value = x->f_scope->getValue(i, j);
            if(value < 0)
            {
                outlet_anything(x->f_out, gensym("glcolor"), 3, blue);
                value= -value;
            }
            else
                outlet_anything(x->f_out, gensym("glcolor"), 3, red);
            atom_setfloat(av, value * sin(two) * cos(one));
            atom_setfloat(av+1, value * cos(two));
            atom_setfloat(av+2, value * sin(two) * sin(one));
            outlet_anything(x->f_out, gensym("lineto"), 3, av);
        }
        
        one  =   0;
        value = x->f_scope->getValue(i, 0);
        if(value < 0)
        {
            outlet_anything(x->f_out, gensym("glcolor"), 3, blue);
            value= -value;
        }
        else
            outlet_anything(x->f_out, gensym("glcolor"), 3, red);
        
        atom_setfloat(av, value * sin(two) * cos(one));
        atom_setfloat(av+1, value * cos(two));
        atom_setfloat(av+2, value * sin(two) * sin(one));
        outlet_anything(x->f_out, gensym("lineto"), 3, av);

    }
    
    for(int j = 0; j < x->f_scope->getNumberOfColumns(); j++)
    {
        one  =   (double)j / (double)x->f_scope->getNumberOfColumns() * CICM_2PI;
        two  = 0.;
        value = x->f_scope->getValue(0, j);
        if(value < 0)
        {
            outlet_anything(x->f_out, gensym("glcolor"), 3, blue);
            value= -value;
        }
        else
            outlet_anything(x->f_out, gensym("glcolor"), 3, red);
        atom_setfloat(av, value * sin(two) * cos(one));
        atom_setfloat(av+1, value * cos(two));
        atom_setfloat(av+2, value * sin(two) * sin(one));
        outlet_anything(x->f_out, gensym("moveto"), 3, av);
        for(int i = 1; i < x->f_scope->getNumberOfRows(); i++)
        {
            two = (double)i / (double)(x->f_scope->getNumberOfRows() - 1) * CICM_PI;
            value = x->f_scope->getValue(i, j);
            if(value < 0)
            {
                outlet_anything(x->f_out, gensym("glcolor"), 3, blue);
                value= -value;
            }
            else
                outlet_anything(x->f_out, gensym("glcolor"), 3, red);
            atom_setfloat(av, value * sin(two) * cos(one));
            atom_setfloat(av+1, value * cos(two));
            atom_setfloat(av+2, value * sin(two) * sin(one));
            outlet_anything(x->f_out, gensym("lineto"), 3, av);
        }
    }
}
コード例 #17
0
ファイル: hoa.meter3D~.cpp プロジェクト: sfm1234/HoaLibrary
void hoa_meter_tick(t_hoa_meter *x)
{
    jbox_redraw((t_jbox *)x);
	if (sys_getdspstate())
		clock_fdelay(x->f_clock, x->f_interval);
}