second (and hopefully) final part of changes to respond to header format changes...
[ArdourMidi.git] / libs / midi++2 / parser.cc
blobcdd23a5306814793c1b24c6dd9eaf66655c30b0d
1 /*
2 Copyright (C) 1998 Paul Barton-Davis
4 This file was inspired by the MIDI parser for KeyKit by
5 Tim Thompson.
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.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 $Id$
24 #include <cstring>
25 #include <cstdlib>
26 #include <unistd.h>
27 #include <cstring>
28 #include <iostream>
29 #include <iterator>
31 #include "midi++/types.h"
32 #include "midi++/parser.h"
33 #include "midi++/port.h"
34 #include "midi++/mmc.h"
35 #include "pbd/transmitter.h"
37 using namespace std;
38 using namespace MIDI;
40 const char *
41 Parser::midi_event_type_name (eventType t)
44 switch (t) {
45 case none:
46 return "no midi messages";
48 case raw:
49 return "raw midi data";
51 case MIDI::any:
52 return "any midi message";
54 case off:
55 return "note off";
57 case on:
58 return "note on";
60 case polypress:
61 return "aftertouch";
63 case MIDI::controller:
64 return "controller";
66 case program:
67 return "program change";
69 case chanpress:
70 return "channel pressure";
72 case MIDI::pitchbend:
73 return "pitch bend";
75 case MIDI::sysex:
76 return "system exclusive";
78 case MIDI::song:
79 return "song position";
81 case MIDI::tune:
82 return "tune";
84 case MIDI::eox:
85 return "end of sysex";
87 case MIDI::timing:
88 return "timing";
90 case MIDI::start:
91 return "start";
93 case MIDI::stop:
94 return "continue";
96 case MIDI::contineu:
97 return "stop";
99 case active:
100 return "active sense";
102 default:
103 return "unknow MIDI event type";
107 Parser::Parser (Port &p)
108 : _port (p)
111 trace_stream = 0;
112 trace_prefix = "";
113 memset (message_counter, 0, sizeof (message_counter[0]) * 256);
114 msgindex = 0;
115 msgtype = none;
116 msglen = 256;
117 msgbuf = (unsigned char *) malloc (msglen);
118 msgbuf[msgindex++] = 0x90;
119 _mmc_forward = false;
120 reset_mtc_state ();
121 _offline = false;
123 /* this hack deals with the possibility of our first MIDI
124 bytes being running status messages.
127 channel_msg (0x90);
128 state = NEEDSTATUS;
130 pre_variable_state = NEEDSTATUS;
131 pre_variable_msgtype = none;
134 Parser::~Parser ()
137 delete msgbuf;
140 void
141 Parser::trace_event (Parser &, byte *msg, size_t len)
143 eventType type;
144 ostream *o;
146 if ((o = trace_stream) == NULL) { /* can be asynchronously removed */
147 return;
150 type = (eventType) (msg[0]&0xF0);
152 switch (type) {
153 case off:
154 *o << trace_prefix
155 << "Channel "
156 << (msg[0]&0xF)+1
157 << " NoteOff NoteNum "
158 << (int) msg[1]
159 << " Vel "
160 << (int) msg[2]
161 << endmsg;
162 break;
164 case on:
165 *o << trace_prefix
166 << "Channel "
167 << (msg[0]&0xF)+1
168 << " NoteOn NoteNum "
169 << (int) msg[1]
170 << " Vel "
171 << (int) msg[2]
172 << endmsg;
173 break;
175 case polypress:
176 *o << trace_prefix
177 << "Channel "
178 << (msg[0]&0xF)+1
179 << " PolyPressure"
180 << (int) msg[1]
181 << endmsg;
182 break;
184 case MIDI::controller:
185 *o << trace_prefix
186 << "Channel "
187 << (msg[0]&0xF)+1
188 << " Controller "
189 << (int) msg[1]
190 << " Value "
191 << (int) msg[2]
192 << endmsg;
193 break;
195 case program:
196 *o << trace_prefix
197 << "Channel "
198 << (msg[0]&0xF)+1
199 << " Program Change ProgNum "
200 << (int) msg[1]
201 << endmsg;
202 break;
204 case chanpress:
205 *o << trace_prefix
206 << "Channel "
207 << (msg[0]&0xF)+1
208 << " Channel Pressure "
209 << (int) msg[1]
210 << endmsg;
211 break;
213 case MIDI::pitchbend:
214 *o << trace_prefix
215 << "Channel "
216 << (msg[0]&0xF)+1
217 << " Pitch Bend "
218 << ((msg[2]<<7)|msg[1])
219 << endmsg;
220 break;
222 case MIDI::sysex:
223 if (len == 1) {
224 switch (msg[0]) {
225 case 0xf8:
226 *o << trace_prefix
227 << "Clock"
228 << endmsg;
229 break;
230 case 0xfa:
231 *o << trace_prefix
232 << "Start"
233 << endmsg;
234 break;
235 case 0xfb:
236 *o << trace_prefix
237 << "Continue"
238 << endmsg;
239 break;
240 case 0xfc:
241 *o << trace_prefix
242 << "Stop"
243 << endmsg;
244 break;
245 case 0xfe:
246 *o << trace_prefix
247 << "Active Sense"
248 << endmsg;
249 break;
250 case 0xff:
251 *o << trace_prefix
252 << "System Reset"
253 << endmsg;
254 break;
255 default:
256 *o << trace_prefix
257 << "System Exclusive (1 byte : " << hex << (int) *msg << dec << ')'
258 << endmsg;
259 break;
261 } else {
262 *o << trace_prefix
263 << "System Exclusive (" << len << ") = [ " << hex;
264 for (unsigned int i = 0; i < len; ++i) {
265 *o << (int) msgbuf[i] << ' ';
267 *o << dec << ']' << endmsg;
270 break;
272 case MIDI::song:
273 *o << trace_prefix << "Song" << endmsg;
274 break;
276 case MIDI::tune:
277 *o << trace_prefix << "Tune" << endmsg;
278 break;
280 case MIDI::eox:
281 *o << trace_prefix << "End-of-System Exclusive" << endmsg;
282 break;
284 case MIDI::timing:
285 *o << trace_prefix << "Timing" << endmsg;
286 break;
288 case MIDI::start:
289 *o << trace_prefix << "Start" << endmsg;
290 break;
292 case MIDI::stop:
293 *o << trace_prefix << "Stop" << endmsg;
294 break;
296 case MIDI::contineu:
297 *o << trace_prefix << "Continue" << endmsg;
298 break;
300 case active:
301 *o << trace_prefix << "Active Sense" << endmsg;
302 break;
304 default:
305 *o << trace_prefix << "Unrecognized MIDI message" << endmsg;
306 break;
310 void
311 Parser::trace (bool onoff, ostream *o, const string &prefix)
313 trace_connection.disconnect ();
315 if (onoff) {
316 trace_stream = o;
317 trace_prefix = prefix;
318 any.connect_same_thread (trace_connection, boost::bind (&Parser::trace_event, this, _1, _2, _3));
319 } else {
320 trace_prefix = "";
321 trace_stream = 0;
325 void
326 Parser::scanner (unsigned char inbyte)
328 bool statusbit;
329 boost::optional<int> edit_result;
331 // cerr << "parse: " << hex << (int) inbyte << dec << " state = " << state << " msgindex = " << msgindex << " runnable = " << runnable << endl;
333 /* Check active sensing early, so it doesn't interrupt sysex.
335 NOTE: active sense messages are not considered to fit under
336 "any" for the purposes of callbacks. If a caller wants
337 active sense messages handled, which is unlikely, then
338 they can just ask for it specifically. They are so unlike
339 every other MIDI message in terms of semantics that its
340 counter-productive to treat them similarly.
343 if (inbyte == 0xfe) {
344 message_counter[inbyte]++;
345 if (!_offline) {
346 active_sense (*this);
348 return;
351 /* If necessary, allocate larger message buffer. */
353 if (msgindex >= msglen) {
354 msglen *= 2;
355 msgbuf = (unsigned char *) realloc (msgbuf, msglen);
359 Real time messages can occur ANYPLACE,
360 but do not interrupt running status.
363 bool rtmsg = false;
365 switch (inbyte) {
366 case 0xf8:
367 rtmsg = true;
368 break;
369 case 0xfa:
370 rtmsg = true;
371 break;
372 case 0xfb:
373 rtmsg = true;
374 break;
375 case 0xfc:
376 rtmsg = true;
377 break;
378 case 0xfd:
379 rtmsg = true;
380 break;
381 case 0xfe:
382 rtmsg = true;
383 break;
384 case 0xff:
385 rtmsg = true;
386 break;
389 if (rtmsg) {
390 boost::optional<int> res = edit (&inbyte, 1);
392 if (res.get_value_or (1) >= 0 && !_offline) {
393 realtime_msg (inbyte);
396 return;
399 statusbit = (inbyte & 0x80);
402 * Variable length messages (ie. the 'system exclusive')
403 * can be terminated by the next status byte, not necessarily
404 * an EOX. Actually, since EOX is a status byte, this
405 * code ALWAYS handles the end of a VARIABLELENGTH message.
408 if (state == VARIABLELENGTH && statusbit) {
410 /* The message has ended, so process it */
412 /* add EOX to any sysex message */
414 if (inbyte == MIDI::eox) {
415 msgbuf[msgindex++] = inbyte;
418 #if 0
419 cerr << "SYSEX: " << hex;
420 for (unsigned int i = 0; i < msgindex; ++i) {
421 cerr << (int) msgbuf[i] << ' ';
423 cerr << dec << endl;
424 #endif
425 if (msgindex > 0) {
427 boost::optional<int> res = edit (msgbuf, msgindex);
429 if (res.get_value_or (1) >= 0) {
430 if (!possible_mmc (msgbuf, msgindex) || _mmc_forward) {
431 if (!possible_mtc (msgbuf, msgindex) || _mtc_forward) {
432 if (!_offline) {
433 sysex (*this, msgbuf, msgindex);
437 if (!_offline) {
438 any (*this, msgbuf, msgindex);
445 * Status bytes always start a new message, except EOX
448 if (statusbit) {
450 msgindex = 0;
452 if (inbyte == MIDI::eox) {
453 /* return to the state we had pre-sysex */
455 state = pre_variable_state;
456 runnable = was_runnable;
457 msgtype = pre_variable_msgtype;
459 if (state != NEEDSTATUS && runnable) {
460 msgbuf[msgindex++] = last_status_byte;
462 } else {
463 msgbuf[msgindex++] = inbyte;
464 if ((inbyte & 0xf0) == 0xf0) {
465 system_msg (inbyte);
466 runnable = false;
467 } else {
468 channel_msg (inbyte);
472 return;
476 * We've got a Data byte.
479 msgbuf[msgindex++] = inbyte;
481 switch (state) {
482 case NEEDSTATUS:
484 * We shouldn't get here, since in NEEDSTATUS mode
485 * we're expecting a new status byte, NOT any
486 * data bytes. On the other hand, some equipment
487 * with leaky modwheels and the like might be
488 * sending data bytes as part of running controller
489 * messages, so just handle it silently.
491 break;
493 case NEEDTWOBYTES:
494 /* wait for the second byte */
495 if (msgindex < 3)
496 return;
497 /*FALLTHRU*/
499 case NEEDONEBYTE:
500 /* We've completed a 1 or 2 byte message. */
502 edit_result = edit (msgbuf, msgindex);
504 if (edit_result.get_value_or (1)) {
506 /* message not cancelled by an editor */
508 message_counter[msgbuf[0] & 0xF0]++;
510 if (!_offline) {
511 signal (msgbuf, msgindex);
515 if (runnable) {
516 /* In Runnable mode, we reset the message
517 index, but keep the callbacks_pending and state the
518 same. This provides the "running status
519 byte" feature.
521 msgindex = 1;
522 } else {
523 /* If not Runnable, reset to NEEDSTATUS mode */
524 state = NEEDSTATUS;
526 break;
528 case VARIABLELENGTH:
529 /* nothing to do */
530 break;
532 return;
535 /** Call the real-time function for the specified byte, immediately.
536 * These can occur anywhere, so they don't change the state.
538 void
539 Parser::realtime_msg(unsigned char inbyte)
542 message_counter[inbyte]++;
544 if (_offline) {
545 return;
548 switch (inbyte) {
549 case 0xf8:
550 timing (*this, _timestamp);
551 break;
552 case 0xfa:
553 start (*this, _timestamp);
554 break;
555 case 0xfb:
556 contineu (*this, _timestamp);
557 break;
558 case 0xfc:
559 stop (*this, _timestamp);
560 break;
561 case 0xfe:
562 /* !!! active sense message in realtime_msg: should not reach here
564 break;
565 case 0xff:
566 reset (*this);
567 break;
570 any (*this, &inbyte, 1);
574 /** Interpret a Channel (voice or mode) Message status byte.
576 void
577 Parser::channel_msg(unsigned char inbyte)
579 last_status_byte = inbyte;
580 runnable = true; /* Channel messages can use running status */
582 /* The high 4 bits, which determine the type of channel message. */
584 switch (inbyte&0xF0) {
585 case 0x80:
586 msgtype = off;
587 state = NEEDTWOBYTES;
588 break;
589 case 0x90:
590 msgtype = on;
591 state = NEEDTWOBYTES;
592 break;
593 case 0xa0:
594 msgtype = polypress;
595 state = NEEDTWOBYTES;
596 break;
597 case 0xb0:
598 msgtype = MIDI::controller;
599 state = NEEDTWOBYTES;
600 break;
601 case 0xc0:
602 msgtype = program;
603 state = NEEDONEBYTE;
604 break;
605 case 0xd0:
606 msgtype = chanpress;
607 state = NEEDONEBYTE;
608 break;
609 case 0xe0:
610 msgtype = MIDI::pitchbend;
611 state = NEEDTWOBYTES;
612 break;
616 /** Initialize (and possibly emit) the signals for the
617 * specified byte. Set the state that the state-machine
618 * should go into. If the signal is not emitted
619 * immediately, it will be when the state machine gets to
620 * the end of the MIDI message.
622 void
623 Parser::system_msg (unsigned char inbyte)
625 message_counter[inbyte]++;
627 switch (inbyte) {
628 case 0xf0:
629 pre_variable_msgtype = msgtype;
630 pre_variable_state = state;
631 was_runnable = runnable;
632 msgtype = MIDI::sysex;
633 state = VARIABLELENGTH;
634 break;
635 case 0xf1:
636 msgtype = MIDI::mtc_quarter;
637 state = NEEDONEBYTE;
638 break;
639 case 0xf2:
640 msgtype = MIDI::position;
641 state = NEEDTWOBYTES;
642 break;
643 case 0xf3:
644 msgtype = MIDI::song;
645 state = NEEDONEBYTE;
646 break;
647 case 0xf6:
648 if (!_offline) {
649 tune (*this);
651 state = NEEDSTATUS;
652 break;
653 case 0xf7:
654 break;
657 // all these messages will be sent via any()
658 // when they are complete.
659 // any (*this, &inbyte, 1);
662 void
663 Parser::signal (byte *msg, size_t len)
665 channel_t chan = msg[0]&0xF;
666 int chan_i = chan;
668 switch (msgtype) {
669 case none:
670 break;
672 case off:
673 channel_active_preparse[chan_i] (*this);
674 note_off (*this, (EventTwoBytes *) &msg[1]);
675 channel_note_off[chan_i]
676 (*this, (EventTwoBytes *) &msg[1]);
677 channel_active_postparse[chan_i] (*this);
678 break;
680 case on:
681 channel_active_preparse[chan_i] (*this);
683 /* Hack to deal with MIDI sources that use velocity=0
684 instead of noteOff.
687 if (msg[2] == 0) {
688 note_off (*this, (EventTwoBytes *) &msg[1]);
689 channel_note_off[chan_i]
690 (*this, (EventTwoBytes *) &msg[1]);
691 } else {
692 note_on (*this, (EventTwoBytes *) &msg[1]);
693 channel_note_on[chan_i]
694 (*this, (EventTwoBytes *) &msg[1]);
697 channel_active_postparse[chan_i] (*this);
698 break;
700 case MIDI::controller:
701 channel_active_preparse[chan_i] (*this);
702 controller (*this, (EventTwoBytes *) &msg[1]);
703 channel_controller[chan_i]
704 (*this, (EventTwoBytes *) &msg[1]);
705 channel_active_postparse[chan_i] (*this);
706 break;
708 case program:
709 channel_active_preparse[chan_i] (*this);
710 program_change (*this, msg[1]);
711 channel_program_change[chan_i] (*this, msg[1]);
712 channel_active_postparse[chan_i] (*this);
713 break;
715 case chanpress:
716 channel_active_preparse[chan_i] (*this);
717 pressure (*this, msg[1]);
718 channel_pressure[chan_i] (*this, msg[1]);
719 channel_active_postparse[chan_i] (*this);
720 break;
722 case polypress:
723 channel_active_preparse[chan_i] (*this);
724 poly_pressure (*this, (EventTwoBytes *) &msg[1]);
725 channel_poly_pressure[chan_i]
726 (*this, (EventTwoBytes *) &msg[1]);
727 channel_active_postparse[chan_i] (*this);
728 break;
730 case MIDI::pitchbend:
731 channel_active_preparse[chan_i] (*this);
732 pitchbend (*this, (msg[2]<<7)|msg[1]);
733 channel_pitchbend[chan_i] (*this, (msg[2]<<7)|msg[1]);
734 channel_active_postparse[chan_i] (*this);
735 break;
737 case MIDI::sysex:
738 sysex (*this, msg, len);
739 break;
741 case MIDI::mtc_quarter:
742 process_mtc_quarter_frame (msg);
743 mtc_quarter_frame (*this, *msg);
744 break;
746 case MIDI::position:
747 position (*this, msg, len);
748 break;
750 case MIDI::song:
751 song (*this, msg, len);
752 break;
754 case MIDI::tune:
755 tune (*this);
757 default:
758 /* XXX some kind of warning ? */
759 break;
762 any (*this, msg, len);
765 bool
766 Parser::possible_mmc (byte *msg, size_t msglen)
768 if (!MachineControl::is_mmc (msg, msglen)) {
769 return false;
772 /* hand over the just the interior MMC part of
773 the sysex msg without the leading 0xF0
776 if (!_offline) {
777 mmc (*this, &msg[1], msglen - 1);
780 return true;
783 void
784 Parser::set_offline (bool yn)
786 if (_offline != yn) {
787 _offline = yn;
788 OfflineStatusChanged ();
790 /* this hack deals with the possibility of our first MIDI
791 bytes being running status messages.
794 channel_msg (0x90);
795 state = NEEDSTATUS;