Commit Graph

54 Commits

Author SHA1 Message Date
lathoub 2c657a38d1
Added support for Active Sensing and SysEx command segments (v4.4.0) (#138)
* stuff to ignore list

* Update midi_Defs.h

* added support for ActiveSensing

From: https://www.midi.org/specifications/item/table-1-summary-of-midi-message

Active Sensing. This message is intended to be sent repeatedly to tell the receiver that a connection is alive. Use of this message is optional. When initially received, the receiver will expect to receive another Active Sensing message each 300ms (max), and if it does not then it will assume that the connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non- active sensing) operation.

* replaced ActiveSensing with Sender Active Sensing

Receiver active Sensing is not implemented (yet)

* added support for receiving SysEx command segments

Very long SysEx mesaages are cut in to multiple command segments
Where a normal SysEx starts with F0 and ends with F7, the first segment will start with F0 and end with F0, the middle section (optional) start with F7 and ends with F7 - the last segments starts with F7 and ends with F0

* lift and shift of the Serial code into a seperate class, allowing for other serializers

lift and shift of the Serial code into a seperate class, allowing for other serializers as AppleMIDI, USBMIDI, ipMIDI, BLE-MIDI

* added Platform class to abstract millis()

* add MidiType to beginTransmission

Avoids reparsing of the stream in the transport layer, in order to get the MidiType

* active sensing defaults to false, to avoid spamming devices

* set ActiveSensing Periodicity in ms

Gives more control over the bool value. Typical value is 300 (ms) - an Active Sensing command is send every 300ms; or 0 (zero) to disable sending ActiveSensing

* added namespace reference

* renamed Encoder -> Transport, added MidiType to beginTransmission in serialMIDI

* added callback for Message

before the specific callback are called, a generic mMessage callback can be fired to inform the user that 'a' message has been received.

* added send(MidiMessage), added (untested) bridge example

added send(MidiMessage) for Bridge application (that convert MIDI transport x into MIDI transport y), avoiding parsing entry a stream, setting up all callback - whilst this allows for passing the content, without to much processing/parsing.

Had to move mPendingMessageExpectedLenght into MidiMessage to avoid parsing the data again, just to know the size

Added Bridge example (untested)

* changed based on Franky47's feedback

- send: pass the message as a const ref, to avoid copies
- add mSerial.begin (with Baudrate - added Settings)
- ThruActivated defaults to true
- class name serialMIDI => SerialMIDI

* return reference to Transport layer

* return a *pointer* (not a ref) to the transport layer

* mPendingMessageExpectedLength as before

mMessage.length is reset to 0 before the callback, so bring back mPendingMessageExpectedLength as before, and set mMessage.length (and not reset it)

* DefaultPlatform for Arduino

* strong typing Channel in the callbacks

* aliasing for callbacks (and default initializers

* cleanup setHandleMessage

unfortunately, not using aliases yet (too complex)

* Fixed "FML" case: fall down here with an overflown SysEx..

Splitting larger incoming messages into smaller SysEx packets - using an RrtpMidi trick:
            //   first:  0xF0 .... 0xF0
            //   midlle: 0xF7 .... 0xF0
            //   last:   0xF7 .... 0xF7

see: https://tools.ietf.org/html/rfc4695#section-3.2

(Understanding this is not part of the original MIDI spec, but does allow for receiving very very large SysEx messages on a small footprint (does require some 'handy' parsing))

SysExMaxSize in Settings can be reduced significatly (16bytes works fine - pending use case)

* + receiver ActiveSensing, + error Callback

1) Active Sensing:
Once an ActiveSensing message is received, the system checks for timeouts: if no message is received within the specified 300ms (see in _Defs), an error is set and the checks for timeout stop.

2) added a callback for errors. 2 errors are defined: parse error and ActiveSensing timeout

* cleanup of basic example

use LED_BUILTIN

* + Manufacturer System Exclusive ID (incomplete)

* + noteValues

* added SendCommon, consistent with SendRealTime

including:

sendClock, sendStart, sendStop, sendContinue, sendActiveSensing, sendSystemReset

* UseSenderActiveSensing & UseReceiverActiveSensing to enable/disable Active Sensing

UseSenderActiveSensing & UseReceiverActiveSensing in Settings are global switches to turn on/off ActiveSensing (and save memory)

* use #defined value, not the literal

* cleanup

* removed deprecated MidiFilterMode (to be removed for v5)

* getting ready for v5

