A class that converts byte streams into MIDI messages, and stores them in a FIFO. This is useful if you wish to read MIDI messages via polling instead of interrupts. The class supports every type of MIDI message, and System Realtime messages can be interleaved with regular ones.

Committer:
Padman
Date:
Thu Aug 04 12:02:12 2016 +0000
Revision:
1:1c3f0c6ea0fb
Parent:
0:69cbdcd5d770
Child:
2:cbd43ba7f842
Added API documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Padman 0:69cbdcd5d770 1 /**
Padman 0:69cbdcd5d770 2 * @file MIDIparser.h
Padman 0:69cbdcd5d770 3 * @brief MIDI parser - converts bytes into queued MIDI messages
Padman 0:69cbdcd5d770 4 * @author Patrick Thomas
Padman 0:69cbdcd5d770 5 * @version 1.0
Padman 0:69cbdcd5d770 6 * @see
Padman 0:69cbdcd5d770 7 *
Padman 0:69cbdcd5d770 8 * Copyright (c) 2016
Padman 0:69cbdcd5d770 9 *
Padman 0:69cbdcd5d770 10 * Licensed under the Apache License, Version 2.0 (the "License");
Padman 0:69cbdcd5d770 11 * you may not use this file except in compliance with the License.
Padman 0:69cbdcd5d770 12 * You may obtain a copy of the License at
Padman 0:69cbdcd5d770 13 *
Padman 0:69cbdcd5d770 14 * http://www.apache.org/licenses/LICENSE-2.0
Padman 0:69cbdcd5d770 15 *
Padman 0:69cbdcd5d770 16 * Unless required by applicable law or agreed to in writing, software
Padman 0:69cbdcd5d770 17 * distributed under the License is distributed on an "AS IS" BASIS,
Padman 0:69cbdcd5d770 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Padman 0:69cbdcd5d770 19 * See the License for the specific language governing permissions and
Padman 0:69cbdcd5d770 20 * limitations under the License.
Padman 0:69cbdcd5d770 21 */
Padman 0:69cbdcd5d770 22
Padman 0:69cbdcd5d770 23 #ifndef MIDIPARSER_MIDIPARSER_H_
Padman 0:69cbdcd5d770 24 #define MIDIPARSER_MIDIPARSER_H_
Padman 0:69cbdcd5d770 25
Padman 0:69cbdcd5d770 26 #include "MIDIMessage.h"
Padman 0:69cbdcd5d770 27 #include "MyBuffer.h"
Padman 0:69cbdcd5d770 28 #include <queue>
Padman 0:69cbdcd5d770 29
Padman 0:69cbdcd5d770 30 /**
Padman 0:69cbdcd5d770 31 *
Padman 0:69cbdcd5d770 32 * Example:
Padman 0:69cbdcd5d770 33 * @code
Padman 0:69cbdcd5d770 34 * #include "mbed.h"
Padman 0:69cbdcd5d770 35 * #include "MIDIparser.h"
Padman 0:69cbdcd5d770 36 *
Padman 0:69cbdcd5d770 37 * MIDIparser myParser;
Padman 0:69cbdcd5d770 38 * Serial pc(USBTX, USBRX);
Padman 0:69cbdcd5d770 39 *
Padman 0:69cbdcd5d770 40 * int main()
Padman 0:69cbdcd5d770 41 * {
Padman 0:69cbdcd5d770 42 * while(1) {
Padman 0:69cbdcd5d770 43 *
Padman 0:69cbdcd5d770 44 * while(pc.readable()) {
Padman 0:69cbdcd5d770 45 *
Padman 0:69cbdcd5d770 46 * myParser.parse(pc.getc());
Padman 0:69cbdcd5d770 47 * }
Padman 0:69cbdcd5d770 48 *
Padman 0:69cbdcd5d770 49 * while (myParser.available()) {
Padman 0:69cbdcd5d770 50 *
Padman 0:69cbdcd5d770 51 * MIDIMessage myMessage = myParser.grab();
Padman 0:69cbdcd5d770 52 * pc.printf("%d %d %d %d\n", myMessage.type(), myMessage.channel(), myMessage.key(), myMessage.velocity());
Padman 0:69cbdcd5d770 53 * }
Padman 0:69cbdcd5d770 54 *
Padman 0:69cbdcd5d770 55 * }
Padman 0:69cbdcd5d770 56 * }
Padman 0:69cbdcd5d770 57 * @endcode
Padman 0:69cbdcd5d770 58 */
Padman 0:69cbdcd5d770 59
Padman 0:69cbdcd5d770 60 class MIDIparser {
Padman 0:69cbdcd5d770 61
Padman 0:69cbdcd5d770 62 private:
Padman 0:69cbdcd5d770 63
Padman 0:69cbdcd5d770 64 MyBuffer<uint8_t> input_vector;
Padman 0:69cbdcd5d770 65 queue<MIDIMessage> output_queue;
Padman 0:69cbdcd5d770 66
Padman 0:69cbdcd5d770 67 bool sysex;
Padman 0:69cbdcd5d770 68 bool dual;
Padman 0:69cbdcd5d770 69
Padman 0:69cbdcd5d770 70 public:
Padman 0:69cbdcd5d770 71
Padman 0:69cbdcd5d770 72 MIDIparser();
Padman 1:1c3f0c6ea0fb 73
Padman 1:1c3f0c6ea0fb 74 /** Input a byte to the parser
Padman 1:1c3f0c6ea0fb 75 * @param data The byte to parse
Padman 1:1c3f0c6ea0fb 76 */
Padman 1:1c3f0c6ea0fb 77 void parse(uint8_t data);
Padman 1:1c3f0c6ea0fb 78
Padman 1:1c3f0c6ea0fb 79 /** Determine if a MIDI message is in the queue
Padman 1:1c3f0c6ea0fb 80 * @return 1 if something is ready, 0 otherwise
Padman 1:1c3f0c6ea0fb 81 */
Padman 1:1c3f0c6ea0fb 82 uint32_t available();
Padman 1:1c3f0c6ea0fb 83
Padman 1:1c3f0c6ea0fb 84 /** Grab the next MIDI message
Padman 1:1c3f0c6ea0fb 85 * @return The next MIDI message
Padman 1:1c3f0c6ea0fb 86 */
Padman 0:69cbdcd5d770 87 MIDIMessage grab();
Padman 0:69cbdcd5d770 88 };
Padman 0:69cbdcd5d770 89
Padman 0:69cbdcd5d770 90 #endif /* MIDIPARSER_MIDIPARSER_H_ */