X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fmidi%2B%2B2%2Fmidi%2B%2B%2Fchannel.h;h=6bd08073b371c9518a5d21e715ae2d2abf2535bd;hb=965def3caf1250679cb83ee115db49e156acebce;hp=02c16e67297cf2f2198a3b8fea06121689264379;hpb=8648a8a13b04549362f14a0738947d997ef1abc7;p=ardour.git diff --git a/libs/midi++2/midi++/channel.h b/libs/midi++2/midi++/channel.h index 02c16e6729..6bd08073b3 100644 --- a/libs/midi++2/midi++/channel.h +++ b/libs/midi++2/midi++/channel.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1998-99 Paul Barton-Davis + Copyright (C) 1998-99 Paul Barton-Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #define __midichannel_h__ #include +#include #include "pbd/signals.h" #include "midi++/parser.h" @@ -42,28 +43,28 @@ class LIBMIDIPP_API Channel : public PBD::ScopedConnectionList { Port &midi_port() { return _port; } byte channel() { return _channel_number; } byte program() { return _program_number; } - byte bank() { return _bank_number; } + unsigned short bank() { return _bank_number; } byte pressure () { return _chanpress; } byte poly_pressure (byte n) { return _polypress[n]; } - byte last_note_on () { + byte last_note_on () { return _last_note_on; } - byte last_on_velocity () { + byte last_on_velocity () { return _last_on_velocity; } - byte last_note_off () { + byte last_note_off () { return _last_note_off; } - byte last_off_velocity () { + byte last_off_velocity () { return _last_off_velocity; } - pitchbend_t pitchbend () { + pitchbend_t pitchbend () { return _pitch_bend; } - controller_value_t controller_value (byte n) { + controller_value_t controller_value (byte n) { return _controller_val[n%128]; } @@ -75,23 +76,26 @@ class LIBMIDIPP_API Channel : public PBD::ScopedConnectionList { _controller_val[n%128] = val; } + controller_value_t rpn_value (uint16_t rpn_id); + controller_value_t nrpn_value (uint16_t rpn_id); + bool channel_msg (byte id, byte val1, byte val2, timestamp_t timestamp); bool all_notes_off (timestamp_t timestamp) { return channel_msg (MIDI::controller, 123, 0, timestamp); } - + bool control (byte id, byte value, timestamp_t timestamp) { return channel_msg (MIDI::controller, id, value, timestamp); } - + bool note_on (byte note, byte velocity, timestamp_t timestamp) { return channel_msg (MIDI::on, note, velocity, timestamp); } - + bool note_off (byte note, byte velocity, timestamp_t timestamp) { return channel_msg (MIDI::off, note, velocity, timestamp); } - + bool aftertouch (byte value, timestamp_t timestamp) { return channel_msg (MIDI::chanpress, value, 0, timestamp); } @@ -108,6 +112,11 @@ class LIBMIDIPP_API Channel : public PBD::ScopedConnectionList { return channel_msg (MIDI::pitchbend, lsb, msb, timestamp); } + float rpn_value (uint16_t rpn) const; + float nrpn_value (uint16_t nrpn) const; + float rpn_value_absolute (uint16_t rpn) const; + float nrpn_value_absolute (uint16_t nrpn) const; + protected: friend class Port; void connect_signals (); @@ -115,14 +124,26 @@ class LIBMIDIPP_API Channel : public PBD::ScopedConnectionList { private: Port& _port; + enum RPNState { + HaveLSB = 0x1, + HaveMSB = 0x2, + HaveValue = 0x4 + }; + /* Current channel values */ byte _channel_number; - byte _bank_number; + unsigned short _bank_number; byte _program_number; byte _rpn_msb; byte _rpn_lsb; + byte _rpn_val_msb; + byte _rpn_val_lsb; byte _nrpn_msb; byte _nrpn_lsb; + byte _nrpn_val_lsb; + byte _nrpn_val_msb; + RPNState _rpn_state; + RPNState _nrpn_state; byte _chanpress; byte _polypress[128]; bool _controller_14bit[128]; @@ -139,8 +160,13 @@ class LIBMIDIPP_API Channel : public PBD::ScopedConnectionList { bool _mono; size_t _notes_on; + typedef std::map RPNList; + + RPNList rpns; + RPNList nrpns; + void reset (timestamp_t timestamp, framecnt_t nframes, bool notes_off = true); - + void process_note_off (Parser &, EventTwoBytes *); void process_note_on (Parser &, EventTwoBytes *); void process_controller (Parser &, EventTwoBytes *); @@ -149,6 +175,14 @@ class LIBMIDIPP_API Channel : public PBD::ScopedConnectionList { void process_chanpress (Parser &, byte); void process_pitchbend (Parser &, pitchbend_t); void process_reset (Parser &); + bool maybe_process_rpns (Parser&, EventTwoBytes *); + + void rpn_reset (); + void nrpn_reset (); + + static const RPNState RPN_READY_FOR_VALUE; + static const RPNState RPN_VALUE_READY; + }; } // namespace MIDI