28 const uint8 noLSBValueReceived = 0xff;
29 const Range<int> allChannels { 1, 17 };
31 template <
typename Range,
typename Value>
32 void mpeInstrumentFill (Range& range,
const Value&
value)
34 std::fill (std::begin (range), std::end (range),
value);
81 mpeInstrumentFill (pair.dimension.lastValueReceivedOnChannel, pair.defaultValue);
129 jassert (allChannels.contains (channelRange));
148 jassert (pitchbendRange >= 0 && pitchbendRange <= 96);
153 if (
legacyMode.pitchbendRange != pitchbendRange)
194 else if (
message.isResetAllControllers()
209 if (
message.getVelocity() == 0)
248 switch (
message.getControllerNumber())
268 for (
int i =
notes.size(); --
i >= 0;)
270 auto& note =
notes.getReference (
i);
272 if (note.midiChannel ==
message.getChannel())
286 for (
int i =
notes.size(); --
i >= 0;)
288 auto& note =
notes.getReference (
i);
290 if (zone.isUsing (note.midiChannel))
356 if (
auto* alreadyPlayingNote =
getNotePtr (midiChannel, midiNoteNumber))
362 notes.remove (alreadyPlayingNote);
379 if (
auto* note =
getNotePtr (midiChannel, midiNoteNumber))
382 note->noteOffVelocity = midiNoteOffVelocity;
427 for (
int i =
notes.size(); --
i >= 0;)
429 auto& note =
notes.getReference (
i);
431 if (note.midiChannel == midiChannel
432 && note.initialNote == midiNoteNumber
461 for (
int i =
notes.size(); --
i >= 0;)
463 auto& note =
notes.getReference (
i);
465 if (note.midiChannel == midiChannel)
484 auto zone = (isLowerZone ?
zoneLayout.getLowerZone()
487 if (! zone.isActive())
490 for (
int i =
notes.size(); --
i >= 0;)
492 auto& note =
notes.getReference (
i);
494 if (! zone.isUsing (note.midiChannel))
545 if (! zone.isActive() || ! zone.isUsing (note.
midiChannel))
549 if (upperZone.isActive() && upperZone.isUsing (note.
midiChannel))
561 auto notePitchbendInSemitones = 0.0f;
563 if (zone.isUsingChannelAsMemberChannel (note.
midiChannel))
566 auto masterPitchbendInSemitones =
pitchbendDimension.lastValueReceivedOnChannel[zone.getMasterChannel() - 1]
568 * (float) zone.masterPitchbendRange;
596 auto zone = (midiChannel == 1 ?
zoneLayout.getLowerZone()
599 for (
int i =
notes.size(); --
i >= 0;)
601 auto& note =
notes.getReference (
i);
603 if (
legacyMode.isEnabled ? (note.midiChannel == midiChannel) : zone.isUsing (note.midiChannel))
630 if (zone.isLowerZone())
632 for (
int i = zone.getFirstMemberChannel();
i <= zone.getLastMemberChannel(); ++
i)
637 for (
int i = zone.getFirstMemberChannel();
i >= zone.getLastMemberChannel(); --
i)
648 return legacyMode.channelRange.contains (midiChannel);
650 return zoneLayout.getLowerZone().isUsingChannelAsMemberChannel (midiChannel)
651 ||
zoneLayout.getUpperZone().isUsingChannelAsMemberChannel (midiChannel);
659 const auto lowerZone =
zoneLayout.getLowerZone();
660 const auto upperZone =
zoneLayout.getUpperZone();
662 return (lowerZone.isActive() && midiChannel == lowerZone.getMasterChannel())
663 || (upperZone.isActive() && midiChannel == upperZone.getMasterChannel());
669 return legacyMode.channelRange.contains (midiChannel);
671 return zoneLayout.getLowerZone().isUsing (midiChannel)
672 ||
zoneLayout.getUpperZone().isUsing (midiChannel);
683 if (
auto* note =
getNotePtr (midiChannel, midiNoteNumber))
698 for (
auto& note :
notes)
699 if (note.noteID == noteID)
716 for (
auto i =
notes.size(); --
i >= 0;)
718 auto& note =
notes.getReference (
i);
720 if (note != otherThanThisNote)
730 for (
int i = 0;
i <
notes.size(); ++
i)
732 auto& note =
notes.getReference (
i);
734 if (note.midiChannel == midiChannel && note.initialNote == midiNoteNumber)
743 return const_cast<MPENote*
> (
static_cast<const MPEInstrument&
> (*this).getNotePtr (midiChannel, midiNoteNumber));
770 for (
auto i =
notes.size(); --
i >= 0;)
772 auto& note =
notes.getReference (
i);
774 if (note.midiChannel == midiChannel
784 return const_cast<MPENote*
> (
static_cast<const MPEInstrument&
> (*this).getLastNotePlayedPtr (midiChannel));
790 int initialNoteMax = -1;
793 for (
auto i =
notes.size(); --
i >= 0;)
795 auto& note =
notes.getReference (
i);
797 if (note.midiChannel == midiChannel
799 && note.initialNote > initialNoteMax)
802 initialNoteMax = note.initialNote;
811 return const_cast<MPENote*
> (
static_cast<const MPEInstrument&
> (*this).getHighestNotePtr (midiChannel));
816 int initialNoteMin = 128;
819 for (
auto i =
notes.size(); --
i >= 0;)
821 auto& note =
notes.getReference (
i);
823 if (note.midiChannel == midiChannel
825 && note.initialNote < initialNoteMin)
828 initialNoteMin = note.initialNote;
837 return const_cast<MPENote*
> (
static_cast<const MPEInstrument&
> (*this).getLowestNotePtr (midiChannel));
845 for (
auto i =
notes.size(); --
i >= 0;)
847 auto& note =
notes.getReference (
i);
861class MPEInstrumentTests :
public UnitTest
872 testLayout.setLowerZone (5);
873 testLayout.setUpperZone (6);
877 void runTest()
override
879 beginTest (
"initial zone layout");
882 expect (!
test.getZoneLayout().getLowerZone().isActive());
883 expect (!
test.getZoneLayout().getUpperZone().isActive());
886 beginTest (
"get/setZoneLayout");
889 test.setZoneLayout (testLayout);
891 auto newLayout =
test.getZoneLayout();
893 expect (
test.getZoneLayout().getLowerZone().isActive());
894 expect (
test.getZoneLayout().getUpperZone().isActive());
895 expectEquals (newLayout.getLowerZone().getMasterChannel(), 1);
896 expectEquals (newLayout.getLowerZone().numMemberChannels, 5);
897 expectEquals (newLayout.getUpperZone().getMasterChannel(), 16);
898 expectEquals (newLayout.getUpperZone().numMemberChannels, 6);
901 beginTest (
"noteOn / noteOff");
905 test.setZoneLayout (testLayout);
906 expectEquals (
test.getNumPlayingNotes(), 0);
909 UnitTestInstrument
test;
910 test.setZoneLayout (testLayout);
913 test.noteOn (7, 60, MPEValue::from7BitInt (100));
914 expectEquals (
test.getNumPlayingNotes(), 0);
915 expectEquals (
test.noteAddedCallCounter, 0);
918 test.noteOn (3, 60, MPEValue::from7BitInt (100));
919 expectEquals (
test.getNumPlayingNotes(), 1);
920 expectEquals (
test.noteAddedCallCounter, 1);
921 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
924 test.noteOff (3, 60, MPEValue::from7BitInt (33));
925 expectEquals (
test.getNumPlayingNotes(), 0);
926 expectEquals (
test.noteReleasedCallCounter, 1);
927 expectHasFinishedNote (
test, 3, 60, 33);
931 test.noteOn (1, 62, MPEValue::from7BitInt (100));
932 expectEquals (
test.getNumPlayingNotes(), 1);
933 expectEquals (
test.noteAddedCallCounter, 2);
934 expectNote (
test.getNote (1, 62), 100, 0, 8192, 64, MPENote::keyDown);
937 test.noteOff (1, 62, MPEValue::from7BitInt (33));
938 expectEquals (
test.getNumPlayingNotes(), 0);
939 expectEquals (
test.noteReleasedCallCounter, 2);
940 expectHasFinishedNote (
test, 1, 62, 33);
944 UnitTestInstrument
test;
945 test.setZoneLayout (testLayout);
946 test.noteOn (3, 60, MPEValue::from7BitInt (100));
949 test.noteOff (3, 61, MPEValue::from7BitInt (33));
950 expectEquals (
test.getNumPlayingNotes(), 1);
951 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
952 expectEquals (
test.noteReleasedCallCounter, 0);
955 test.noteOff (2, 60, MPEValue::from7BitInt (33));
956 expectEquals (
test.getNumPlayingNotes(), 1);
957 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
958 expectEquals (
test.noteReleasedCallCounter, 0);
963 UnitTestInstrument
test;
964 test.setZoneLayout (testLayout);
965 test.noteOn (3, 0, MPEValue::from7BitInt (100));
966 test.noteOn (3, 1, MPEValue::from7BitInt (100));
967 test.noteOn (3, 2, MPEValue::from7BitInt (100));
968 expectEquals (
test.getNumPlayingNotes(), 3);
969 expectNote (
test.getNote (3, 0), 100, 0, 8192, 64, MPENote::keyDown);
970 expectNote (
test.getNote (3, 1), 100, 0, 8192, 64, MPENote::keyDown);
971 expectNote (
test.getNote (3, 2), 100, 0, 8192, 64, MPENote::keyDown);
975 UnitTestInstrument
test;
976 test.setZoneLayout (testLayout);
977 test.noteOn (3, 0, MPEValue::from7BitInt (100));
978 test.noteOn (3, 0, MPEValue::from7BitInt (60));
979 expectEquals (
test.getNumPlayingNotes(), 1);
980 expectNote (
test.getNote (3, 0), 60, 0, 8192, 64, MPENote::keyDown);
984 beginTest (
"noteReleased after setZoneLayout");
986 UnitTestInstrument
test;
987 test.setZoneLayout (testLayout);
989 test.noteOn (3, 60, MPEValue::from7BitInt (100));
990 test.noteOn (3, 61, MPEValue::from7BitInt (100));
991 test.noteOn (4, 61, MPEValue::from7BitInt (100));
992 expectEquals (
test.getNumPlayingNotes(), 3);
993 expectEquals (
test.noteReleasedCallCounter, 0);
995 test.setZoneLayout (testLayout);
996 expectEquals (
test.getNumPlayingNotes(), 0);
997 expectEquals (
test.noteReleasedCallCounter, 3);
1000 beginTest (
"releaseAllNotes");
1002 UnitTestInstrument
test;
1003 test.setZoneLayout (testLayout);
1004 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1005 test.noteOn (4, 61, MPEValue::from7BitInt (100));
1006 test.noteOn (15, 62, MPEValue::from7BitInt (100));
1007 expectEquals (
test.getNumPlayingNotes(), 3);
1009 test.releaseAllNotes();
1010 expectEquals (
test.getNumPlayingNotes(), 0);
1013 beginTest (
"sustainPedal");
1015 UnitTestInstrument
test;
1016 test.setZoneLayout (testLayout);
1017 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1018 test.noteOn (10, 60, MPEValue::from7BitInt (100));
1021 test.sustainPedal (3,
true);
1022 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1024 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1025 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1026 expectEquals (
test.noteKeyStateChangedCallCounter, 0);
1029 test.sustainPedal (7,
true);
1030 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1031 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1032 expectEquals (
test.noteKeyStateChangedCallCounter, 0);
1035 test.sustainPedal (1,
true);
1036 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDownAndSustained);
1037 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1038 expectEquals (
test.noteKeyStateChangedCallCounter, 1);
1041 test.sustainPedal (1,
false);
1042 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1043 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1044 expectEquals (
test.noteKeyStateChangedCallCounter, 2);
1047 test.sustainPedal (1,
true);
1048 expectEquals (
test.noteKeyStateChangedCallCounter, 3);
1049 test.noteOn (4, 51, MPEValue::from7BitInt (100));
1050 expectNote (
test.getNote (4, 51), 100, 0, 8192, 64, MPENote::keyDownAndSustained);
1051 expectEquals (
test.noteKeyStateChangedCallCounter, 3);
1054 test.sustainPedal (11,
true);
1055 test.noteOn (11, 52, MPEValue::from7BitInt (100));
1056 expectNote (
test.getNote (11, 52), 100, 0, 8192, 64, MPENote::keyDown);
1057 test.noteOff (11, 52, MPEValue::from7BitInt (100));
1058 expectEquals (
test.noteReleasedCallCounter, 1);
1061 test.noteOff (3, 60, MPEValue::from7BitInt (100));
1062 test.noteOff (4, 51, MPEValue::from7BitInt (100));
1063 test.noteOff (10, 60, MPEValue::from7BitInt (100));
1064 expectEquals (
test.getNumPlayingNotes(), 2);
1065 expectEquals (
test.noteReleasedCallCounter, 2);
1066 expectEquals (
test.noteKeyStateChangedCallCounter, 5);
1067 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::sustained);
1068 expectNote (
test.getNote (4, 51), 100, 0, 8192, 64, MPENote::sustained);
1071 test.sustainPedal (1,
false);
1072 expectEquals (
test.getNumPlayingNotes(), 0);
1073 expectEquals (
test.noteReleasedCallCounter, 4);
1076 beginTest (
"sostenutoPedal");
1078 UnitTestInstrument
test;
1079 test.setZoneLayout (testLayout);
1080 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1081 test.noteOn (10, 60, MPEValue::from7BitInt (100));
1084 test.sostenutoPedal (3,
true);
1085 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1086 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1087 expectEquals (
test.noteKeyStateChangedCallCounter, 0);
1090 test.sostenutoPedal (9,
true);
1091 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1092 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1093 expectEquals (
test.noteKeyStateChangedCallCounter, 0);
1096 test.sostenutoPedal (1,
true);
1097 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDownAndSustained);
1098 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1099 expectEquals (
test.noteKeyStateChangedCallCounter, 1);
1102 test.sostenutoPedal (1,
false);
1103 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1104 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1105 expectEquals (
test.noteKeyStateChangedCallCounter, 2);
1108 test.sostenutoPedal (1,
true);
1109 expectEquals (
test.noteKeyStateChangedCallCounter, 3);
1110 test.noteOn (4, 51, MPEValue::from7BitInt (100));
1111 expectEquals (
test.getNumPlayingNotes(), 3);
1112 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDownAndSustained);
1113 expectNote (
test.getNote (4, 51), 100, 0, 8192, 64, MPENote::keyDown);
1114 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1115 expectEquals (
test.noteKeyStateChangedCallCounter, 3);
1119 test.noteOff (3, 60, MPEValue::from7BitInt (100));
1120 test.noteOff (4, 51, MPEValue::from7BitInt (100));
1121 test.noteOff (10, 60, MPEValue::from7BitInt (100));
1122 expectEquals (
test.getNumPlayingNotes(), 1);
1123 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::sustained);
1124 expectEquals (
test.noteReleasedCallCounter, 2);
1125 expectEquals (
test.noteKeyStateChangedCallCounter, 4);
1128 test.sustainPedal (1,
false);
1129 expectEquals (
test.getNumPlayingNotes(), 0);
1130 expectEquals (
test.noteReleasedCallCounter, 3);
1133 beginTest (
"getMostRecentNote");
1136 test.setZoneLayout (testLayout);
1138 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1139 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1142 auto note =
test.getMostRecentNote (2);
1143 expect (! note.isValid());
1146 auto note =
test.getMostRecentNote (3);
1147 expect (note.isValid());
1148 expectEquals (
int (note.midiChannel), 3);
1149 expectEquals (
int (note.initialNote), 61);
1152 test.sustainPedal (1,
true);
1153 test.noteOff (3, 61, MPEValue::from7BitInt (100));
1156 auto note =
test.getMostRecentNote (3);
1157 expect (note.isValid());
1158 expectEquals (
int (note.midiChannel), 3);
1159 expectEquals (
int (note.initialNote), 60);
1162 test.sustainPedal (1,
false);
1163 test.noteOff (3, 60, MPEValue::from7BitInt (100));
1166 auto note =
test.getMostRecentNote (3);
1167 expect (! note.isValid());
1171 beginTest (
"getMostRecentNoteOtherThan");
1173 MPENote testNote (3, 60,
1174 MPEValue::centreValue(), MPEValue::centreValue(),
1175 MPEValue::centreValue(), MPEValue::centreValue());
1181 test.setZoneLayout (testLayout);
1182 expect (!
test.getMostRecentNoteOtherThan (testNote).isValid());
1184 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1185 expect (!
test.getMostRecentNoteOtherThan (testNote).isValid());
1187 test.noteOn (4, 61, MPEValue::from7BitInt (100));
1188 expect (
test.getMostRecentNoteOtherThan (testNote).isValid());
1189 expect (
test.getMostRecentNoteOtherThan (testNote).midiChannel == 4);
1190 expect (
test.getMostRecentNoteOtherThan (testNote).initialNote == 61);
1196 test.setZoneLayout (testLayout);
1197 expect (!
test.getMostRecentNoteOtherThan (testNote).isValid());
1199 test.noteOn (4, 61, MPEValue::from7BitInt (100));
1200 expect (
test.getMostRecentNoteOtherThan (testNote).isValid());
1201 expect (
test.getMostRecentNoteOtherThan (testNote).midiChannel == 4);
1202 expect (
test.getMostRecentNoteOtherThan (testNote).initialNote == 61);
1204 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1205 expect (
test.getMostRecentNoteOtherThan (testNote).isValid());
1206 expect (
test.getMostRecentNoteOtherThan (testNote).midiChannel == 4);
1207 expect (
test.getMostRecentNoteOtherThan (testNote).initialNote == 61);
1211 beginTest (
"pressure");
1214 UnitTestInstrument
test;
1215 test.setZoneLayout (testLayout);
1217 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1218 test.noteOn (4, 60, MPEValue::from7BitInt (100));
1219 test.noteOn (10, 60, MPEValue::from7BitInt (100));
1222 test.pressure (3, MPEValue::from7BitInt (33));
1223 expectNote (
test.getNote (3, 60), 100, 33, 8192, 64, MPENote::keyDown);
1224 expectNote (
test.getNote (4, 60), 100, 0, 8192, 64, MPENote::keyDown);
1225 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1226 expectEquals (
test.notePressureChangedCallCounter, 1);
1229 test.pressure (1, MPEValue::from7BitInt (44));
1230 expectNote (
test.getNote (3, 60), 100, 44, 8192, 64, MPENote::keyDown);
1231 expectNote (
test.getNote (4, 60), 100, 44, 8192, 64, MPENote::keyDown);
1232 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1233 expectEquals (
test.notePressureChangedCallCounter, 3);
1236 test.pressure (8, MPEValue::from7BitInt (55));
1237 expectNote (
test.getNote (3, 60), 100, 44, 8192, 64, MPENote::keyDown);
1238 expectNote (
test.getNote (4, 60), 100, 44, 8192, 64, MPENote::keyDown);
1239 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1240 expectEquals (
test.notePressureChangedCallCounter, 3);
1243 UnitTestInstrument
test;
1244 test.setZoneLayout (testLayout);
1247 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1248 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1249 test.pressure (3, MPEValue::from7BitInt (66));
1250 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1251 expectNote (
test.getNote (3, 61), 100, 66, 8192, 64, MPENote::keyDown);
1252 expectEquals (
test.notePressureChangedCallCounter, 1);
1255 UnitTestInstrument
test;
1256 test.setZoneLayout (testLayout);
1260 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1261 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1262 test.noteOff (3, 61, MPEValue::from7BitInt (100));
1263 test.pressure (3, MPEValue::from7BitInt (77));
1264 expectEquals (
test.getNumPlayingNotes(), 1);
1265 expectNote (
test.getNote (3, 60), 100, 77, 8192, 64, MPENote::keyDown);
1266 expectEquals (
test.notePressureChangedCallCounter, 1);
1269 UnitTestInstrument
test;
1270 test.setZoneLayout (testLayout);
1273 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1274 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1277 UnitTestInstrument
test;
1278 test.setZoneLayout (testLayout);
1281 test.pressure (3, MPEValue::from7BitInt (77));
1282 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1283 expectNote (
test.getNote (3, 60), 100, 77, 8192, 64, MPENote::keyDown);
1286 UnitTestInstrument
test;
1287 test.setZoneLayout (testLayout);
1291 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1292 test.pressure (3, MPEValue::from7BitInt (77));
1293 test.noteOff (3, 61, MPEValue::from7BitInt (100));
1294 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1295 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1298 UnitTestInstrument
test;
1299 test.setZoneLayout (testLayout);
1303 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1304 test.pressure (3, MPEValue::from7BitInt (77));
1305 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1306 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1307 test.pressure (3, MPEValue::from7BitInt (78));
1308 expectNote (
test.getNote (3, 60), 100, 78, 8192, 64, MPENote::keyDown);
1309 expectNote (
test.getNote (3, 61), 100, 77, 8192, 64, MPENote::keyDown);
1313 UnitTestInstrument
test;
1314 test.setZoneLayout (testLayout);
1317 test.noteOn (16, 60, MPEValue::from7BitInt (100));
1318 expectNote (
test.getNote (16, 60), 100, 0, 8192, 64, MPENote::keyDown);
1319 test.aftertouch (16, 60, MPEValue::from7BitInt (27));
1320 expectNote (
test.getNote (16, 60), 100, 27, 8192, 64, MPENote::keyDown);
1323 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1324 test.aftertouch (3, 60, MPEValue::from7BitInt (50));
1325 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1329 beginTest (
"pitchbend");
1332 UnitTestInstrument
test;
1333 test.setZoneLayout (testLayout);
1335 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1336 test.noteOn (4, 60, MPEValue::from7BitInt (100));
1337 test.noteOn (10, 60, MPEValue::from7BitInt (100));
1340 test.pitchbend (3, MPEValue::from14BitInt (1111));
1341 expectNote (
test.getNote (3, 60), 100, 0, 1111, 64, MPENote::keyDown);
1342 expectNote (
test.getNote (4, 60), 100, 0, 8192, 64, MPENote::keyDown);
1343 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1344 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1350 test.pitchbend (1, MPEValue::from14BitInt (2222));
1351 expectNote (
test.getNote (3, 60), 100, 0, 1111, 64, MPENote::keyDown);
1352 expectNote (
test.getNote (4, 60), 100, 0, 8192, 64, MPENote::keyDown);
1353 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1354 expectEquals (
test.notePitchbendChangedCallCounter, 3);
1357 test.pitchbend (8, MPEValue::from14BitInt (3333));
1358 expectNote (
test.getNote (3, 60), 100, 0, 1111, 64, MPENote::keyDown);
1359 expectNote (
test.getNote (4, 60), 100, 0, 8192, 64, MPENote::keyDown);
1360 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1361 expectEquals (
test.notePitchbendChangedCallCounter, 3);
1364 UnitTestInstrument
test;
1365 test.setZoneLayout (testLayout);
1368 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1369 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1370 test.pitchbend (3, MPEValue::from14BitInt (4444));
1371 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1372 expectNote (
test.getNote (3, 61), 100, 0, 4444, 64, MPENote::keyDown);
1373 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1376 UnitTestInstrument
test;
1377 test.setZoneLayout (testLayout);
1381 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1382 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1383 test.noteOff (3, 61, MPEValue::from7BitInt (100));
1384 test.pitchbend (3, MPEValue::from14BitInt (5555));
1385 expectEquals (
test.getNumPlayingNotes(), 1);
1386 expectNote (
test.getNote (3, 60), 100, 0, 5555, 64, MPENote::keyDown);
1387 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1390 UnitTestInstrument
test;
1391 test.setZoneLayout (testLayout);
1401 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1402 test.sustainPedal (1,
true);
1403 test.noteOff (3, 60, MPEValue::from7BitInt (64));
1404 expectEquals (
test.getNumPlayingNotes(), 1);
1405 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::sustained);
1406 expectEquals (
test.noteKeyStateChangedCallCounter, 2);
1408 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1409 test.pitchbend (3, MPEValue::from14BitInt (6666));
1410 expectEquals (
test.getNumPlayingNotes(), 2);
1411 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::sustained);
1412 expectNote (
test.getNote (3, 61), 100, 0, 6666, 64, MPENote::keyDownAndSustained);
1413 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1416 UnitTestInstrument
test;
1417 test.setZoneLayout (testLayout);
1427 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1428 test.pitchbend (3, MPEValue::from14BitInt (5555));
1429 expectNote (
test.getNote (3, 60), 100, 0, 5555, 64, MPENote::keyDown);
1431 test.noteOff (3, 60, MPEValue::from7BitInt (100));
1432 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1433 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1438 UnitTestInstrument
test;
1440 MPEZoneLayout layout = testLayout;
1441 test.setZoneLayout (layout);
1442 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1443 test.pitchbend (3, MPEValue::from14BitInt (4096));
1444 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, -24.0, 0.01);
1446 layout.setLowerZone (5, 96);
1447 test.setZoneLayout (layout);
1448 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1449 test.pitchbend (3, MPEValue::from14BitInt (0));
1450 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, -96.0, 0.01);
1452 layout.setLowerZone (5, 1);
1453 test.setZoneLayout (layout);
1454 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1455 test.pitchbend (3, MPEValue::from14BitInt (16383));
1456 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, 1.0, 0.01);
1458 layout.setLowerZone (5, 0);
1459 test.setZoneLayout (layout);
1460 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1461 test.pitchbend (3, MPEValue::from14BitInt (12345));
1462 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, 0.0, 0.01);
1467 UnitTestInstrument
test;
1469 MPEZoneLayout layout = testLayout;
1470 test.setZoneLayout (layout);
1471 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1472 test.pitchbend (1, MPEValue::from14BitInt (4096));
1473 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, -1.0, 0.01);
1475 layout.setLowerZone (5, 48, 96);
1476 test.setZoneLayout (layout);
1477 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1478 test.pitchbend (1, MPEValue::from14BitInt (0));
1479 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, -96.0, 0.01);
1481 layout.setLowerZone (5, 48, 1);
1482 test.setZoneLayout (layout);
1483 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1484 test.pitchbend (1, MPEValue::from14BitInt (16383));
1485 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, 1.0, 0.01);
1487 layout.setLowerZone (5, 48, 0);
1488 test.setZoneLayout (layout);
1489 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1490 test.pitchbend (1, MPEValue::from14BitInt (12345));
1491 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, 0.0, 0.01);
1497 UnitTestInstrument
test;
1499 MPEZoneLayout layout = testLayout;
1500 layout.setLowerZone (5, 12, 1);
1501 test.setZoneLayout (layout);
1503 test.pitchbend (1, MPEValue::from14BitInt (4096));
1504 test.pitchbend (3, MPEValue::from14BitInt (0));
1507 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1508 expectDoubleWithinRelativeError (
test.getMostRecentNote (3).totalPitchbendInSemitones, -12.5, 0.01);
1512 beginTest (
"timbre");
1515 UnitTestInstrument
test;
1516 test.setZoneLayout (testLayout);
1518 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1519 test.noteOn (4, 60, MPEValue::from7BitInt (100));
1520 test.noteOn (10, 60, MPEValue::from7BitInt (100));
1523 test.timbre (3, MPEValue::from7BitInt (33));
1524 expectNote (
test.getNote (3, 60), 100, 0, 8192, 33, MPENote::keyDown);
1525 expectNote (
test.getNote (4, 60), 100, 0, 8192, 64, MPENote::keyDown);
1526 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1527 expectEquals (
test.noteTimbreChangedCallCounter, 1);
1530 test.timbre (1, MPEValue::from7BitInt (44));
1531 expectNote (
test.getNote (3, 60), 100, 0, 8192, 44, MPENote::keyDown);
1532 expectNote (
test.getNote (4, 60), 100, 0, 8192, 44, MPENote::keyDown);
1533 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1534 expectEquals (
test.noteTimbreChangedCallCounter, 3);
1537 test.timbre (9, MPEValue::from7BitInt (55));
1538 expectNote (
test.getNote (3, 60), 100, 0, 8192, 44, MPENote::keyDown);
1539 expectNote (
test.getNote (4, 60), 100, 0, 8192, 44, MPENote::keyDown);
1540 expectNote (
test.getNote (10, 60), 100, 0, 8192, 64, MPENote::keyDown);
1541 expectEquals (
test.noteTimbreChangedCallCounter, 3);
1544 UnitTestInstrument
test;
1545 test.setZoneLayout (testLayout);
1548 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1549 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1550 test.timbre (3, MPEValue::from7BitInt (66));
1551 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1552 expectNote (
test.getNote (3, 61), 100, 0, 8192, 66, MPENote::keyDown);
1553 expectEquals (
test.noteTimbreChangedCallCounter, 1);
1556 UnitTestInstrument
test;
1557 test.setZoneLayout (testLayout);
1561 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1562 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1563 test.noteOff (3, 61, MPEValue::from7BitInt (100));
1564 test.timbre (3, MPEValue::from7BitInt (77));
1565 expectEquals (
test.getNumPlayingNotes(), 1);
1566 expectNote (
test.getNote (3, 60), 100, 0, 8192, 77, MPENote::keyDown);
1567 expectEquals (
test.noteTimbreChangedCallCounter, 1);
1570 UnitTestInstrument
test;
1571 test.setZoneLayout (testLayout);
1574 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1575 test.timbre (3, MPEValue::from7BitInt (42));
1576 expectNote (
test.getNote (3, 60), 100, 0, 8192, 42, MPENote::keyDown);
1578 test.noteOff (3, 60, MPEValue::from7BitInt (100));
1579 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1580 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1584 beginTest (
"setPressureTrackingMode");
1588 UnitTestInstrument
test;
1589 test.setZoneLayout (testLayout);
1591 test.setPressureTrackingMode (MPEInstrument::lastNotePlayedOnChannel);
1592 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1593 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1594 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1595 test.pressure (3, MPEValue::from7BitInt (99));
1596 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1597 expectNote (
test.getNote (3, 62), 100, 0, 8192, 64, MPENote::keyDown);
1598 expectNote (
test.getNote (3, 61), 100, 99, 8192, 64, MPENote::keyDown);
1599 expectEquals (
test.notePressureChangedCallCounter, 1);
1603 UnitTestInstrument
test;
1604 test.setZoneLayout (testLayout);
1606 test.setPressureTrackingMode (MPEInstrument::lowestNoteOnChannel);
1607 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1608 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1609 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1610 test.pressure (3, MPEValue::from7BitInt (99));
1611 expectNote (
test.getNote (3, 60), 100, 99, 8192, 64, MPENote::keyDown);
1612 expectNote (
test.getNote (3, 62), 100, 0, 8192, 64, MPENote::keyDown);
1613 expectNote (
test.getNote (3, 61), 100, 0, 8192, 64, MPENote::keyDown);
1614 expectEquals (
test.notePressureChangedCallCounter, 1);
1618 UnitTestInstrument
test;
1619 test.setZoneLayout (testLayout);
1621 test.setPressureTrackingMode (MPEInstrument::highestNoteOnChannel);
1622 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1623 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1624 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1625 test.pressure (3, MPEValue::from7BitInt (99));
1626 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1627 expectNote (
test.getNote (3, 62), 100, 99, 8192, 64, MPENote::keyDown);
1628 expectNote (
test.getNote (3, 61), 100, 0, 8192, 64, MPENote::keyDown);
1629 expectEquals (
test.notePressureChangedCallCounter, 1);
1633 UnitTestInstrument
test;
1634 test.setZoneLayout (testLayout);
1636 test.setPressureTrackingMode (MPEInstrument::allNotesOnChannel);
1637 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1638 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1639 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1640 test.pressure (3, MPEValue::from7BitInt (99));
1641 expectNote (
test.getNote (3, 60), 100, 99, 8192, 64, MPENote::keyDown);
1642 expectNote (
test.getNote (3, 62), 100, 99, 8192, 64, MPENote::keyDown);
1643 expectNote (
test.getNote (3, 61), 100, 99, 8192, 64, MPENote::keyDown);
1644 expectEquals (
test.notePressureChangedCallCounter, 3);
1648 beginTest (
"setPitchbendTrackingMode");
1652 UnitTestInstrument
test;
1653 test.setZoneLayout (testLayout);
1655 test.setPitchbendTrackingMode (MPEInstrument::lastNotePlayedOnChannel);
1656 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1657 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1658 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1659 test.pitchbend (3, MPEValue::from14BitInt (9999));
1660 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1661 expectNote (
test.getNote (3, 62), 100, 0, 8192, 64, MPENote::keyDown);
1662 expectNote (
test.getNote (3, 61), 100, 0, 9999, 64, MPENote::keyDown);
1663 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1667 UnitTestInstrument
test;
1668 test.setZoneLayout (testLayout);
1670 test.setPitchbendTrackingMode (MPEInstrument::lowestNoteOnChannel);
1671 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1672 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1673 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1674 test.pitchbend (3, MPEValue::from14BitInt (9999));
1675 expectNote (
test.getNote (3, 60), 100, 0, 9999, 64, MPENote::keyDown);
1676 expectNote (
test.getNote (3, 62), 100, 0, 8192, 64, MPENote::keyDown);
1677 expectNote (
test.getNote (3, 61), 100, 0, 8192, 64, MPENote::keyDown);
1678 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1682 UnitTestInstrument
test;
1683 test.setZoneLayout (testLayout);
1685 test.setPitchbendTrackingMode (MPEInstrument::highestNoteOnChannel);
1686 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1687 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1688 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1689 test.pitchbend (3, MPEValue::from14BitInt (9999));
1690 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1691 expectNote (
test.getNote (3, 62), 100, 0, 9999, 64, MPENote::keyDown);
1692 expectNote (
test.getNote (3, 61), 100, 0, 8192, 64, MPENote::keyDown);
1693 expectEquals (
test.notePitchbendChangedCallCounter, 1);
1697 UnitTestInstrument
test;
1698 test.setZoneLayout (testLayout);
1700 test.setPitchbendTrackingMode (MPEInstrument::allNotesOnChannel);
1701 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1702 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1703 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1704 test.pitchbend (3, MPEValue::from14BitInt (9999));
1705 expectNote (
test.getNote (3, 60), 100, 0, 9999, 64, MPENote::keyDown);
1706 expectNote (
test.getNote (3, 62), 100, 0, 9999, 64, MPENote::keyDown);
1707 expectNote (
test.getNote (3, 61), 100, 0, 9999, 64, MPENote::keyDown);
1708 expectEquals (
test.notePitchbendChangedCallCounter, 3);
1712 beginTest (
"setTimbreTrackingMode");
1716 UnitTestInstrument
test;
1717 test.setZoneLayout (testLayout);
1719 test.setTimbreTrackingMode (MPEInstrument::lastNotePlayedOnChannel);
1720 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1721 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1722 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1723 test.timbre (3, MPEValue::from7BitInt (99));
1724 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1725 expectNote (
test.getNote (3, 62), 100, 0, 8192, 64, MPENote::keyDown);
1726 expectNote (
test.getNote (3, 61), 100, 0, 8192, 99, MPENote::keyDown);
1727 expectEquals (
test.noteTimbreChangedCallCounter, 1);
1731 UnitTestInstrument
test;
1732 test.setZoneLayout (testLayout);
1734 test.setTimbreTrackingMode (MPEInstrument::lowestNoteOnChannel);
1735 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1736 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1737 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1738 test.timbre (3, MPEValue::from7BitInt (99));
1739 expectNote (
test.getNote (3, 60), 100, 0, 8192, 99, MPENote::keyDown);
1740 expectNote (
test.getNote (3, 62), 100, 0, 8192, 64, MPENote::keyDown);
1741 expectNote (
test.getNote (3, 61), 100, 0, 8192, 64, MPENote::keyDown);
1742 expectEquals (
test.noteTimbreChangedCallCounter, 1);
1746 UnitTestInstrument
test;
1747 test.setZoneLayout (testLayout);
1749 test.setTimbreTrackingMode (MPEInstrument::highestNoteOnChannel);
1750 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1751 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1752 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1753 test.timbre (3, MPEValue::from7BitInt (99));
1754 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
1755 expectNote (
test.getNote (3, 62), 100, 0, 8192, 99, MPENote::keyDown);
1756 expectNote (
test.getNote (3, 61), 100, 0, 8192, 64, MPENote::keyDown);
1757 expectEquals (
test.noteTimbreChangedCallCounter, 1);
1761 UnitTestInstrument
test;
1762 test.setZoneLayout (testLayout);
1764 test.setTimbreTrackingMode (MPEInstrument::allNotesOnChannel);
1765 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1766 test.noteOn (3, 62, MPEValue::from7BitInt (100));
1767 test.noteOn (3, 61, MPEValue::from7BitInt (100));
1768 test.timbre (3, MPEValue::from7BitInt (99));
1769 expectNote (
test.getNote (3, 60), 100, 0, 8192, 99, MPENote::keyDown);
1770 expectNote (
test.getNote (3, 62), 100, 0, 8192, 99, MPENote::keyDown);
1771 expectNote (
test.getNote (3, 61), 100, 0, 8192, 99, MPENote::keyDown);
1772 expectEquals (
test.noteTimbreChangedCallCounter, 3);
1776 beginTest (
"processNextMidiEvent");
1778 UnitTestInstrument
test;
1783 expectEquals (
test.noteOnCallCounter, 1);
1784 expectEquals (
test.lastMidiChannelReceived, 3);
1785 expectEquals (
test.lastMidiNoteNumberReceived, 42);
1786 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 92);
1791 expectEquals (
test.noteOffCallCounter, 1);
1792 expectEquals (
test.lastMidiChannelReceived, 4);
1793 expectEquals (
test.lastMidiNoteNumberReceived, 12);
1794 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 33);
1800 expectEquals (
test.noteOffCallCounter, 2);
1801 expectEquals (
test.lastMidiChannelReceived, 5);
1802 expectEquals (
test.lastMidiNoteNumberReceived, 11);
1803 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 64);
1808 expectEquals (
test.pitchbendCallCounter, 1);
1809 expectEquals (
test.lastMidiChannelReceived, 1);
1810 expectEquals (
test.lastMPEValueReceived.as14BitInt(), 3333);
1816 expectEquals (
test.pressureCallCounter, 1);
1817 expectEquals (
test.lastMidiChannelReceived, 10);
1818 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 35);
1825 expectEquals (
test.pressureCallCounter, 2);
1826 expectEquals (
test.lastMidiChannelReceived, 3);
1827 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 120);
1831 expectEquals (
test.pressureCallCounter, 2);
1833 expectEquals (
test.pressureCallCounter, 2);
1835 expectEquals (
test.pressureCallCounter, 3);
1836 expectEquals (
test.lastMidiChannelReceived, 4);
1837 expectEquals (
test.lastMPEValueReceived.as14BitInt(), 121 + (123 << 7));
1839 expectEquals (
test.pressureCallCounter, 4);
1840 expectEquals (
test.lastMidiChannelReceived, 5);
1841 expectEquals (
test.lastMPEValueReceived.as14BitInt(), 122 + (124 << 7));
1843 expectEquals (
test.pressureCallCounter, 5);
1844 expectEquals (
test.lastMidiChannelReceived, 5);
1845 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 64);
1849 expectEquals (
test.timbreCallCounter, 1);
1850 expectEquals (
test.lastMidiChannelReceived, 3);
1851 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 120);
1853 expectEquals (
test.timbreCallCounter, 1);
1855 expectEquals (
test.timbreCallCounter, 1);
1857 expectEquals (
test.timbreCallCounter, 2);
1858 expectEquals (
test.lastMidiChannelReceived, 4);
1859 expectEquals (
test.lastMPEValueReceived.as14BitInt(), 121 + (123 << 7));
1861 expectEquals (
test.timbreCallCounter, 3);
1862 expectEquals (
test.lastMidiChannelReceived, 5);
1863 expectEquals (
test.lastMPEValueReceived.as14BitInt(), 122 + (124 << 7));
1865 expectEquals (
test.timbreCallCounter, 4);
1866 expectEquals (
test.lastMidiChannelReceived, 5);
1867 expectEquals (
test.lastMPEValueReceived.as7BitInt(), 64);
1871 expectEquals (
test.sustainPedalCallCounter, 1);
1872 expectEquals (
test.lastMidiChannelReceived, 1);
1873 expect (
test.lastSustainPedalValueReceived);
1875 expectEquals (
test.sustainPedalCallCounter, 2);
1876 expectEquals (
test.lastMidiChannelReceived, 16);
1877 expect (!
test.lastSustainPedalValueReceived);
1881 expectEquals (
test.sostenutoPedalCallCounter, 1);
1882 expectEquals (
test.lastMidiChannelReceived, 1);
1883 expect (
test.lastSostenutoPedalValueReceived);
1885 expectEquals (
test.sostenutoPedalCallCounter, 2);
1886 expectEquals (
test.lastMidiChannelReceived, 16);
1887 expect (!
test.lastSostenutoPedalValueReceived);
1897 buffer.addEvents (MPEMessages::setLowerZone (5), 0, -1, 0);
1898 buffer.addEvents (MPEMessages::setUpperZone (6), 0, -1, 0);
1900 for (
const auto metadata : buffer)
1901 test.processNextMidiEvent (metadata.getMessage());
1903 expect (
test.getZoneLayout().getLowerZone().isActive());
1904 expect (
test.getZoneLayout().getUpperZone().isActive());
1905 expectEquals (
test.getZoneLayout().getLowerZone().getMasterChannel(), 1);
1906 expectEquals (
test.getZoneLayout().getLowerZone().numMemberChannels, 5);
1907 expectEquals (
test.getZoneLayout().getUpperZone().getMasterChannel(), 16);
1908 expectEquals (
test.getZoneLayout().getUpperZone().numMemberChannels, 6);
1911 beginTest (
"MIDI all notes off");
1913 UnitTestInstrument
test;
1914 test.setZoneLayout (testLayout);
1915 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1916 test.noteOn (4, 61, MPEValue::from7BitInt (100));
1917 test.noteOn (15, 62, MPEValue::from7BitInt (100));
1918 test.noteOn (15, 63, MPEValue::from7BitInt (100));
1919 expectEquals (
test.getNumPlayingNotes(), 4);
1923 expectEquals (
test.getNumPlayingNotes(), 4);
1927 expectEquals (
test.getNumPlayingNotes(), 4);
1931 expectEquals (
test.getNumPlayingNotes(), 2);
1933 expectEquals (
test.getNumPlayingNotes(), 0);
1936 beginTest (
"MIDI all notes off (legacy mode)");
1938 UnitTestInstrument
test;
1939 test.enableLegacyMode();
1940 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1941 test.noteOn (4, 61, MPEValue::from7BitInt (100));
1942 test.noteOn (15, 62, MPEValue::from7BitInt (100));
1943 test.noteOn (15, 63, MPEValue::from7BitInt (100));
1944 expectEquals (
test.getNumPlayingNotes(), 4);
1947 expectEquals (
test.getNumPlayingNotes(), 3);
1950 expectEquals (
test.getNumPlayingNotes(), 1);
1953 expectEquals (
test.getNumPlayingNotes(), 0);
1956 beginTest (
"default initial values for pitchbend and timbre");
1959 test.setZoneLayout (testLayout);
1961 test.pitchbend (3, MPEValue::from14BitInt (3333));
1962 test.pitchbend (2, MPEValue::from14BitInt (4444));
1963 test.pitchbend (2, MPEValue::from14BitInt (5555));
1965 test.timbre (3, MPEValue::from7BitInt (66));
1966 test.timbre (2, MPEValue::from7BitInt (77));
1967 test.timbre (2, MPEValue::from7BitInt (88));
1969 test.noteOn (3, 60, MPEValue::from7BitInt (100));
1971 expectNote (
test.getMostRecentNote (3), 100, 0, 3333, 66, MPENote::keyDown);
1974 beginTest (
"Legacy mode");
1979 expect (!
test.isLegacyModeEnabled());
1981 test.setZoneLayout (testLayout);
1982 expect (!
test.isLegacyModeEnabled());
1984 test.enableLegacyMode();
1985 expect (
test.isLegacyModeEnabled());
1987 test.setZoneLayout (testLayout);
1988 expect (!
test.isLegacyModeEnabled());
1993 test.enableLegacyMode (0, Range<int> (1, 11));
1994 expectEquals (
test.getLegacyModePitchbendRange(), 0);
1995 expect (
test.getLegacyModeChannelRange() == Range<int> (1, 11));
2000 test.enableLegacyMode();
2002 expectEquals (
test.getLegacyModePitchbendRange(), 2);
2003 expect (
test.getLegacyModeChannelRange() == Range<int> (1, 17));
2005 test.setLegacyModePitchbendRange (96);
2006 expectEquals (
test.getLegacyModePitchbendRange(), 96);
2008 test.setLegacyModeChannelRange (Range<int> (10, 12));
2009 expect (
test.getLegacyModeChannelRange() == Range<int> (10, 12));
2014 UnitTestInstrument
test;
2015 test.enableLegacyMode();
2017 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2018 test.noteOn (2, 60, MPEValue::from7BitInt (100));
2019 test.noteOn (15, 60, MPEValue::from7BitInt (100));
2020 test.noteOn (16, 60, MPEValue::from7BitInt (100));
2021 expectEquals (
test.getNumPlayingNotes(), 4);
2025 test.pitchbend (1, MPEValue::from14BitInt (9999));
2026 test.pressure (2, MPEValue::from7BitInt (88));
2027 test.timbre (15, MPEValue::from7BitInt (77));
2029 expectNote (
test.getNote (1, 60), 100, 0, 9999, 64, MPENote::keyDown);
2030 expectNote (
test.getNote (2, 60), 100, 88, 8192, 64, MPENote::keyDown);
2031 expectNote (
test.getNote (15, 60), 100, 0, 8192, 77, MPENote::keyDown);
2032 expectNote (
test.getNote (16, 60), 100, 0, 8192, 64, MPENote::keyDown);
2036 test.noteOff (15, 60, MPEValue::from7BitInt (0));
2037 test.noteOff (1, 60, MPEValue::from7BitInt (0));
2038 test.noteOff (2, 60, MPEValue::from7BitInt (0));
2039 test.noteOff (16, 60, MPEValue::from7BitInt (0));
2040 expectEquals (
test.getNumPlayingNotes(), 0);
2045 UnitTestInstrument
test;
2046 test.enableLegacyMode (2, Range<int> (3, 8));
2048 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2049 test.noteOn (2, 60, MPEValue::from7BitInt (100));
2050 test.noteOn (3, 60, MPEValue::from7BitInt (100));
2051 test.noteOn (4, 60, MPEValue::from7BitInt (100));
2052 test.noteOn (6, 60, MPEValue::from7BitInt (100));
2053 test.noteOn (7, 60, MPEValue::from7BitInt (100));
2054 test.noteOn (8, 60, MPEValue::from7BitInt (100));
2055 test.noteOn (16, 60, MPEValue::from7BitInt (100));
2057 expectEquals (
test.getNumPlayingNotes(), 4);
2058 expectNote (
test.getNote (3, 60), 100, 0, 8192, 64, MPENote::keyDown);
2059 expectNote (
test.getNote (4, 60), 100, 0, 8192, 64, MPENote::keyDown);
2060 expectNote (
test.getNote (6, 60), 100, 0, 8192, 64, MPENote::keyDown);
2061 expectNote (
test.getNote (7, 60), 100, 0, 8192, 64, MPENote::keyDown);
2066 UnitTestInstrument
test;
2067 test.enableLegacyMode();
2069 test.setPitchbendTrackingMode (MPEInstrument::lastNotePlayedOnChannel);
2070 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2071 test.noteOn (1, 62, MPEValue::from7BitInt (100));
2072 test.noteOn (1, 61, MPEValue::from7BitInt (100));
2073 test.pitchbend (1, MPEValue::from14BitInt (9999));
2074 expectNote (
test.getNote (1, 60), 100, 0, 8192, 64, MPENote::keyDown);
2075 expectNote (
test.getNote (1, 61), 100, 0, 9999, 64, MPENote::keyDown);
2076 expectNote (
test.getNote (1, 62), 100, 0, 8192, 64, MPENote::keyDown);
2079 UnitTestInstrument
test;
2080 test.enableLegacyMode();
2082 test.setPitchbendTrackingMode (MPEInstrument::lowestNoteOnChannel);
2083 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2084 test.noteOn (1, 62, MPEValue::from7BitInt (100));
2085 test.noteOn (1, 61, MPEValue::from7BitInt (100));
2086 test.pitchbend (1, MPEValue::from14BitInt (9999));
2087 expectNote (
test.getNote (1, 60), 100, 0, 9999, 64, MPENote::keyDown);
2088 expectNote (
test.getNote (1, 61), 100, 0, 8192, 64, MPENote::keyDown);
2089 expectNote (
test.getNote (1, 62), 100, 0, 8192, 64, MPENote::keyDown);
2092 UnitTestInstrument
test;
2093 test.enableLegacyMode();
2095 test.setPitchbendTrackingMode (MPEInstrument::highestNoteOnChannel);
2096 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2097 test.noteOn (1, 62, MPEValue::from7BitInt (100));
2098 test.noteOn (1, 61, MPEValue::from7BitInt (100));
2099 test.pitchbend (1, MPEValue::from14BitInt (9999));
2100 expectNote (
test.getNote (1, 60), 100, 0, 8192, 64, MPENote::keyDown);
2101 expectNote (
test.getNote (1, 61), 100, 0, 8192, 64, MPENote::keyDown);
2102 expectNote (
test.getNote (1, 62), 100, 0, 9999, 64, MPENote::keyDown);
2105 UnitTestInstrument
test;
2106 test.enableLegacyMode();
2108 test.setPitchbendTrackingMode (MPEInstrument::allNotesOnChannel);
2109 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2110 test.noteOn (1, 62, MPEValue::from7BitInt (100));
2111 test.noteOn (1, 61, MPEValue::from7BitInt (100));
2112 test.pitchbend (1, MPEValue::from14BitInt (9999));
2113 expectNote (
test.getNote (1, 60), 100, 0, 9999, 64, MPENote::keyDown);
2114 expectNote (
test.getNote (1, 61), 100, 0, 9999, 64, MPENote::keyDown);
2115 expectNote (
test.getNote (1, 62), 100, 0, 9999, 64, MPENote::keyDown);
2120 UnitTestInstrument
test;
2121 test.enableLegacyMode (11);
2123 test.pitchbend (1, MPEValue::from14BitInt (4096));
2124 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2125 expectDoubleWithinRelativeError (
test.getMostRecentNote (1).totalPitchbendInSemitones, -5.5, 0.01);
2129 UnitTestInstrument
test;
2130 test.enableLegacyMode();
2132 test.sustainPedal (1,
true);
2133 test.noteOn (2, 61, MPEValue::from7BitInt (100));
2134 test.noteOff (2, 61, MPEValue::from7BitInt (100));
2135 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2136 test.noteOff (1, 60, MPEValue::from7BitInt (100));
2138 expectEquals (
test.getNumPlayingNotes(), 1);
2139 expectNote (
test.getNote (1, 60), 100, 0, 8192, 64, MPENote::sustained);
2141 test.sustainPedal (1,
false);
2142 expectEquals (
test.getNumPlayingNotes(), 0);
2144 test.noteOn (2, 61, MPEValue::from7BitInt (100));
2145 test.sustainPedal (1,
true);
2146 test.noteOff (2, 61, MPEValue::from7BitInt (100));
2147 expectEquals (
test.getNumPlayingNotes(), 0);
2152 UnitTestInstrument
test;
2153 test.enableLegacyMode();
2155 test.noteOn (1, 60, MPEValue::from7BitInt (100));
2156 test.sostenutoPedal (1,
true);
2157 test.noteOff (1, 60, MPEValue::from7BitInt (100));
2158 test.noteOn (2, 61, MPEValue::from7BitInt (100));
2159 test.noteOff (2, 61, MPEValue::from7BitInt (100));
2161 expectEquals (
test.getNumPlayingNotes(), 1);
2162 expectNote (
test.getNote (1, 60), 100, 0, 8192, 64, MPENote::sustained);
2164 test.sostenutoPedal (1,
false);
2165 expectEquals (
test.getNumPlayingNotes(), 0);
2167 test.noteOn (2, 61, MPEValue::from7BitInt (100));
2168 test.sostenutoPedal (1,
true);
2169 test.noteOff (2, 61, MPEValue::from7BitInt (100));
2170 expectEquals (
test.getNumPlayingNotes(), 0);
2174 UnitTestInstrument
test;
2175 test.setZoneLayout (testLayout);
2176 test.noteOn (3, 60, MPEValue::from7BitInt (100));
2177 expectEquals (
test.getNumPlayingNotes(), 1);
2179 test.enableLegacyMode();
2180 expectEquals (
test.getNumPlayingNotes(), 0);
2181 test.noteOn (3, 60, MPEValue::from7BitInt (100));
2182 expectEquals (
test.getNumPlayingNotes(), 1);
2184 test.setZoneLayout (testLayout);
2185 expectEquals (
test.getNumPlayingNotes(), 0);
2196 class UnitTestInstrument :
public MPEInstrument,
2197 private MPEInstrument::Listener
2199 using Base = MPEInstrument;
2202 UnitTestInstrument()
2203 : noteOnCallCounter (0), noteOffCallCounter (0), pitchbendCallCounter (0),
2204 pressureCallCounter (0), timbreCallCounter (0), sustainPedalCallCounter (0),
2205 sostenutoPedalCallCounter (0), noteAddedCallCounter (0), notePressureChangedCallCounter (0),
2206 notePitchbendChangedCallCounter (0), noteTimbreChangedCallCounter (0),
2207 noteKeyStateChangedCallCounter (0), noteReleasedCallCounter (0),
2208 lastMidiChannelReceived (-1), lastMidiNoteNumberReceived (-1),
2209 lastSustainPedalValueReceived (
false), lastSostenutoPedalValueReceived (
false)
2214 void noteOn (
int midiChannel,
int midiNoteNumber, MPEValue midiNoteOnVelocity)
override
2216 Base::noteOn (midiChannel, midiNoteNumber, midiNoteOnVelocity);
2218 noteOnCallCounter++;
2219 lastMidiChannelReceived = midiChannel;
2220 lastMidiNoteNumberReceived = midiNoteNumber;
2221 lastMPEValueReceived = midiNoteOnVelocity;
2224 void noteOff (
int midiChannel,
int midiNoteNumber, MPEValue midiNoteOffVelocity)
override
2226 Base::noteOff (midiChannel, midiNoteNumber, midiNoteOffVelocity);
2228 noteOffCallCounter++;
2229 lastMidiChannelReceived = midiChannel;
2230 lastMidiNoteNumberReceived = midiNoteNumber;
2231 lastMPEValueReceived = midiNoteOffVelocity;
2234 void pitchbend (
int midiChannel, MPEValue
value)
override
2236 Base::pitchbend (midiChannel,
value);
2238 pitchbendCallCounter++;
2239 lastMidiChannelReceived = midiChannel;
2240 lastMPEValueReceived =
value;
2243 void pressure (
int midiChannel, MPEValue
value)
override
2245 Base::pressure (midiChannel,
value);
2247 pressureCallCounter++;
2248 lastMidiChannelReceived = midiChannel;
2249 lastMPEValueReceived =
value;
2252 void timbre (
int midiChannel, MPEValue
value)
override
2254 Base::timbre (midiChannel,
value);
2256 timbreCallCounter++;
2257 lastMidiChannelReceived = midiChannel;
2258 lastMPEValueReceived =
value;
2261 void sustainPedal (
int midiChannel,
bool value)
override
2263 Base::sustainPedal (midiChannel,
value);
2265 sustainPedalCallCounter++;
2266 lastMidiChannelReceived = midiChannel;
2267 lastSustainPedalValueReceived =
value;
2270 void sostenutoPedal (
int midiChannel,
bool value)
override
2272 Base::sostenutoPedal (midiChannel,
value);
2274 sostenutoPedalCallCounter++;
2275 lastMidiChannelReceived = midiChannel;
2276 lastSostenutoPedalValueReceived =
value;
2279 void aftertouch (
int midiChannel,
int midiNoteNumber, MPEValue
value)
2282 processNextMidiEvent (
message);
2285 int noteOnCallCounter, noteOffCallCounter, pitchbendCallCounter,
2286 pressureCallCounter, timbreCallCounter, sustainPedalCallCounter,
2287 sostenutoPedalCallCounter, noteAddedCallCounter,
2288 notePressureChangedCallCounter, notePitchbendChangedCallCounter,
2289 noteTimbreChangedCallCounter, noteKeyStateChangedCallCounter,
2290 noteReleasedCallCounter, lastMidiChannelReceived, lastMidiNoteNumberReceived;
2292 bool lastSustainPedalValueReceived, lastSostenutoPedalValueReceived;
2293 MPEValue lastMPEValueReceived;
2294 std::unique_ptr<MPENote> lastNoteFinished;
2298 void noteAdded (MPENote)
override { noteAddedCallCounter++; }
2300 void notePressureChanged (MPENote)
override { notePressureChangedCallCounter++; }
2301 void notePitchbendChanged (MPENote)
override { notePitchbendChangedCallCounter++; }
2302 void noteTimbreChanged (MPENote)
override { noteTimbreChangedCallCounter++; }
2303 void noteKeyStateChanged (MPENote)
override { noteKeyStateChangedCallCounter++; }
2305 void noteReleased (MPENote finishedNote)
override
2307 noteReleasedCallCounter++;
2308 lastNoteFinished.reset (
new MPENote (finishedNote));
2313 void expectNote (MPENote noteToTest,
2314 int noteOnVelocity7Bit,
2318 MPENote::KeyState keyState)
2320 expect (noteToTest.isValid());
2321 expectEquals (noteToTest.noteOnVelocity.as7BitInt(), noteOnVelocity7Bit);
2322 expectEquals (noteToTest.pressure.as7BitInt(), pressure7Bit);
2323 expectEquals (noteToTest.pitchbend.as14BitInt(), pitchbend14Bit);
2324 expectEquals (noteToTest.timbre.as7BitInt(),timbre7Bit);
2325 expect (noteToTest.keyState == keyState);
2328 void expectHasFinishedNote (
const UnitTestInstrument&
test,
2329 int channel,
int noteNumber,
int noteOffVelocity7Bit)
2331 expect (
test.lastNoteFinished !=
nullptr);
2332 expectEquals (
int (
test.lastNoteFinished->midiChannel), channel);
2333 expectEquals (
int (
test.lastNoteFinished->initialNote), noteNumber);
2334 expectEquals (
test.lastNoteFinished->noteOffVelocity.as7BitInt(), noteOffVelocity7Bit);
2335 expect (
test.lastNoteFinished->keyState == MPENote::off);
2338 void expectDoubleWithinRelativeError (
double actual,
double expected,
double maxRelativeError)
2340 const double maxAbsoluteError =
jmax (1.0, std::abs (expected)) * maxRelativeError;
2341 expect (std::abs (expected - actual) < maxAbsoluteError);
2345 MPEZoneLayout testLayout;
2348static MPEInstrumentTests MPEInstrumentUnitTests;
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
uint8_t uint8
Definition basics.h:86
static MidiMessage allControllersOff(int channel) noexcept
Definition MidiMessage.cpp:583
static MidiMessage noteOn(int channel, int noteNumber, float velocity) noexcept
Definition MidiMessage.cpp:534
static MidiMessage noteOff(int channel, int noteNumber, float velocity) noexcept
Definition MidiMessage.cpp:548
static MidiMessage controllerEvent(int channel, int controllerType, int value) noexcept
Definition MidiMessage.cpp:516
static MidiMessage channelPressureChange(int channel, int pressure) noexcept
Definition MidiMessage.cpp:436
static MidiMessage pitchWheel(int channel, int position) noexcept
Definition MidiMessage.cpp:484
Definition juce_MPEInstrument.h:260
void setPitchbendTrackingMode(TrackingMode modeToUse)
Definition juce_MPEInstrument.cpp:166
void setLegacyModeChannelRange(Range< int > channelRange)
Definition juce_MPEInstrument.cpp:127
void updateDimensionForNote(MPENote &, MPEDimension &, MPEValue)
Definition juce_MPEInstrument.cpp:513
bool isMemberChannelSustained[16]
Definition juce_MPEInstrument.h:370
void processMidiControllerMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:246
MPENote getMostRecentNoteOtherThan(MPENote otherThanThisNote) const noexcept
Definition juce_MPEInstrument.cpp:714
void processMidiPitchWheelMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:232
MPEZoneLayout getZoneLayout() const noexcept
Definition juce_MPEInstrument.cpp:63
virtual void sostenutoPedal(int midiChannel, bool isDown)
Definition juce_MPEInstrument.cpp:581
virtual void pitchbend(int midiChannel, MPEValue pitchbend)
Definition juce_MPEInstrument.cpp:405
void updateNoteTotalPitchbend(MPENote &)
Definition juce_MPEInstrument.cpp:535
bool isMemberChannel(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:645
void processMidiAfterTouchMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:301
MPEZoneLayout zoneLayout
Definition juce_MPEInstrument.h:365
void handlePressureMSB(int midiChannel, int value) noexcept
Definition juce_MPEInstrument.cpp:311
void processMidiNoteOnMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:203
void enableLegacyMode(int pitchbendRange=2, Range< int > channelRange=Range< int >(1, 17))
Definition juce_MPEInstrument.cpp:100
MPENote getNote(int index) const noexcept
Definition juce_MPEInstrument.cpp:689
TrackingMode
Definition juce_MPEInstrument.h:120
@ highestNoteOnChannel
Definition juce_MPEInstrument.h:123
@ lowestNoteOnChannel
Definition juce_MPEInstrument.h:122
@ lastNotePlayedOnChannel
Definition juce_MPEInstrument.h:121
@ allNotesOnChannel
Definition juce_MPEInstrument.h:124
void resetLastReceivedValues()
Definition juce_MPEInstrument.cpp:68
CriticalSection lock
Definition juce_MPEInstrument.h:360
ListenerList< Listener > listeners
Definition juce_MPEInstrument.h:366
MPEInstrument() noexcept
Definition juce_MPEInstrument.cpp:39
void setZoneLayout(MPEZoneLayout newLayout)
Definition juce_MPEInstrument.cpp:85
virtual void polyAftertouch(int midiChannel, int midiNoteNumber, MPEValue value)
Definition juce_MPEInstrument.cpp:423
virtual void processNextMidiEvent(const MidiMessage &message)
Definition juce_MPEInstrument.cpp:188
void setLegacyModePitchbendRange(int pitchbendRange)
Definition juce_MPEInstrument.cpp:146
MPEDimension pitchbendDimension
Definition juce_MPEInstrument.h:388
void processMidiNoteOffMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:224
bool isLegacyModeEnabled() const noexcept
Definition juce_MPEInstrument.cpp:117
void updateDimension(int midiChannel, MPEDimension &, MPEValue)
Definition juce_MPEInstrument.cpp:450
const MPENote * getLastNotePlayedPtr(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:766
void setPressureTrackingMode(TrackingMode modeToUse)
Definition juce_MPEInstrument.cpp:161
MPEDimension timbreDimension
Definition juce_MPEInstrument.h:388
void handleSustainOrSostenuto(int midiChannel, bool isDown, bool isSostenuto)
Definition juce_MPEInstrument.cpp:588
void addListener(Listener *listenerToAdd)
Definition juce_MPEInstrument.cpp:177
void removeListener(Listener *listenerToRemove)
Definition juce_MPEInstrument.cpp:182
MPENote getNoteWithID(uint16 noteID) const noexcept
Definition juce_MPEInstrument.cpp:694
void handlePressureLSB(int midiChannel, int value) noexcept
Definition juce_MPEInstrument.cpp:319
virtual void sustainPedal(int midiChannel, bool isDown)
Definition juce_MPEInstrument.cpp:575
void setTimbreTrackingMode(TrackingMode modeToUse)
Definition juce_MPEInstrument.cpp:171
const MPENote * getNotePtr(int midiChannel, int midiNoteNumber) const noexcept
Definition juce_MPEInstrument.cpp:728
int getNumPlayingNotes() const noexcept
Definition juce_MPEInstrument.cpp:676
void releaseAllNotes()
Definition juce_MPEInstrument.cpp:841
virtual void timbre(int midiChannel, MPEValue value)
Definition juce_MPEInstrument.cpp:417
MPEDimension pressureDimension
Definition juce_MPEInstrument.h:388
void updateDimensionMaster(bool, MPEDimension &, MPEValue)
Definition juce_MPEInstrument.cpp:482
const MPENote * getLowestNotePtr(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:814
MPENote getMostRecentNote(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:706
Range< int > getLegacyModeChannelRange() const noexcept
Definition juce_MPEInstrument.cpp:122
virtual void noteOn(int midiChannel, int midiNoteNumber, MPEValue midiNoteOnVelocity)
Definition juce_MPEInstrument.cpp:338
void processMidiResetAllControllersMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:261
int getLegacyModePitchbendRange() const noexcept
Definition juce_MPEInstrument.cpp:141
void handleTimbreLSB(int midiChannel, int value) noexcept
Definition juce_MPEInstrument.cpp:332
MPEValue getInitialValueForNewNote(int midiChannel, MPEDimension &) const
Definition juce_MPEInstrument.cpp:441
virtual void noteOff(int midiChannel, int midiNoteNumber, MPEValue midiNoteOffVelocity)
Definition juce_MPEInstrument.cpp:370
uint8 lastTimbreLowerBitReceivedOnChannel[16]
Definition juce_MPEInstrument.h:369
void handleTimbreMSB(int midiChannel, int value) noexcept
Definition juce_MPEInstrument.cpp:324
void processMidiChannelPressureMessage(const MidiMessage &)
Definition juce_MPEInstrument.cpp:239
Array< MPENote > notes
Definition juce_MPEInstrument.h:364
const MPENote * getHighestNotePtr(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:788
virtual void pressure(int midiChannel, MPEValue value)
Definition juce_MPEInstrument.cpp:411
void callListenersDimensionChanged(const MPENote &, const MPEDimension &)
Definition juce_MPEInstrument.cpp:527
bool isMasterChannel(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:654
uint8 lastPressureLowerBitReceivedOnChannel[16]
Definition juce_MPEInstrument.h:368
bool isUsingChannel(int midiChannel) const noexcept
Definition juce_MPEInstrument.cpp:666
LegacyMode legacyMode
Definition juce_MPEInstrument.h:387
Definition juce_MPEValue.h:37
float asSignedFloat() const noexcept
Definition juce_MPEValue.cpp:74
static MPEValue centreValue() noexcept
Definition juce_MPEValue.cpp:60
static MPEValue from14BitInt(int value) noexcept
Definition juce_MPEValue.cpp:40
static MPEValue minValue() noexcept
Definition juce_MPEValue.cpp:59
static MPEValue from7BitInt(int value) noexcept
Definition juce_MPEValue.cpp:30
Definition juce_MPEZoneLayout.h:121
Definition juce_MidiMessage.h:35
static MidiMessage aftertouchChange(int channel, int noteNumber, int aftertouchAmount) noexcept
Definition juce_MidiMessage.cpp:482
Definition juce_Range.h:40
Definition juce_UnitTest.h:70
int * l
Definition inflate.c:1579
register unsigned i
Definition inflate.c:1575
static PuglViewHint int value
Definition pugl.h:1708
#define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
Definition juce_CompilerWarnings.h:198
#define JUCE_END_IGNORE_WARNINGS_MSVC
Definition juce_CompilerWarnings.h:199
Definition juce_UnitTestCategories.h:27
JOCTET * buffer
Definition juce_JPEGLoader.cpp:302
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
unsigned short uint16
Definition juce_MathsFunctions.h:41
Base
Definition PathUtil.h:34
#define false
Definition ordinals.h:83
png_structrp int mode
Definition png.h:1139
static int test(SerdEnv *env, bool top_level, bool pretty_numbers)
Definition sratom_test.c:79
Definition juce_MPEInstrument.h:380
TrackingMode trackingMode
Definition juce_MPEInstrument.h:381
MPEValue & getValue(MPENote ¬e) noexcept
Definition juce_MPEInstrument.h:384
MPEValue lastValueReceivedOnChannel[16]
Definition juce_MPEInstrument.h:382
Definition juce_MPENote.h:40
@ keyDown
Definition juce_MPENote.h:46
@ off
Definition juce_MPENote.h:45
@ keyDownAndSustained
Definition juce_MPENote.h:48
@ sustained
Definition juce_MPENote.h:47
MPEValue timbre
Definition juce_MPENote.h:144
MPEValue pitchbend
Definition juce_MPENote.h:128
MPEValue pressure
Definition juce_MPENote.h:133
double totalPitchbendInSemitones
Definition juce_MPENote.h:164
uint8 midiChannel
Definition juce_MPENote.h:103
int result
Definition process.c:1455
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137