-APC control and controller interface updates

This commit is contained in:
Harry van Haaren 2013-05-19 02:01:22 +01:00
parent 398ab69482
commit f16f502c41
6 changed files with 81 additions and 30 deletions

View file

@ -10,14 +10,32 @@ AkaiAPC::AkaiAPC()
} }
void AkaiAPC::record(int t, bool b) void AkaiAPC::recordArm(int t, bool enabled)
{ {
unsigned char data[3]; unsigned char data[3];
data[0] = 144 + t; data[0] = 144 + t;
data[1] = 48; // record LED data[1] = 48; // record enable LED
data[2] = 127 * b; data[2] = enabled ? 127 : 0;
jack->writeApcOutput( &data[0] );
}
void AkaiAPC::clipSelect(int t, int clip, ClipMode cm)
{
unsigned char data[3];
data[0] = 144 + t;
data[1] = 53 + clip;
switch (cm)
{
case CLIP_MODE_EMPTY: data[2] = 0; break;
case CLIP_MODE_PLAYING: data[2] = 1; break;
case CLIP_MODE_PLAY_QUEUED: data[2] = 2; break;
case CLIP_MODE_RECORDING: data[2] = 3; break;
//case CLIP_MODE_RECORDING: data[2] = 4; break;
case CLIP_MODE_LOADED: data[2] = 5; break;
}
jack->writeApcOutput( &data[0] ); jack->writeApcOutput( &data[0] );
cout << "record written to JACK" << endl;
} }
void AkaiAPC::mute(int t, bool b) void AkaiAPC::mute(int t, bool b)
@ -25,10 +43,6 @@ void AkaiAPC::mute(int t, bool b)
} }
void AkaiAPC::clipSelect(int t, bool b)
{
}
void AkaiAPC::volume(int t, float f) void AkaiAPC::volume(int t, float f)
{ {

View file

@ -11,10 +11,10 @@ class AkaiAPC : public Controller
AkaiAPC(); AkaiAPC();
void mute(int t, bool b); void mute(int t, bool b);
void clipSelect(int t, bool b);
virtual void record(int t, bool b);
void volume(int t, float f); void volume(int t, float f);
void recordArm(int t, bool b);
void clipSelect(int track, int clip, ClipMode cm);
}; };
#endif // LUPPP_APC_H #endif // LUPPP_APC_H

View file

@ -6,15 +6,32 @@
class Controller class Controller
{ {
public: public:
/*
make a state class for a whole track
class TrackState {
int track;
};
*/
enum ClipMode {
CLIP_MODE_PLAYING,
CLIP_MODE_PLAY_QUEUED,
CLIP_MODE_LOADED,
CLIP_MODE_RECORDING,
CLIP_MODE_RECORD_QUEUED,
CLIP_MODE_EMPTY,
};
Controller(){}; Controller(){};
virtual ~Controller(){}; virtual ~Controller(){};
//virtual void setTrack(TrackState& t);
virtual void mute(int t, bool b){}; virtual void mute(int t, bool b){};
virtual void clipSelect(int t, bool b){};
virtual void record(int t, bool b) = 0;
virtual void volume(int t, float f){}; virtual void volume(int t, float f){};
virtual void recordArm(int t, bool r){};
virtual void clipSelect(int track, int clip, ClipMode cm){};
}; };
#endif // LUPPP_CONTROLLER_H #endif // LUPPP_CONTROLLER_H

View file

