summaryrefslogtreecommitdiff
path: root/src/audioinputenginemidi.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audioinputenginemidi.cc')
-rw-r--r--src/audioinputenginemidi.cc54
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;
}