From 6e861dd4c1833a5932c3bc8d4a937568b8463ac2 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Sat, 18 May 2013 16:37:03 +0100 Subject: [PATCH] -Added MIDI input port, loopers get fed MIDI data --- src/buffers.hxx | 2 ++ src/jack.cxx | 30 ++++++++++++++++++++++++++++-- src/jack.hxx | 2 ++ src/looper.cxx | 7 +++++++ src/looper.hxx | 2 ++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/buffers.hxx b/src/buffers.hxx index 8970f8f..056513b 100644 --- a/src/buffers.hxx +++ b/src/buffers.hxx @@ -13,10 +13,12 @@ class Buffers memset( audio, 0, sizeof(float*)*2); } float* audio[2]; + char* midi [1]; enum BUFFER { MASTER_OUTPUT = 0, MASTER_INPUT, + MASTER_MIDI_INPUT, }; // Jack details diff --git a/src/jack.cxx b/src/jack.cxx index 06c5f4f..f11e117 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -32,6 +32,12 @@ Jack::Jack() JackPortIsInput, 0 ); + masterMidiInput = jack_port_register( client, + "midi_in", + JACK_DEFAULT_MIDI_TYPE, + JackPortIsInput, + 0 ); + if ( jack_set_process_callback( client, static_process, static_cast(this)) ) @@ -71,8 +77,28 @@ int Jack::process (jack_nframes_t nframes) handleDspEvents(); // get buffers - buffers.audio[Buffers::MASTER_INPUT] = (float*)jack_port_get_buffer( masterInput , nframes); - buffers.audio[Buffers::MASTER_OUTPUT] = (float*)jack_port_get_buffer( masterOutput, nframes); + buffers.audio[Buffers::MASTER_INPUT] = (float*)jack_port_get_buffer( masterInput , nframes); + buffers.audio[Buffers::MASTER_OUTPUT] = (float*)jack_port_get_buffer( masterOutput, nframes); + buffers.midi[Buffers::MASTER_MIDI_INPUT]= (char*) jack_port_get_buffer( masterMidiInput, nframes ); + + // process incoming MIDI + jack_midi_event_t in_event; + + int masterMidiInputIndex = 0; + int event_count = (int) jack_midi_get_event_count( buffers.midi[Buffers::MASTER_MIDI_INPUT] ); + + while ( masterMidiInputIndex < event_count ) + { + jack_midi_event_get(&in_event, buffers.midi[Buffers::MASTER_MIDI_INPUT], masterMidiInputIndex); + + cout << int(in_event.buffer[0]) << int(in_event.buffer[1]) << int(in_event.buffer[2]) << endl; + + // check each looper for MIDI match + for(int i = 0; i < loopers.size(); i++) + loopers.at(i)->midi( (char*)in_event.buffer ); + + masterMidiInputIndex++; + } // pre-zero output buffers memset( buffers.audio[Buffers::MASTER_OUTPUT], 0, sizeof(float) * nframes ); diff --git a/src/jack.hxx b/src/jack.hxx index fb3e891..c40ba31 100644 --- a/src/jack.hxx +++ b/src/jack.hxx @@ -61,6 +61,8 @@ class Jack jack_port_t* masterInput; jack_port_t* masterOutput; + jack_port_t* masterMidiInput; + // JACK callbacks int process (jack_nframes_t); diff --git a/src/looper.cxx b/src/looper.cxx index 52deb7b..b8d5b0a 100644 --- a/src/looper.cxx +++ b/src/looper.cxx @@ -37,6 +37,11 @@ Looper::Looper(int t) : fRec0[i] = 0; } +void Looper::midi(char* data) +{ + +} + void Looper::setState(State s) { if ( state == STATE_RECORDING ) @@ -68,11 +73,13 @@ void Looper::process(int nframes, Buffers* buffers) if (track == 0) { + /* // log pitch-shift rates char buffer [50]; sprintf (buffer, "Looper, pbs=%f, dP=%f", playbackSpeed, deltaPitch ); EventGuiPrint e( buffer ); writeToGuiRingbuffer( &e ); + */ } if ( state == STATE_PLAYING ) diff --git a/src/looper.hxx b/src/looper.hxx index f9e73d7..ace3334 100644 --- a/src/looper.hxx +++ b/src/looper.hxx @@ -24,6 +24,8 @@ class Looper : public Observer // for notifications Looper(int t); + void midi(char* data); + void bar(); void beat();