28 uint16 generateNoteID (
int midiChannel,
int midiNoteNumber)
noexcept
30 jassert (midiChannel > 0 && midiChannel <= 16);
31 jassert (midiNoteNumber >= 0 && midiNoteNumber < 128);
33 return uint16 ((midiChannel << 7) + midiNoteNumber);
45 : noteID (generateNoteID (midiChannel_, initialNote_)),
46 midiChannel (uint8 (midiChannel_)),
47 initialNote (uint8 (initialNote_)),
48 noteOnVelocity (noteOnVelocity_),
49 pitchbend (pitchbend_),
51 initialTimbre (timbre_),
70 auto pitchInSemitones = double (initialNote) + totalPitchbendInSemitones;
71 return frequencyOfA * std::pow (2.0, (pitchInSemitones - 69.0) / 12.0);
77 jassert (isValid() && other.isValid());
78 return noteID == other.noteID;
83 jassert (isValid() && other.isValid());
84 return noteID != other.noteID;
96 :
UnitTest (
"MPENote class", UnitTestCategories::midi)
100 void runTest()
override
102 beginTest (
"getFrequencyInHertz");
105 note.initialNote = 60;
106 note.totalPitchbendInSemitones = -0.5;
107 expectEqualsWithinOneCent (note.getFrequencyInHertz(), 254.178);
113 void expectEqualsWithinOneCent (
double frequencyInHertzActual,
114 double frequencyInHertzExpected)
116 double ratio = frequencyInHertzActual / frequencyInHertzExpected;
117 double oneCent = 1.0005946;
118 expect (ratio < oneCent);
119 expect (ratio > 1.0 / oneCent);
123static MPENoteTests MPENoteUnitTests;
double getFrequencyInHertz(double frequencyOfA=440.0) const noexcept
bool operator!=(const MPENote &other) const noexcept
bool isValid() const noexcept
bool operator==(const MPENote &other) const noexcept