LMMS
Loading...
Searching...
No Matches
juce_MidiMessage.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
26//==============================================================================
35{
36public:
37 //==============================================================================
46 MidiMessage (int byte1, int byte2, int byte3, double timeStamp = 0) noexcept;
47
55 MidiMessage (int byte1, int byte2, double timeStamp = 0) noexcept;
56
63 MidiMessage (int byte1, double timeStamp = 0) noexcept;
64
66 template <typename... Data>
67 MidiMessage (int byte1, int byte2, int byte3, Data... otherBytes) : size (3 + sizeof... (otherBytes))
68 {
69 // this checks that the length matches the data..
70 jassert (size > 3 || byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == size);
71
72 const uint8 data[] = { (uint8) byte1, (uint8) byte2, (uint8) byte3, static_cast<uint8> (otherBytes)... };
73 memcpy (allocateSpace (size), data, (size_t) size);
74 }
75
76
78 MidiMessage (const void* data, int numBytes, double timeStamp = 0);
79
100 MidiMessage (const void* data, int maxBytesToUse,
101 int& numBytesUsed, uint8 lastStatusByte,
102 double timeStamp = 0,
103 bool sysexHasEmbeddedLength = true);
104
111
114
116 MidiMessage (const MidiMessage&, double newTimeStamp);
117
120
122 MidiMessage& operator= (const MidiMessage& other);
123
126
128 MidiMessage& operator= (MidiMessage&&) noexcept;
129
130 //==============================================================================
135
140
141 //==============================================================================
145 String getDescription() const;
146
147 //==============================================================================
165
170 void setTimeStamp (double newTimestamp) noexcept { timeStamp = newTimestamp; }
171
175 void addToTimeStamp (double delta) noexcept { timeStamp += delta; }
176
180 MidiMessage withTimeStamp (double newTimestamp) const;
181
182 //==============================================================================
189 int getChannel() const noexcept;
190
196 bool isForChannel (int channelNumber) const noexcept;
197
202 void setChannel (int newChannelNumber) noexcept;
203
204 //==============================================================================
207 bool isSysEx() const noexcept;
208
213 const uint8* getSysExData() const noexcept;
214
219 int getSysExDataSize() const noexcept;
220
221 //==============================================================================
232 bool isNoteOn (bool returnTrueForVelocity0 = false) const noexcept;
233
241 static MidiMessage noteOn (int channel, int noteNumber, float velocity) noexcept;
242
250 static MidiMessage noteOn (int channel, int noteNumber, uint8 velocity) noexcept;
251
259 bool isNoteOff (bool returnTrueForNoteOnVelocity0 = true) const noexcept;
260
268 static MidiMessage noteOff (int channel, int noteNumber, float velocity) noexcept;
269
277 static MidiMessage noteOff (int channel, int noteNumber, uint8 velocity) noexcept;
278
285 static MidiMessage noteOff (int channel, int noteNumber) noexcept;
286
291 bool isNoteOnOrOff() const noexcept;
292
297 int getNoteNumber() const noexcept;
298
302 void setNoteNumber (int newNoteNumber) noexcept;
303
304 //==============================================================================
312 uint8 getVelocity() const noexcept;
313
321 float getFloatVelocity() const noexcept;
322
330 void setVelocity (float newVelocity) noexcept;
331
339 void multiplyVelocity (float scaleFactor) noexcept;
340
341 //==============================================================================
343 bool isSustainPedalOn() const noexcept;
345 bool isSustainPedalOff() const noexcept;
346
348 bool isSostenutoPedalOn() const noexcept;
350 bool isSostenutoPedalOff() const noexcept;
351
353 bool isSoftPedalOn() const noexcept;
355 bool isSoftPedalOff() const noexcept;
356
357 //==============================================================================
361 bool isProgramChange() const noexcept;
362
367 int getProgramChangeNumber() const noexcept;
368
375 static MidiMessage programChange (int channel, int programNumber) noexcept;
376
377 //==============================================================================
381 bool isPitchWheel() const noexcept;
382
391 int getPitchWheelValue() const noexcept;
392
399 static MidiMessage pitchWheel (int channel, int position) noexcept;
400
401 //==============================================================================
410 bool isAftertouch() const noexcept;
411
419 int getAfterTouchValue() const noexcept;
420
428 static MidiMessage aftertouchChange (int channel,
429 int noteNumber,
430 int aftertouchAmount) noexcept;
431
440 bool isChannelPressure() const noexcept;
441
447 int getChannelPressureValue() const noexcept;
448
455 static MidiMessage channelPressureChange (int channel, int pressure) noexcept;
456
457 //==============================================================================
462 bool isController() const noexcept;
463
471 int getControllerNumber() const noexcept;
472
480 int getControllerValue() const noexcept;
481
485 bool isControllerOfType (int controllerType) const noexcept;
486
493 static MidiMessage controllerEvent (int channel,
494 int controllerType,
495 int value) noexcept;
496
500 bool isAllNotesOff() const noexcept;
501
505 bool isAllSoundOff() const noexcept;
506
510 bool isResetAllControllers() const noexcept;
511
516 static MidiMessage allNotesOff (int channel) noexcept;
517
522 static MidiMessage allSoundOff (int channel) noexcept;
523
527 static MidiMessage allControllersOff (int channel) noexcept;
528
529 //==============================================================================
538 bool isMetaEvent() const noexcept;
539
548 int getMetaEventType() const noexcept;
549
553 const uint8* getMetaEventData() const noexcept;
554
558 int getMetaEventLength() const noexcept;
559
560 //==============================================================================
562 bool isTrackMetaEvent() const noexcept;
563
565 bool isEndOfTrackMetaEvent() const noexcept;
566
570 static MidiMessage endOfTrack() noexcept;
571
575 bool isTrackNameEvent() const noexcept;
576
580 bool isTextMetaEvent() const noexcept;
581
585 String getTextFromTextMetaEvent() const;
586
588 static MidiMessage textMetaEvent (int type, StringRef text);
589
590 //==============================================================================
594 bool isTempoMetaEvent() const noexcept;
595
602 double getTempoMetaEventTickLength (short timeFormat) const noexcept;
603
607 double getTempoSecondsPerQuarterNote() const noexcept;
608
612 static MidiMessage tempoMetaEvent (int microsecondsPerQuarterNote) noexcept;
613
614 //==============================================================================
618 bool isTimeSignatureMetaEvent() const noexcept;
619
623 void getTimeSignatureInfo (int& numerator, int& denominator) const noexcept;
624
628 static MidiMessage timeSignatureMetaEvent (int numerator, int denominator);
629
630 //==============================================================================
634 bool isKeySignatureMetaEvent() const noexcept;
635
643 int getKeySignatureNumberOfSharpsOrFlats() const noexcept;
644
648 bool isKeySignatureMajorKey() const noexcept;
649
656 static MidiMessage keySignatureMetaEvent (int numberOfSharpsOrFlats, bool isMinorKey);
657
658 //==============================================================================
666 bool isMidiChannelMetaEvent() const noexcept;
667
673 int getMidiChannelMetaEventChannel() const noexcept;
674
680 static MidiMessage midiChannelMetaEvent (int channel) noexcept;
681
682 //==============================================================================
684 bool isActiveSense() const noexcept;
685
686 //==============================================================================
690 bool isMidiStart() const noexcept;
691
693 static MidiMessage midiStart() noexcept;
694
698 bool isMidiContinue() const noexcept;
699
701 static MidiMessage midiContinue() noexcept;
702
706 bool isMidiStop() const noexcept;
707
709 static MidiMessage midiStop() noexcept;
710
714 bool isMidiClock() const noexcept;
715
717 static MidiMessage midiClock() noexcept;
718
722 bool isSongPositionPointer() const noexcept;
723
727 int getSongPositionPointerMidiBeat() const noexcept;
728
737 static MidiMessage songPositionPointer (int positionInMidiBeats) noexcept;
738
739 //==============================================================================
743 bool isQuarterFrame() const noexcept;
744
749 int getQuarterFrameSequenceNumber() const noexcept;
750
754 int getQuarterFrameValue() const noexcept;
755
761 static MidiMessage quarterFrame (int sequenceNumber, int value) noexcept;
762
767 {
768 fps24 = 0,
769 fps25 = 1,
772 };
773
775 bool isFullFrame() const noexcept;
776
782 void getFullFrameParameters (int& hours,
783 int& minutes,
784 int& seconds,
785 int& frames,
786 SmpteTimecodeType& timecodeType) const noexcept;
787
789 static MidiMessage fullFrame (int hours,
790 int minutes,
791 int seconds,
792 int frames,
793 SmpteTimecodeType timecodeType);
794
795 //==============================================================================
811
815 bool isMidiMachineControlMessage() const noexcept;
816
822 MidiMachineControlCommand getMidiMachineControlCommand() const noexcept;
823
825 static MidiMessage midiMachineControlCommand (MidiMachineControlCommand command);
826
831 bool isMidiMachineControlGoto (int& hours,
832 int& minutes,
833 int& seconds,
834 int& frames) const noexcept;
835
840 static MidiMessage midiMachineControlGoto (int hours,
841 int minutes,
842 int seconds,
843 int frames);
844
845 //==============================================================================
849 static MidiMessage masterVolume (float volume);
850
851 //==============================================================================
855 static MidiMessage createSysExMessage (const void* sysexData,
856 int dataSize);
857
858
859 //==============================================================================
860 #ifndef DOXYGEN
867 [[deprecated ("This signature has been deprecated in favour of the safer readVariableLengthValue.")]]
868 static int readVariableLengthVal (const uint8* data, int& numBytesUsed) noexcept;
869 #endif
870
877 {
879
880 VariableLengthValue (int valueIn, int bytesUsedIn)
881 : value (valueIn), bytesUsed (bytesUsedIn) {}
882
883 bool isValid() const noexcept { return bytesUsed > 0; }
884
885 int value = 0;
886 int bytesUsed = 0;
887 };
888
899 int maxBytesToUse) noexcept;
900
906 static int getMessageLengthFromFirstByte (uint8 firstByte) noexcept;
907
908 //==============================================================================
923 static String getMidiNoteName (int noteNumber,
924 bool useSharps,
925 bool includeOctaveNumber,
926 int octaveNumForMiddleC);
927
933 static double getMidiNoteInHertz (int noteNumber, double frequencyOfA = 440.0) noexcept;
934
936 static bool isMidiNoteBlack (int noteNumber) noexcept;
937
943 static const char* getGMInstrumentName (int midiInstrumentNumber);
944
948 static const char* getGMInstrumentBankName (int midiBankNumber);
949
953 static const char* getRhythmInstrumentName (int midiNoteNumber);
954
958 static const char* getControllerName (int controllerNumber);
959
961 static uint8 floatValueToMidiByte (float valueBetween0and1) noexcept;
962
964 static uint16 pitchbendToPitchwheelPos (float pitchbendInSemitones,
965 float pitchbendRangeInSemitones) noexcept;
966
967private:
968 //==============================================================================
969 #ifndef DOXYGEN
971 {
973 uint8 asBytes[sizeof (uint8*)];
974 };
975
977 double timeStamp = 0;
978 int size;
979 #endif
980
981 inline bool isHeapAllocated() const noexcept { return size > (int) sizeof (packedData); }
982 inline uint8* getData() const noexcept { return isHeapAllocated() ? packedData.allocatedData : const_cast<uint8*>(packedData.asBytes); }
983 uint8* allocateSpace (int);
984};
985
986} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition juce_MidiMessage.h:35
uint8 * getData() const noexcept
Definition juce_MidiMessage.h:982
MidiMessage(int byte1, int byte2, int byte3, Data... otherBytes)
Definition juce_MidiMessage.h:67
static const char * getGMInstrumentBankName(int midiBankNumber)
Definition juce_MidiMessage.cpp:1088
static bool isMidiNoteBlack(int noteNumber) noexcept
Definition juce_MidiMessage.cpp:1042
int size
Definition juce_MidiMessage.h:978
const uint8 * getRawData() const noexcept
Definition juce_MidiMessage.h:134
static double getMidiNoteInHertz(int noteNumber, double frequencyOfA=440.0) noexcept
Definition juce_MidiMessage.cpp:1037
static uint16 pitchbendToPitchwheelPos(float pitchbendInSemitones, float pitchbendRangeInSemitones) noexcept
Definition juce_MidiMessage.cpp:48
double getTimeStamp() const noexcept
Definition juce_MidiMessage.h:164
static const char * getGMInstrumentName(int midiInstrumentNumber)
Definition juce_MidiMessage.cpp:1047
MidiMessage(int byte1, int byte2, int byte3, double timeStamp=0) noexcept
Definition juce_MidiMessage.cpp:161
MidiMachineControlCommand
Definition juce_MidiMessage.h:801
@ mmc_rewind
Definition juce_MidiMessage.h:806
@ mmc_play
Definition juce_MidiMessage.h:803
@ mmc_stop
Definition juce_MidiMessage.h:802
@ mmc_recordStart
Definition juce_MidiMessage.h:807
@ mmc_fastforward
Definition juce_MidiMessage.h:805
@ mmc_deferredplay
Definition juce_MidiMessage.h:804
@ mmc_pause
Definition juce_MidiMessage.h:809
@ mmc_recordStop
Definition juce_MidiMessage.h:808
uint8 * allocateSpace(int)
Definition juce_MidiMessage.cpp:337
static uint8 floatValueToMidiByte(float valueBetween0and1) noexcept
Definition juce_MidiMessage.cpp:40
PackedData packedData
Definition juce_MidiMessage.h:976
static int getMessageLengthFromFirstByte(uint8 firstByte) noexcept
Definition juce_MidiMessage.cpp:104
static String getMidiNoteName(int noteNumber, bool useSharps, bool includeOctaveNumber, int octaveNumForMiddleC)
Definition juce_MidiMessage.cpp:1018
void addToTimeStamp(double delta) noexcept
Definition juce_MidiMessage.h:175
void setTimeStamp(double newTimestamp) noexcept
Definition juce_MidiMessage.h:170
static const char * getRhythmInstrumentName(int midiNoteNumber)
Definition juce_MidiMessage.cpp:1101
double timeStamp
Definition juce_MidiMessage.h:977
bool isHeapAllocated() const noexcept
Definition juce_MidiMessage.h:981
SmpteTimecodeType
Definition juce_MidiMessage.h:767
@ fps24
Definition juce_MidiMessage.h:768
@ fps30
Definition juce_MidiMessage.h:771
@ fps30drop
Definition juce_MidiMessage.h:770
@ fps25
Definition juce_MidiMessage.h:769
static VariableLengthValue readVariableLengthValue(const uint8 *data, int maxBytesToUse) noexcept
Definition juce_MidiMessage.cpp:60
static const char * getControllerName(int controllerNumber)
Definition juce_MidiMessage.cpp:1122
int getRawDataSize() const noexcept
Definition juce_MidiMessage.h:139
Definition juce_String.h:53
Definition juce_StringRef.h:62
static PuglViewHint int value
Definition pugl.h:1708
JSAMPIMAGE data
Definition jpeglib.h:945
#define jassert(expression)
#define JUCE_API
Definition juce_StandardHeader.h:152
Definition carla_juce.cpp:31
unsigned short uint16
Definition juce_MathsFunctions.h:41
unsigned char uint8
Definition juce_MathsFunctions.h:37
static float volume(float level)
Definition nekobee_voice_render.c:99
#define true
Definition ordinals.h:82
#define false
Definition ordinals.h:83
Definition juce_MidiMessage.h:877
int bytesUsed
Definition juce_MidiMessage.h:886
VariableLengthValue(int valueIn, int bytesUsedIn)
Definition juce_MidiMessage.h:880
int value
Definition juce_MidiMessage.h:885
bool isValid() const noexcept
Definition juce_MidiMessage.h:883
const char * text
Definition swell-functions.h:167
Definition juce_MidiMessage.h:971
uint8 * allocatedData
Definition juce_MidiMessage.h:972
uint8 asBytes[sizeof(uint8 *)]
Definition juce_MidiMessage.h:973
memcpy(hh, h, RAND_HEAD_LEN)
typedef int(UZ_EXP MsgFn)()
#define const
Definition zconf.h:137