107 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*!
 | |
|  *  @file       MIDI.cpp
 | |
|  *  Project     Arduino MIDI Library
 | |
|  *  @brief      MIDI Library for the Arduino
 | |
|  *  @version    4.2
 | |
|  *  @author     Francois Best
 | |
|  *  @date       24/02/11
 | |
|  *  @license    MIT - Copyright (c) 2015 Francois Best
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
|  * of this software and associated documentation files (the "Software"), to deal
 | |
|  * in the Software without restriction, including without limitation the rights
 | |
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
|  * copies of the Software, and to permit persons to whom the Software is
 | |
|  * furnished to do so, subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice shall be included in
 | |
|  * all copies or substantial portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | |
|  * THE SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #include "MIDI.h"
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| BEGIN_MIDI_NAMESPACE
 | |
| 
 | |
| /*! \brief Encode System Exclusive messages.
 | |
|  SysEx messages are encoded to guarantee transmission of data bytes higher than
 | |
|  127 without breaking the MIDI protocol. Use this static method to convert the
 | |
|  data you want to send.
 | |
|  \param inData The data to encode.
 | |
|  \param outSysEx The output buffer where to store the encoded message.
 | |
|  \param inLength The lenght of the input buffer.
 | |
|  \return The lenght of the encoded output buffer.
 | |
|  @see decodeSysEx
 | |
|  Code inspired from Ruin & Wesen's SysEx encoder/decoder - http://ruinwesen.com
 | |
|  */
 | |
| unsigned encodeSysEx(const byte* inData, byte* outSysEx, unsigned inLength)
 | |
| {
 | |
|     unsigned outLength  = 0;     // Num bytes in output array.
 | |
|     byte count          = 0;     // Num 7bytes in a block.
 | |
|     outSysEx[0]         = 0;
 | |
| 
 | |
|     for (unsigned i = 0; i < inLength; ++i)
 | |
|     {
 | |
|         const byte data = inData[i];
 | |
|         const byte msb  = data >> 7;
 | |
|         const byte body = data & 0x7f;
 | |
| 
 | |
|         outSysEx[0] |= (msb << (6 - count));
 | |
|         outSysEx[1 + count] = body;
 | |
| 
 | |
|         if (count++ == 6)
 | |
|         {
 | |
|             outSysEx   += 8;
 | |
|             outLength  += 8;
 | |
|             outSysEx[0] = 0;
 | |
|             count       = 0;
 | |
|         }
 | |
|     }
 | |
|     return outLength + count + (count != 0 ? 1 : 0);
 | |
| }
 | |
| 
 | |
| /*! \brief Decode System Exclusive messages.
 | |
|  SysEx messages are encoded to guarantee transmission of data bytes higher than
 | |
|  127 without breaking the MIDI protocol. Use this static method to reassemble
 | |
|  your received message.
 | |
|  \param inSysEx The SysEx data received from MIDI in.
 | |
|  \param outData    The output buffer where to store the decrypted message.
 | |
|  \param inLength The lenght of the input buffer.
 | |
|  \return The lenght of the output buffer.
 | |
|  @see encodeSysEx @see getSysExArrayLength
 | |
|  Code inspired from Ruin & Wesen's SysEx encoder/decoder - http://ruinwesen.com
 | |
|  */
 | |
| unsigned decodeSysEx(const byte* inSysEx, byte* outData, unsigned inLength)
 | |
| {
 | |
|     unsigned count  = 0;
 | |
|     byte msbStorage = 0;
 | |
|     byte byteIndex  = 0;
 | |
| 
 | |
|     for (unsigned i = 0; i < inLength; ++i)
 | |
|     {
 | |
|         if ((i % 8) == 0)
 | |
|         {
 | |
|             msbStorage = inSysEx[i];
 | |
|             byteIndex  = 6;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             const byte body = inSysEx[i];
 | |
|             const byte msb  = ((msbStorage >> byteIndex--) & 1) << 7;
 | |
|             outData[count++] = msb | body;
 | |
|         }
 | |
|     }
 | |
|     return count;
 | |
| }
 | |
| 
 | |
| END_MIDI_NAMESPACE
 |