From f7fce45d4ada769237e323795f13e5fc1687bcec Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Tue, 13 Aug 2013 18:34:08 +0100 Subject: [PATCH] -Loops can be used as tempo, and Luppp will guess the amount of beats, its tempo based on beats, and start running at that tempo. --- src/avtk/avtk_clip_selector.h | 6 ++++++ src/event.hxx | 14 ++++++++++++++ src/eventhandlerdsp.cxx | 11 +++++++++++ src/jack.cxx | 4 ++-- src/logic.cxx | 34 ++++++++++++++++++++++++++++++++++ src/logic.hxx | 1 + src/looperclip.hxx | 2 +- src/timemanager.hxx | 2 +- 8 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/avtk/avtk_clip_selector.h b/src/avtk/avtk_clip_selector.h index c7056fd..94ca2c6 100644 --- a/src/avtk/avtk_clip_selector.h +++ b/src/avtk/avtk_clip_selector.h @@ -336,6 +336,7 @@ class ClipSelector : public Fl_Button {"32"}, {0}, { "Record" }, + { "Use as tempo" }, { 0 } }; Fl_Menu_Item *m = (Fl_Menu_Item*) rclick_menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, 0); @@ -367,6 +368,11 @@ class ClipSelector : public Fl_Button EventLooperLoopLength e = EventLooperLoopLength(ID, clipNum ,32); writeToDspRingbuffer( &e ); } + else if ( strcmp(m->label(), "Use as tempo") == 0 ) + { + EventLooperUseAsTempo e (ID, clipNum); + writeToDspRingbuffer( &e ); + } else if ( strcmp(m->label(), "Record") == 0 ) { /* diff --git a/src/event.hxx b/src/event.hxx index a79bca6..b1defdc 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -43,6 +43,7 @@ namespace Event LOOPER_STATE, LOOPER_PROGRESS, LOOPER_LOOP_LENGTH, + LOOPER_LOOP_USE_AS_TEMPO, METRONOME_ACTIVE, @@ -196,6 +197,19 @@ class EventLooperLoopLength : public EventBase EventLooperLoopLength(int t, int s, int b) : track(t), scene(s), beats(b) {} }; +class EventLooperUseAsTempo : public EventBase +{ + public: + int type() { return int(LOOPER_LOOP_USE_AS_TEMPO); } + uint32_t size() { return sizeof(EventLooperUseAsTempo); } + + int track; + int scene; + int beats; + EventLooperUseAsTempo(){} + EventLooperUseAsTempo(int t, int s) : track(t), scene(s){} +}; + class EventLooperLoad : public EventBase { public: diff --git a/src/eventhandlerdsp.cxx b/src/eventhandlerdsp.cxx index 1358f49..0dc5183 100644 --- a/src/eventhandlerdsp.cxx +++ b/src/eventhandlerdsp.cxx @@ -78,6 +78,17 @@ void handleDspEvents() jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventLooperLoopLength) ); jack->getLogic()->looperClipLenght( ev.track, ev.scene, ev.beats ); } break; } + + + case Event::LOOPER_LOOP_USE_AS_TEMPO: { + if ( availableRead >= sizeof(EventLooperUseAsTempo) ) { + EventLooperUseAsTempo ev; + jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventLooperUseAsTempo) ); + jack->getLogic()->looperUseAsTempo( ev.track, ev.scene ); + } break; } + + + case Event::TIME_BPM: { if ( availableRead >= sizeof(EventTimeBPM) ) { EventTimeBPM ev; diff --git a/src/jack.cxx b/src/jack.cxx index 95503a4..73537ea 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -230,8 +230,8 @@ int Jack::process (jack_nframes_t nframes) tmp += buffers.audio[Buffers::TRACK_0 + t][i]; } - buffers.audio[Buffers::JACK_MASTER_OUT_L][i] = tmp + buffers.audio[Buffers::MASTER_OUT_L][i]; - buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = tmp + buffers.audio[Buffers::MASTER_OUT_R][i]; + buffers.audio[Buffers::JACK_MASTER_OUT_L][i] = tmp; // + buffers.audio[Buffers::MASTER_OUT_L][i]; + buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = tmp; // + buffers.audio[Buffers::MASTER_OUT_R][i]; } /* diff --git a/src/logic.cxx b/src/logic.cxx index e90fb8e..4d1223c 100644 --- a/src/logic.cxx +++ b/src/logic.cxx @@ -38,3 +38,37 @@ void Logic::looperClipLenght(int t, int s, int l) { jack->getLooper( t )->getClip( s )->setBeats(l); } + + +void Logic::looperUseAsTempo(int t, int s) +{ + size_t l = jack->getLooper( t )->getClip( s )->getBufferLenght(); + printf("lenght = %zu\n", l ); + + int beats = 1; + + int four = l / 4; + int eight = l / 8; + int sixteen = l / 16; + int tirty2 = l / 32; + int sixty4 = l / 64; + + printf("%i\n%i\n%i\n%i\n", four, eight, sixteen, tirty2 ); + + size_t res = l; + + while ( res > 22050 / 2 ) + { + res = l / beats; + + if ( res - 22050 < jack->getTimeManager()->getFpb() / 2.f ) + { + printf("using beats %i\n", beats); + jack->getTimeManager()->setFpb(res); + } + + beats = beats + beats; + } + + +} diff --git a/src/logic.hxx b/src/logic.hxx index 78f9c84..2c3e736 100644 --- a/src/logic.hxx +++ b/src/logic.hxx @@ -28,6 +28,7 @@ class Logic void trackRecordArm(int t, bool v); void trackSend(int t, int send, float v); + void looperUseAsTempo(int t, int s); void looperClipLenght(int t, int s, int l); }; diff --git a/src/looperclip.hxx b/src/looperclip.hxx index fc4da72..c8732ac 100644 --- a/src/looperclip.hxx +++ b/src/looperclip.hxx @@ -169,7 +169,7 @@ class LooperClip if ( _buffer && _playing ) { float p = float(_playhead) / _recordhead; - printf("LooperClip progress %f\n", p ); + //printf("LooperClip progress %f\n", p ); return p; } return 0.f; diff --git a/src/timemanager.hxx b/src/timemanager.hxx index 50a47a0..53a4b07 100644 --- a/src/timemanager.hxx +++ b/src/timemanager.hxx @@ -27,7 +27,7 @@ class TimeManager cout << "TimeManager() done" << endl; } - + int getFpb(){return fpb;} void setBpm(float bpm) { //cout << "setBpm() " << bpm << endl;