2 Copyright (C) 1998 Paul Barton-Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __midi_parse_h__
21 #define __midi_parse_h__
26 #include "pbd/signals.h"
28 #include "midi++/libmidi_visibility.h"
29 #include "midi++/types.h"
36 typedef PBD::Signal1<void,Parser&> ZeroByteSignal;
37 typedef PBD::Signal2<void,Parser&,unsigned short> BankSignal;
38 typedef PBD::Signal2<void,Parser&,framecnt_t> TimestampedSignal;
39 typedef PBD::Signal2<void,Parser&, byte> OneByteSignal;
40 typedef PBD::Signal2<void,Parser &, EventTwoBytes *> TwoByteSignal;
41 typedef PBD::Signal2<void,Parser &, pitchbend_t> PitchBendSignal;
42 typedef PBD::Signal2<void,Parser &, uint16_t> RPNSignal;
43 typedef PBD::Signal3<void,Parser &, byte *, size_t> Signal;
45 class LIBMIDIPP_API Parser {
50 /* sets the time that will be reported for any MTC or MIDI Clock
51 message the next time ::scanner() parses such a message. It should
52 therefore be set before every byte passed into ::scanner().
55 framecnt_t get_timestamp() const { return _timestamp; }
56 void set_timestamp (const framecnt_t timestamp) { _timestamp = timestamp; }
58 /* signals that anyone can connect to */
60 BankSignal bank_change;
61 TwoByteSignal note_on;
62 TwoByteSignal note_off;
63 TwoByteSignal poly_pressure;
64 OneByteSignal pressure;
65 OneByteSignal program_change;
66 PitchBendSignal pitchbend;
67 TwoByteSignal controller;
69 BankSignal channel_bank_change[16];
70 TwoByteSignal channel_note_on[16];
71 TwoByteSignal channel_note_off[16];
72 TwoByteSignal channel_poly_pressure[16];
73 OneByteSignal channel_pressure[16];
74 OneByteSignal channel_program_change[16];
75 PitchBendSignal channel_pitchbend[16];
76 TwoByteSignal channel_controller[16];
77 ZeroByteSignal channel_active_preparse[16];
78 ZeroByteSignal channel_active_postparse[16];
79 RPNSignal channel_rpn[16];
80 RPNSignal channel_nrpn[16];
81 RPNSignal channel_rpn_increment[16];
82 RPNSignal channel_rpn_decrement[16];
83 RPNSignal channel_nrpn_increment[16];
84 RPNSignal channel_nrpn_decrement[16];
86 OneByteSignal mtc_quarter_frame; /* see below for more useful signals */
96 ZeroByteSignal all_notes_off;
98 ZeroByteSignal active_sense;
102 TimestampedSignal timing;
103 TimestampedSignal start;
104 TimestampedSignal stop;
105 TimestampedSignal contineu; /* note spelling */
107 /* This should really be protected, but then derivatives of Port
111 void scanner (byte c);
113 size_t *message_counts() { return message_counter; }
114 const char *midi_event_type_name (MIDI::eventType);
115 void trace (bool onoff, std::ostream *o, const std::string &prefix = "");
116 bool tracing() { return trace_stream != 0; }
118 void set_offline (bool);
119 bool offline() const { return _offline; }
120 PBD::Signal0<void> OfflineStatusChanged;
122 PBD::Signal2<int,byte *, size_t> edit;
124 void set_mmc_forwarding (bool yn) {
130 MTC_FPS mtc_fps() const { return _mtc_fps; }
131 MTC_Status mtc_running() const { return _mtc_running; }
132 const byte *mtc_current() const { return _mtc_time; }
133 bool mtc_locked() const { return _mtc_locked; }
135 PBD::Signal3<void, Parser &, int, framecnt_t> mtc_qtr;
136 PBD::Signal3<void, const byte *, bool, framecnt_t> mtc_time;
137 PBD::Signal1<void, MTC_Status> mtc_status;
138 PBD::Signal0<bool> mtc_skipped;
140 void set_mtc_forwarding (bool yn) {
144 void reset_mtc_state ();
149 std::ostream *trace_stream;
150 std::string trace_prefix;
151 void trace_event (Parser &p, byte *msg, size_t len);
152 PBD::ScopedConnection trace_connection;
154 size_t message_counter[256];
163 unsigned char *msgbuf;
166 MIDI::eventType msgtype;
173 int expected_mtc_quarter_frame_code;
175 byte _qtr_mtc_time[5];
176 unsigned long consecutive_qtr_frame_cnt;
178 MTC_Status _mtc_running;
182 framecnt_t _timestamp;
184 ParseState pre_variable_state;
185 MIDI::eventType pre_variable_msgtype;
186 byte last_status_byte;
188 void channel_msg (byte);
189 void realtime_msg (byte);
190 void system_msg (byte);
191 void signal (byte *msg, size_t msglen);
192 bool possible_mmc (byte *msg, size_t msglen);
193 bool possible_mtc (byte *msg, size_t msglen);
194 void process_mtc_quarter_frame (byte *msg);
199 #endif // __midi_parse_h__