28 inline uint8 initialByte (
const int type,
const int channel)
noexcept
30 return (uint8) (type | jlimit (0, 15, channel - 1));
33 inline uint8 validVelocity (
const int v)
noexcept
35 return (uint8) jlimit (0, 127, v);
42 jassert (v >= 0 && v <= 1.0f);
45 return MidiHelpers::validVelocity (roundToInt (v * 127.0f));
49 const float pitchbendRange)
noexcept
52 jassert (std::abs (pitchbend) <= pitchbendRange);
54 return static_cast<uint16> (pitchbend > 0.0f
55 ? jmap (pitchbend, 0.0f, pitchbendRange, 8192.0f, 16383.0f)
56 : jmap (pitchbend, -pitchbendRange, 0.0f, 0.0f, 8192.0f));
72 v = (v << 7) + (i & 0x7f);
86 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
87 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
88 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
89 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
90 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
92 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93 1, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
103 packedData.asBytes[0] = 0xf0;
104 packedData.asBytes[1] = 0xf7;
108 : timeStamp (
t), size (dataSize)
110 jassert (dataSize > 0);
114 memcpy (allocateSpace (dataSize), d, (
size_t) dataSize);
118 : timeStamp (
t), size (1)
120 packedData.asBytes[0] = (uint8)
byte1;
123 jassert (
byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8)
byte1) == 1);
127 : timeStamp (
t), size (2)
129 packedData.asBytes[0] = (uint8)
byte1;
130 packedData.asBytes[1] = (uint8)
byte2;
133 jassert (
byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8)
byte1) == 2);
137 : timeStamp (
t), size (3)
139 packedData.asBytes[0] = (uint8)
byte1;
140 packedData.asBytes[1] = (uint8)
byte2;
141 packedData.asBytes[2] = (uint8)
byte3;
144 jassert (
byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8)
byte1) == 3);
148 : timeStamp (
other.timeStamp), size (
other.size)
150 if (isHeapAllocated())
151 memcpy (allocateSpace (size),
other.getData(), (
size_t) size);
153 packedData.allocatedData =
other.packedData.allocatedData;
159 if (isHeapAllocated())
160 memcpy (allocateSpace (size),
other.getData(), (
size_t) size);
162 packedData.allocatedData =
other.packedData.allocatedData;
169 auto src =
static_cast<const uint8*
> (
srcData);
170 auto byte = (
unsigned int) *
src;
217 size = 1 + (
int) (d -
src);
219 auto dest = allocateSpace (size);
220 *dest = (uint8)
byte;
221 memcpy (dest + 1,
src, (
size_t) (size - 1));
225 else if (
byte == 0xff)
238 auto dest = allocateSpace (size);
239 *dest = (uint8)
byte;
240 memcpy (dest + 1,
src, (
size_t) size - 1);
247 packedData.asBytes[0] = (uint8)
byte;
251 packedData.asBytes[1] = (
sz > 0 ?
src[0] : 0);
254 packedData.asBytes[2] = (
sz > 1 ?
src[1] : 0);
262 packedData.allocatedData =
nullptr;
271 if (
other.isHeapAllocated())
273 if (isHeapAllocated())
274 packedData.allocatedData =
static_cast<uint8*
> (std::realloc (packedData.allocatedData, (
size_t)
other.
size));
276 packedData.allocatedData =
static_cast<uint8*
> (std::malloc ((
size_t)
other.
size));
282 if (isHeapAllocated())
283 std::free (packedData.allocatedData);
285 packedData.allocatedData =
other.packedData.allocatedData;
288 timeStamp =
other.timeStamp;
298 packedData.allocatedData =
other.packedData.allocatedData;
304 packedData.allocatedData =
other.packedData.allocatedData;
305 timeStamp =
other.timeStamp;
313 if (isHeapAllocated())
314 std::free (packedData.allocatedData);
317uint8* MidiMessage::allocateSpace (
int bytes)
319 if (
bytes > (
int)
sizeof (packedData))
321 auto d =
static_cast<uint8*
> (std::malloc ((
size_t)
bytes));
322 packedData.allocatedData = d;
326 return packedData.asBytes;
363 if ((data[0] & 0xf0) != 0xf0)
364 return (data[0] & 0xf) + 1;
371 jassert (channel > 0 && channel <= 16);
373 auto data = getRawData();
375 return ((data[0] & 0xf) == channel - 1)
376 && ((data[0] & 0xf0) != 0xf0);
381 jassert (channel > 0 && channel <= 16);
383 auto data = getData();
385 if ((data[0] & 0xf0) != (uint8) 0xf0)
386 data[0] = (uint8) ((data[0] & (uint8) 0xf0)
387 | (uint8)(channel - 1));
392 auto data = getRawData();
394 return ((data[0] & 0xf0) == 0x90)
400 auto data = getRawData();
402 return ((data[0] & 0xf0) == 0x80)
409 return (d == 0x90) || (d == 0x80);
419 if (isNoteOnOrOff() || isAftertouch())
446 auto data = getData();
447 data[2] = MidiHelpers::validVelocity (roundToInt (
scaleFactor * data[2]));
466 jassert (channel > 0 && channel <= 16);
467 jassert (isPositiveAndBelow (
noteNum, 128));
470 return MidiMessage (MidiHelpers::initialByte (0xa0, channel),
488 jassert (channel > 0 && channel <= 16);
489 jassert (isPositiveAndBelow (pressure, 128));
491 return MidiMessage (MidiHelpers::initialByte (0xd0, channel), pressure & 0x7f);
517 jassert (channel > 0 && channel <= 16);
531 return data[1] | (data[2] << 7);
536 jassert (channel > 0 && channel <= 16);
537 jassert (isPositiveAndBelow (position, 0x4000));
539 return MidiMessage (MidiHelpers::initialByte (0xe0, channel),
540 position & 127, (position >> 7) & 127);
550 auto data = getRawData();
569 jassert (channel > 0 && channel <= 16);
571 return MidiMessage (MidiHelpers::initialByte (0xb0, channel),
577 jassert (channel > 0 && channel <= 16);
578 jassert (isPositiveAndBelow (
noteNumber, 128));
580 return MidiMessage (MidiHelpers::initialByte (0x90, channel),
591 jassert (channel > 0 && channel <= 16);
592 jassert (isPositiveAndBelow (
noteNumber, 128));
594 return MidiMessage (MidiHelpers::initialByte (0x80, channel),
605 jassert (channel > 0 && channel <= 16);
606 jassert (isPositiveAndBelow (
noteNumber, 128));
613 return controllerEvent (channel, 123, 0);
619 return (data[0] & 0xf0) == 0xb0 && data[1] == 123;
624 return controllerEvent (channel, 120, 0);
630 return data[1] == 120 && (data[0] & 0xf0) == 0xb0;
636 return (data[0] & 0xf0) == 0xb0 && data[1] == 121;
641 return controllerEvent (channel, 121, 0);
646 auto vol = jlimit (0, 0x3fff, roundToInt (
volume * 0x4000));
648 return { 0xf0, 0x7f, 0x7f, 0x04, 0x01,
vol & 0x7f,
vol >> 7, 0xf7 };
663 m[dataSize + 1] = 0xf7;
675 return isSysEx() ? size - 2 : 0;
685 return *data != 0xff ? -1 : data[1];
717 return t > 0 &&
t < 16;
730 jassert (type > 0 && type < 16);
737 size_t n =
sizeof (
header);
741 for (
size_t i =
textSize; (i >>= 7) != 0;)
742 header[--n] = (uint8) ((i & 0x7f) | 0x80);
744 header[--n] = (uint8) type;
750 auto dest = result.allocateSpace (
totalSize);
776 return (((
unsigned int) d[0] << 16)
777 | ((
unsigned int) d[1] << 8)
786 if (! isTempoMetaEvent())
787 return 0.5 / timeFormat;
789 return getTempoSecondsPerQuarterNote() / timeFormat;
792 const int frameCode = (-timeFormat) >> 8;
809 return { 0xff, 81, 3,
818 return (data[1] == 0x58) && (*data == (uint8) 0xff);
823 if (isTimeSignatureMetaEvent())
825 auto d = getMetaEventData();
852 return { 0xff, 0x20, 0x01, jlimit (0, 0xff, channel - 1) };
879 return { 0xff, 0x2f, 0x00 };
918 return data[0] == 0xf0
928 jassert (isFullFrame());
930 auto data = getRawData();
932 hours = data[5] & 0x1f;
941 return { 0xf0, 0x7f, 0x7f, 0x01, 0x01,
951 return data[0] == 0xf0
966 return { 0xf0, 0x7f, 0, 6, command, 0xf7 };
972 auto data = getRawData();
982 hours = data[7] % 24;
995 return { 0xf0, 0x7f, 0, 6, 0x44, 6, 1, hours, minutes, seconds,
frames, 0xf7 };
1001 static const char*
const sharpNoteNames[] = {
"C",
"C#",
"D",
"D#",
"E",
"F",
"F#",
"G",
"G#",
"A",
"A#",
"B" };
1002 static const char*
const flatNoteNames[] = {
"C",
"Db",
"D",
"Eb",
"E",
"F",
"Gb",
"G",
"Ab",
"A",
"Bb",
"B" };
1004 if (isPositiveAndBelow (
note, 128))
1025 return ((1 << (
noteNumber % 12)) & 0x054a) != 0;
1030 static const char* names[] =
1032 NEEDS_TRANS(
"Acoustic Grand Piano"), NEEDS_TRANS(
"Bright Acoustic Piano"), NEEDS_TRANS(
"Electric Grand Piano"), NEEDS_TRANS(
"Honky-tonk Piano"),
1033 NEEDS_TRANS(
"Electric Piano 1"), NEEDS_TRANS(
"Electric Piano 2"), NEEDS_TRANS(
"Harpsichord"), NEEDS_TRANS(
"Clavinet"),
1034 NEEDS_TRANS(
"Celesta"), NEEDS_TRANS(
"Glockenspiel"), NEEDS_TRANS(
"Music Box"), NEEDS_TRANS(
"Vibraphone"),
1035 NEEDS_TRANS(
"Marimba"), NEEDS_TRANS(
"Xylophone"), NEEDS_TRANS(
"Tubular Bells"), NEEDS_TRANS(
"Dulcimer"),
1036 NEEDS_TRANS(
"Drawbar Organ"), NEEDS_TRANS(
"Percussive Organ"), NEEDS_TRANS(
"Rock Organ"), NEEDS_TRANS(
"Church Organ"),
1037 NEEDS_TRANS(
"Reed Organ"), NEEDS_TRANS(
"Accordion"), NEEDS_TRANS(
"Harmonica"), NEEDS_TRANS(
"Tango Accordion"),
1038 NEEDS_TRANS(
"Acoustic Guitar (nylon)"), NEEDS_TRANS(
"Acoustic Guitar (steel)"), NEEDS_TRANS(
"Electric Guitar (jazz)"), NEEDS_TRANS(
"Electric Guitar (clean)"),
1039 NEEDS_TRANS(
"Electric Guitar (mute)"), NEEDS_TRANS(
"Overdriven Guitar"), NEEDS_TRANS(
"Distortion Guitar"), NEEDS_TRANS(
"Guitar Harmonics"),
1040 NEEDS_TRANS(
"Acoustic Bass"), NEEDS_TRANS(
"Electric Bass (finger)"), NEEDS_TRANS(
"Electric Bass (pick)"), NEEDS_TRANS(
"Fretless Bass"),
1041 NEEDS_TRANS(
"Slap Bass 1"), NEEDS_TRANS(
"Slap Bass 2"), NEEDS_TRANS(
"Synth Bass 1"), NEEDS_TRANS(
"Synth Bass 2"),
1042 NEEDS_TRANS(
"Violin"), NEEDS_TRANS(
"Viola"), NEEDS_TRANS(
"Cello"), NEEDS_TRANS(
"Contrabass"),
1043 NEEDS_TRANS(
"Tremolo Strings"), NEEDS_TRANS(
"Pizzicato Strings"), NEEDS_TRANS(
"Orchestral Harp"), NEEDS_TRANS(
"Timpani"),
1044 NEEDS_TRANS(
"String Ensemble 1"), NEEDS_TRANS(
"String Ensemble 2"), NEEDS_TRANS(
"SynthStrings 1"), NEEDS_TRANS(
"SynthStrings 2"),
1045 NEEDS_TRANS(
"Choir Aahs"), NEEDS_TRANS(
"Voice Oohs"), NEEDS_TRANS(
"Synth Voice"), NEEDS_TRANS(
"Orchestra Hit"),
1046 NEEDS_TRANS(
"Trumpet"), NEEDS_TRANS(
"Trombone"), NEEDS_TRANS(
"Tuba"), NEEDS_TRANS(
"Muted Trumpet"),
1047 NEEDS_TRANS(
"French Horn"), NEEDS_TRANS(
"Brass Section"), NEEDS_TRANS(
"SynthBrass 1"), NEEDS_TRANS(
"SynthBrass 2"),
1048 NEEDS_TRANS(
"Soprano Sax"), NEEDS_TRANS(
"Alto Sax"), NEEDS_TRANS(
"Tenor Sax"), NEEDS_TRANS(
"Baritone Sax"),
1049 NEEDS_TRANS(
"Oboe"), NEEDS_TRANS(
"English Horn"), NEEDS_TRANS(
"Bassoon"), NEEDS_TRANS(
"Clarinet"),
1050 NEEDS_TRANS(
"Piccolo"), NEEDS_TRANS(
"Flute"), NEEDS_TRANS(
"Recorder"), NEEDS_TRANS(
"Pan Flute"),
1051 NEEDS_TRANS(
"Blown Bottle"), NEEDS_TRANS(
"Shakuhachi"), NEEDS_TRANS(
"Whistle"), NEEDS_TRANS(
"Ocarina"),
1052 NEEDS_TRANS(
"Lead 1 (square)"), NEEDS_TRANS(
"Lead 2 (sawtooth)"), NEEDS_TRANS(
"Lead 3 (calliope)"), NEEDS_TRANS(
"Lead 4 (chiff)"),
1053 NEEDS_TRANS(
"Lead 5 (charang)"), NEEDS_TRANS(
"Lead 6 (voice)"), NEEDS_TRANS(
"Lead 7 (fifths)"), NEEDS_TRANS(
"Lead 8 (bass+lead)"),
1054 NEEDS_TRANS(
"Pad 1 (new age)"), NEEDS_TRANS(
"Pad 2 (warm)"), NEEDS_TRANS(
"Pad 3 (polysynth)"), NEEDS_TRANS(
"Pad 4 (choir)"),
1055 NEEDS_TRANS(
"Pad 5 (bowed)"), NEEDS_TRANS(
"Pad 6 (metallic)"), NEEDS_TRANS(
"Pad 7 (halo)"), NEEDS_TRANS(
"Pad 8 (sweep)"),
1056 NEEDS_TRANS(
"FX 1 (rain)"), NEEDS_TRANS(
"FX 2 (soundtrack)"), NEEDS_TRANS(
"FX 3 (crystal)"), NEEDS_TRANS(
"FX 4 (atmosphere)"),
1057 NEEDS_TRANS(
"FX 5 (brightness)"), NEEDS_TRANS(
"FX 6 (goblins)"), NEEDS_TRANS(
"FX 7 (echoes)"), NEEDS_TRANS(
"FX 8 (sci-fi)"),
1058 NEEDS_TRANS(
"Sitar"), NEEDS_TRANS(
"Banjo"), NEEDS_TRANS(
"Shamisen"), NEEDS_TRANS(
"Koto"),
1059 NEEDS_TRANS(
"Kalimba"), NEEDS_TRANS(
"Bag pipe"), NEEDS_TRANS(
"Fiddle"), NEEDS_TRANS(
"Shanai"),
1060 NEEDS_TRANS(
"Tinkle Bell"), NEEDS_TRANS(
"Agogo"), NEEDS_TRANS(
"Steel Drums"), NEEDS_TRANS(
"Woodblock"),
1061 NEEDS_TRANS(
"Taiko Drum"), NEEDS_TRANS(
"Melodic Tom"), NEEDS_TRANS(
"Synth Drum"), NEEDS_TRANS(
"Reverse Cymbal"),
1062 NEEDS_TRANS(
"Guitar Fret Noise"), NEEDS_TRANS(
"Breath Noise"), NEEDS_TRANS(
"Seashore"), NEEDS_TRANS(
"Bird Tweet"),
1063 NEEDS_TRANS(
"Telephone Ring"), NEEDS_TRANS(
"Helicopter"), NEEDS_TRANS(
"Applause"), NEEDS_TRANS(
"Gunshot")
1066 return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] :
nullptr;
1071 static const char* names[] =
1073 NEEDS_TRANS(
"Piano"), NEEDS_TRANS(
"Chromatic Percussion"), NEEDS_TRANS(
"Organ"), NEEDS_TRANS(
"Guitar"),
1074 NEEDS_TRANS(
"Bass"), NEEDS_TRANS(
"Strings"), NEEDS_TRANS(
"Ensemble"), NEEDS_TRANS(
"Brass"),
1075 NEEDS_TRANS(
"Reed"), NEEDS_TRANS(
"Pipe"), NEEDS_TRANS(
"Synth Lead"), NEEDS_TRANS(
"Synth Pad"),
1076 NEEDS_TRANS(
"Synth Effects"), NEEDS_TRANS(
"Ethnic"), NEEDS_TRANS(
"Percussive"), NEEDS_TRANS(
"Sound Effects")
1079 return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] :
nullptr;
1084 static const char* names[] =
1086 NEEDS_TRANS(
"Acoustic Bass Drum"), NEEDS_TRANS(
"Bass Drum 1"), NEEDS_TRANS(
"Side Stick"), NEEDS_TRANS(
"Acoustic Snare"),
1087 NEEDS_TRANS(
"Hand Clap"), NEEDS_TRANS(
"Electric Snare"), NEEDS_TRANS(
"Low Floor Tom"), NEEDS_TRANS(
"Closed Hi-Hat"),
1088 NEEDS_TRANS(
"High Floor Tom"), NEEDS_TRANS(
"Pedal Hi-Hat"), NEEDS_TRANS(
"Low Tom"), NEEDS_TRANS(
"Open Hi-Hat"),
1089 NEEDS_TRANS(
"Low-Mid Tom"), NEEDS_TRANS(
"Hi-Mid Tom"), NEEDS_TRANS(
"Crash Cymbal 1"), NEEDS_TRANS(
"High Tom"),
1090 NEEDS_TRANS(
"Ride Cymbal 1"), NEEDS_TRANS(
"Chinese Cymbal"), NEEDS_TRANS(
"Ride Bell"), NEEDS_TRANS(
"Tambourine"),
1091 NEEDS_TRANS(
"Splash Cymbal"), NEEDS_TRANS(
"Cowbell"), NEEDS_TRANS(
"Crash Cymbal 2"), NEEDS_TRANS(
"Vibraslap"),
1092 NEEDS_TRANS(
"Ride Cymbal 2"), NEEDS_TRANS(
"Hi Bongo"), NEEDS_TRANS(
"Low Bongo"), NEEDS_TRANS(
"Mute Hi Conga"),
1093 NEEDS_TRANS(
"Open Hi Conga"), NEEDS_TRANS(
"Low Conga"), NEEDS_TRANS(
"High Timbale"), NEEDS_TRANS(
"Low Timbale"),
1094 NEEDS_TRANS(
"High Agogo"), NEEDS_TRANS(
"Low Agogo"), NEEDS_TRANS(
"Cabasa"), NEEDS_TRANS(
"Maracas"),
1095 NEEDS_TRANS(
"Short Whistle"), NEEDS_TRANS(
"Long Whistle"), NEEDS_TRANS(
"Short Guiro"), NEEDS_TRANS(
"Long Guiro"),
1096 NEEDS_TRANS(
"Claves"), NEEDS_TRANS(
"Hi Wood Block"), NEEDS_TRANS(
"Low Wood Block"), NEEDS_TRANS(
"Mute Cuica"),
1097 NEEDS_TRANS(
"Open Cuica"), NEEDS_TRANS(
"Mute Triangle"), NEEDS_TRANS(
"Open Triangle")
1100 return (n >= 35 && n <= 81) ? names[n - 35] :
nullptr;
1105 static const char* names[] =
1107 NEEDS_TRANS(
"Bank Select"), NEEDS_TRANS(
"Modulation Wheel (coarse)"), NEEDS_TRANS(
"Breath controller (coarse)"),
1109 NEEDS_TRANS(
"Foot Pedal (coarse)"), NEEDS_TRANS(
"Portamento Time (coarse)"), NEEDS_TRANS(
"Data Entry (coarse)"),
1110 NEEDS_TRANS(
"Volume (coarse)"), NEEDS_TRANS(
"Balance (coarse)"),
1112 NEEDS_TRANS(
"Pan position (coarse)"), NEEDS_TRANS(
"Expression (coarse)"), NEEDS_TRANS(
"Effect Control 1 (coarse)"),
1113 NEEDS_TRANS(
"Effect Control 2 (coarse)"),
1115 NEEDS_TRANS(
"General Purpose Slider 1"), NEEDS_TRANS(
"General Purpose Slider 2"),
1116 NEEDS_TRANS(
"General Purpose Slider 3"), NEEDS_TRANS(
"General Purpose Slider 4"),
1117 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1118 NEEDS_TRANS(
"Bank Select (fine)"), NEEDS_TRANS(
"Modulation Wheel (fine)"), NEEDS_TRANS(
"Breath controller (fine)"),
1120 NEEDS_TRANS(
"Foot Pedal (fine)"), NEEDS_TRANS(
"Portamento Time (fine)"), NEEDS_TRANS(
"Data Entry (fine)"), NEEDS_TRANS(
"Volume (fine)"),
1121 NEEDS_TRANS(
"Balance (fine)"),
nullptr, NEEDS_TRANS(
"Pan position (fine)"), NEEDS_TRANS(
"Expression (fine)"),
1122 NEEDS_TRANS(
"Effect Control 1 (fine)"), NEEDS_TRANS(
"Effect Control 2 (fine)"),
1123 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1124 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1125 NEEDS_TRANS(
"Hold Pedal (on/off)"), NEEDS_TRANS(
"Portamento (on/off)"), NEEDS_TRANS(
"Sustenuto Pedal (on/off)"), NEEDS_TRANS(
"Soft Pedal (on/off)"),
1126 NEEDS_TRANS(
"Legato Pedal (on/off)"), NEEDS_TRANS(
"Hold 2 Pedal (on/off)"), NEEDS_TRANS(
"Sound Variation"), NEEDS_TRANS(
"Sound Timbre"),
1127 NEEDS_TRANS(
"Sound Release Time"), NEEDS_TRANS(
"Sound Attack Time"), NEEDS_TRANS(
"Sound Brightness"), NEEDS_TRANS(
"Sound Control 6"),
1128 NEEDS_TRANS(
"Sound Control 7"), NEEDS_TRANS(
"Sound Control 8"), NEEDS_TRANS(
"Sound Control 9"), NEEDS_TRANS(
"Sound Control 10"),
1129 NEEDS_TRANS(
"General Purpose Button 1 (on/off)"), NEEDS_TRANS(
"General Purpose Button 2 (on/off)"),
1130 NEEDS_TRANS(
"General Purpose Button 3 (on/off)"), NEEDS_TRANS(
"General Purpose Button 4 (on/off)"),
1131 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1132 NEEDS_TRANS(
"Reverb Level"), NEEDS_TRANS(
"Tremolo Level"), NEEDS_TRANS(
"Chorus Level"), NEEDS_TRANS(
"Celeste Level"),
1133 NEEDS_TRANS(
"Phaser Level"), NEEDS_TRANS(
"Data Button increment"), NEEDS_TRANS(
"Data Button decrement"), NEEDS_TRANS(
"Non-registered Parameter (fine)"),
1134 NEEDS_TRANS(
"Non-registered Parameter (coarse)"), NEEDS_TRANS(
"Registered Parameter (fine)"), NEEDS_TRANS(
"Registered Parameter (coarse)"),
1135 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1136 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1137 NEEDS_TRANS(
"All Sound Off"), NEEDS_TRANS(
"All Controllers Off"), NEEDS_TRANS(
"Local Keyboard (on/off)"), NEEDS_TRANS(
"All Notes Off"),
1138 NEEDS_TRANS(
"Omni Mode Off"), NEEDS_TRANS(
"Omni Mode On"), NEEDS_TRANS(
"Mono Operation"), NEEDS_TRANS(
"Poly Operation")
1141 return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] :
nullptr;
int size() const noexcept
bool isTrackMetaEvent() const noexcept
static MidiMessage createSysExMessage(const void *sysexData, int dataSize)
static MidiMessage tempoMetaEvent(int microsecondsPerQuarterNote) noexcept
static MidiMessage midiStart() noexcept
const uint8 * getSysExData() const noexcept
String getDescription() const
static const char * getGMInstrumentBankName(int midiBankNumber)
bool isAftertouch() const noexcept
void setNoteNumber(int newNoteNumber) noexcept
bool isNoteOn(bool returnTrueForVelocity0=false) const noexcept
int getKeySignatureNumberOfSharpsOrFlats() const noexcept
int getSongPositionPointerMidiBeat() const noexcept
void multiplyVelocity(float scaleFactor) noexcept
void getFullFrameParameters(int &hours, int &minutes, int &seconds, int &frames, SmpteTimecodeType &timecodeType) const noexcept
float getFloatVelocity() const noexcept
bool isMidiMachineControlMessage() const noexcept
int getChannel() const noexcept
static bool isMidiNoteBlack(int noteNumber) noexcept
static MidiMessage aftertouchChange(int channel, int noteNumber, int aftertouchAmount) noexcept
static int readVariableLengthVal(const uint8 *data, int &numBytesUsed) noexcept
int getQuarterFrameSequenceNumber() const noexcept
int getSysExDataSize() const noexcept
bool isQuarterFrame() const noexcept
const uint8 * getRawData() const noexcept
bool isTextMetaEvent() const noexcept
void setVelocity(float newVelocity) noexcept
int getMetaEventType() const noexcept
bool isProgramChange() const noexcept
bool isController() const noexcept
void getTimeSignatureInfo(int &numerator, int &denominator) const noexcept
bool isAllSoundOff() const noexcept
bool isSoftPedalOn() const noexcept
int getControllerNumber() const noexcept
bool isMidiStart() const noexcept
static double getMidiNoteInHertz(int noteNumber, double frequencyOfA=440.0) noexcept
int getQuarterFrameValue() const noexcept
bool isTrackNameEvent() const noexcept
int getChannelPressureValue() const noexcept
static MidiMessage pitchWheel(int channel, int position) noexcept
bool isForChannel(int channelNumber) const noexcept
bool isNoteOff(bool returnTrueForNoteOnVelocity0=true) const noexcept
const uint8 * getMetaEventData() const noexcept
bool isKeySignatureMetaEvent() const noexcept
static MidiMessage noteOn(int channel, int noteNumber, float velocity) noexcept
static MidiMessage quarterFrame(int sequenceNumber, int value) noexcept
bool isPitchWheel() const noexcept
bool isSustainPedalOn() const noexcept
bool isMidiContinue() const noexcept
static MidiMessage midiStop() noexcept
static MidiMessage timeSignatureMetaEvent(int numerator, int denominator)
bool isSostenutoPedalOn() const noexcept
static uint16 pitchbendToPitchwheelPos(float pitchbendInSemitones, float pitchbendRangeInSemitones) noexcept
int getNoteNumber() const noexcept
static MidiMessage midiChannelMetaEvent(int channel) noexcept
int getProgramChangeNumber() const noexcept
static const char * getGMInstrumentName(int midiInstrumentNumber)
bool isSostenutoPedalOff() const noexcept
int getMidiChannelMetaEventChannel() const noexcept
MidiMachineControlCommand
bool isTimeSignatureMetaEvent() const noexcept
static MidiMessage allNotesOff(int channel) noexcept
static MidiMessage controllerEvent(int channel, int controllerType, int value) noexcept
bool isControllerOfType(int controllerType) const noexcept
bool isTempoMetaEvent() const noexcept
static uint8 floatValueToMidiByte(float valueBetween0and1) noexcept
static MidiMessage keySignatureMetaEvent(int numberOfSharpsOrFlats, bool isMinorKey)
static MidiMessage midiClock() noexcept
bool isResetAllControllers() const noexcept
static MidiMessage fullFrame(int hours, int minutes, int seconds, int frames, SmpteTimecodeType timecodeType)
bool isSoftPedalOff() const noexcept
int getMetaEventLength() const noexcept
bool isMidiStop() const noexcept
MidiMessage & operator=(const MidiMessage &other)
bool isActiveSense() const noexcept
double getTempoSecondsPerQuarterNote() const noexcept
static MidiMessage masterVolume(float volume)
int getAfterTouchValue() const noexcept
static MidiMessage textMetaEvent(int type, StringRef text)
static MidiMessage channelPressureChange(int channel, int pressure) noexcept
bool isFullFrame() const noexcept
double getTempoMetaEventTickLength(short timeFormat) const noexcept
static int getMessageLengthFromFirstByte(uint8 firstByte) noexcept
bool isEndOfTrackMetaEvent() const noexcept
bool isNoteOnOrOff() const noexcept
static MidiMessage midiContinue() noexcept
int getControllerValue() const noexcept
static String getMidiNoteName(int noteNumber, bool useSharps, bool includeOctaveNumber, int octaveNumForMiddleC)
static MidiMessage midiMachineControlGoto(int hours, int minutes, int seconds, int frames)
bool isAllNotesOff() const noexcept
static MidiMessage noteOff(int channel, int noteNumber, float velocity) noexcept
bool isMidiMachineControlGoto(int &hours, int &minutes, int &seconds, int &frames) const noexcept
bool isKeySignatureMajorKey() const noexcept
bool isMidiChannelMetaEvent() const noexcept
MidiMachineControlCommand getMidiMachineControlCommand() const noexcept
bool isMetaEvent() const noexcept
uint8 getVelocity() const noexcept
static const char * getRhythmInstrumentName(int midiNoteNumber)
static MidiMessage programChange(int channel, int programNumber) noexcept
bool isChannelPressure() const noexcept
bool isSysEx() const noexcept
static MidiMessage songPositionPointer(int positionInMidiBeats) noexcept
static MidiMessage endOfTrack() noexcept
bool isMidiClock() const noexcept
String getTextFromTextMetaEvent() const
static MidiMessage midiMachineControlCommand(MidiMachineControlCommand command)
static MidiMessage allSoundOff(int channel) noexcept
void setChannel(int newChannelNumber) noexcept
static const char * getControllerName(int controllerNumber)
bool isSongPositionPointer() const noexcept
bool isSustainPedalOff() const noexcept
int getRawDataSize() const noexcept
static MidiMessage allControllersOff(int channel) noexcept
MidiMessage withTimeStamp(double newTimestamp) const
int getPitchWheelValue() const noexcept
String::CharPointerType text
bool isEmpty() const noexcept
static String toHexString(IntegerType number)