From fa0f4a2af7ef1c900e279ead72122f9d652b6959 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Tue, 26 Jan 2021 20:31:31 +0100 Subject: Add positional information to drumkit xml and sample class. --- src/audioinputenginemidi.cc | 77 ++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 25 deletions(-) (limited to 'src/audioinputenginemidi.cc') 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; } -- cgit v1.2.3