/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
This file is part of the JUCE library .
Copyright ( c ) 2015 - ROLI Ltd .
Permission is granted to use this software under the terms of either :
a ) the GPL v2 ( or any later version )
b ) the Affero GPL v3
Details of these licenses can be found at : www . gnu . org / licenses
JUCE is distributed in the hope that it will be useful , but WITHOUT ANY
WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE . See the GNU General Public License for more details .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
To release a closed - source product which uses JUCE , commercial licenses are
available : visit www . juce . com for more information .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
# ifndef JUCE_MIDIMESSAGE_H_INCLUDED
# define JUCE_MIDIMESSAGE_H_INCLUDED
//==============================================================================
/**
Encapsulates a MIDI message .
@ see MidiMessageSequence , MidiOutput , MidiInput
*/
class JUCE_API MidiMessage
{
public :
//==============================================================================
/** Creates a 3-byte short midi message.
@ param byte1 message byte 1
@ param byte2 message byte 2
@ param byte3 message byte 3
@ param timeStamp the time to give the midi message - this value doesn ' t
use any particular units , so will be application - specific
*/
MidiMessage ( int byte1 , int byte2 , int byte3 , double timeStamp = 0 ) noexcept ;
/** Creates a 2-byte short midi message.
@ param byte1 message byte 1
@ param byte2 message byte 2
@ param timeStamp the time to give the midi message - this value doesn ' t
use any particular units , so will be application - specific
*/
MidiMessage ( int byte1 , int byte2 , double timeStamp = 0 ) noexcept ;
/** Creates a 1-byte short midi message.
@ param byte1 message byte 1
@ param timeStamp the time to give the midi message - this value doesn ' t
use any particular units , so will be application - specific
*/
MidiMessage ( int byte1 , double timeStamp = 0 ) noexcept ;
/** Creates a midi message from a block of data. */
MidiMessage ( const void * data , int numBytes , double timeStamp = 0 ) ;
/** Reads the next midi message from some data.
This will read as many bytes from a data stream as it needs to make a
complete message , and will return the number of bytes it used . This lets
you read a sequence of midi messages from a file or stream .
@ param data the data to read from
@ param maxBytesToUse the maximum number of bytes it ' s allowed to read
@ param numBytesUsed returns the number of bytes that were actually needed
@ param lastStatusByte in a sequence of midi messages , the initial byte
can be dropped from a message if it ' s the same as the
first byte of the previous message , so this lets you
supply the byte to use if the first byte of the message
has in fact been dropped .
@ param timeStamp the time to give the midi message - this value doesn ' t
use any particular units , so will be application - specific
@ param sysexHasEmbeddedLength when reading sysexes , this flag indicates whether
to expect the data to begin with a variable - length field
indicating its size
*/
MidiMessage ( const void * data , int maxBytesToUse ,
int & numBytesUsed , uint8 lastStatusByte ,
double timeStamp = 0 ,
bool sysexHasEmbeddedLength = true ) ;
/** Creates an active-sense message.
Since the MidiMessage has to contain a valid message , this default constructor
just initialises it with an empty sysex message .
*/
MidiMessage ( ) noexcept ;
/** Creates a copy of another midi message. */
MidiMessage ( const MidiMessage & ) ;
/** Creates a copy of another midi message, with a different timestamp. */
MidiMessage ( const MidiMessage & , double newTimeStamp ) ;
/** Destructor. */
~ MidiMessage ( ) ;
/** Copies this message from another one. */
MidiMessage & operator = ( const MidiMessage & other ) ;
# if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
MidiMessage ( MidiMessage & & ) noexcept ;
MidiMessage & operator = ( MidiMessage & & ) noexcept ;
# endif
//==============================================================================
/** Returns a pointer to the raw midi data.
@ see getRawDataSize
*/
const uint8 * getRawData ( ) const noexcept { return allocatedData ! = nullptr ? allocatedData . getData ( ) : preallocatedData . asBytes ; }
/** Returns the number of bytes of data in the message.
@ see getRawData
*/
int getRawDataSize ( ) const noexcept { return size ; }
//==============================================================================
/** Returns the timestamp associated with this message.
The exact meaning of this time and its units will vary , as messages are used in
a variety of different contexts .
If you ' re getting the message from a midi file , this could be a time in seconds , or
a number of ticks - see MidiFile : : convertTimestampTicksToSeconds ( ) .
If the message is being used in a MidiBuffer , it might indicate the number of
audio samples from the start of the buffer .
If the message was created by a MidiInput , see MidiInputCallback : : handleIncomingMidiMessage ( )
for details of the way that it initialises this value .
@ see setTimeStamp , addToTimeStamp
*/
double getTimeStamp ( ) const noexcept { return timeStamp ; }
/** Changes the message's associated timestamp.
The units for the timestamp will be application - specific - see the notes for getTimeStamp ( ) .
@ see addToTimeStamp , getTimeStamp
*/
void setTimeStamp ( double newTimestamp ) noexcept { timeStamp = newTimestamp ; }
/** Adds a value to the message's timestamp.
The units for the timestamp will be application - specific .
*/
void addToTimeStamp ( double delta ) noexcept { timeStamp + = delta ; }
//==============================================================================
/** Returns the midi channel associated with the message.
@ returns a value 1 to 16 if the message has a channel , or 0 if it hasn ' t ( e . g .
if it ' s a sysex )
@ see isForChannel , setChannel
*/
int getChannel ( ) const noexcept ;
/** Returns true if the message applies to the given midi channel.
@ param channelNumber the channel number to look for , in the range 1 to 16
@ see getChannel , setChannel
*/
bool isForChannel ( int channelNumber ) const noexcept ;
/** Changes the message's midi channel.
This won ' t do anything for non - channel messages like sysexes .
@ param newChannelNumber the channel number to change it to , in the range 1 to 16
*/
void setChannel ( int newChannelNumber ) noexcept ;
//==============================================================================
/** Returns true if this is a system-exclusive message.
*/
bool isSysEx ( ) const noexcept ;
/** Returns a pointer to the sysex data inside the message.
If this event isn ' t a sysex event , it ' ll return 0.
@ see getSysExDataSize
*/
const uint8 * getSysExData ( ) const noexcept ;
/** Returns the size of the sysex data.
This value excludes the 0xf0 header byte and the 0xf7 at the end .
@ see getSysExData
*/
int getSysExDataSize ( ) const noexcept ;
//==============================================================================
/** Returns true if this message is a 'key-down' event.
@ param returnTrueForVelocity0 if true , then if this event is a note - on with
velocity 0 , it will still be considered to be a note - on and the
method will return true . If returnTrueForVelocity0 is false , then
if this is a note - on event with velocity 0 , it ' ll be regarded as
a note - off , and the method will return false
@ see isNoteOff , getNoteNumber , getVelocity , noteOn
*/
bool isNoteOn ( bool returnTrueForVelocity0 = false ) const noexcept ;
/** Creates a key-down message (using a floating-point velocity).
@ param channel the midi channel , in the range 1 to 16
@ param noteNumber the key number , 0 to 127
@ param velocity in the range 0 to 1.0
@ see isNoteOn
*/
static MidiMessage noteOn ( int channel , int noteNumber , float velocity ) noexcept ;
/** Creates a key-down message (using an integer velocity).
@ param channel the midi channel , in the range 1 to 16
@ param noteNumber the key number , 0 to 127
@ param velocity in the range 0 to 127
@ see isNoteOn
*/
static MidiMessage noteOn ( int channel , int noteNumber , uint8 velocity ) noexcept ;
/** Returns true if this message is a 'key-up' event.
If returnTrueForNoteOnVelocity0 is true , then his will also return true
for a note - on event with a velocity of 0.
@ see isNoteOn , getNoteNumber , getVelocity , noteOff
*/
bool isNoteOff ( bool returnTrueForNoteOnVelocity0 = true ) const noexcept ;
/** Creates a key-up message.
@ param channel the midi channel , in the range 1 to 16
@ param noteNumber the key number , 0 to 127
@ param velocity in the range 0 to 127
@ see isNoteOff
*/
static MidiMessage noteOff ( int channel , int noteNumber , uint8 velocity = 0 ) noexcept ;
/** Returns true if this message is a 'key-down' or 'key-up' event.
@ see isNoteOn , isNoteOff
*/
bool isNoteOnOrOff ( ) const noexcept ;
/** Returns the midi note number for note-on and note-off messages.
If the message isn ' t a note - on or off , the value returned is undefined .
@ see isNoteOff , getMidiNoteName , getMidiNoteInHertz , setNoteNumber
*/
int getNoteNumber ( ) const noexcept ;
/** Changes the midi note number of a note-on or note-off message.
If the message isn ' t a note on or off , this will do nothing .
*/
void setNoteNumber ( int newNoteNumber ) noexcept ;
//==============================================================================
/** Returns the velocity of a note-on or note-off message.
The value returned will be in the range 0 to 127.
If the message isn ' t a note - on or off event , it will return 0.
@ see getFloatVelocity
*/
uint8 getVelocity ( ) const noexcept ;
/** Returns the velocity of a note-on or note-off message.
The value returned will be in the range 0 to 1.0
If the message isn ' t a note - on or off event , it will return 0.
@ see getVelocity , setVelocity
*/
float getFloatVelocity ( ) const noexcept ;
/** Changes the velocity of a note-on or note-off message.
If the message isn ' t a note on or off , this will do nothing .
@ param newVelocity the new velocity , in the range 0 to 1.0
@ see getFloatVelocity , multiplyVelocity
*/
void setVelocity ( float newVelocity ) noexcept ;
/** Multiplies the velocity of a note-on or note-off message by a given amount.
If the message isn ' t a note on or off , this will do nothing .
@ param scaleFactor the value by which to multiply the velocity
@ see setVelocity
*/
void multiplyVelocity ( float scaleFactor ) noexcept ;
//==============================================================================
/** Returns true if this message is a 'sustain pedal down' controller message. */
bool isSustainPedalOn ( ) const noexcept ;
/** Returns true if this message is a 'sustain pedal up' controller message. */
bool isSustainPedalOff ( ) const noexcept ;
/** Returns true if this message is a 'sostenuto pedal down' controller message. */
bool isSostenutoPedalOn ( ) const noexcept ;
/** Returns true if this message is a 'sostenuto pedal up' controller message. */
bool isSostenutoPedalOff ( ) const noexcept ;
/** Returns true if this message is a 'soft pedal down' controller message. */
bool isSoftPedalOn ( ) const noexcept ;
/** Returns true if this message is a 'soft pedal up' controller message. */
bool isSoftPedalOff ( ) const noexcept ;
//==============================================================================
/** Returns true if the message is a program (patch) change message.
@ see getProgramChangeNumber , getGMInstrumentName
*/
bool isProgramChange ( ) const noexcept ;
/** Returns the new program number of a program change message.
If the message isn ' t a program change , the value returned is undefined .
@ see isProgramChange , getGMInstrumentName
*/
int getProgramChangeNumber ( ) const noexcept ;
/** Creates a program-change message.
@ param channel the midi channel , in the range 1 to 16
@ param programNumber the midi program number , 0 to 127
@ see isProgramChange , getGMInstrumentName
*/
static MidiMessage programChange ( int channel , int programNumber ) noexcept ;
//==============================================================================
/** Returns true if the message is a pitch-wheel move.
@ see getPitchWheelValue , pitchWheel
*/
bool isPitchWheel ( ) const noexcept ;
/** Returns the pitch wheel position from a pitch-wheel move message.
The value returned is a 14 - bit number from 0 to 0x3fff , indicating the wheel position .
If called for messages which aren ' t pitch wheel events , the number returned will be
nonsense .
@ see isPitchWheel
*/
int getPitchWheelValue ( ) const noexcept ;
/** Creates a pitch-wheel move message.
@ param channel the midi channel , in the range 1 to 16
@ param position the wheel position , in the range 0 to 16383
@ see isPitchWheel
*/
static MidiMessage pitchWheel ( int channel , int position ) noexcept ;
//==============================================================================
/** Returns true if the message is an aftertouch event.
For aftertouch events , use the getNoteNumber ( ) method to find out the key
that it applies to , and getAftertouchValue ( ) to find out the amount . Use
getChannel ( ) to find out the channel .
@ see getAftertouchValue , getNoteNumber
*/
bool isAftertouch ( ) const noexcept ;
/** Returns the amount of aftertouch from an aftertouch messages.
The value returned is in the range 0 to 127 , and will be nonsense for messages
other than aftertouch messages .
@ see isAftertouch
*/
int getAfterTouchValue ( ) const noexcept ;
/** Creates an aftertouch message.
@ param channel the midi channel , in the range 1 to 16
@ param noteNumber the key number , 0 to 127
@ param aftertouchAmount the amount of aftertouch , 0 to 127
@ see isAftertouch
*/
static MidiMessage aftertouchChange ( int channel ,
int noteNumber ,
int aftertouchAmount ) noexcept ;
/** Returns true if the message is a channel-pressure change event.
This is like aftertouch , but common to the whole channel rather than a specific
note . Use getChannelPressureValue ( ) to find out the pressure , and getChannel ( )
to find out the channel .
@ see channelPressureChange
*/
bool isChannelPressure ( ) const noexcept ;
/** Returns the pressure from a channel pressure change message.
@ returns the pressure , in the range 0 to 127
@ see isChannelPressure , channelPressureChange
*/
int getChannelPressureValue ( ) const noexcept ;
/** Creates a channel-pressure change event.
@ param channel the midi channel : 1 to 16
@ param pressure the pressure , 0 to 127
@ see isChannelPressure
*/
static MidiMessage channelPressureChange ( int channel , int pressure ) noexcept ;
//==============================================================================
/** Returns true if this is a midi controller message.
@ see getControllerNumber , getControllerValue , controllerEvent
*/
bool isController ( ) const noexcept ;
/** Returns the controller number of a controller message.
The name of the controller can be looked up using the getControllerName ( ) method .
Note that the value returned is invalid for messages that aren ' t controller changes .
@ see isController , getControllerName , getControllerValue
*/
int getControllerNumber ( ) const noexcept ;
/** Returns the controller value from a controller message.
A value 0 to 127 is returned to indicate the new controller position .
Note that the value returned is invalid for messages that aren ' t controller changes .
@ see isController , getControllerNumber
*/
int getControllerValue ( ) const noexcept ;
/** Returns true if this message is a controller message and if it has the specified
controller type .
*/
bool isControllerOfType ( int controllerType ) const noexcept ;
/** Creates a controller message.
@ param channel the midi channel , in the range 1 to 16
@ param controllerType the type of controller
@ param value the controller value
@ see isController
*/
static MidiMessage controllerEvent ( int channel ,
int controllerType ,
int value ) noexcept ;
/** Checks whether this message is an all-notes-off message.
@ see allNotesOff
*/
bool isAllNotesOff ( ) const noexcept ;
/** Checks whether this message is an all-sound-off message.
@ see allSoundOff
*/
bool isAllSoundOff ( ) const noexcept ;
/** Creates an all-notes-off message.
@ param channel the midi channel , in the range 1 to 16
@ see isAllNotesOff
*/
static MidiMessage allNotesOff ( int channel ) noexcept ;
/** Creates an all-sound-off message.
@ param channel the midi channel , in the range 1 to 16
@ see isAllSoundOff
*/
static MidiMessage allSoundOff ( int channel ) noexcept ;
/** Creates an all-controllers-off message.
@ param channel the midi channel , in the range 1 to 16
*/
static MidiMessage allControllersOff ( int channel ) noexcept ;
//==============================================================================
/** Returns true if this event is a meta-event.
Meta - events are things like tempo changes , track names , etc .
@ see getMetaEventType , isTrackMetaEvent , isEndOfTrackMetaEvent ,
isTextMetaEvent , isTrackNameEvent , isTempoMetaEvent , isTimeSignatureMetaEvent ,
isKeySignatureMetaEvent , isMidiChannelMetaEvent
*/
bool isMetaEvent ( ) const noexcept ;
/** Returns a meta-event's type number.
If the message isn ' t a meta - event , this will return - 1.
@ see isMetaEvent , isTrackMetaEvent , isEndOfTrackMetaEvent ,
isTextMetaEvent , isTrackNameEvent , isTempoMetaEvent , isTimeSignatureMetaEvent ,
isKeySignatureMetaEvent , isMidiChannelMetaEvent
*/
int getMetaEventType ( ) const noexcept ;
/** Returns a pointer to the data in a meta-event.
@ see isMetaEvent , getMetaEventLength
*/
const uint8 * getMetaEventData ( ) const noexcept ;
/** Returns the length of the data for a meta-event.
@ see isMetaEvent , getMetaEventData
*/
int getMetaEventLength ( ) const noexcept ;
//==============================================================================
/** Returns true if this is a 'track' meta-event. */
bool isTrackMetaEvent ( ) const noexcept ;
/** Returns true if this is an 'end-of-track' meta-event. */
bool isEndOfTrackMetaEvent ( ) const noexcept ;
/** Creates an end-of-track meta-event.
@ see isEndOfTrackMetaEvent
*/
static MidiMessage endOfTrack ( ) noexcept ;
/** Returns true if this is an 'track name' meta-event.
You can use the getTextFromTextMetaEvent ( ) method to get the track ' s name .
*/
bool isTrackNameEvent ( ) const noexcept ;
/** Returns true if this is a 'text' meta-event.
@ see getTextFromTextMetaEvent
*/
bool isTextMetaEvent ( ) const noexcept ;
/** Returns the text from a text meta-event.
@ see isTextMetaEvent
*/
String getTextFromTextMetaEvent ( ) const ;
/** Creates a text meta-event. */
static MidiMessage textMetaEvent ( int type , StringRef text ) ;
//==============================================================================
/** Returns true if this is a 'tempo' meta-event.
@ see getTempoMetaEventTickLength , getTempoSecondsPerQuarterNote
*/
bool isTempoMetaEvent ( ) const noexcept ;
/** Returns the tick length from a tempo meta-event.
@ param timeFormat the 16 - bit time format value from the midi file ' s header .
@ returns the tick length ( in seconds ) .
@ see isTempoMetaEvent
*/
double getTempoMetaEventTickLength ( short timeFormat ) const noexcept ;
/** Calculates the seconds-per-quarter-note from a tempo meta-event.
@ see isTempoMetaEvent , getTempoMetaEventTickLength
*/
double getTempoSecondsPerQuarterNote ( ) const noexcept ;
/** Creates a tempo meta-event.
@ see isTempoMetaEvent
*/
static MidiMessage tempoMetaEvent ( int microsecondsPerQuarterNote ) noexcept ;
//==============================================================================
/** Returns true if this is a 'time-signature' meta-event.
@ see getTimeSignatureInfo
*/
bool isTimeSignatureMetaEvent ( ) const noexcept ;
/** Returns the time-signature values from a time-signature meta-event.
@ see isTimeSignatureMetaEvent
*/
void getTimeSignatureInfo ( int & numerator , int & denominator ) const noexcept ;
/** Creates a time-signature meta-event.
@ see isTimeSignatureMetaEvent
*/
static MidiMessage timeSignatureMetaEvent ( int numerator , int denominator ) ;
//==============================================================================
/** Returns true if this is a 'key-signature' meta-event.
@ see getKeySignatureNumberOfSharpsOrFlats , isKeySignatureMajorKey
*/
bool isKeySignatureMetaEvent ( ) const noexcept ;
/** Returns the key from a key-signature meta-event.
This method must only be called if isKeySignatureMetaEvent ( ) is true .
A positive number here indicates the number of sharps in the key signature ,
and a negative number indicates a number of flats . So e . g . 3 = F # + C # + G # ,
- 2 = Bb + Eb
@ see isKeySignatureMetaEvent , isKeySignatureMajorKey
*/
int getKeySignatureNumberOfSharpsOrFlats ( ) const noexcept ;
/** Returns true if this key-signature event is major, or false if it's minor.
This method must only be called if isKeySignatureMetaEvent ( ) is true .
*/
bool isKeySignatureMajorKey ( ) const noexcept ;
/** Creates a key-signature meta-event.
@ param numberOfSharpsOrFlats if positive , this indicates the number of sharps
in the key ; if negative , the number of flats
@ param isMinorKey if true , the key is minor ; if false , it is major
@ see isKeySignatureMetaEvent
*/
static MidiMessage keySignatureMetaEvent ( int numberOfSharpsOrFlats , bool isMinorKey ) ;
//==============================================================================
/** Returns true if this is a 'channel' meta-event.
A channel meta - event specifies the midi channel that should be used
for subsequent meta - events .
@ see getMidiChannelMetaEventChannel
*/
bool isMidiChannelMetaEvent ( ) const noexcept ;
/** Returns the channel number from a channel meta-event.
@ returns the channel , in the range 1 to 16.
@ see isMidiChannelMetaEvent
*/
int getMidiChannelMetaEventChannel ( ) const noexcept ;
/** Creates a midi channel meta-event.
@ param channel the midi channel , in the range 1 to 16
@ see isMidiChannelMetaEvent
*/
static MidiMessage midiChannelMetaEvent ( int channel ) noexcept ;
//==============================================================================
/** Returns true if this is an active-sense message. */
bool isActiveSense ( ) const noexcept ;
//==============================================================================
/** Returns true if this is a midi start event.
@ see midiStart
*/
bool isMidiStart ( ) const noexcept ;
/** Creates a midi start event. */
static MidiMessage midiStart ( ) noexcept ;
/** Returns true if this is a midi continue event.
@ see midiContinue
*/
bool isMidiContinue ( ) const noexcept ;
/** Creates a midi continue event. */
static MidiMessage midiContinue ( ) noexcept ;
/** Returns true if this is a midi stop event.
@ see midiStop
*/
bool isMidiStop ( ) const noexcept ;
/** Creates a midi stop event. */
static MidiMessage midiStop ( ) noexcept ;
/** Returns true if this is a midi clock event.
@ see midiClock , songPositionPointer
*/
bool isMidiClock ( ) const noexcept ;
/** Creates a midi clock event. */
static MidiMessage midiClock ( ) noexcept ;
/** Returns true if this is a song-position-pointer message.
@ see getSongPositionPointerMidiBeat , songPositionPointer
*/
bool isSongPositionPointer ( ) const noexcept ;
/** Returns the midi beat-number of a song-position-pointer message.
@ see isSongPositionPointer , songPositionPointer
*/
int getSongPositionPointerMidiBeat ( ) const noexcept ;
/** Creates a song-position-pointer message.
The position is a number of midi beats from the start of the song , where 1 midi
beat is 6 midi clocks , and there are 24 midi clocks in a quarter - note . So there
are 4 midi beats in a quarter - note .
@ see isSongPositionPointer , getSongPositionPointerMidiBeat
*/
static MidiMessage songPositionPointer ( int positionInMidiBeats ) noexcept ;
//==============================================================================
/** Returns true if this is a quarter-frame midi timecode message.
@ see quarterFrame , getQuarterFrameSequenceNumber , getQuarterFrameValue
*/
bool isQuarterFrame ( ) const noexcept ;
/** Returns the sequence number of a quarter-frame midi timecode message.
This will be a value between 0 and 7.
@ see isQuarterFrame , getQuarterFrameValue , quarterFrame
*/
int getQuarterFrameSequenceNumber ( ) const noexcept ;
/** Returns the value from a quarter-frame message.
This will be the lower nybble of the message ' s data - byte , a value between 0 and 15
*/
int getQuarterFrameValue ( ) const noexcept ;
/** Creates a quarter-frame MTC message.
@ param sequenceNumber a value 0 to 7 for the upper nybble of the message ' s data byte
@ param value a value 0 to 15 for the lower nybble of the message ' s data byte
*/
static MidiMessage quarterFrame ( int sequenceNumber , int value ) noexcept ;
/** SMPTE timecode types.
Used by the getFullFrameParameters ( ) and fullFrame ( ) methods .
*/
enum SmpteTimecodeType
{
fps24 = 0 ,
fps25 = 1 ,
fps30drop = 2 ,
fps30 = 3
} ;
/** Returns true if this is a full-frame midi timecode message. */
bool isFullFrame ( ) const noexcept ;
/** Extracts the timecode information from a full-frame midi timecode message.
You should only call this on messages where you ' ve used isFullFrame ( ) to
check that they ' re the right kind .
*/
void getFullFrameParameters ( int & hours ,
int & minutes ,
int & seconds ,
int & frames ,
SmpteTimecodeType & timecodeType ) const noexcept ;
/** Creates a full-frame MTC message. */
static MidiMessage fullFrame ( int hours ,
int minutes ,
int seconds ,
int frames ,
SmpteTimecodeType timecodeType ) ;
//==============================================================================
/** Types of MMC command.
@ see isMidiMachineControlMessage , getMidiMachineControlCommand , midiMachineControlCommand
*/
enum MidiMachineControlCommand
{
mmc_stop = 1 ,
mmc_play = 2 ,
mmc_deferredplay = 3 ,
mmc_fastforward = 4 ,
mmc_rewind = 5 ,
mmc_recordStart = 6 ,
mmc_recordStop = 7 ,
mmc_pause = 9
} ;
/** Checks whether this is an MMC message.
If it is , you can use the getMidiMachineControlCommand ( ) to find out its type .
*/
bool isMidiMachineControlMessage ( ) const noexcept ;
/** For an MMC message, this returns its type.
Make sure it ' s actually an MMC message with isMidiMachineControlMessage ( ) before
calling this method .
*/
MidiMachineControlCommand getMidiMachineControlCommand ( ) const noexcept ;
/** Creates an MMC message. */
static MidiMessage midiMachineControlCommand ( MidiMachineControlCommand command ) ;
/** Checks whether this is an MMC "goto" message.
If it is , the parameters passed - in are set to the time that the message contains .
@ see midiMachineControlGoto
*/
bool isMidiMachineControlGoto ( int & hours ,
int & minutes ,
int & seconds ,
int & frames ) const noexcept ;
/** Creates an MMC "goto" message.
This messages tells the device to go to a specific frame .
@ see isMidiMachineControlGoto
*/
static MidiMessage midiMachineControlGoto ( int hours ,
int minutes ,
int seconds ,
int frames ) ;
//==============================================================================
/** Creates a master-volume change message.
@ param volume the volume , 0 to 1.0
*/
static MidiMessage masterVolume ( float volume ) ;
//==============================================================================
/** Creates a system-exclusive message.
The data passed in is wrapped with header and tail bytes of 0xf0 and 0xf7 .
*/
static MidiMessage createSysExMessage ( const void * sysexData ,
int dataSize ) ;
//==============================================================================
/** Reads a midi variable-length integer.
@ param data the data to read the number from
@ param numBytesUsed on return , this will be set to the number of bytes that were read
*/
static int readVariableLengthVal ( const uint8 * data ,
int & numBytesUsed ) noexcept ;
/** Based on the first byte of a short midi message, this uses a lookup table
to return the message length ( either 1 , 2 , or 3 bytes ) .
The value passed in must be 0x80 or higher .
*/
static int getMessageLengthFromFirstByte ( const uint8 firstByte ) noexcept ;
//==============================================================================
/** Returns the name of a midi note number.
E . g " C " , " D# " , etc .
@ param noteNumber the midi note number , 0 to 127
@ param useSharps if true , sharpened notes are used , e . g . " C# " , otherwise
they ' ll be flattened , e . g . " Db "
@ param includeOctaveNumber if true , the octave number will be appended to the string ,
e . g . " C#4 "
@ param octaveNumForMiddleC if an octave number is being appended , this indicates the
number that will be used for middle C ' s octave
@ see getMidiNoteInHertz
*/
static String getMidiNoteName ( int noteNumber ,
bool useSharps ,
bool includeOctaveNumber ,
int octaveNumForMiddleC ) ;
/** Returns the frequency of a midi note number.
The frequencyOfA parameter is an optional frequency for ' A ' , normally 440 - 444 Hz for concert pitch .
@ see getMidiNoteName
*/
static double getMidiNoteInHertz ( int noteNumber , const double frequencyOfA = 440.0 ) noexcept ;
/** Returns true if the given midi note number is a black key. */
static bool isMidiNoteBlack ( int noteNumber ) noexcept ;
/** Returns the standard name of a GM instrument, or nullptr if unknown for this index.
@ param midiInstrumentNumber the program number 0 to 127
@ see getProgramChangeNumber
*/
static const char * getGMInstrumentName ( int midiInstrumentNumber ) ;
/** Returns the name of a bank of GM instruments, or nullptr if unknown for this bank number.
@ param midiBankNumber the bank , 0 to 15
*/
static const char * getGMInstrumentBankName ( int midiBankNumber ) ;
/** Returns the standard name of a channel 10 percussion sound, or nullptr if unknown for this note number.
@ param midiNoteNumber the key number , 35 to 81
*/
static const char * getRhythmInstrumentName ( int midiNoteNumber ) ;
/** Returns the name of a controller type number, or nullptr if unknown for this controller number.
@ see getControllerNumber
*/
static const char * getControllerName ( int controllerNumber ) ;
private :
//==============================================================================
double timeStamp ;
HeapBlock < uint8 > allocatedData ;
int size ;
# ifndef DOXYGEN
union
{
uint8 asBytes [ 4 ] ;
uint32 asInt32 ;
} preallocatedData ;
# endif
inline uint8 * getData ( ) noexcept { return allocatedData ! = nullptr ? allocatedData . getData ( ) : preallocatedData . asBytes ; }
uint8 * allocateSpace ( int ) ;
} ;
# endif // JUCE_MIDIMESSAGE_H_INCLUDED