* prepare for v5

* updating authors

* Removed USB examples

* added header

* removed typedef

when instanciating multiple instances of SerialMIDI, a redefinition error accors because of typing of the serial##Name.
Fix: removed the typdef, a bit harder to read, but avoided complex #ifdef

* move bridge example to other Transport mechanisms

* Update Bench.ino

* Create NoteNames.ino

demonstrate use of MIDI_NAMESPACE::NoteValues[inNote].strptr

* moved #version to MIDI.h

#version of the library does not belong in general MIDI definitions
(making midi_Defs.h as generic as possible - usable on other platforms)

* adding comment section

* shorter syntax using iif

* moved code to avoid doc clash

* added Tick (0xF9)

* Simplified NoteValues

Need need for extra index (that is the same as the noteName anyway)

* Removed Undefined_F9 (Tick) as an invalid token (so it valid now)

* removed references to USB in the test scripts

* setting the CMake env

* removed USB references

* struggling with travis

* LCOV_EXCL_LINE in sendCommon

* order of initialization

* reorder variables for initialisation

* extending platforms

* adding boards (but not the Zero)

* fixing cmake

* moved RingBuffer to SerialMock

* fix cmake removing RingBuffer

* Update CMakeLists.txt

* using bitwire operators (works on all platforms)

* Update midi_Platform.h

* removed NoteNames

* simplify test (will be rolled back later)

* Update unit-tests_MidiInput.cpp

* Update unit-tests_MidiInput.cpp

* Revert "Update midi_Platform.h"

This reverts commit bd2f6476b2.

* bring in other Platform (remove usb)

* added BaudRate

* Revert "using bitwire operators (works on all platforms)"

This reverts commit 122ebe1dc3.

* Revert "moved code to avoid doc clash"

This reverts commit ef878344cd.

* restored after very funcky commits and rollbacks (Sorry!)

* add Transport layer

* removed SerialMock test

* Update unit-tests_MidiInput.cpp

* Update unit-tests_MidiInput.cpp

* Update unit-tests_MidiInput.cpp

* Update unit-tests_MidiInput.cpp

* fixed MidiInterface<SerialMock => MidiInterface<Transport

* SerialMIDI should not aware of the channel

* Update unit-tests_MidiThru.cpp

* Update midi_Defs.h

* avoid shadow parameters and buf fix

* Update CMakeLists.txt

* Update unit-tests_MidiOutput.cpp

* Update midi_Settings.h

* Update unit-tests_MidiInput.cpp

* Update unit-tests_MidiInput.cpp

* Update unit-tests_MidiInput.cpp

* tmp removed teensy, bug fix sendCommon (unsigned, not byte)

* Update unit-tests_MidiInput.cpp

* fix for Leonardo

* Update DualMerger.ino

* adding tests_MidiInputCallbacks

* Update unit-tests_MidiInputCallbacks.cpp

* preparing to release 5.0.0

* added Alternative Pin for Serial port example

* default listen on all channel as in #96

* Update unit-tests_MidiInput.cpp

Co-authored-by: lathoub <lathoub@gmail.com>
2020-04-08 10:36:10 +02:00
Francois Best faa7bade0b cleanup: Dedupe RingBuffer implementation in mocks 2018-11-07 12:08:12 +01:00
Francois Best 5ccf0159a2 feat: Serialise USB MIDI packets into the serial RX buffer 2018-11-04 10:07:21 +01:00
Francois Best 1ccd7c3ce8 feat: Add SysEx support for USB MIDI 2018-11-03 21:47:37 +01:00
Francois Best 5b96487362 feat: Compose TX USB MIDI packets from serial buffer 2018-11-03 18:59:20 +01:00
Francois Best 3f15b733e4 feat: Get CIN from status byte
Removed unused implementation of UsbMidiEventPacket
2018-11-03 18:58:45 +01:00
Francois Best a34087c92c feat: Add peek and pop methods 2018-11-03 18:56:42 +01:00
Francois Best 9a0907ea7f chore: Point MIDI-USB submodule to own fork for unit testing 2018-11-03 18:56:11 +01:00
Francois Best 83ad031ee6 fix: Add tests and fix RingBuffer implementation 2018-10-11 10:31:23 +02:00
Francois Best 1c01effbd9 feat: Handle Korg-style of flipping SysEx data header bits
Closes #92
2018-03-10 16:58:17 +01:00
Francois Best 7ee313ebb7 Fix tests. 2016-11-02 09:13:11 +01:00
Francois Best cfffdbea26 Fix shadowing warnings. 2016-11-02 09:02:00 +01:00
Francois Best 2df247489a Testing running status reset. 2016-10-29 15:45:53 +02:00
Francois Best 53fdcc79b0 Testing invalid Thru mode. 2016-10-29 14:09:06 +02:00
Francois Best f653d21ca1 Thru tests. #55 2016-10-29 12:20:54 +02:00
Francois Best 2e816e3e39 Added test for larger SysEx frames. #47 2016-10-29 09:53:05 +02:00
Francois Best 7b36662a7f Added callback tests. 2016-10-28 09:54:37 +02:00
Francois Best 037b9fb9f2 Added test for new sendAfterTouch signature. 2016-10-28 09:15:56 +02:00
Francois Best f1f0ef41ce Using new definitions for Thru. 2016-10-27 08:11:29 +02:00
Francois Best e92c5fc6df Test off case. 2016-10-21 07:42:47 +02:00
Francois Best 189288c03f Testing. 2016-10-20 10:08:06 +02:00
Francois Best 8eb881f39e Fixed unit tests regarding RunningStatus changes. 2016-10-17 20:32:39 +02:00
Francois Best 5f7fa5d083 Fix #58. 2016-10-15 13:41:50 +02:00
Francois Best 208a79e5f0 Moar tests. 2016-10-15 11:59:35 +02:00
Francois Best 4cebcbf915 Added MIDI Input tests. 2016-10-15 10:54:49 +02:00
Francois Best 58e1ea2a65 Added peek method for Ring Buffer. 2016-10-15 10:54:15 +02:00
Francois Best 8badd2bbfa Moved variable settings to separate file. 2016-10-15 10:53:55 +02:00
Francois Best 7317243c36 Fixed warnings.
#55
2016-10-13 19:15:03 +02:00
Francois Best 5a477fda4f Added unit tests for USB stuff. 2016-10-13 18:30:59 +02:00
Francois Best 2b4b30b32a Moar tests. 2016-10-10 14:23:57 +02:00
Francois Best 300cb139e9 #54: Deprecated sending of TuneRequests with sendRealTime. 2016-10-10 14:23:50 +02:00
Francois Best ac1925a74f Testing send real-time shortcut & sendSysEx. 2016-10-10 13:48:11 +02:00
Francois Best 68444227b2 Added test for invalid send methods. 2016-10-10 12:01:24 +02:00
Francois Best cb34be646c Added test for PolyPressure. 2016-10-08 02:37:18 +02:00
Francois Best 8372ee92d7 Added build & run target for unit tests. 2016-10-08 02:37:07 +02:00
Francois Best dd700fd49f Using CTest for unit tests. 2016-10-07 14:46:31 +02:00
Francois Best 527a7c8e9d Using vector buffers & initializer-list expectancies. 2016-10-07 10:04:05 +02:00
Francois Best e65d5b6b4c Added more RPN/NRPN tests. 2016-10-07 09:59:08 +02:00
Francois Best 34b37f75e8 Fixed order of DataEntry bytes (MSB first). 2016-10-07 09:50:37 +02:00
Francois Best a7d6d803a1 Enabled CMake target debugging.
(requires CMake Tools extension for VSCode)
2016-10-07 09:12:48 +02:00
Francois Best c29dfd84d7 Added more tests & fixed #53 (sendPitchBend range). 2016-10-06 20:49:38 +02:00
Francois Best b25d111391 Made post-build test running an option. 2016-10-05 05:54:44 -07:00
Francois Best aeffb7d7c5 Smaller buffers, added full codec test. 2016-10-05 05:52:04 -07:00
Francois Best 8b5e81ed86 Added MIDI IO tests. 2016-10-04 18:56:18 -07:00
Francois Best 0b0bd7eda5 Fix 2016-10-04 18:56:05 -07:00
Francois Best 7268429235 More tests. 2016-10-04 09:54:46 -07:00
Francois Best 371d1adba9 Disable auto-tests in post-build. 2016-10-04 01:24:28 -07:00
Francois Best d42acc0cbb Testing (and fixed) SysEx codec.
Now conforms to Somascape specs.
2016-10-04 01:00:12 -07:00
Francois Best 22d6bb8cf2 Restrict include. 2016-10-03 22:10:39 -07:00
Francois Best 618f71658b Moved tests, added references to static stuff. 2016-10-03 22:08:45 -07:00