diff options
Diffstat (limited to 'src/audioinputenginemidi.cc')
-rw-r--r-- | src/audioinputenginemidi.cc | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc index 240acc3..dd31bc9 100644 --- a/src/audioinputenginemidi.cc +++ b/src/audioinputenginemidi.cc @@ -26,6 +26,7 @@ */ #include "audioinputenginemidi.h" +#include "instrument.h" #include "midimapparser.h" #include <cassert> @@ -70,6 +71,7 @@ bool AudioInputEngineMidi::loadMidiMap(const std::string& midimap_file, for(size_t i = 0; i < instruments.size(); i++) { instrmap[instruments[i]->getName()] = static_cast<int>(i); + instrument_states[i] = InstrumentState{}; } mmap.swap(instrmap, midimap_parser.midimap); @@ -119,7 +121,8 @@ void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer, { auto key = midi_buffer[1]; // NOLINT - span auto velocity = midi_buffer[2]; // NOLINT - span - auto instruments = mmap.lookup(key); + auto map_entries = mmap.lookup(key, MapFrom::Note, MapTo::PlayInstrument); + auto instruments = mmap.lookup_instruments(map_entries); for(const auto& instrument_idx : instruments) { if(velocity != 0) @@ -130,8 +133,16 @@ void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer, assert(velocity <= 127); // MIDI only support up to 127 auto centered_velocity = (static_cast<float>(velocity) - lower_offset) / midi_velocity_max; + float position = 0.0f; + float openness = 0.0f; // TODO + auto instr_it = instrument_states.find(instrument_idx); + if(instr_it != instrument_states.end()) + { + position = instr_it->second.position; + openness = instr_it->second.openness; + } events.push_back({EventType::OnSet, (std::size_t)instrument_idx, - offset, centered_velocity, positional_information}); + offset, centered_velocity, position, openness}); } } } @@ -141,13 +152,14 @@ void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer, { auto key = midi_buffer[1]; // NOLINT - span auto velocity = midi_buffer[2]; // NOLINT - span - auto instruments = mmap.lookup(key); + auto map_entries = mmap.lookup(key, MapFrom::Note, MapTo::PlayInstrument); + auto instruments = mmap.lookup_instruments(map_entries); for(const auto& instrument_idx : instruments) { if(velocity > 0) { events.push_back({EventType::Choke, (std::size_t)instrument_idx, - offset, .0f, .0f}); + offset, .0f, .0f, .0f}); } } } @@ -157,17 +169,33 @@ void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer, { auto controller_number = midi_buffer[1]; // NOLINT - span auto value = midi_buffer[2]; // NOLINT - span - if(controller_number == 16) // positional information - { - // Store value for use in next NoteOn event. - positional_information = value / 127.0f; - // Return here to prevent reset of cached positional information. - return; + // TODO: cross-map from cc to play, etc. + auto map_entries = mmap.lookup(controller_number, + MapFrom::CC, + MapTo::InstrumentState); + for(const auto& entry : map_entries) + { + auto instrument_idx = mmap.lookup_instrument(entry.instrument_name); + if (instrument_idx >= 0) { + auto state_it = instrument_states.find(instrument_idx); + if (state_it != instrument_states.end()) { + InstrumentState &state = state_it->second; + auto const max = (float) entry.state_max; + auto const min = (float) entry.state_min; + auto const in_clamped = std::min(std::max((float)value, std::min(min, max)), std::max(min, max)); + float fvalue = (in_clamped - min) / (max - min); + if (entry.maybe_instrument_state_kind == InstrumentStateKind::Openness) { + state_it->second.openness = fvalue; + } + else if (entry.maybe_instrument_state_kind == InstrumentStateKind::Position) { + state_it->second.position = fvalue; + } + } + } } + + // TODO: the old version deleted the position cache(s) here } } - - // Clear cached positional information. - positional_information = 0.0f; } |