summaryrefslogtreecommitdiff
path: root/src/audioinputenginemidi.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audioinputenginemidi.cc')
-rw-r--r--src/audioinputenginemidi.cc77
1 files changed, 52 insertions, 25 deletions
diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc
index 69aeeb6..0dee346 100644
--- a/src/audioinputenginemidi.cc
+++ b/src/audioinputenginemidi.cc
@@ -100,9 +100,13 @@ bool AudioInputEngineMidi::isValid() const
static const std::uint8_t NoteOff = 0x80;
static const std::uint8_t NoteOn = 0x90;
static const std::uint8_t NoteAftertouch = 0xA0;
+static const std::uint8_t ControlChange = 0xB0;
// Note type mask:
-static int const NoteMask = 0xF0;
+static const std::uint8_t TypeMask = 0xF0;
+
+// See:
+// https://www.midi.org/specifications-old/item/table-1-summary-of-midi-message
void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer,
std::size_t midi_buffer_length,
@@ -114,38 +118,61 @@ void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer,
return;
}
- auto key = midi_buffer[1];
- auto velocity = midi_buffer[2];
- auto instrument_idx = mmap.lookup(key);
- auto instruments = mmap.lookup(key);
- for(const auto& instrument_idx : instruments)
+ switch(midi_buffer[0] & TypeMask)
{
- switch(midi_buffer[0] & NoteMask)
- {
- case NoteOff:
- // Ignore for now
- break;
+ case NoteOff:
+ // Ignore for now
+ break;
- case NoteOn:
- if(velocity != 0)
+ case NoteOn:
+ {
+ auto key = midi_buffer[1];
+ auto velocity = midi_buffer[2];
+ auto instruments = mmap.lookup(key);
+ for(const auto& instrument_idx : instruments)
{
- // 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});
+ 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, positional_information});
+ }
}
- break;
+ }
+ break;
- case NoteAftertouch:
- if(velocity > 0)
+ case NoteAftertouch:
+ {
+ auto key = midi_buffer[1];
+ auto velocity = midi_buffer[2];
+ auto instruments = mmap.lookup(key);
+ for(const auto& instrument_idx : instruments)
{
- events.push_back({EventType::Choke, (std::size_t)instrument_idx,
- offset, .0f});
+ if(velocity > 0)
+ {
+ events.push_back({EventType::Choke, (std::size_t)instrument_idx,
+ offset, .0f, .0f});
+ }
}
- break;
+ }
+ break;
- default:
- break;
+ case ControlChange:
+ {
+ auto controller_number = midi_buffer[1];
+ auto value = midi_buffer[2];
+ 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;
+ }
}
}
+
+ // Clear cached positional information.
+ positional_information = 0.0f;
}