/*
Copyright (C) 1998 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
the Free Software Foundation; either version 2 of the License, or
#include "pbd/signals.h"
+#include "midi++/libmidi_visibility.h"
#include "midi++/types.h"
namespace MIDI {
-class PortBase;
+class Port;
class Parser;
typedef PBD::Signal1<void,Parser&> ZeroByteSignal;
+typedef PBD::Signal2<void,Parser&,unsigned short> BankSignal;
typedef PBD::Signal2<void,Parser&,framecnt_t> TimestampedSignal;
typedef PBD::Signal2<void,Parser&, byte> OneByteSignal;
typedef PBD::Signal2<void,Parser &, EventTwoBytes *> TwoByteSignal;
typedef PBD::Signal2<void,Parser &, pitchbend_t> PitchBendSignal;
+typedef PBD::Signal3<void,Parser &, uint16_t, int> RPNSignal;
+typedef PBD::Signal3<void,Parser &, uint16_t, float> RPNValueSignal;
typedef PBD::Signal3<void,Parser &, byte *, size_t> Signal;
-class Parser {
+class LIBMIDIPP_API Parser {
public:
- Parser (PortBase &p);
+ Parser ();
~Parser ();
/* sets the time that will be reported for any MTC or MIDI Clock
message the next time ::scanner() parses such a message. It should
therefore be set before every byte passed into ::scanner().
*/
-
+
framecnt_t get_timestamp() const { return _timestamp; }
- void set_timestamp (const framecnt_t timestamp) { _timestamp = timestamp; }
+ void set_timestamp (const framecnt_t timestamp) { _timestamp = timestamp; }
/* signals that anyone can connect to */
-
- OneByteSignal bank_change;
+
+ BankSignal bank_change;
TwoByteSignal note_on;
TwoByteSignal note_off;
TwoByteSignal poly_pressure;
PitchBendSignal pitchbend;
TwoByteSignal controller;
- OneByteSignal channel_bank_change[16];
+ BankSignal channel_bank_change[16];
TwoByteSignal channel_note_on[16];
TwoByteSignal channel_note_off[16];
TwoByteSignal channel_poly_pressure[16];
TwoByteSignal channel_controller[16];
ZeroByteSignal channel_active_preparse[16];
ZeroByteSignal channel_active_postparse[16];
+ RPNValueSignal channel_rpn[16];
+ RPNValueSignal channel_nrpn[16];
+ RPNSignal channel_rpn_change[16];
+ RPNSignal channel_nrpn_change[16];
OneByteSignal mtc_quarter_frame; /* see below for more useful signals */
Signal mtc;
const char *midi_event_type_name (MIDI::eventType);
void trace (bool onoff, std::ostream *o, const std::string &prefix = "");
bool tracing() { return trace_stream != 0; }
- PortBase &port() { return _port; }
void set_offline (bool);
bool offline() const { return _offline; }
MTC_Status mtc_running() const { return _mtc_running; }
const byte *mtc_current() const { return _mtc_time; }
bool mtc_locked() const { return _mtc_locked; }
-
+
PBD::Signal3<void, Parser &, int, framecnt_t> mtc_qtr;
PBD::Signal3<void, const byte *, bool, framecnt_t> mtc_time;
PBD::Signal1<void, MTC_Status> mtc_status;
}
void reset_mtc_state ();
-
+
private:
- PortBase&_port;
/* tracing */
-
+
std::ostream *trace_stream;
std::string trace_prefix;
void trace_event (Parser &p, byte *msg, size_t len);
size_t message_counter[256];
- enum ParseState {
+ enum ParseState {
NEEDSTATUS,
NEEDONEBYTE,
NEEDTWOBYTES,
MTC_Status _mtc_running;
bool _mtc_locked;
byte last_qtr_frame;
-
+
framecnt_t _timestamp;
ParseState pre_variable_state;