From 2a29891b988365013c60334ba620f2ee77210266 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Tue, 27 Aug 2013 00:50:48 +0100 Subject: [PATCH] -Added APC footcontroller support, ControllerUpdater has reset() --- src/controller/apc.cxx | 47 +++++++++++++++++++++++++++++++++++---- src/controller/apc.hxx | 7 ++++++ src/controllerupdater.hxx | 5 +++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/controller/apc.cxx b/src/controller/apc.cxx index f5aa0d7..6857f3e 100644 --- a/src/controller/apc.cxx +++ b/src/controller/apc.cxx @@ -11,7 +11,10 @@ extern Jack* jack; AkaiAPC::AkaiAPC() : Controller(), - MidiObserver("apc") + MidiObserver("apc"), + shiftPressed(false), + footpedalTrack(0), + footpedalScene(0) { } @@ -121,7 +124,13 @@ void AkaiAPC::noteOn( int track, int note, int vel ) printf("apc noteOn: t = %i, n = %i, vel = %i\n", track, note, vel); if ( note >= 53 && note <= 57 ) { - jack->getGridLogic()->pressed( track, note - 53 ); + if ( shiftPressed ) + { + footpedalTrack = track; + footpedalScene = note - 53; + } + else + jack->getGridLogic()->pressed( track, note - 53 ); return; } @@ -140,6 +149,10 @@ void AkaiAPC::noteOn( int track, int note, int vel ) jack->getGridLogic()->launchScene(note - 82); } break; + case 98: { // Shift + shiftPressed = true; + break; } + case 99: { // tap tempo jack->getLogic()->tapTempo(); jack->getControllerUpdater()->tapTempo( true ); @@ -185,6 +198,10 @@ void AkaiAPC::noteOff( int track, int note, int vel ) int s = jack->getGridLogic()->getLaunchedScene(); launchScene( s ); } break ; + + case 98: { // Shift + shiftPressed = false; + break; } } } @@ -215,8 +232,16 @@ void AkaiAPC::ccChange( int track, int cc, float value ) break; } case 64: { // FootSwitch 1 - - break; } + if ( value > 0.5 ) + { + printf("footpedal press %i, %i\n", footpedalTrack, footpedalScene ); + jack->getGridLogic()->pressed( footpedalTrack, footpedalScene ); + } + else + { + printf("footpedal release %i, %i\n", footpedalTrack, footpedalScene ); + jack->getGridLogic()->released( footpedalTrack, footpedalScene ); + } break; } case 67: { // FootSwitch 2 break; } @@ -252,3 +277,17 @@ void AkaiAPC::midi(unsigned char* data) ccChange( b1 - 176, b2, data[2] / 127.f ); } } + + +void AkaiAPC::reset() +{ + unsigned char data[3]; + // setup "volume" style rotary display + for(int i = 0; i < NTRACKS; i++) + { + data[0] = 176 + i; + data[1] = 0x19; + data[2] = 2; + jack->writeApcOutput( &data[0] ); + } +} diff --git a/src/controller/apc.hxx b/src/controller/apc.hxx index c508635..dcc5cf0 100644 --- a/src/controller/apc.hxx +++ b/src/controller/apc.hxx @@ -25,9 +25,16 @@ class AkaiAPC : public Controller, public MidiObserver /// track FX void trackSend(int t, int send, float v); + void reset(); + void midi(unsigned char* data); private: + bool shiftPressed; + + int footpedalTrack; + int footpedalScene; + /// for handling events void ccChange( int track, int cc, float value ); void noteOff( int track, int note, int vel ); diff --git a/src/controllerupdater.hxx b/src/controllerupdater.hxx index 1e917f5..fc61284 100644 --- a/src/controllerupdater.hxx +++ b/src/controllerupdater.hxx @@ -35,6 +35,11 @@ class ControllerUpdater c.push_back( controller ); } + void reset() + { + for(unsigned int i = 0; i < c.size(); i++) + c.at(i)->reset(); + } void mute(int t, bool b) {