mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-06 09:31:39 -05:00
-Updated Jack to have DBMeter instances, dbMetering taking place in process(), event for signal level added & handled in GUI
This commit is contained in:
parent
9337fae460
commit
c9cf150841
7 changed files with 64 additions and 34 deletions
|
@ -7,9 +7,6 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
float fabsf(float dummy0);
|
|
||||||
float log10f(float dummy0);
|
|
||||||
|
|
||||||
class DBMeter
|
class DBMeter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -27,33 +24,28 @@ class DBMeter
|
||||||
int getNumInputs() { return 2;}
|
int getNumInputs() { return 2;}
|
||||||
int getNumOutputs(){ return 2;}
|
int getNumOutputs(){ return 2;}
|
||||||
|
|
||||||
// call this to get the current dB value, range = -96 -> +10
|
// call these to get the current dB values
|
||||||
float getLeftDB()
|
float getLeftDB()
|
||||||
{
|
{
|
||||||
return fvbargraph0;
|
// range scale from range = -96 -> +10, to 0 -> 1
|
||||||
|
float zeroOneL = (1-(fvbargraph0 / -96.f));
|
||||||
|
return pow(zeroOneL, 4);
|
||||||
}
|
}
|
||||||
float getRightDB()
|
float getRightDB()
|
||||||
{
|
{
|
||||||
return fvbargraph1;
|
float zeroOneR = (1-(fvbargraph1 / -96.f));
|
||||||
|
return pow(zeroOneR, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void process(int count, float** inputs, float** outputs)
|
void process(int count, float* inputL, float* inputR )
|
||||||
{
|
{
|
||||||
float* input0 = inputs[0];
|
|
||||||
float* input1 = inputs[1];
|
|
||||||
float* output0 = outputs[0];
|
|
||||||
float* output1 = outputs[1];
|
|
||||||
for (int i = 0; (i < count); i = (i + 1))
|
for (int i = 0; (i < count); i = (i + 1))
|
||||||
{
|
{
|
||||||
float fTemp0 = float(input0[i]);
|
fRec0[0] = max((fRec0[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(*inputL))))));
|
||||||
fRec0[0] = max((fRec0[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(fTemp0))))));
|
|
||||||
fvbargraph0 = fRec0[0];
|
fvbargraph0 = fRec0[0];
|
||||||
output0[i] = float(fTemp0);
|
|
||||||
|
|
||||||
float fTemp1 = float(input1[i]);
|
fRec1[0] = max((fRec1[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(*inputR))))));
|
||||||
fRec1[0] = max((fRec1[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(fTemp1))))));
|
|
||||||
fvbargraph1 = fRec1[0];
|
fvbargraph1 = fRec1[0];
|
||||||
output1[i] = float(fTemp1);
|
|
||||||
|
|
||||||
fRec0[1] = fRec0[0];
|
fRec0[1] = fRec0[0];
|
||||||
fRec1[1] = fRec1[0];
|
fRec1[1] = fRec1[0];
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace Event
|
||||||
MASTER_VOL,
|
MASTER_VOL,
|
||||||
RECORD,
|
RECORD,
|
||||||
|
|
||||||
|
TRACK_SIGNAL_LEVEL,
|
||||||
|
|
||||||
LOOPER_LOAD,
|
LOOPER_LOAD,
|
||||||
LOOPER_PLAY,
|
LOOPER_PLAY,
|
||||||
LOOPER_STATE,
|
LOOPER_STATE,
|
||||||
|
@ -138,6 +140,20 @@ class EventTimeBPM : public EventBase
|
||||||
EventTimeBPM(float b) : bpm(b) {}
|
EventTimeBPM(float b) : bpm(b) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class EventTrackSignalLevel : public EventBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int type() { return int(TRACK_SIGNAL_LEVEL); }
|
||||||
|
uint32_t size() { return sizeof(EventTrackSignalLevel); }
|
||||||
|
|
||||||
|
int track;
|
||||||
|
float left;
|
||||||
|
float right;
|
||||||
|
|
||||||
|
EventTrackSignalLevel(){}
|
||||||
|
EventTrackSignalLevel(int t, float l,float r) : track(t), left(l), right(r) {}
|
||||||
|
};
|
||||||
|
|
||||||
class EventTimeTempoTap : public EventBase
|
class EventTimeTempoTap : public EventBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -66,6 +66,12 @@ void handleGuiEvents()
|
||||||
gui->getTrack(ev.track)->progress.value(ev.progress);
|
gui->getTrack(ev.track)->progress.value(ev.progress);
|
||||||
//jack->setLooperLoopLength( ev.track, ev.scale );
|
//jack->setLooperLoopLength( ev.track, ev.scale );
|
||||||
} break; }
|
} break; }
|
||||||
|
case Event::TRACK_SIGNAL_LEVEL: {
|
||||||
|
if ( availableRead >= sizeof(EventTrackSignalLevel) ) {
|
||||||
|
EventTrackSignalLevel ev;
|
||||||
|
jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventTrackSignalLevel) );
|
||||||
|
gui->getTrack(ev.track)->getVolume()->amplitude( ev.left, ev.right );
|
||||||
|
} break; }
|
||||||
case Event::GUI_PRINT: {
|
case Event::GUI_PRINT: {
|
||||||
if ( availableRead >= sizeof(EventGuiPrint) ) {
|
if ( availableRead >= sizeof(EventGuiPrint) ) {
|
||||||
EventGuiPrint ev;
|
EventGuiPrint ev;
|
||||||
|
|
|
@ -30,6 +30,7 @@ class GTrack : public Fl_Group
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Avtk::Volume* getVolume(){return &volume;}
|
||||||
Avtk::ClipSelector* getClipSelector(){return &clipSel;}
|
Avtk::ClipSelector* getClipSelector(){return &clipSel;}
|
||||||
|
|
||||||
GTrack(int x, int y, int w, int h, const char* l = 0 ) :
|
GTrack(int x, int y, int w, int h, const char* l = 0 ) :
|
||||||
|
|
42
src/jack.cxx
42
src/jack.cxx
|
@ -49,6 +49,22 @@ Jack::Jack()
|
||||||
JackPortIsOutput,
|
JackPortIsOutput,
|
||||||
0 );
|
0 );
|
||||||
|
|
||||||
|
for(int i = 0; i < NTRACKS; i++)
|
||||||
|
{
|
||||||
|
loopers.push_back( new Looper(i) );
|
||||||
|
timeManager.registerObserver( loopers.back() );
|
||||||
|
|
||||||
|
// allocate working buffers for each track
|
||||||
|
buffers.audio[Buffers::TRACK_0 + i] = (float*) malloc( sizeof(float) * nframes );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int i = 0; i < NTRACKS; i++)
|
||||||
|
{
|
||||||
|
dbMeters.push_back( DBMeter( buffers.samplerate ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
timeManager.registerObserver( &metronome );
|
||||||
|
|
||||||
if ( jack_set_process_callback( client,
|
if ( jack_set_process_callback( client,
|
||||||
static_process,
|
static_process,
|
||||||
static_cast<void*>(this)) )
|
static_cast<void*>(this)) )
|
||||||
|
@ -63,27 +79,13 @@ Jack::Jack()
|
||||||
{
|
{
|
||||||
cerr << "Jack() error setting timebase callback" << endl;
|
cerr << "Jack() error setting timebase callback" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < NTRACKS; i++)
|
|
||||||
{
|
|
||||||
// allocate working buffers for each track
|
|
||||||
buffers.audio[Buffers::TRACK_0 + i] = (float*) malloc( sizeof(float) * nframes );
|
|
||||||
|
|
||||||
loopers.push_back( new Looper(i) );
|
|
||||||
timeManager.registerObserver( loopers.back() );
|
|
||||||
|
|
||||||
dbMeters.push_back( new DBMeter( buffers.samplerate ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
timeManager.registerObserver( &metronome );
|
|
||||||
|
|
||||||
jack_transport_start(client);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Jack::activate()
|
void Jack::activate()
|
||||||
{
|
{
|
||||||
jack_activate( client );
|
jack_activate( client );
|
||||||
|
jack_transport_start(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -150,6 +152,16 @@ int Jack::process (jack_nframes_t nframes)
|
||||||
*output++ = tmp;
|
*output++ = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get DB readings, and send to UI
|
||||||
|
for(int n = 0; n < NTRACKS; n++)
|
||||||
|
{
|
||||||
|
// needs to be setup to handle stereo instead of mono
|
||||||
|
dbMeters.at(n).process( nframes, buffers.audio[Buffers::TRACK_0 + n], buffers.audio[Buffers::TRACK_0 + n]);
|
||||||
|
EventTrackSignalLevel e( n, dbMeters.at(n).getLeftDB(), dbMeters.at(n).getRightDB() );
|
||||||
|
writeToGuiRingbuffer( &e );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
metronome.process( nframes, &buffers );
|
metronome.process( nframes, &buffers );
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -64,7 +64,8 @@ class Jack
|
||||||
ControllerUpdater controllerUpdater;
|
ControllerUpdater controllerUpdater;
|
||||||
|
|
||||||
vector<Looper*> loopers;
|
vector<Looper*> loopers;
|
||||||
vector<DBMeter*> dbMeters;
|
|
||||||
|
vector<DBMeter> dbMeters;
|
||||||
|
|
||||||
int nframes;
|
int nframes;
|
||||||
int samplerate;
|
int samplerate;
|
||||||
|
|
|
@ -37,9 +37,11 @@ int main()
|
||||||
|
|
||||||
|
|
||||||
jack = new Jack();
|
jack = new Jack();
|
||||||
jack->activate();
|
|
||||||
|
|
||||||
gui = new Gui();
|
gui = new Gui();
|
||||||
|
|
||||||
|
jack->activate();
|
||||||
|
|
||||||
gui->show();
|
gui->show();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue