Покаяние
Каюсь... Временно променял писанину про Козла и Примуса на С++ писанину миди-синтезатора вокала:
:-) Цитата из нового романа:============================================================================
void MIDITrackPreview::PresetTrackElementsFromMIDISequence(){ int EventsNum = TrackMIDISequence->getNumEvents(); int note = 0; lowNoteKey = 127; highNoteKey = 0; uint8 vel = 0; uint8 minVel = 127; uint8 maxVel = 0; double noteStart, noteEnd; MidiMessage msg; MidiMessageSequence::MidiEventHolder* mh; //Extract for draw: int indexNoteUp = -1; for (int i = 0; i < EventsNum; ++i) { mh = TrackMIDISequence->getEventPointer(i); msg = mh->message; if (msg.isTrackNameEvent()) { TrackName = msg.getTextFromTextMetaEvent(); } else if (msg.isNoteOn()) { mNote* newNote = new mNote(); MIDICh = msg.getChannel(); newNote->midiChannel = MIDICh; note = msg.getNoteNumber(); noteStart = msg.getTimeStamp(); indexNoteUp = TrackMIDISequence->getIndexOfMatchingKeyUp(i); if (indexNoteUp > -1) { //arrNotesStart.add(noteStart); newNote->noteStart = noteStart; //arrNotesKeys.add(note); newNote->nKey = note; lowNoteKey = jmin(note, lowNoteKey); highNoteKey = jmax(note, highNoteKey); vel = msg.getVelocity(); //arrVelocity.add(vel); newNote->nVelocity = vel; minVel = jmin(vel, minVel); maxVel = jmax(vel, maxVel); mh = TrackMIDISequence->getEventPointer(indexNoteUp); msg = mh->message; noteEnd = msg.getTimeStamp(); newNote->noteEnd = noteEnd; //arrNotesEnd.add(noteEnd); arrMidiNotes.add(newNote); } newNote = nullptr; } } String notesNames = "(" + msg.getMidiNoteName(lowNoteKey, true, true, 5) + "..." + msg.getMidiNoteName(highNoteKey, true, true, 5) + ")"; //4 = octave number for middle C TrackInfo = "VOCAL TRACK::" + String(MIDITrackNum + 1) + ": " + TrackName + " Notes: " + String(arrMidiNotes.size()) //arrNotesStart.size() + " KeyRange: " + String(highNoteKey - lowNoteKey) + notesNames +" TPQ: " + String(TicksPerQuarter);