Experiment with templates.
This commit is contained in:
parent
4b8b38aeaf
commit
5078e0527e
1018
src/MIDI.cpp
1018
src/MIDI.cpp
File diff suppressed because it is too large
Load Diff
20
src/MIDI.h
20
src/MIDI.h
|
|
@ -8,18 +8,21 @@
|
|||
* license GPL Forty Seven Effects - 2011
|
||||
*/
|
||||
|
||||
#ifndef LIB_MIDI_H_
|
||||
#define LIB_MIDI_H_
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "midi_Settings.h"
|
||||
#include "midi_Defs.h"
|
||||
#include <stdlib.h>
|
||||
#include "Arduino.h"
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
BEGIN_MIDI_NAMESPACE
|
||||
|
||||
/*! \brief The main class for MIDI handling.
|
||||
*/
|
||||
//template<typename Uart>
|
||||
template<typename Uart>
|
||||
class MidiInterface
|
||||
{
|
||||
public:
|
||||
|
|
@ -29,7 +32,6 @@ public:
|
|||
public:
|
||||
void begin(byte inChannel = 1);
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// MIDI Output
|
||||
|
||||
|
|
@ -131,7 +133,7 @@ private:
|
|||
// =========================================================================
|
||||
// Input Callbacks
|
||||
|
||||
#if USE_CALLBACKS
|
||||
#if MIDI_USE_CALLBACKS
|
||||
|
||||
public:
|
||||
|
||||
|
|
@ -179,7 +181,7 @@ private:
|
|||
void (*mActiveSensingCallback)(void);
|
||||
void (*mSystemResetCallback)(void);
|
||||
|
||||
#endif // USE_CALLBACKS
|
||||
#endif // MIDI_USE_CALLBACKS
|
||||
|
||||
#endif // MIDI_BUILD_INPUT
|
||||
|
||||
|
|
@ -219,8 +221,12 @@ private:
|
|||
|
||||
END_MIDI_NAMESPACE
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#if MIDI_AUTO_INSTANCIATE
|
||||
extern midi::MidiInterface MIDI;
|
||||
extern MIDI_NAMESPACE::MidiInterface MIDI;
|
||||
#endif
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#include "midi_Inline.hpp"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -12,156 +12,6 @@
|
|||
|
||||
BEGIN_MIDI_NAMESPACE
|
||||
|
||||
#if MIDI_BUILD_OUTPUT
|
||||
|
||||
StatusByte MidiInterface::getStatus(kMIDIType inType,
|
||||
Channel inChannel) const
|
||||
{
|
||||
return ((byte)inType | ((inChannel - 1) & 0x0F));
|
||||
}
|
||||
|
||||
#endif // MIDI_BUILD_OUTPUT
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#if MIDI_BUILD_INPUT
|
||||
|
||||
/*! \brief Get the last received message's type
|
||||
|
||||
Returns an enumerated type. @see MidiType
|
||||
*/
|
||||
MidiType MidiInterface::getType() const
|
||||
{
|
||||
return mMessage.type;
|
||||
}
|
||||
|
||||
/*! \brief Get the channel of the message stored in the structure.
|
||||
|
||||
\return Channel range is 1 to 16.
|
||||
For non-channel messages, this will return 0.
|
||||
*/
|
||||
Channel MidiInterface::getChannel() const
|
||||
{
|
||||
return mMessage.channel;
|
||||
}
|
||||
|
||||
/*! \brief Get the first data byte of the last received message. */
|
||||
DataByte MidiInterface::getData1() const
|
||||
{
|
||||
return mMessage.data1;
|
||||
}
|
||||
|
||||
/*! \brief Get the second data byte of the last received message. */
|
||||
DataByte MidiInterface::getData2() const
|
||||
{
|
||||
return mMessage.data2;
|
||||
}
|
||||
|
||||
/*! \brief Get the System Exclusive byte array.
|
||||
|
||||
@see getSysExArrayLength to get the array's length in bytes.
|
||||
*/
|
||||
const byte* MidiInterface::getSysExArray() const
|
||||
{
|
||||
return mMessage.sysex_array;
|
||||
}
|
||||
|
||||
/*! \brief Get the lenght of the System Exclusive array.
|
||||
|
||||
It is coded using data1 as LSB and data2 as MSB.
|
||||
\return The array's length, in bytes.
|
||||
*/
|
||||
unsigned int MidiInterface::getSysExArrayLength() const
|
||||
{
|
||||
const unsigned int size = ((unsigned)(mMessage.data2) << 8) | mMessage.data1;
|
||||
return (size > MIDI_SYSEX_ARRAY_SIZE) ? MIDI_SYSEX_ARRAY_SIZE : size;
|
||||
}
|
||||
|
||||
/*! \brief Check if a valid message is stored in the structure. */
|
||||
bool MidiInterface::check() const
|
||||
{
|
||||
return mMessage.valid;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
Channel MidiInterface::getInputChannel() const
|
||||
{
|
||||
return mInputChannel;
|
||||
}
|
||||
|
||||
/*! \brief Set the value for the input MIDI channel
|
||||
\param Channel the channel value. Valid values are 1 to 16, MIDI_CHANNEL_OMNI
|
||||
if you want to listen to all channels, and MIDI_CHANNEL_OFF to disable input.
|
||||
*/
|
||||
void MidiInterface::setInputChannel(Channel inChannel)
|
||||
{
|
||||
mInputChannel = inChannel;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
/*! \brief Extract an enumerated MIDI type from a status byte.
|
||||
|
||||
This is a utility static method, used internally,
|
||||
made public so you can handle MidiTypes more easily.
|
||||
*/
|
||||
MidiType MidiInterface::getTypeFromStatusByte(const byte inStatus)
|
||||
{
|
||||
if ((inStatus < 0x80) ||
|
||||
(inStatus == 0xF4) ||
|
||||
(inStatus == 0xF5) ||
|
||||
(inStatus == 0xF9) ||
|
||||
(inStatus == 0xFD)) return InvalidType; // data bytes and undefined.
|
||||
if (inStatus < 0xF0) return (MidiType)(inStatus & 0xF0); // Channel message, remove channel nibble.
|
||||
else return (MidiType)inStatus;
|
||||
}
|
||||
|
||||
#endif // MIDI_BUILD_INPUT
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#if (MIDI_BUILD_INPUT && MIDI_BUILD_OUTPUT && MIDI_BUILD_THRU)
|
||||
|
||||
MidiFilterMode MidiInterface::getFilterMode() const
|
||||
{
|
||||
return mThruFilterMode;
|
||||
}
|
||||
|
||||
bool MidiInterface::getThruState() const
|
||||
{
|
||||
return mThruActivated;
|
||||
}
|
||||
|
||||
/*! \brief Setter method: turn message mirroring on. */
|
||||
void MidiInterface::turnThruOn(MidiFilterMode inThruFilterMode)
|
||||
{
|
||||
mThruActivated = true;
|
||||
mThruFilterMode = inThruFilterMode;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Setter method: turn message mirroring off. */
|
||||
void MidiInterface::turnThruOff()
|
||||
{
|
||||
mThruActivated = false;
|
||||
mThruFilterMode = Off;
|
||||
}
|
||||
|
||||
/*! \brief Set the filter for thru mirroring
|
||||
\param inThruFilterMode a filter mode
|
||||
|
||||
@see MidiFilterMode
|
||||
*/
|
||||
void MidiInterface::setThruFilterMode(MidiFilterMode inThruFilterMode)
|
||||
{
|
||||
mThruFilterMode = inThruFilterMode;
|
||||
if (mThruFilterMode != Off)
|
||||
mThruActivated = true;
|
||||
else
|
||||
mThruActivated = false;
|
||||
}
|
||||
|
||||
#endif // MIDI_BUILD_THRU
|
||||
|
||||
END_MIDI_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ BEGIN_MIDI_NAMESPACE
|
|||
#define MIDI_BUILD_OUTPUT 1
|
||||
#define MIDI_BUILD_THRU 1
|
||||
|
||||
#define MIDI_USE_CALLBACKS 1
|
||||
|
||||
// Create a MIDI object automatically on the port defined with MIDI_SERIAL_PORT.
|
||||
#define MIDI_AUTO_INSTANCIATE 1
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue