From 723343269d161b2bba7aee4597357ffc32f26f04 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Mon, 8 Apr 2019 17:42:00 +0200 Subject: Move midi note process to one common place in AudioInputEngineMidi::processNote and use it in the four input engines (plugin, midifile, ossmidi and jackmidi) --- src/audioinputenginemidi.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++ src/audioinputenginemidi.h | 5 +++++ 2 files changed, 54 insertions(+) (limited to 'src') diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc index 6e76f19..7b8cbcb 100644 --- a/src/audioinputenginemidi.cc +++ b/src/audioinputenginemidi.cc @@ -95,3 +95,52 @@ bool AudioInputEngineMidi::isValid() const { return is_valid; } + +// Note types: +static const std::uint8_t NoteOff = 0x80; +static const std::uint8_t NoteOn = 0x90; +static const std::uint8_t NoteAftertouch = 0xA0; + +// Note type mask: +static int const NoteMask = 0xF0; + +void AudioInputEngineMidi::processNote(const std::uint8_t* midi_buffer, + std::size_t midi_buffer_length, + std::size_t offset, + std::vector& events) +{ + if(midi_buffer_length != 3) + { + return; + } + + auto key = midi_buffer[1]; + auto velocity = midi_buffer[2]; + auto instrument_idx = mmap.lookup(key); + + switch(midi_buffer[0] & NoteMask) + { + case NoteOff: + // Ignore for now + break; + + case NoteOn: + if(instrument_idx != -1) + { + events.push_back({EventType::OnSet, (std::size_t)instrument_idx, + offset, velocity / 127.0f}); + } + break; + + case NoteAftertouch: + if(velocity == 0 && instrument_idx != -1) + { + events.push_back({EventType::Choke, (std::size_t)instrument_idx, + offset, .0f}); + } + break; + + default: + break; + } +} diff --git a/src/audioinputenginemidi.h b/src/audioinputenginemidi.h index e02ba21..8da7bd2 100644 --- a/src/audioinputenginemidi.h +++ b/src/audioinputenginemidi.h @@ -57,6 +57,11 @@ public: bool isValid() const; + void processNote(const std::uint8_t* note_data, + std::size_t note_data_size, + std::size_t offset, + std::vector& events); + protected: MidiMapper mmap; -- cgit v1.2.3