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:
Wed Aug 03 16:22:22 2016 +0000
Revision:
0:69cbdcd5d770
Child:
1:1c3f0c6ea0fb
Initial commit

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 0:69cbdcd5d770 73
Padman 0:69cbdcd5d770 74 void parse(uint8_t);
Padman 0:69cbdcd5d770 75 bool available();
Padman 0:69cbdcd5d770 76 MIDIMessage grab();
Padman 0:69cbdcd5d770 77 };
Padman 0:69cbdcd5d770 78
Padman 0:69cbdcd5d770 79 #endif /* MIDIPARSER_MIDIPARSER_H_ */