diff options
Diffstat (limited to 'drumgizmo/input')
| -rw-r--r-- | drumgizmo/input/jackmidi.cc | 145 | ||||
| -rw-r--r-- | drumgizmo/input/jackmidi.h | 67 | ||||
| -rw-r--r-- | drumgizmo/input/midifile.cc | 4 | ||||
| -rw-r--r-- | drumgizmo/input/midifile.h | 6 | 
4 files changed, 217 insertions, 5 deletions
diff --git a/drumgizmo/input/jackmidi.cc b/drumgizmo/input/jackmidi.cc new file mode 100644 index 0000000..2d399c2 --- /dev/null +++ b/drumgizmo/input/jackmidi.cc @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            jackmidi.cc + * + *  Mo 25. Jan 11:26:06 CET 2016 + *  Copyright 2016 Christian Glöckner + *  cgloeckner@freenet.de + ****************************************************************************/ + +/* + *  This file is part of DrumGizmo. + * + *  DrumGizmo is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  DrumGizmo is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with DrumGizmo; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#include <iostream> +#include <cassert> + +#include "cpp11fix.h" // required for c++11 +#include "jackmidi.h" + +int const NOTE_ON = 0x90; + +JackMidiInputEngine::JackMidiInputEngine(JackClient& client) +	: AudioInputEngine{} +	, JackProcess{} +	, client{client} +	, port{nullptr} +	, midimap{} +	, midi_mapper{} +	, list{nullptr} +	, pos{0u} { +	client.add(*this); +} + +JackMidiInputEngine::~JackMidiInputEngine() { +	client.remove(*this); +} + +bool JackMidiInputEngine::isMidiEngine() { +	return true; +} + +bool JackMidiInputEngine::init(Instruments& instruments) { +	if (midimap == "") { +		std::cerr << "[JackMidiInputEngine] Missing midimap filename\n"; +		return false; +	} +	MidiMapParser p{midimap}; +	if (p.parse()) { +		std::cerr << "[JackmidiInputEngine] Failed to parse midimap '" +			<< midimap << "'\n"; +		return false; +	} +	midi_mapper.midimap = p.midimap; +	for (auto i = 0u; i < instruments.size(); ++i) { +		auto name = instruments[i]->name(); +		midi_mapper.instrmap[name] = i; +	} +	port = std::make_unique<JackPort>(client, "drumgizmo_midiin", +		JACK_DEFAULT_MIDI_TYPE, JackPortIsInput); +	return true; +} + +void JackMidiInputEngine::setParm(std::string parm, std::string value) { +	if (parm == "midimap") { +		// apply midimap filename +		midimap = value; +		 +	} else { +		std::cerr << "[JackMidiInputEngine] Unsupported parameter '" +			<< parm << "'\n"; +	} +} + +bool JackMidiInputEngine::start() { +	client.activate(); +	return true; +} + +void JackMidiInputEngine::stop() { +} + +void JackMidiInputEngine::pre() { +} + +event_t* JackMidiInputEngine::run(size_t pos, size_t len, size_t* nevents) { +	*nevents = listsize; +	event_t* l = list; +	printf("Owning raw pointer at drumgizmo/input/jackmidiinput.cc - GET RID OF THEM!\n"); +	list = (event_t *)malloc(sizeof(event_t) * 1000); +	listsize = 0; +	return l; +} + +void JackMidiInputEngine::post() { +} + +void JackMidiInputEngine::process(jack_nframes_t num_frames) { +	assert(port != nullptr); +	void* buffer = port->getBuffer(num_frames); +	jack_nframes_t num_events = jack_midi_get_event_count(buffer); + +	for(jack_nframes_t i = 0; i < num_events; ++i) { +		jack_midi_event_t event; +		jack_midi_event_get(&event, buffer, i); +		if(event.size != 3) { +			continue; +		} +		if((event.buffer[0] & NOTE_ON) != NOTE_ON) { +			continue; +		} +		int key = event.buffer[1]; +		int velocity = event.buffer[2]; +		printf("Event key:%d vel:%d\n", key, velocity); +		int k = midi_mapper.lookup(key); +		if(k != -1 && velocity) { +			list[listsize].type = TYPE_ONSET; +			list[listsize].instrument = k; +			list[listsize].velocity = velocity / 127.0; +			list[listsize].offset = event.time; +			++listsize; +		} +	} +	jack_midi_clear_buffer(buffer); +	pos += num_frames; +} + +/* +		DrumKit* kit; +		size_t pos; +		EventQueue *eventqueue; +*/ + diff --git a/drumgizmo/input/jackmidi.h b/drumgizmo/input/jackmidi.h new file mode 100644 index 0000000..3c64f2d --- /dev/null +++ b/drumgizmo/input/jackmidi.h @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            jackmidi.h + * + *  Mo 25. Jan 11:26:06 CET 2016 + *  Copyright 2016 Christian Glöckner + *  cgloeckner@freenet.de + ****************************************************************************/ + +/* + *  This file is part of DrumGizmo. + * + *  DrumGizmo is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  DrumGizmo is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with DrumGizmo; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#pragma once +#include <memory> +#include <jack/jack.h> +#include <jack/midiport.h> + +#include "audioinputengine.h" +#include "midimapper.h" +#include "midimapparser.h" +#include "../jackclient.h" + +class JackMidiInputEngine +	: public AudioInputEngine +	, public JackProcess { +	public: +		JackMidiInputEngine(JackClient& client); +		~JackMidiInputEngine(); +		 +		// based on AudioInputEngine +		bool isMidiEngine() override; +		bool init(Instruments& instruments) override; +		void setParm(std::string parm, std::string value) override; +		bool start() override; +		void stop() override; +		void pre() override; +		event_t* run(size_t pos, size_t len, size_t* nevents) override; +		void post() override; +		 +		// based on JackProcess +		void process(jack_nframes_t num_frames) override; +		 +	private: +		JackClient& client; +		std::unique_ptr<JackPort> port; +		 +		std::string midimap; +		MidiMapper midi_mapper; +		std::size_t pos; +		 +		event_t* list; +		size_t listsize; +}; diff --git a/drumgizmo/input/midifile.cc b/drumgizmo/input/midifile.cc index 323a198..c9aeaf8 100644 --- a/drumgizmo/input/midifile.cc +++ b/drumgizmo/input/midifile.cc @@ -137,7 +137,7 @@ event_t* MidifileInputEngine::run(size_t pos, size_t len, size_t *nevents) {  				current_event->midi_buffer[2] > 0) {  				if(evs == nullptr) { -					printf("Yet another raw owning pointer was generated by drumgizmo/input/midifile.cc - GET RID OF THEM!\n"); +					printf("Owning raw pointer at drumgizmo/input/midifile.cc - GET RID OF THEM!\n");  					evs = (event_t *)malloc(sizeof(event_t) * 1000);  				} @@ -171,7 +171,7 @@ event_t* MidifileInputEngine::run(size_t pos, size_t len, size_t *nevents) {  			offset += current_max_time;  		} else {  			if(evs == nullptr) { -				printf("Yet another raw owning pointer was generated by drumgizmo/input/midifile.cc - GET RID OF THEM!\n"); +				printf("Owning raw pointer at drumgizmo/input/midifile.cc - GET RID OF THEM!\n");  				evs = (event_t *)malloc(sizeof(event_t) * 1000);  			}  			evs[num_events].type = TYPE_STOP; diff --git a/drumgizmo/input/midifile.h b/drumgizmo/input/midifile.h index 85abfc9..6749339 100644 --- a/drumgizmo/input/midifile.h +++ b/drumgizmo/input/midifile.h @@ -30,9 +30,9 @@  #include <event.h>  #include <smf.h> -#include <audioinputengine.h> -#include <midimapper.h> -#include <midimapparser.h> +#include "audioinputengine.h" +#include "midimapper.h" +#include "midimapparser.h"  class MidifileInputEngine  	: public AudioInputEngine {  | 
