Mixer: OSC enhancements. Responsd to both exact (range limited) and Control Voltage (0.0-1.0 on */cv) input.
This commit is contained in:
parent
f864159b51
commit
6d7059777b
|
@ -49,7 +49,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const float CONTROL_UPDATE_FREQ = 0.1f;
|
const float CONTROL_UPDATE_FREQ = 0.2f;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -127,13 +127,23 @@ Controller_Module::change_osc_path ( char *path )
|
||||||
mixer->osc_endpoint->del_method( _osc_path, "f" );
|
mixer->osc_endpoint->del_method( _osc_path, "f" );
|
||||||
|
|
||||||
free( _osc_path );
|
free( _osc_path );
|
||||||
|
free( _osc_path_cv );
|
||||||
|
|
||||||
_osc_path = NULL;
|
_osc_path = NULL;
|
||||||
|
_osc_path_cv = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( path )
|
if ( path )
|
||||||
{
|
{
|
||||||
mixer->osc_endpoint->add_method( path, "f", &Controller_Module::osc_control_change, this, "value" );
|
_osc_path_cv = (char*)malloc( strlen( path ) + 4 );
|
||||||
|
_osc_path_cv[0] = 0;
|
||||||
|
|
||||||
|
strcpy( _osc_path_cv, path );
|
||||||
|
strcat( _osc_path_cv, "/cv" );
|
||||||
|
|
||||||
|
mixer->osc_endpoint->add_method( path, "f", &Controller_Module::osc_control_change_exact, this, "value" );
|
||||||
|
|
||||||
|
mixer->osc_endpoint->add_method( _osc_path_cv, "f", &Controller_Module::osc_control_change_cv, this, "value" );
|
||||||
|
|
||||||
_osc_path = path;
|
_osc_path = path;
|
||||||
|
|
||||||
|
@ -410,8 +420,10 @@ Controller_Module::connect_to ( Port *p )
|
||||||
{ Fl_Arc_Dial *o = new Fl_Arc_Dial( 0, 0, 40, 40, p->name() );
|
{ Fl_Arc_Dial *o = new Fl_Arc_Dial( 0, 0, 40, 40, p->name() );
|
||||||
w = o;
|
w = o;
|
||||||
control = o;
|
control = o;
|
||||||
|
|
||||||
if ( p->hints.ranged )
|
if ( p->hints.ranged )
|
||||||
{
|
{
|
||||||
|
DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum );
|
||||||
o->minimum( p->hints.minimum );
|
o->minimum( p->hints.minimum );
|
||||||
o->maximum( p->hints.maximum );
|
o->maximum( p->hints.maximum );
|
||||||
}
|
}
|
||||||
|
@ -466,8 +478,8 @@ Controller_Module::update_cb ( void )
|
||||||
{
|
{
|
||||||
Fl::repeat_timeout( CONTROL_UPDATE_FREQ, update_cb, this );
|
Fl::repeat_timeout( CONTROL_UPDATE_FREQ, update_cb, this );
|
||||||
|
|
||||||
/* if ( control && control_output[0].connected() ) */
|
if ( control && control_output.size() > 0 && control_output[0].connected() )
|
||||||
/* handle_control_changed( NULL ); */
|
handle_control_changed( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -581,6 +593,9 @@ Controller_Module::handle_control_changed ( Port * )
|
||||||
if ( contains( Fl::pushed() ) )
|
if ( contains( Fl::pushed() ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if ( control->value() != control_value )
|
||||||
|
redraw();
|
||||||
|
|
||||||
if ( type() == SPATIALIZATION )
|
if ( type() == SPATIALIZATION )
|
||||||
{
|
{
|
||||||
Panner *pan = (Panner*)control;
|
Panner *pan = (Panner*)control;
|
||||||
|
@ -592,8 +607,6 @@ Controller_Module::handle_control_changed ( Port * )
|
||||||
{
|
{
|
||||||
control->value(control_value);
|
control->value(control_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
redraw();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********/
|
/**********/
|
||||||
|
@ -641,7 +654,7 @@ Controller_Module::process ( nframes_t nframes )
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Controller_Module::osc_control_change ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
|
Controller_Module::osc_control_change_exact ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
|
||||||
{
|
{
|
||||||
Controller_Module *c = (Controller_Module*)user_data;
|
Controller_Module *c = (Controller_Module*)user_data;
|
||||||
|
|
||||||
|
@ -650,11 +663,53 @@ Controller_Module::osc_control_change ( const char *path, const char *types, lo_
|
||||||
|
|
||||||
OSC_DMSG();
|
OSC_DMSG();
|
||||||
|
|
||||||
c->control_value = argv[0]->f;
|
const Port *p = c->control_output[0].connected_port();
|
||||||
|
|
||||||
|
float f = argv[0]->f;
|
||||||
|
|
||||||
|
if ( p->hints.ranged )
|
||||||
|
{
|
||||||
|
if ( f > p->hints.maximum )
|
||||||
|
f = p->hints.maximum;
|
||||||
|
else if ( f < p->hints.minimum )
|
||||||
|
f = p->hints.minimum;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->control_value = f;
|
||||||
|
|
||||||
mixer->osc_endpoint->send( lo_message_get_source( msg ), "/reply", path, "ok" );
|
mixer->osc_endpoint->send( lo_message_get_source( msg ), "/reply", path, "ok" );
|
||||||
|
|
||||||
// OSC_REPLY_OK();
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Controller_Module::osc_control_change_cv ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
|
||||||
|
{
|
||||||
|
Controller_Module *c = (Controller_Module*)user_data;
|
||||||
|
|
||||||
|
if ( c->mode() != OSC )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
OSC_DMSG();
|
||||||
|
|
||||||
|
const Port *p = c->control_output[0].connected_port();
|
||||||
|
|
||||||
|
float f = argv[0]->f;
|
||||||
|
|
||||||
|
if (p->hints.ranged )
|
||||||
|
{
|
||||||
|
// scale value to range.
|
||||||
|
// we assume that CV values are between 0 and 1
|
||||||
|
|
||||||
|
float scale = p->hints.maximum - p->hints.minimum;
|
||||||
|
float offset = p->hints.minimum;
|
||||||
|
|
||||||
|
f = ( f * scale ) + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->control_value = f;
|
||||||
|
|
||||||
|
mixer->osc_endpoint->send( lo_message_get_source( msg ), "/reply", path, "ok" );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ class Controller_Module : public Module
|
||||||
void menu_cb ( const Fl_Menu_ *m );
|
void menu_cb ( const Fl_Menu_ *m );
|
||||||
|
|
||||||
char *_osc_path;
|
char *_osc_path;
|
||||||
|
char *_osc_path_cv;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -105,8 +106,8 @@ private:
|
||||||
char *generate_osc_path ( void );
|
char *generate_osc_path ( void );
|
||||||
void change_osc_path ( char *path );
|
void change_osc_path ( char *path );
|
||||||
|
|
||||||
static int osc_control_change ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data );
|
static int osc_control_change_exact ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data );
|
||||||
|
static int osc_control_change_cv ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data );
|
||||||
|
|
||||||
std::vector<JACK::Port> jack_input;
|
std::vector<JACK::Port> jack_input;
|
||||||
Mode _mode;
|
Mode _mode;
|
||||||
|
|
|
@ -194,8 +194,11 @@ Module_Parameter_Editor::make_controls ( void )
|
||||||
{
|
{
|
||||||
Fl_Arc_Dial *o = new Fl_Arc_Dial( 0, 0, 50, 50, p->name() );
|
Fl_Arc_Dial *o = new Fl_Arc_Dial( 0, 0, 50, 50, p->name() );
|
||||||
w = o;
|
w = o;
|
||||||
|
|
||||||
if ( p->hints.ranged )
|
if ( p->hints.ranged )
|
||||||
{
|
{
|
||||||
|
DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum );
|
||||||
|
|
||||||
o->minimum( p->hints.minimum );
|
o->minimum( p->hints.minimum );
|
||||||
o->maximum( p->hints.maximum );
|
o->maximum( p->hints.maximum );
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,6 +183,8 @@ main ( int argc, char **argv )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mixer->init_osc( osc_port );
|
||||||
|
|
||||||
if ( r >= 1 )
|
if ( r >= 1 )
|
||||||
{
|
{
|
||||||
MESSAGE( "Loading \"%s\"", argv[i] );
|
MESSAGE( "Loading \"%s\"", argv[i] );
|
||||||
|
@ -195,8 +197,6 @@ main ( int argc, char **argv )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mixer->init_osc( osc_port );
|
|
||||||
|
|
||||||
Fl::run();
|
Fl::run();
|
||||||
|
|
||||||
delete main_window;
|
delete main_window;
|
||||||
|
|
Loading…
Reference in New Issue