diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-08-08 10:34:54 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-08-08 10:34:54 +0200 | 
| commit | f43935b5c873676a632b23cbfcef45a4431b233d (patch) | |
| tree | ad1473fa34f3da5292e3344a99ed447261d99584 /src | |
| parent | a2483a839264369482fff135d33f007ded266d3c (diff) | |
Add support for a single midi note that plays multiple instruments.
Diffstat (limited to 'src')
| -rw-r--r-- | src/audioinputenginemidi.cc | 51 | ||||
| -rw-r--r-- | src/midimapparser.cc | 3 | ||||
| -rw-r--r-- | src/midimapper.cc | 24 | ||||
| -rw-r--r-- | src/midimapper.h | 16 | 
4 files changed, 53 insertions, 41 deletions
| diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc index 8732d8d..69aeeb6 100644 --- a/src/audioinputenginemidi.cc +++ b/src/audioinputenginemidi.cc @@ -117,32 +117,35 @@ void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer,  	auto key = midi_buffer[1];  	auto velocity = midi_buffer[2];  	auto instrument_idx = mmap.lookup(key); - -	switch(midi_buffer[0] & NoteMask) +	auto instruments = mmap.lookup(key); +	for(const auto& instrument_idx : instruments)  	{ -	case NoteOff: -		// Ignore for now -		break; - -	case NoteOn: -		if(velocity != 0 && instrument_idx != -1) -		{ -			// maps velocities to [.5/127, 126.5/127] -			auto centered_velocity = (velocity-.5f)/127.0f; -			events.push_back({EventType::OnSet, (std::size_t)instrument_idx, -			                  offset, centered_velocity}); -		} -		break; - -	case NoteAftertouch: -		if(velocity > 0 && instrument_idx != -1) +		switch(midi_buffer[0] & NoteMask)  		{ -			events.push_back({EventType::Choke, (std::size_t)instrument_idx, -			                  offset, .0f}); +		case NoteOff: +			// Ignore for now +			break; + +		case NoteOn: +			if(velocity != 0) +			{ +				// maps velocities to [.5/127, 126.5/127] +				auto centered_velocity = (velocity-.5f)/127.0f; +				events.push_back({EventType::OnSet, (std::size_t)instrument_idx, +				                  offset, centered_velocity}); +			} +			break; + +		case NoteAftertouch: +			if(velocity > 0) +			{ +				events.push_back({EventType::Choke, (std::size_t)instrument_idx, +				                  offset, .0f}); +			} +			break; + +		default: +			break;  		} -		break; - -	default: -		break;  	}  } diff --git a/src/midimapparser.cc b/src/midimapparser.cc index 059dfec..363e1d5 100644 --- a/src/midimapparser.cc +++ b/src/midimapparser.cc @@ -50,7 +50,8 @@ bool MidiMapParser::parseFile(const std::string& filename)  			continue;  		} -		midimap[note] = instr; +		MidimapEntry entry{note, instr}; +		midimap.push_back(entry);  	}  	return true; diff --git a/src/midimapper.cc b/src/midimapper.cc index 9593aae..b9316c5 100644 --- a/src/midimapper.cc +++ b/src/midimapper.cc @@ -26,23 +26,25 @@   */  #include "midimapper.h" -int MidiMapper::lookup(int note) +std::vector<int> MidiMapper::lookup(int note_id)  { -	std::lock_guard<std::mutex> guard(mutex); +	std::vector<int> instruments; -	auto midimap_it = midimap.find(note); -	if(midimap_it == midimap.end()) -	{ -		return -1; -	} +	std::lock_guard<std::mutex> guard(mutex); -	auto instrmap_it = instrmap.find(midimap_it->second); -	if(instrmap_it == instrmap.end()) +	for(const auto& map_entry : midimap)  	{ -		return -1; +		if(map_entry.note_id == note_id) +		{ +			auto instrmap_it = instrmap.find(map_entry.instrument_name); +			if(instrmap_it != instrmap.end()) +			{ +				instruments.push_back(instrmap_it->second); +			} +		}  	} -	return instrmap_it->second; +	return instruments;  }  void MidiMapper::swap(instrmap_t& instrmap, midimap_t& midimap) diff --git a/src/midimapper.h b/src/midimapper.h index 4673e33..94781d4 100644 --- a/src/midimapper.h +++ b/src/midimapper.h @@ -29,16 +29,22 @@  #include <map>  #include <string>  #include <mutex> +#include <vector> -typedef std::map<int, std::string> midimap_t; -typedef std::map<std::string, int> instrmap_t; +struct MidimapEntry +{ +	int note_id; +	std::string instrument_name; +}; + +using midimap_t = std::vector<MidimapEntry>; +using instrmap_t = std::map<std::string, int>;  class MidiMapper  {  public: -	//! Lookup note in map and return its index. -	//! \returns -1 if not found or the note index. -	int lookup(int note); +	//! Lookup note in map and returns the corresponding instrument index list. +	std::vector<int> lookup(int note_id);  	//! Set new map sets.  	void swap(instrmap_t& instrmap, midimap_t& midimap); | 
