Ardour  8.12
parser.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1998-2018 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2005-2006 Taybin Rutkin <taybin@taybin.com>
4  * Copyright (C) 2009 David Robillard <d@drobilla.net>
5  * Copyright (C) 2015-2019 Robin Gareus <robin@gareus.org>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #ifndef __midi_parse_h__
23 #define __midi_parse_h__
24 
25 #include <string>
26 #include <iostream>
27 
28 #include "pbd/signals.h"
29 
31 #include "midi++/types.h"
32 
33 namespace MIDI {
34 
35 class Port;
36 class Parser;
37 
38 typedef PBD::Signal1<void,Parser&> ZeroByteSignal;
39 typedef PBD::Signal2<void,Parser&,unsigned short> BankSignal;
40 typedef PBD::Signal2<void,Parser&,samplecnt_t> TimestampedSignal;
41 typedef PBD::Signal2<void,Parser&, byte> OneByteSignal;
42 typedef PBD::Signal2<void,Parser &, EventTwoBytes *> TwoByteSignal;
43 typedef PBD::Signal2<void,Parser &, pitchbend_t> PitchBendSignal;
44 typedef PBD::Signal3<void,Parser &, uint16_t, int> RPNSignal;
45 typedef PBD::Signal3<void,Parser &, uint16_t, float> RPNValueSignal;
46 typedef PBD::Signal3<void,Parser &, byte *, size_t> Signal;
47 typedef PBD::Signal4<void,Parser &, byte *, size_t, samplecnt_t> AnySignal;
48 
50  public:
51  Parser ();
52  ~Parser ();
53 
54  /* sets the time that will be reported for any MTC or MIDI Clock
55  message the next time ::scanner() parses such a message. It should
56  therefore be set before every byte passed into ::scanner().
57  */
58 
59  samplecnt_t get_timestamp() const { return _timestamp; }
60  void set_timestamp (const samplecnt_t timestamp) { _timestamp = timestamp; }
61 
62  /* signals that anyone can connect to */
63 
72 
73  BankSignal channel_bank_change[16];
74  TwoByteSignal channel_note_on[16];
75  TwoByteSignal channel_note_off[16];
76  TwoByteSignal channel_poly_pressure[16];
77  OneByteSignal channel_pressure[16];
78  OneByteSignal channel_program_change[16];
79  PitchBendSignal channel_pitchbend[16];
80  TwoByteSignal channel_controller[16];
81  ZeroByteSignal channel_active_preparse[16];
82  ZeroByteSignal channel_active_postparse[16];
83  RPNValueSignal channel_rpn[16];
84  RPNValueSignal channel_nrpn[16];
85  RPNSignal channel_rpn_change[16];
86  RPNSignal channel_nrpn_change[16];
87 
88  OneByteSignal mtc_quarter_frame; /* see below for more useful signals */
97 
103 
105  TimestampedSignal tick; /* rarely seen in the wild */
108  TimestampedSignal contineu; /* note spelling */
109 
110  /* This should really be protected, but then derivatives of Port
111  can't access it.
112  */
113 
114  void scanner (byte c);
115 
116  size_t *message_counts() { return message_counter; }
118  void trace (bool onoff, std::ostream *o, const std::string &prefix = "");
119  bool tracing() { return trace_stream != 0; }
120 
121  void set_offline (bool);
122  bool offline() const { return _offline; }
123  PBD::Signal0<void> OfflineStatusChanged;
124 
125  PBD::Signal2<int,byte *, size_t> edit;
126 
127  void set_mmc_forwarding (bool yn) {
128  _mmc_forward = yn;
129  }
130 
131  /* MTC */
132 
133  MTC_FPS mtc_fps() const { return _mtc_fps; }
134  MTC_Status mtc_running() const { return _mtc_running; }
135  const byte *mtc_current() const { return _mtc_time; }
136  bool mtc_locked() const { return _mtc_locked; }
137 
138  PBD::Signal3<void, Parser &, int, samplecnt_t> mtc_qtr;
139  PBD::Signal3<void, const byte *, bool, samplecnt_t> mtc_time;
140  PBD::Signal1<void, MTC_Status> mtc_status;
141  PBD::Signal0<bool> mtc_skipped;
142 
143  void set_mtc_forwarding (bool yn) {
144  _mtc_forward = yn;
145  }
146 
148 
149  private:
150  /* tracing */
151 
152  std::ostream *trace_stream;
153  std::string trace_prefix;
154  void trace_event (Parser &p, byte *msg, size_t len, samplecnt_t);
156 
157  size_t message_counter[256];
158 
159  enum ParseState {
163  VARIABLELENGTH
164  };
166  unsigned char *msgbuf;
167  int msglen;
168  int msgindex;
171  bool _offline;
172  bool runnable;
177  byte _mtc_time[5];
178  byte _qtr_mtc_time[5];
184 
186 
190 
191  void channel_msg (byte);
192  void realtime_msg (byte);
193  void system_msg (byte);
194  void signal (byte *msg, size_t msglen);
195  bool possible_mmc (byte *msg, size_t msglen);
196  bool possible_mtc (byte *msg, size_t msglen);
197  void process_mtc_quarter_frame (byte *msg);
198 };
199 
200 } // namespace MIDI
201 
202 #endif // __midi_parse_h__
203 
PitchBendSignal pitchbend
Definition: parser.h:70
Signal song
Definition: parser.h:96
int msgindex
Definition: parser.h:168
ZeroByteSignal reset
Definition: parser.h:101
void system_msg(byte)
AnySignal position
Definition: parser.h:95
bool _mmc_forward
Definition: parser.h:174
bool possible_mtc(byte *msg, size_t msglen)
AnySignal any
Definition: parser.h:92
void process_mtc_quarter_frame(byte *msg)
const char * midi_event_type_name(MIDI::eventType)
BankSignal bank_change
Definition: parser.h:64
Signal raw_preparse
Definition: parser.h:90
TwoByteSignal poly_pressure
Definition: parser.h:67
OneByteSignal mtc_quarter_frame
Definition: parser.h:88
PBD::Signal0< void > OfflineStatusChanged
Definition: parser.h:123
TwoByteSignal note_on
Definition: parser.h:65
MTC_FPS _mtc_fps
Definition: parser.h:180
bool runnable
Definition: parser.h:172
TwoByteSignal note_off
Definition: parser.h:66
PBD::Signal3< void, Parser &, int, samplecnt_t > mtc_qtr
Definition: parser.h:138
void trace(bool onoff, std::ostream *o, const std::string &prefix="")
void set_timestamp(const samplecnt_t timestamp)
Definition: parser.h:60
samplecnt_t get_timestamp() const
Definition: parser.h:59
OneByteSignal program_change
Definition: parser.h:69
TwoByteSignal controller
Definition: parser.h:71
MTC_Status _mtc_running
Definition: parser.h:181
unsigned char * msgbuf
Definition: parser.h:166
bool _offline
Definition: parser.h:171
int expected_mtc_quarter_frame_code
Definition: parser.h:176
MTC_Status mtc_running() const
Definition: parser.h:134
void set_mtc_forwarding(bool yn)
Definition: parser.h:143
PBD::Signal0< bool > mtc_skipped
Definition: parser.h:141
OneByteSignal pressure
Definition: parser.h:68
PBD::Signal3< void, const byte *, bool, samplecnt_t > mtc_time
Definition: parser.h:139
PBD::ScopedConnection trace_connection
Definition: parser.h:155
bool _mtc_forward
Definition: parser.h:175
void channel_msg(byte)
ParseState state
Definition: parser.h:165
bool _mtc_locked
Definition: parser.h:182
MIDI::eventType msgtype
Definition: parser.h:169
@ NEEDONEBYTE
Definition: parser.h:161
@ NEEDTWOBYTES
Definition: parser.h:162
@ NEEDSTATUS
Definition: parser.h:160
PBD::Signal1< void, MTC_Status > mtc_status
Definition: parser.h:140
TimestampedSignal timing
Definition: parser.h:104
MTC_FPS mtc_fps() const
Definition: parser.h:133
std::string trace_prefix
Definition: parser.h:153
void set_mmc_forwarding(bool yn)
Definition: parser.h:127
ZeroByteSignal tune
Definition: parser.h:99
bool tracing()
Definition: parser.h:119
Signal mtc
Definition: parser.h:89
byte last_qtr_frame
Definition: parser.h:183
samplecnt_t _timestamp
Definition: parser.h:185
unsigned long consecutive_qtr_frame_cnt
Definition: parser.h:179
TimestampedSignal stop
Definition: parser.h:107
void signal(byte *msg, size_t msglen)
TimestampedSignal start
Definition: parser.h:106
void trace_event(Parser &p, byte *msg, size_t len, samplecnt_t)
Signal sysex
Definition: parser.h:93
size_t * message_counts()
Definition: parser.h:116
void reset_mtc_state()
bool offline() const
Definition: parser.h:122
int msglen
Definition: parser.h:167
bool was_runnable
Definition: parser.h:173
ZeroByteSignal eox
Definition: parser.h:102
TimestampedSignal contineu
Definition: parser.h:108
void set_offline(bool)
bool mtc_locked() const
Definition: parser.h:136
const byte * mtc_current() const
Definition: parser.h:135
bool possible_mmc(byte *msg, size_t msglen)
ZeroByteSignal active_sense
Definition: parser.h:100
void scanner(byte c)
PBD::Signal2< int, byte *, size_t > edit
Definition: parser.h:125
TimestampedSignal tick
Definition: parser.h:105
Signal mmc
Definition: parser.h:94
ParseState pre_variable_state
Definition: parser.h:187
Signal raw_postparse
Definition: parser.h:91
ZeroByteSignal all_notes_off
Definition: parser.h:98
void realtime_msg(byte)
std::ostream * trace_stream
Definition: parser.h:152
channel_t channel
Definition: parser.h:170
MIDI::eventType pre_variable_msgtype
Definition: parser.h:188
byte last_status_byte
Definition: parser.h:189
#define LIBMIDIPP_API
int64_t samplecnt_t
PBD::Signal4< void, Parser &, byte *, size_t, samplecnt_t > AnySignal
Definition: parser.h:47
PBD::Signal3< void, Parser &, uint16_t, int > RPNSignal
Definition: parser.h:44
PBD::Signal2< void, Parser &, samplecnt_t > TimestampedSignal
Definition: parser.h:40
PBD::Signal3< void, Parser &, uint16_t, float > RPNValueSignal
Definition: parser.h:45
PBD::Signal1< void, Parser & > ZeroByteSignal
Definition: parser.h:36
PBD::Signal2< void, Parser &, pitchbend_t > PitchBendSignal
Definition: parser.h:43
PBD::Signal3< void, Parser &, byte *, size_t > Signal
Definition: parser.h:46
PBD::Signal2< void, Parser &, EventTwoBytes * > TwoByteSignal
Definition: parser.h:42
PBD::Signal2< void, Parser &, byte > OneByteSignal
Definition: parser.h:41
PBD::Signal2< void, Parser &, unsigned short > BankSignal
Definition: parser.h:39