@ -15,14 +15,6 @@ using namespace std;
class ControllerUpdator class ControllerUpdator
{ {
public: public:
enum ClipMode {
CLIP_MODE_PLAYING,
CLIP_MODE_PLAY_QUEUED,
CLIP_MODE_LOADED,
CLIP_MODE_EMPTY,
};
ControllerUpdator() ControllerUpdator()
{ {
c.push_back( new AkaiAPC() ); c.push_back( new AkaiAPC() );
@ -33,17 +25,17 @@ class ControllerUpdator
for(int i = 0; i < c.size(); i++) c.at(i)->mute(t,b); for(int i = 0; i < c.size(); i++) c.at(i)->mute(t,b);
} }
void clipSelect(int t, ClipMode cm) void clipSelect(int t, int clip, Controller::ClipMode cm)
{ {
for(int i = 0; i < c.size(); i++) for(int i = 0; i < c.size(); i++)
c.at(i)->clipSelect(t,cm); c.at(i)->clipSelect(t,clip,cm);
} }
void record(int t, bool r) void recordArm(int t, bool r)
{ {
cout << "record() " << t << " " << r << endl; cout << "record() " << t << " " << r << endl;
for(int i = 0; i < c.size(); i++) for(int i = 0; i < c.size(); i++)
c.at(i)->record(t,r); c.at(i)->recordArm(t,r);
} }
void volume(int t, float v) void volume(int t, float v)

View file

@ -4,6 +4,7 @@
#include "jack.hxx" #include "jack.hxx"
#include "eventhandler.hxx" #include "eventhandler.hxx"
#include "controllerupdater.hxx"
extern Jack* jack; extern Jack* jack;
@ -70,25 +71,45 @@ void Looper::midi(unsigned char* data)
void Looper::setState(State s) void Looper::setState(State s)
{ {
// quantize recording to next bar event
if ( state == STATE_RECORDING ) if ( state == STATE_RECORDING )
{ {
stopRecordOnBar = true; stopRecordOnBar = true;
} }
state = s; state = s;
updateControllers();
}
void Looper::updateControllers()
{
if (state == STATE_RECORD_QUEUED ) if (state == STATE_RECORD_QUEUED )
{ {
numBeats = 0; numBeats = 0;
jack->getControllerUpdator()->record(track, true); jack->getControllerUpdator()->recordArm(track, true);
} }
else else
{ {
jack->getControllerUpdator()->record(track, false); jack->getControllerUpdator()->recordArm(track, false);
} }
if (state == STATE_PLAY_QUEUED ) if (state == STATE_PLAY_QUEUED )
{ {
jack->getControllerUpdator()->clipSelect(track, 0, Controller::CLIP_MODE_PLAY_QUEUED);
}
else if ( state == STATE_PLAYING )
{
jack->getControllerUpdator()->clipSelect(track, 0, Controller::CLIP_MODE_PLAYING);
}
if (state == STATE_STOP_QUEUED )
{
jack->getControllerUpdator()->clipSelect(track, 0, Controller::CLIP_MODE_LOADED);
}
else if ( state == STATE_STOPPED )
{
jack->getControllerUpdator()->clipSelect(track, 0, Controller::CLIP_MODE_LOADED);
}
} }
void Looper::process(int nframes, Buffers* buffers) void Looper::process(int nframes, Buffers* buffers)
@ -155,6 +176,7 @@ void Looper::process(int nframes, Buffers* buffers)
void Looper::bar() void Looper::bar()
{ {
int barTmpState = state;
// queue stop recording -> stop recording, now calculate beats in loop // queue stop recording -> stop recording, now calculate beats in loop
if ( stopRecordOnBar ) if ( stopRecordOnBar )
{ {
@ -193,6 +215,11 @@ void Looper::bar()
state = STATE_STOPPED; state = STATE_STOPPED;
endPoint = lastWrittenSampleIndex; endPoint = lastWrittenSampleIndex;
} }
if ( barTmpState != state )
{
jack->getControllerUpdator()->recordArm( track, state == STATE_RECORDING ? 1 : 0 );
}
} }
void Looper::beat() void Looper::beat()

View file

@ -34,6 +34,7 @@ class Looper : public Observer // for notifications
void setState(State s); void setState(State s);
void setLoopLength(float l); void setLoopLength(float l);
void updateControllers();
void process(int nframes, Buffers* buffers); void process(int nframes, Buffers* buffers);
private: private: