diff options
-rw-r--r-- | drumgizmo/input/jackmidi.cc | 20 | ||||
-rw-r--r-- | drumgizmo/input/midifile.cc | 27 | ||||
-rw-r--r-- | src/audioinputenginemidi.cc | 3 | ||||
-rw-r--r-- | src/audioinputenginemidi.h | 5 | ||||
-rw-r--r-- | src/midiprocessor.cc | 60 | ||||
-rw-r--r-- | src/midiprocessor.h | 42 |
6 files changed, 121 insertions, 36 deletions
diff --git a/drumgizmo/input/jackmidi.cc b/drumgizmo/input/jackmidi.cc index 7c5cf1c..0839ae3 100644 --- a/drumgizmo/input/jackmidi.cc +++ b/drumgizmo/input/jackmidi.cc @@ -118,22 +118,14 @@ void JackMidiInputEngine::process(jack_nframes_t num_frames) { jack_midi_event_t event; jack_midi_event_get(&event, buffer, i); - if(event.size != 3) - { + + event_t out; + if (!midi_processor(event.size, event.buffer, out)) { + // unsupported event continue; } - if((event.buffer[0] & NOTE_ON) != NOTE_ON) - { - continue; - } - int key = event.buffer[1]; - int velocity = event.buffer[2]; - printf("Event key:%d vel:%d\n", key, velocity); - int k = mmap.lookup(key); - if(k != -1 && velocity) - { - events.push_back({TYPE_ONSET, (size_t)k, event.time, velocity / 127.f}); - } + out.offset = event.time; + events.push_back(out); } jack_midi_clear_buffer(buffer); pos += num_frames; diff --git a/drumgizmo/input/midifile.cc b/drumgizmo/input/midifile.cc index 89ffa6b..6d09f36 100644 --- a/drumgizmo/input/midifile.cc +++ b/drumgizmo/input/midifile.cc @@ -146,27 +146,14 @@ void MidifileInputEngine::run(size_t pos, size_t len, std::vector<event_t>& even { if(!smf_event_is_metadata(current_event)) { - if((current_event->midi_buffer_length == 3) && - ((current_event->midi_buffer[0] & NOTE_ON) == NOTE_ON) && - (track == -1 || current_event->track_number == track) && - current_event->midi_buffer[2] > 0) - { - int key = current_event->midi_buffer[1]; - int velocity = current_event->midi_buffer[2]; - - events.emplace_back(); - auto& event = events.back(); - event.type = TYPE_ONSET; - size_t evpos = current_event->time_seconds * (samplerate / speed); - event.offset = evpos - pos; - - int i = mmap.lookup(key); - if(i != -1) - { - event.instrument = i; - event.velocity = velocity / 127.0; - } + event_t out; + if (!midi_processor(current_event->midi_buffer_length, current_event->midi_buffer, out)) { + // unsupported event + continue; } + std::size_t evpos = current_event->time_seconds * (samplerate / speed); + out.offset = evpos - pos; + events.push_back(out); } current_event = smf_get_next_event(smf); diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc index 3ac2a96..44a7354 100644 --- a/src/audioinputenginemidi.cc +++ b/src/audioinputenginemidi.cc @@ -33,7 +33,8 @@ #include <hugin.hpp> AudioInputEngineMidi::AudioInputEngineMidi() - : refs(REFSFILE) + : midi_processor{mmap} + , refs(REFSFILE) { is_valid = false; } diff --git a/src/audioinputenginemidi.h b/src/audioinputenginemidi.h index 19f7da4..ffa8018 100644 --- a/src/audioinputenginemidi.h +++ b/src/audioinputenginemidi.h @@ -32,6 +32,7 @@ #include "midimapper.h" #include "instrument.h" #include "configfile.h" +#include "midiprocessor.h" class AudioInputEngineMidi : public AudioInputEngine @@ -59,8 +60,10 @@ public: protected: MidiMapper mmap; - + private: + MidiProcessor midi_processor; + std::string midimap; bool is_valid; diff --git a/src/midiprocessor.cc b/src/midiprocessor.cc new file mode 100644 index 0000000..1cf9f49 --- /dev/null +++ b/src/midiprocessor.cc @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * midiprocessor.cc + * + * Thu May 12 09:41:25 CEST 2016 + * Copyright 2016 Christian Glöckner + * cgloeckner@freenet.de + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "midiprocessor.h" + +MidiProcessor::MidiProcessor(MidiMapper& midi_mapper) + : midi_mapper{midi_mapper} { +} + +bool MidiProcessor::operator()(std::size_t size, unsigned char const * buffer, event_t& out) { + if (size != 3u) { + // not enough data + return false; + } + + // determine event type + switch (buffer[0] & 0xF0) { + case 0x90: + out.type = TYPE_ONSET; + break; + + default: + // yet unsupported type + return false; + } + + // lookup instrument + int instr = midi_mapper.lookup(buffer[1]); + if (instr == -1) { + // key does not map to an instrument + return false; + } + + out.instrument = (std::size_t)instr; + out.velocity = buffer[2] / 127.0; + return true; +} diff --git a/src/midiprocessor.h b/src/midiprocessor.h new file mode 100644 index 0000000..7254375 --- /dev/null +++ b/src/midiprocessor.h @@ -0,0 +1,42 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * midiprocessor.h + * + * Thu May 12 08:20:49 CEST 2016 + * Copyright 2016 Christian Glöckner + * cgloeckner@freenet.de + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#pragma once +#include <vector> + +#include "event.h" +#include "midimapper.h" + +class MidiProcessor { +private: + MidiMapper& midi_mapper; + +public: + MidiProcessor(MidiMapper& midi_mapper); + + bool operator()(std::size_t size, unsigned char const * buffer, event_t& out); +}; + |