diff options
Diffstat (limited to 'libs/ardour/midi_diskstream.cc')
-rw-r--r-- | libs/ardour/midi_diskstream.cc | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index f8d9f1eb58..6eaf01c819 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -52,6 +52,8 @@ #include "ardour/smf_source.h" #include "ardour/utils.h" +#include "midi++/types.h" + #include "i18n.h" #include <locale.h> @@ -419,6 +421,173 @@ MidiDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframe last_possibly_recording = possibly_recording; } +static void +trace_midi (ostream& o, MIDI::byte *msg, size_t len) +{ + using namespace MIDI; + eventType type; + const char trace_prefix = ':'; + + type = (eventType) (msg[0]&0xF0); + + switch (type) { + case off: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " NoteOff NoteNum " + << (int) msg[1] + << " Vel " + << (int) msg[2] + << endl; + break; + + case on: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " NoteOn NoteNum " + << (int) msg[1] + << " Vel " + << (int) msg[2] + << endl; + break; + + case polypress: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " PolyPressure" + << (int) msg[1] + << endl; + break; + + case MIDI::controller: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " Controller " + << (int) msg[1] + << " Value " + << (int) msg[2] + << endl; + break; + + case program: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " Program Change ProgNum " + << (int) msg[1] + << endl; + break; + + case chanpress: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " Channel Pressure " + << (int) msg[1] + << endl; + break; + + case MIDI::pitchbend: + o << trace_prefix + << "Channel " + << (msg[0]&0xF)+1 + << " Pitch Bend " + << ((msg[2]<<7)|msg[1]) + << endl; + break; + + case MIDI::sysex: + if (len == 1) { + switch (msg[0]) { + case 0xf8: + o << trace_prefix + << "Clock" + << endl; + break; + case 0xfa: + o << trace_prefix + << "Start" + << endl; + break; + case 0xfb: + o << trace_prefix + << "Continue" + << endl; + break; + case 0xfc: + o << trace_prefix + << "Stop" + << endl; + break; + case 0xfe: + o << trace_prefix + << "Active Sense" + << endl; + break; + case 0xff: + o << trace_prefix + << "System Reset" + << endl; + break; + default: + o << trace_prefix + << "System Exclusive (1 byte : " << hex << (int) *msg << dec << ')' + << endl; + break; + } + } else { + o << trace_prefix + << "System Exclusive (" << len << ") = [ " << hex; + for (unsigned int i = 0; i < len; ++i) { + o << (int) msg[i] << ' '; + } + o << dec << ']' << endl; + + } + break; + + case MIDI::song: + o << trace_prefix << "Song" << endl; + break; + + case MIDI::tune: + o << trace_prefix << "Tune" << endl; + break; + + case MIDI::eox: + o << trace_prefix << "End-of-System Exclusive" << endl; + break; + + case MIDI::timing: + o << trace_prefix << "Timing" << endl; + break; + + case MIDI::start: + o << trace_prefix << "Start" << endl; + break; + + case MIDI::stop: + o << trace_prefix << "Stop" << endl; + break; + + case MIDI::contineu: + o << trace_prefix << "Continue" << endl; + break; + + case active: + o << trace_prefix << "Active Sense" << endl; + break; + + default: + o << trace_prefix << "Unrecognized MIDI message" << endl; + break; + } +} + int MidiDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can_record, bool rec_monitors_input) { |