diff options
Diffstat (limited to 'drumgizmo/input')
| -rw-r--r-- | drumgizmo/input/inputdummy.cc | 29 | ||||
| -rw-r--r-- | drumgizmo/input/inputdummy.h | 28 | ||||
| -rw-r--r-- | drumgizmo/input/jackmidi.cc | 99 | ||||
| -rw-r--r-- | drumgizmo/input/jackmidi.h | 59 | ||||
| -rw-r--r-- | drumgizmo/input/midifile.cc | 166 | ||||
| -rw-r--r-- | drumgizmo/input/midifile.h | 54 | 
6 files changed, 224 insertions, 211 deletions
| diff --git a/drumgizmo/input/inputdummy.cc b/drumgizmo/input/inputdummy.cc index f078cd5..f2d33b7 100644 --- a/drumgizmo/input/inputdummy.cc +++ b/drumgizmo/input/inputdummy.cc @@ -26,33 +26,24 @@   */  #include "inputdummy.h" -DummyInputEngine::DummyInputEngine() { -} +DummyInputEngine::DummyInputEngine() {} -DummyInputEngine::~DummyInputEngine() { -} +DummyInputEngine::~DummyInputEngine() {} -bool DummyInputEngine::init(Instruments& instruments) { -	return true; -} +bool DummyInputEngine::init(Instruments &instruments) { return true; } -void DummyInputEngine::setParm(std::string parm, std::string value) { -} +void DummyInputEngine::setParm(std::string parm, std::string value) {} -bool DummyInputEngine::start() { -	return true; -} +bool DummyInputEngine::start() { return true; } -void DummyInputEngine::stop() { -} +void DummyInputEngine::stop() {} -void DummyInputEngine::pre() { -} +void DummyInputEngine::pre() {} -event_t* DummyInputEngine::run(size_t pos, size_t len, size_t *nevents) { +event_t *DummyInputEngine::run(size_t pos, size_t len, size_t *nevents) +{  	nevents = 0u;  	return nullptr;  } -void DummyInputEngine::post() { -} +void DummyInputEngine::post() {} diff --git a/drumgizmo/input/inputdummy.h b/drumgizmo/input/inputdummy.h index b047ba7..fb84443 100644 --- a/drumgizmo/input/inputdummy.h +++ b/drumgizmo/input/inputdummy.h @@ -27,18 +27,18 @@  #pragma once  #include <audioinputengine.h> -class DummyInputEngine -	: public AudioInputEngine { -	public: -		DummyInputEngine(); -		~DummyInputEngine(); -		 -		// based on AudioInputEngine -		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; +class DummyInputEngine : public AudioInputEngine +{ +public: +	DummyInputEngine(); +	~DummyInputEngine(); + +	// based on AudioInputEngine +	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;  }; diff --git a/drumgizmo/input/jackmidi.cc b/drumgizmo/input/jackmidi.cc index ba4e8b3..5ae6add 100644 --- a/drumgizmo/input/jackmidi.cc +++ b/drumgizmo/input/jackmidi.cc @@ -32,101 +32,103 @@  int const NOTE_ON = 0x90; -JackMidiInputEngine::JackMidiInputEngine(JackClient& client) -	: AudioInputEngine{} -	, JackProcess{} -	, client(client) -	, port{nullptr} -	, midimap{} -	, midi_mapper{} -	, pos{0u} -	, list{nullptr} -	, listsize{0u} { +JackMidiInputEngine::JackMidiInputEngine(JackClient &client) +    : AudioInputEngine{}, JackProcess{}, client(client), port{nullptr}, +      midimap{}, midi_mapper{}, pos{0u}, list{nullptr}, listsize{0u} +{  	client.add(*this);  } -JackMidiInputEngine::~JackMidiInputEngine() { -	client.remove(*this); -} +JackMidiInputEngine::~JackMidiInputEngine() { client.remove(*this); } -bool JackMidiInputEngine::isMidiEngine() { -	return true; -} +bool JackMidiInputEngine::isMidiEngine() { return true; } -bool JackMidiInputEngine::init(Instruments& instruments) { -	if (midimap == "") { +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"; +	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) { +	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); +	                                  JACK_DEFAULT_MIDI_TYPE, JackPortIsInput);  	return true;  } -void JackMidiInputEngine::setParm(std::string parm, std::string value) { -	if (parm == "midimap") { +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"; +	} +	else +	{ +		std::cerr << "[JackMidiInputEngine] Unsupported parameter '" << parm +		          << "'\n";  	}  } -bool JackMidiInputEngine::start() { +bool JackMidiInputEngine::start() +{  	client.activate();  	return true;  } -void JackMidiInputEngine::stop() { -} +void JackMidiInputEngine::stop() {} -void JackMidiInputEngine::pre() { -} +void JackMidiInputEngine::pre() {} -event_t* JackMidiInputEngine::run(size_t pos, size_t len, size_t* nevents) { +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"); +	event_t *l = list; +	printf("Owning raw pointer at drumgizmo/input/jackmidi.cc - GET RID OF " +	       "THEM!\n");  	list = (event_t *)malloc(sizeof(event_t) * 1000);  	listsize = 0;  	return l;  } -void JackMidiInputEngine::post() { -} +void JackMidiInputEngine::post() {} -void JackMidiInputEngine::process(jack_nframes_t num_frames) { +void JackMidiInputEngine::process(jack_nframes_t num_frames) +{  	assert(port != nullptr); -	void* buffer = jack_port_get_buffer(port->port, num_frames); +	void *buffer = jack_port_get_buffer(port->port, num_frames);  	jack_nframes_t num_events = jack_midi_get_event_count(buffer); -	for(jack_nframes_t i = 0; i < num_events; ++i) { +	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) { +		if (event.size != 3) +		{  			continue;  		} -		if((event.buffer[0] & NOTE_ON) != NOTE_ON) { +		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) { +		if (k != -1 && velocity) +		{  			list[listsize].type = TYPE_ONSET;  			list[listsize].instrument = k;  			list[listsize].velocity = velocity / 127.0; @@ -139,8 +141,7 @@ void JackMidiInputEngine::process(jack_nframes_t num_frames) {  }  /* -		DrumKit* kit; -		size_t pos; -		EventQueue *eventqueue; +    DrumKit* kit; +    size_t pos; +    EventQueue *eventqueue;  */ - diff --git a/drumgizmo/input/jackmidi.h b/drumgizmo/input/jackmidi.h index 3c64f2d..41a3e55 100644 --- a/drumgizmo/input/jackmidi.h +++ b/drumgizmo/input/jackmidi.h @@ -34,34 +34,33 @@  #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; +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 c9aeaf8..0cc9dea 100644 --- a/drumgizmo/input/midifile.cc +++ b/drumgizmo/input/midifile.cc @@ -31,116 +31,131 @@  int const NOTE_ON = 0x90;  MidifileInputEngine::MidifileInputEngine() -	: smf{nullptr} -	, current_event{nullptr} -	, file{} -	, midimap{} -	, speed{1.f} -	, track{-1} // all tracks -	, loop{false} -	, offset{0.0} { +    : smf{nullptr}, current_event{nullptr}, file{}, midimap{}, speed{1.f}, +      track{-1} // all tracks +      , +      loop{false}, offset{0.0} +{  } -MidifileInputEngine::~MidifileInputEngine() { -	if (smf != nullptr) { +MidifileInputEngine::~MidifileInputEngine() +{ +	if (smf != nullptr) +	{  		smf_delete(smf);  	}  } -bool MidifileInputEngine::isMidiEngine() { -	return true; -} +bool MidifileInputEngine::isMidiEngine() { return true; } -bool MidifileInputEngine::init(Instruments& instruments) { -	if (file == "") { +bool MidifileInputEngine::init(Instruments &instruments) +{ +	if (file == "") +	{  		std::cerr << "[MidifileInputEngine] Missing midi filename\n";  		return false;  	} -	if (midimap == "") { +	if (midimap == "") +	{  		std::cerr << "[MidifileInputEngine] Missing midimap filename\n";  		return false;  	}  	smf = smf_load(file.c_str()); -	if (smf == nullptr) { -		std::cerr << "[MidifileInputEngine] Failed to load midifile '" -			<< file << "'\n"; +	if (smf == nullptr) +	{ +		std::cerr << "[MidifileInputEngine] Failed to load midifile '" << file +		          << "'\n";  		return false;  	}  	MidiMapParser p{midimap}; -	if (p.parse()) { -		std::cerr << "[MidifileInputEngine] Failed to parse midimap '" -			<< midimap << "'\n"; +	if (p.parse()) +	{ +		std::cerr << "[MidifileInputEngine] Failed to parse midimap '" << midimap +		          << "'\n";  		return false;  	}  	midi_mapper.midimap = p.midimap; -	for (auto i = 0u; i < instruments.size(); ++i) { +	for (auto i = 0u; i < instruments.size(); ++i) +	{  		auto name = instruments[i]->name();  		midi_mapper.instrmap[name] = i;  	}  	return true;  } -void MidifileInputEngine::setParm(std::string parm, std::string value) { -	if(parm == "file") { +void MidifileInputEngine::setParm(std::string parm, std::string value) +{ +	if (parm == "file") +	{  		// apply midi input filename  		file = value; -		 -	} else if(parm == "speed") { +	} +	else if (parm == "speed") +	{  		// try to apply speed -		 try { +		try +		{  			speed = std::stof(value); -		} catch (...) { -			std::cerr << "[MidifileInputEngine] Invalid speed " -				<< value << "\n";  		} -	} else if (parm == "midimap") { +		catch (...) +		{ +			std::cerr << "[MidifileInputEngine] Invalid speed " << value << "\n"; +		} +	} +	else if (parm == "midimap") +	{  		// apply midimap filename  		midimap = value; -		 -	} else if (parm == "loop") { +	} +	else if (parm == "loop") +	{  		// apply looping  		loop = true; -		 -	} else { -		std::cerr << "[MidifileInputEngine] Unsupported parameter '" -			<< parm << "'\n"; +	} +	else +	{ +		std::cerr << "[MidifileInputEngine] Unsupported parameter '" << parm +		          << "'\n";  	}  } -bool MidifileInputEngine::start() { -	return true; -} +bool MidifileInputEngine::start() { return true; } -void MidifileInputEngine::stop() { -} +void MidifileInputEngine::stop() {} -void MidifileInputEngine::pre() { -} +void MidifileInputEngine::pre() {} -event_t* MidifileInputEngine::run(size_t pos, size_t len, size_t *nevents) { -	event_t* evs{nullptr}; +event_t *MidifileInputEngine::run(size_t pos, size_t len, size_t *nevents) +{ +	event_t *evs{nullptr};  	size_t num_events{0u}; -	 +  	double current_max_time = (1.0 + pos + len) / (44100.0 / speed);  	current_max_time -= offset;  	//  double cur_min_time = (double)(pos) / (44100.0 / speed); -	 -	if(!current_event) { + +	if (!current_event) +	{  		current_event = smf_get_next_event(smf);  	} -	 -	while(current_event && current_event->time_seconds < current_max_time) { -		if(!smf_event_is_metadata(current_event)) { -			if( (current_event->midi_buffer_length == 3) && -				((current_event->midi_buffer[0] & NOTE_ON) == NOTE_ON) && -				(track == -1 || current_event->track_number == track) && -				current_event->midi_buffer[2] > 0) { -				 -				if(evs == nullptr) { -					printf("Owning raw pointer at drumgizmo/input/midifile.cc - GET RID OF THEM!\n"); + +	while (current_event && current_event->time_seconds < current_max_time) +	{ +		if (!smf_event_is_metadata(current_event)) +		{ +			if ((current_event->midi_buffer_length == 3) && +			    ((current_event->midi_buffer[0] & NOTE_ON) == NOTE_ON) && +			    (track == -1 || current_event->track_number == track) && +			    current_event->midi_buffer[2] > 0) +			{ + +				if (evs == nullptr) +				{ +					printf("Owning raw pointer at drumgizmo/input/midifile.cc - GET RID " +					       "OF THEM!\n");  					evs = (event_t *)malloc(sizeof(event_t) * 1000);  				} -				 +  				int key = current_event->midi_buffer[1];  				int velocity = current_event->midi_buffer[2]; @@ -149,29 +164,37 @@ event_t* MidifileInputEngine::run(size_t pos, size_t len, size_t *nevents) {  				evs[num_events].offset = evpos - pos;  				int i = midi_mapper.lookup(key); -				if(i != -1) { +				if (i != -1) +				{  					evs[num_events].instrument = i;  					evs[num_events].velocity = velocity / 127.0; -         +  					++num_events; -					if(num_events > 999) { +					if (num_events > 999) +					{  						fprintf(stderr, "PANIC!\n");  						break;  					}  				}  			}  		} -     +  		current_event = smf_get_next_event(smf);  	} -	if(!current_event) { -		if(loop) { +	if (!current_event) +	{ +		if (loop) +		{  			smf_rewind(smf);  			offset += current_max_time; -		} else { -			if(evs == nullptr) { -				printf("Owning raw pointer at drumgizmo/input/midifile.cc - GET RID OF THEM!\n"); +		} +		else +		{ +			if (evs == nullptr) +			{ +				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; @@ -183,5 +206,4 @@ event_t* MidifileInputEngine::run(size_t pos, size_t len, size_t *nevents) {  	return evs;  } -void MidifileInputEngine::post() { -} +void MidifileInputEngine::post() {} diff --git a/drumgizmo/input/midifile.h b/drumgizmo/input/midifile.h index 6749339..5efcc72 100644 --- a/drumgizmo/input/midifile.h +++ b/drumgizmo/input/midifile.h @@ -34,31 +34,31 @@  #include "midimapper.h"  #include "midimapparser.h" -class MidifileInputEngine -	: public AudioInputEngine { -	public: -		MidifileInputEngine(); -		~MidifileInputEngine(); -		 -		// 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; -		 -	private: -		smf_t* smf; -		smf_event_t* current_event; -		 -		MidiMapper midi_mapper; -		 -		std::string file, midimap; -		float speed; -		int track; -		bool loop; -		double offset; +class MidifileInputEngine : public AudioInputEngine +{ +public: +	MidifileInputEngine(); +	~MidifileInputEngine(); + +	// 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; + +private: +	smf_t *smf; +	smf_event_t *current_event; + +	MidiMapper midi_mapper; + +	std::string file, midimap; +	float speed; +	int track; +	bool loop; +	double offset;  }; | 
