MCP: reverse operation of cursor up/down in zoom mode; more tracign for vpot
git-svn-id: svn://localhost/ardour2/branches/3.0@11920 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
96d4ba88d1
commit
bc52377c3e
@ -101,10 +101,10 @@ class MackieControlProtocol
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum FlipMode {
|
enum FlipMode {
|
||||||
Normal,
|
Normal, /* fader controls primary, vpot controls secondary */
|
||||||
Mirror,
|
Mirror, /* fader + vpot control secondary */
|
||||||
Swap,
|
Swap, /* fader controls secondary, vpot controls primary */
|
||||||
Zero,
|
Zero, /* fader controls primary, but doesn't move, vpot controls secondary */
|
||||||
};
|
};
|
||||||
|
|
||||||
MackieControlProtocol(ARDOUR::Session &);
|
MackieControlProtocol(ARDOUR::Session &);
|
||||||
|
@ -202,10 +202,11 @@ LedState
|
|||||||
MackieControlProtocol::cursor_up_press (Button&)
|
MackieControlProtocol::cursor_up_press (Button&)
|
||||||
{
|
{
|
||||||
if (_zoom_mode) {
|
if (_zoom_mode) {
|
||||||
|
|
||||||
if (_modifier_state & MODIFIER_OPTION) {
|
if (_modifier_state & MODIFIER_OPTION) {
|
||||||
VerticalZoomOutSelected (); /* EMIT SIGNAL */
|
VerticalZoomInSelected (); /* EMIT SIGNAL */
|
||||||
} else {
|
} else {
|
||||||
VerticalZoomOutAll (); /* EMIT SIGNAL */
|
VerticalZoomInAll (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return off;
|
return off;
|
||||||
@ -221,11 +222,10 @@ LedState
|
|||||||
MackieControlProtocol::cursor_down_press (Button&)
|
MackieControlProtocol::cursor_down_press (Button&)
|
||||||
{
|
{
|
||||||
if (_zoom_mode) {
|
if (_zoom_mode) {
|
||||||
|
|
||||||
if (_modifier_state & MODIFIER_OPTION) {
|
if (_modifier_state & MODIFIER_OPTION) {
|
||||||
VerticalZoomInSelected (); /* EMIT SIGNAL */
|
VerticalZoomOutSelected (); /* EMIT SIGNAL */
|
||||||
} else {
|
} else {
|
||||||
VerticalZoomInAll (); /* EMIT SIGNAL */
|
VerticalZoomOutAll (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return off;
|
return off;
|
||||||
|
@ -66,10 +66,12 @@ Strip::Strip (Surface& s, const std::string& name, int index, StripControlDefini
|
|||||||
, _vselect (0)
|
, _vselect (0)
|
||||||
, _fader_touch (0)
|
, _fader_touch (0)
|
||||||
, _vpot (0)
|
, _vpot (0)
|
||||||
, _gain (0)
|
, _fader (0)
|
||||||
, _index (index)
|
, _index (index)
|
||||||
, _surface (&s)
|
, _surface (&s)
|
||||||
, _route_locked (false)
|
, _route_locked (false)
|
||||||
|
, _last_fader_position_written (-1.0)
|
||||||
|
, _last_vpot_position_written (-1.0)
|
||||||
{
|
{
|
||||||
/* build the controls for this track, which will automatically add them
|
/* build the controls for this track, which will automatically add them
|
||||||
to the Group
|
to the Group
|
||||||
@ -100,7 +102,7 @@ void Strip::add (Control & control)
|
|||||||
|
|
||||||
if ((fader = dynamic_cast<Fader*>(&control)) != 0) {
|
if ((fader = dynamic_cast<Fader*>(&control)) != 0) {
|
||||||
|
|
||||||
_gain = fader;
|
_fader = fader;
|
||||||
|
|
||||||
} else if ((pot = dynamic_cast<Pot*>(&control)) != 0) {
|
} else if ((pot = dynamic_cast<Pot*>(&control)) != 0) {
|
||||||
|
|
||||||
@ -144,110 +146,6 @@ void Strip::add (Control & control)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Fader&
|
|
||||||
Strip::gain()
|
|
||||||
{
|
|
||||||
if (_gain == 0) {
|
|
||||||
throw MackieControlException ("gain is null");
|
|
||||||
}
|
|
||||||
return *_gain;
|
|
||||||
}
|
|
||||||
|
|
||||||
Pot&
|
|
||||||
Strip::vpot()
|
|
||||||
{
|
|
||||||
if (_vpot == 0) {
|
|
||||||
throw MackieControlException ("vpot is null");
|
|
||||||
}
|
|
||||||
return *_vpot;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button&
|
|
||||||
Strip::recenable()
|
|
||||||
{
|
|
||||||
if (_recenable == 0) {
|
|
||||||
throw MackieControlException ("recenable is null");
|
|
||||||
}
|
|
||||||
return *_recenable;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button&
|
|
||||||
Strip::solo()
|
|
||||||
{
|
|
||||||
if (_solo == 0) {
|
|
||||||
throw MackieControlException ("solo is null");
|
|
||||||
}
|
|
||||||
return *_solo;
|
|
||||||
}
|
|
||||||
Button&
|
|
||||||
Strip::mute()
|
|
||||||
{
|
|
||||||
if (_mute == 0) {
|
|
||||||
throw MackieControlException ("mute is null");
|
|
||||||
}
|
|
||||||
return *_mute;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button&
|
|
||||||
Strip::select()
|
|
||||||
{
|
|
||||||
if (_select == 0) {
|
|
||||||
throw MackieControlException ("select is null");
|
|
||||||
}
|
|
||||||
return *_select;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button&
|
|
||||||
Strip::vselect()
|
|
||||||
{
|
|
||||||
if (_vselect == 0) {
|
|
||||||
throw MackieControlException ("vselect is null");
|
|
||||||
}
|
|
||||||
return *_vselect;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button&
|
|
||||||
Strip::fader_touch()
|
|
||||||
{
|
|
||||||
if (_fader_touch == 0) {
|
|
||||||
throw MackieControlException ("fader_touch is null");
|
|
||||||
}
|
|
||||||
return *_fader_touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
Meter&
|
|
||||||
Strip::meter()
|
|
||||||
{
|
|
||||||
if (_meter == 0) {
|
|
||||||
throw MackieControlException ("meter is null");
|
|
||||||
}
|
|
||||||
return *_meter;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & Mackie::operator << (std::ostream & os, const Strip & strip)
|
|
||||||
{
|
|
||||||
os << typeid (strip).name();
|
|
||||||
os << " { ";
|
|
||||||
os << "has_solo: " << boolalpha << strip.has_solo();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_recenable: " << boolalpha << strip.has_recenable();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_mute: " << boolalpha << strip.has_mute();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_select: " << boolalpha << strip.has_select();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_vselect: " << boolalpha << strip.has_vselect();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_fader_touch: " << boolalpha << strip.has_fader_touch();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_vpot: " << boolalpha << strip.has_vpot();
|
|
||||||
os << ", ";
|
|
||||||
os << "has_gain: " << boolalpha << strip.has_gain();
|
|
||||||
os << " }";
|
|
||||||
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Strip::set_route (boost::shared_ptr<Route> r)
|
Strip::set_route (boost::shared_ptr<Route> r)
|
||||||
{
|
{
|
||||||
@ -265,16 +163,15 @@ Strip::set_route (boost::shared_ptr<Route> r)
|
|||||||
_surface->number(), _index, _route->name()));
|
_surface->number(), _index, _route->name()));
|
||||||
|
|
||||||
|
|
||||||
if (has_solo()) {
|
if (_solo) {
|
||||||
_route->solo_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_solo_changed, this), ui_context());
|
_route->solo_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_solo_changed, this), ui_context());
|
||||||
}
|
}
|
||||||
if (has_mute()) {
|
|
||||||
|
if (_mute) {
|
||||||
_route->mute_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_mute_changed, this), ui_context());
|
_route->mute_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_mute_changed, this), ui_context());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_gain()) {
|
|
||||||
_route->gain_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_gain_changed, this, false), ui_context());
|
_route->gain_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_gain_changed, this, false), ui_context());
|
||||||
}
|
|
||||||
|
|
||||||
_route->PropertyChanged.connect (route_connections, invalidator(), ui_bind (&Strip::notify_property_changed, this, _1), ui_context());
|
_route->PropertyChanged.connect (route_connections, invalidator(), ui_bind (&Strip::notify_property_changed, this, _1), ui_context());
|
||||||
|
|
||||||
@ -311,28 +208,13 @@ Strip::set_route (boost::shared_ptr<Route> r)
|
|||||||
void
|
void
|
||||||
Strip::notify_all()
|
Strip::notify_all()
|
||||||
{
|
{
|
||||||
if (has_solo()) {
|
|
||||||
notify_solo_changed ();
|
notify_solo_changed ();
|
||||||
}
|
|
||||||
|
|
||||||
if (has_mute()) {
|
|
||||||
notify_mute_changed ();
|
notify_mute_changed ();
|
||||||
}
|
|
||||||
|
|
||||||
if (has_gain()) {
|
|
||||||
notify_gain_changed ();
|
notify_gain_changed ();
|
||||||
}
|
|
||||||
|
|
||||||
notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name));
|
notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name));
|
||||||
|
|
||||||
if (has_vpot()) {
|
|
||||||
notify_panner_changed ();
|
notify_panner_changed ();
|
||||||
}
|
|
||||||
|
|
||||||
if (has_recenable()) {
|
|
||||||
notify_record_enable_changed ();
|
notify_record_enable_changed ();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Strip::notify_solo_changed ()
|
Strip::notify_solo_changed ()
|
||||||
@ -377,15 +259,30 @@ Strip::notify_route_deleted ()
|
|||||||
void
|
void
|
||||||
Strip::notify_gain_changed (bool force_update)
|
Strip::notify_gain_changed (bool force_update)
|
||||||
{
|
{
|
||||||
if (_route) {
|
if (_route && _fader) {
|
||||||
Fader & fader = gain();
|
|
||||||
|
|
||||||
if (!fader.in_use()) {
|
if (!_fader->in_use()) {
|
||||||
float position = gain_to_slider_position (_route->gain_control()->get_value());
|
|
||||||
// check that something has actually changed
|
double pos;
|
||||||
if (force_update || position != _last_gain_written) {
|
|
||||||
_surface->write (fader.set_position (position));
|
switch (_surface->mcp().flip_mode()) {
|
||||||
_last_gain_written = position;
|
case MackieControlProtocol::Swap:
|
||||||
|
pos = _route->gain_control()->get_value();
|
||||||
|
return;
|
||||||
|
|
||||||
|
case MackieControlProtocol::Normal:
|
||||||
|
case MackieControlProtocol::Zero:
|
||||||
|
case MackieControlProtocol::Mirror:
|
||||||
|
/* fader is used for something else and/or
|
||||||
|
should not move.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = gain_to_slider_position (pos);
|
||||||
|
if (force_update || pos != _last_fader_position_written) {
|
||||||
|
_surface->write (_fader->set_position (pos));
|
||||||
|
_last_fader_position_written = pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -415,27 +312,32 @@ Strip::notify_property_changed (const PropertyChange& what_changed)
|
|||||||
void
|
void
|
||||||
Strip::notify_panner_changed (bool force_update)
|
Strip::notify_panner_changed (bool force_update)
|
||||||
{
|
{
|
||||||
if (_route) {
|
if (_route && _vpot) {
|
||||||
Pot & pot = vpot();
|
|
||||||
boost::shared_ptr<Panner> panner = _route->panner();
|
|
||||||
|
|
||||||
if (panner) {
|
boost::shared_ptr<Pannable> pannable = _route->pannable();
|
||||||
double pos = panner->position ();
|
|
||||||
|
|
||||||
// cache the MidiByteArray here, because the mackie led control is much lower
|
if (!pannable) {
|
||||||
// resolution than the panner control. So we save lots of byte
|
_surface->write (_vpot->zero());
|
||||||
// sends in spite of more work on the comparison
|
return;
|
||||||
|
|
||||||
MidiByteArray bytes = pot.set_all (pos, true, Pot::dot);
|
|
||||||
|
|
||||||
// check that something has actually changed
|
|
||||||
if (force_update || bytes != _last_pan_written)
|
|
||||||
{
|
|
||||||
_surface->write (bytes);
|
|
||||||
_last_pan_written = bytes;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
_surface->write (pot.zero());
|
double pos;
|
||||||
|
|
||||||
|
switch (_surface->mcp().flip_mode()) {
|
||||||
|
case MackieControlProtocol::Swap:
|
||||||
|
/* pot is controlling the gain */
|
||||||
|
return;
|
||||||
|
|
||||||
|
case MackieControlProtocol::Normal:
|
||||||
|
case MackieControlProtocol::Zero:
|
||||||
|
case MackieControlProtocol::Mirror:
|
||||||
|
pos = pannable->pan_azimuth_control->get_value();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (force_update || pos != _last_vpot_position_written) {
|
||||||
|
_surface->write (_vpot->set_all (pos, true, Pot::dot));
|
||||||
|
_last_vpot_position_written = pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -494,7 +396,7 @@ Strip::handle_button (Button& button, ButtonState bs)
|
|||||||
|
|
||||||
bool state = (bs == press);
|
bool state = (bs == press);
|
||||||
|
|
||||||
_gain->set_in_use (state);
|
_fader->set_in_use (state);
|
||||||
|
|
||||||
if (ARDOUR::Config->get_mackie_emulation() == "bcf" && state) {
|
if (ARDOUR::Config->get_mackie_emulation() == "bcf" && state) {
|
||||||
|
|
||||||
@ -502,7 +404,7 @@ Strip::handle_button (Button& button, ButtonState bs)
|
|||||||
their `in_use' state.
|
their `in_use' state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
_surface->mcp().add_in_use_timeout (*_surface, gain(), &fader_touch());
|
_surface->mcp().add_in_use_timeout (*_surface, *_fader, _fader_touch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -512,24 +414,23 @@ Strip::handle_fader (Fader& fader, float position)
|
|||||||
{
|
{
|
||||||
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("fader to %1\n", position));
|
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("fader to %1\n", position));
|
||||||
|
|
||||||
|
if (!_route) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (_surface->mcp().flip_mode()) {
|
switch (_surface->mcp().flip_mode()) {
|
||||||
case MackieControlProtocol::Normal:
|
case MackieControlProtocol::Normal:
|
||||||
|
_route->gain_control()->set_value (slider_position_to_gain (position));
|
||||||
break;
|
break;
|
||||||
case MackieControlProtocol::Zero:
|
case MackieControlProtocol::Zero:
|
||||||
break;
|
break;
|
||||||
case MackieControlProtocol::Mirror:
|
case MackieControlProtocol::Mirror:
|
||||||
break;
|
break;
|
||||||
case MackieControlProtocol::Swap:
|
case MackieControlProtocol::Swap:
|
||||||
if (_vpot) {
|
_route->pannable()->pan_azimuth_control->set_value (position);
|
||||||
handle_pot (*_vpot, 1.0);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_route) {
|
|
||||||
_route->gain_control()->set_value (slider_position_to_gain (position));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARDOUR::Config->get_mackie_emulation() == "bcf") {
|
if (ARDOUR::Config->get_mackie_emulation() == "bcf") {
|
||||||
/* reset the timeout while we're still moving the fader */
|
/* reset the timeout while we're still moving the fader */
|
||||||
_surface->mcp().add_in_use_timeout (*_surface, fader, fader.in_use_touch_control);
|
_surface->mcp().add_in_use_timeout (*_surface, fader, fader.in_use_touch_control);
|
||||||
@ -555,11 +456,20 @@ Strip::handle_pot (Pot& pot, float delta)
|
|||||||
if (pannable) {
|
if (pannable) {
|
||||||
boost::shared_ptr<AutomationControl> ac;
|
boost::shared_ptr<AutomationControl> ac;
|
||||||
|
|
||||||
|
switch (_surface->mcp().flip_mode()) {
|
||||||
|
case MackieControlProtocol::Normal: /* pot controls pan */
|
||||||
|
case MackieControlProtocol::Mirror: /* pot + fader control pan */
|
||||||
|
case MackieControlProtocol::Zero: /* pot controls pan, faders don't move */
|
||||||
if (_surface->mcp().modifier_state() & MackieControlProtocol::MODIFIER_CONTROL) {
|
if (_surface->mcp().modifier_state() & MackieControlProtocol::MODIFIER_CONTROL) {
|
||||||
ac = pannable->pan_width_control;
|
ac = pannable->pan_width_control;
|
||||||
} else {
|
} else {
|
||||||
ac = pannable->pan_azimuth_control;
|
ac = pannable->pan_azimuth_control;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case MackieControlProtocol::Swap:
|
||||||
|
ac = _route->gain_control();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
double p = ac->get_value();
|
double p = ac->get_value();
|
||||||
|
|
||||||
@ -603,8 +513,10 @@ Strip::update_automation ()
|
|||||||
void
|
void
|
||||||
Strip::update_meter ()
|
Strip::update_meter ()
|
||||||
{
|
{
|
||||||
|
if (_meter) {
|
||||||
float dB = const_cast<PeakMeter&> (_route->peak_meter()).peak_power (0);
|
float dB = const_cast<PeakMeter&> (_route->peak_meter()).peak_power (0);
|
||||||
_surface->write (meter().update_message (dB));
|
_surface->write (_meter->update_message (dB));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MidiByteArray
|
MidiByteArray
|
||||||
|
@ -52,26 +52,6 @@ public:
|
|||||||
void add (Control & control);
|
void add (Control & control);
|
||||||
int index() const { return _index; } // zero based
|
int index() const { return _index; } // zero based
|
||||||
|
|
||||||
Button & solo();
|
|
||||||
Button & recenable();
|
|
||||||
Button & mute();
|
|
||||||
Button & select();
|
|
||||||
Button & vselect();
|
|
||||||
Button & fader_touch();
|
|
||||||
Pot & vpot();
|
|
||||||
Fader & gain();
|
|
||||||
Meter& meter ();
|
|
||||||
|
|
||||||
bool has_solo() const { return _solo != 0; }
|
|
||||||
bool has_recenable() const { return _recenable != 0; }
|
|
||||||
bool has_mute() const { return _mute != 0; }
|
|
||||||
bool has_select() const { return _select != 0; }
|
|
||||||
bool has_vselect() const { return _vselect != 0; }
|
|
||||||
bool has_fader_touch() const { return _fader_touch != 0; }
|
|
||||||
bool has_vpot() const { return _vpot != 0; }
|
|
||||||
bool has_gain() const { return _gain != 0; }
|
|
||||||
bool has_meter() const { return _meter != 0; }
|
|
||||||
|
|
||||||
void set_route (boost::shared_ptr<ARDOUR::Route>);
|
void set_route (boost::shared_ptr<ARDOUR::Route>);
|
||||||
|
|
||||||
// call all signal handlers manually
|
// call all signal handlers manually
|
||||||
@ -98,7 +78,7 @@ private:
|
|||||||
Button* _vselect;
|
Button* _vselect;
|
||||||
Button* _fader_touch;
|
Button* _fader_touch;
|
||||||
Pot* _vpot;
|
Pot* _vpot;
|
||||||
Fader* _gain;
|
Fader* _fader;
|
||||||
Meter* _meter;
|
Meter* _meter;
|
||||||
int _index;
|
int _index;
|
||||||
Surface* _surface;
|
Surface* _surface;
|
||||||
@ -107,11 +87,8 @@ private:
|
|||||||
boost::shared_ptr<ARDOUR::Route> _route;
|
boost::shared_ptr<ARDOUR::Route> _route;
|
||||||
PBD::ScopedConnectionList route_connections;
|
PBD::ScopedConnectionList route_connections;
|
||||||
|
|
||||||
// Last written values for the gain and pan, to avoid overloading
|
float _last_fader_position_written;
|
||||||
// the midi connection to the surface
|
float _last_vpot_position_written;
|
||||||
float _last_gain_written;
|
|
||||||
MidiByteArray _last_pan_written;
|
|
||||||
|
|
||||||
|
|
||||||
void notify_solo_changed ();
|
void notify_solo_changed ();
|
||||||
void notify_mute_changed ();
|
void notify_mute_changed ();
|
||||||
@ -127,8 +104,6 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream & operator << (std::ostream &, const Strip &);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __ardour_mackie_control_protocol_strip_h__ */
|
#endif /* __ardour_mackie_control_protocol_strip_h__ */
|
||||||
|
@ -386,7 +386,7 @@ Surface::handle_midi_note_on_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
|
|||||||
void
|
void
|
||||||
Surface::handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
|
Surface::handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
|
||||||
{
|
{
|
||||||
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("SurfacePort::handle_midi_controller %1 = %2\n", ev->controller_number, ev->value));
|
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("SurfacePort::handle_midi_controller %1 = %2\n", (int) ev->controller_number, (int) ev->value));
|
||||||
|
|
||||||
Pot* pot = pots[ev->controller_number];
|
Pot* pot = pots[ev->controller_number];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user