Removed auto-instanciation
This commit is contained in:
parent
410e51c91a
commit
f88012b38f
21
src/MIDI.cpp
21
src/MIDI.cpp
|
|
@ -25,27 +25,6 @@
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
#if !(MIDI_BUILD_INPUT) && !(MIDI_BUILD_OUTPUT)
|
|
||||||
# error To use MIDI, you need to enable at least input or output.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MIDI_BUILD_THRU && !(MIDI_BUILD_OUTPUT)
|
|
||||||
# error For thru to work, you need to enable output.
|
|
||||||
#endif
|
|
||||||
#if MIDI_BUILD_THRU && !(MIDI_BUILD_INPUT)
|
|
||||||
# error For thru to work, you need to enable input.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#if MIDI_AUTO_INSTANCIATE && defined(ARDUINO)
|
|
||||||
MIDI_CREATE_INSTANCE(MIDI_DEFAULT_SERIAL_CLASS,
|
|
||||||
MIDI_DEFAULT_SERIAL_PORT,
|
|
||||||
MIDI);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
BEGIN_MIDI_NAMESPACE
|
BEGIN_MIDI_NAMESPACE
|
||||||
|
|
||||||
/*! \brief Encode System Exclusive messages.
|
/*! \brief Encode System Exclusive messages.
|
||||||
|
|
|
||||||
63
src/MIDI.h
63
src/MIDI.h
|
|
@ -26,10 +26,6 @@
|
||||||
#include "midi_Settings.h"
|
#include "midi_Settings.h"
|
||||||
#include "midi_Defs.h"
|
#include "midi_Defs.h"
|
||||||
|
|
||||||
#ifdef FSE_AVR
|
|
||||||
#include <ak47.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
BEGIN_MIDI_NAMESPACE
|
BEGIN_MIDI_NAMESPACE
|
||||||
|
|
@ -44,8 +40,8 @@ template<class SerialPort, class Settings = DefaultSettings>
|
||||||
class MidiInterface
|
class MidiInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MidiInterface(SerialPort& inSerial);
|
inline MidiInterface(SerialPort& inSerial);
|
||||||
~MidiInterface();
|
inline ~MidiInterface();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void begin(Channel inChannel = 1);
|
void begin(Channel inChannel = 1);
|
||||||
|
|
@ -53,8 +49,6 @@ public:
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// MIDI Output
|
// MIDI Output
|
||||||
|
|
||||||
#if MIDI_BUILD_OUTPUT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline void sendNoteOn(DataByte inNoteNumber,
|
inline void sendNoteOn(DataByte inNoteNumber,
|
||||||
DataByte inVelocity,
|
DataByte inVelocity,
|
||||||
|
|
@ -100,17 +94,9 @@ public:
|
||||||
DataByte inData2,
|
DataByte inData2,
|
||||||
Channel inChannel);
|
Channel inChannel);
|
||||||
|
|
||||||
private:
|
|
||||||
inline StatusByte getStatus(MidiType inType,
|
|
||||||
Channel inChannel) const;
|
|
||||||
|
|
||||||
#endif // MIDI_BUILD_OUTPUT
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// MIDI Input
|
// MIDI Input
|
||||||
|
|
||||||
#if MIDI_BUILD_INPUT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline bool read();
|
inline bool read();
|
||||||
inline bool read(Channel inChannel);
|
inline bool read(Channel inChannel);
|
||||||
|
|
@ -133,25 +119,10 @@ public:
|
||||||
static inline Channel getChannelFromStatusByte(byte inStatus);
|
static inline Channel getChannelFromStatusByte(byte inStatus);
|
||||||
static inline bool isChannelMessage(MidiType inType);
|
static inline bool isChannelMessage(MidiType inType);
|
||||||
|
|
||||||
private:
|
|
||||||
bool parse();
|
|
||||||
inline void handleNullVelocityNoteOnAsNoteOff();
|
|
||||||
inline bool inputFilter(Channel inChannel);
|
|
||||||
inline void resetInput();
|
|
||||||
|
|
||||||
private:
|
|
||||||
StatusByte mRunningStatus_RX;
|
|
||||||
Channel mInputChannel;
|
|
||||||
byte mPendingMessage[3];
|
|
||||||
unsigned mPendingMessageExpectedLenght;
|
|
||||||
unsigned mPendingMessageIndex;
|
|
||||||
Message mMessage;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Input Callbacks
|
// Input Callbacks
|
||||||
|
|
||||||
#if MIDI_USE_CALLBACKS
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity));
|
inline void setHandleNoteOff(void (*fptr)(byte channel, byte note, byte velocity));
|
||||||
inline void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity));
|
inline void setHandleNoteOn(void (*fptr)(byte channel, byte note, byte velocity));
|
||||||
|
|
@ -196,14 +167,9 @@ private:
|
||||||
void (*mActiveSensingCallback)(void);
|
void (*mActiveSensingCallback)(void);
|
||||||
void (*mSystemResetCallback)(void);
|
void (*mSystemResetCallback)(void);
|
||||||
|
|
||||||
#endif // MIDI_USE_CALLBACKS
|
|
||||||
#endif // MIDI_BUILD_INPUT
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// MIDI Soft Thru
|
// MIDI Soft Thru
|
||||||
|
|
||||||
#if MIDI_BUILD_THRU
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline MidiFilterMode getFilterMode() const;
|
inline MidiFilterMode getFilterMode() const;
|
||||||
inline bool getThruState() const;
|
inline bool getThruState() const;
|
||||||
|
|
@ -216,11 +182,28 @@ public:
|
||||||
private:
|
private:
|
||||||
void thruFilter(byte inChannel);
|
void thruFilter(byte inChannel);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool parse();
|
||||||
|
inline void handleNullVelocityNoteOnAsNoteOff();
|
||||||
|
inline bool inputFilter(Channel inChannel);
|
||||||
|
inline void resetInput();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool mThruActivated : 1;
|
bool mThruActivated : 1;
|
||||||
MidiFilterMode mThruFilterMode : 7;
|
MidiFilterMode mThruFilterMode : 7;
|
||||||
|
|
||||||
#endif // MIDI_BUILD_THRU
|
private:
|
||||||
|
StatusByte mRunningStatus_RX;
|
||||||
|
Channel mInputChannel;
|
||||||
|
byte mPendingMessage[3];
|
||||||
|
unsigned mPendingMessageExpectedLenght;
|
||||||
|
unsigned mPendingMessageIndex;
|
||||||
|
Message mMessage;
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline StatusByte getStatus(MidiType inType,
|
||||||
|
Channel inChannel) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if MIDI_USE_RUNNING_STATUS
|
#if MIDI_USE_RUNNING_STATUS
|
||||||
|
|
@ -241,10 +224,4 @@ END_MIDI_NAMESPACE
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
#if MIDI_AUTO_INSTANCIATE && defined(ARDUINO)
|
|
||||||
extern MIDI_NAMESPACE::MidiInterface<MIDI_DEFAULT_SERIAL_CLASS> MIDI;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include "MIDI.hpp"
|
#include "MIDI.hpp"
|
||||||
|
|
|
||||||
43
src/MIDI.hpp
43
src/MIDI.hpp
|
|
@ -143,7 +143,7 @@ void MidiInterface<SerialPort, Settings>::send(MidiType inType,
|
||||||
// Then test if channel is valid
|
// Then test if channel is valid
|
||||||
if (inChannel >= MIDI_CHANNEL_OFF ||
|
if (inChannel >= MIDI_CHANNEL_OFF ||
|
||||||
inChannel == MIDI_CHANNEL_OMNI ||
|
inChannel == MIDI_CHANNEL_OMNI ||
|
||||||
inType < NoteOff)
|
inType < 0x80)
|
||||||
{
|
{
|
||||||
if (Settings::UseRunningStatus)
|
if (Settings::UseRunningStatus)
|
||||||
{
|
{
|
||||||
|
|
@ -178,12 +178,14 @@ void MidiInterface<SerialPort, Settings>::send(MidiType inType,
|
||||||
// Then send data
|
// Then send data
|
||||||
mSerial.write(inData1);
|
mSerial.write(inData1);
|
||||||
if (inType != ProgramChange && inType != AfterTouchChannel)
|
if (inType != ProgramChange && inType != AfterTouchChannel)
|
||||||
|
{
|
||||||
mSerial.write(inData2);
|
mSerial.write(inData2);
|
||||||
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else if (inType >= TuneRequest && inType <= SystemReset)
|
else if (inType >= TuneRequest && inType <= SystemReset)
|
||||||
|
{
|
||||||
sendRealTime(inType); // System Real-time and 1 byte.
|
sendRealTime(inType); // System Real-time and 1 byte.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
@ -212,7 +214,7 @@ void MidiInterface<SerialPort, Settings>::sendNoteOn(DataByte inNoteNumber,
|
||||||
|
|
||||||
Note: you can send NoteOn with zero velocity to make a NoteOff, this is based
|
Note: you can send NoteOn with zero velocity to make a NoteOff, this is based
|
||||||
on the Running Status principle, to avoid sending status messages and thus
|
on the Running Status principle, to avoid sending status messages and thus
|
||||||
sending only NoteOn data. This method will always send a real NoteOff message.
|
sending only NoteOn data. sendNoteOff will always send a real NoteOff message.
|
||||||
Take a look at the values, names and frequencies of notes here:
|
Take a look at the values, names and frequencies of notes here:
|
||||||
http://www.phys.unsw.edu.au/jw/notes.html
|
http://www.phys.unsw.edu.au/jw/notes.html
|
||||||
*/
|
*/
|
||||||
|
|
@ -492,24 +494,22 @@ inline bool MidiInterface<SerialPort, Settings>::read(Channel inChannel)
|
||||||
if (inChannel >= MIDI_CHANNEL_OFF)
|
if (inChannel >= MIDI_CHANNEL_OFF)
|
||||||
return false; // MIDI Input disabled.
|
return false; // MIDI Input disabled.
|
||||||
|
|
||||||
if (parse())
|
if (!parse())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
handleNullVelocityNoteOnAsNoteOff();
|
||||||
|
const bool channelMatch = inputFilter(inChannel);
|
||||||
|
|
||||||
|
if (MIDI_USE_CALLBACKS && channelMatch)
|
||||||
{
|
{
|
||||||
handleNullVelocityNoteOnAsNoteOff();
|
launchCallback();
|
||||||
if (inputFilter(inChannel))
|
|
||||||
{
|
|
||||||
|
|
||||||
#if (MIDI_BUILD_OUTPUT && MIDI_BUILD_THRU)
|
|
||||||
thruFilter(inChannel);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MIDI_USE_CALLBACKS
|
|
||||||
launchCallback();
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
#if MIDI_BUILD_THRU
|
||||||
|
thruFilter(inChannel);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return channelMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
@ -802,7 +802,6 @@ inline void MidiInterface<SerialPort, Settings>::handleNullVelocityNoteOnAsNoteO
|
||||||
{
|
{
|
||||||
mMessage.type = NoteOff;
|
mMessage.type = NoteOff;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private method: check if the received message is on the listened channel
|
// Private method: check if the received message is on the listened channel
|
||||||
|
|
@ -953,10 +952,10 @@ MidiType MidiInterface<SerialPort, Settings>::getTypeFromStatusByte(byte inStatu
|
||||||
if (inStatus < 0xf0)
|
if (inStatus < 0xf0)
|
||||||
{
|
{
|
||||||
// Channel message, remove channel nibble.
|
// Channel message, remove channel nibble.
|
||||||
return (MidiType)(inStatus & 0xf0);
|
return MidiType(inStatus & 0xf0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (MidiType)inStatus;
|
return MidiType(inStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Returns channel in the range 1-16
|
/*! \brief Returns channel in the range 1-16
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "midi_Namespace.h"
|
#include "midi_Namespace.h"
|
||||||
|
#include "midi_Settings.h"
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
BEGIN_MIDI_NAMESPACE
|
BEGIN_MIDI_NAMESPACE
|
||||||
|
|
@ -39,8 +40,7 @@ BEGIN_MIDI_NAMESPACE
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Type definitions
|
// Type definitions
|
||||||
|
|
||||||
typedef uint8_t byte;
|
typedef uint8_t byte;
|
||||||
|
|
||||||
typedef byte StatusByte;
|
typedef byte StatusByte;
|
||||||
typedef byte DataByte;
|
typedef byte DataByte;
|
||||||
typedef byte Channel;
|
typedef byte Channel;
|
||||||
|
|
@ -163,7 +163,6 @@ enum MidiControlChangeNumber
|
||||||
*/
|
*/
|
||||||
struct Message
|
struct Message
|
||||||
{
|
{
|
||||||
|
|
||||||
/*! The MIDI channel on which the message was recieved.
|
/*! The MIDI channel on which the message was recieved.
|
||||||
\n Value goes from 1 to 16.
|
\n Value goes from 1 to 16.
|
||||||
*/
|
*/
|
||||||
|
|
@ -196,13 +195,14 @@ struct Message
|
||||||
validity means the message respects the MIDI norm.
|
validity means the message respects the MIDI norm.
|
||||||
*/
|
*/
|
||||||
bool valid;
|
bool valid;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
/*! \brief Create an instance of the library attached to a serial port.
|
/*! \brief Create an instance of the library attached to a serial port.
|
||||||
You can use HardwareSerial or SoftwareSerial for the serial port.
|
You can use HardwareSerial or SoftwareSerial for the serial port.
|
||||||
|
Example: MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midi2);
|
||||||
|
Then call midi2.begin(), midi2.read() etc..
|
||||||
*/
|
*/
|
||||||
#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name) \
|
#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name) \
|
||||||
midi::MidiInterface<Type> Name((Type&)SerialPort);
|
midi::MidiInterface<Type> Name((Type&)SerialPort);
|
||||||
|
|
|
||||||
|
|
@ -44,36 +44,6 @@
|
||||||
|
|
||||||
#define MIDI_USE_CALLBACKS 1
|
#define MIDI_USE_CALLBACKS 1
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Create a MIDI object automatically on the port defined with MIDI_SERIAL_PORT.
|
|
||||||
#ifndef MIDI_AUTO_INSTANCIATE
|
|
||||||
# ifdef ARDUINO
|
|
||||||
# define MIDI_AUTO_INSTANCIATE 1
|
|
||||||
# else
|
|
||||||
# define MIDI_AUTO_INSTANCIATE 0 ///< @see MIDI_CREATE_INSTANCE
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// Default serial port configuration (if MIDI_AUTO_INSTANCIATE is set)
|
|
||||||
|
|
||||||
// Set the default port to use for MIDI.
|
|
||||||
#if MIDI_AUTO_INSTANCIATE
|
|
||||||
# ifdef ARDUINO
|
|
||||||
# include "Arduino.h"
|
|
||||||
# ifdef USBCON
|
|
||||||
# define MIDI_DEFAULT_SERIAL_PORT Serial1 // For Leonardo
|
|
||||||
# else
|
|
||||||
# define MIDI_DEFAULT_SERIAL_PORT Serial // For other Arduinos
|
|
||||||
# endif
|
|
||||||
# define MIDI_DEFAULT_SERIAL_CLASS HardwareSerial
|
|
||||||
# include "HardwareSerial.h"
|
|
||||||
# else
|
|
||||||
# error Auto-instanciation disabled. Use MIDI_CREATE_INSTANCE macro.
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Misc. options
|
// Misc. options
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue