17 channel(0), data1(0), data2(0), time(0) { }
52 StringArray midiDevs = MidiInput::getDevices();
53 return (
int) midiDevs.size();
59 StringArray midiDevs = MidiInput::getDevices();
60 unsigned len = midiDevs.size();
61 logMsg(
"\n\tMIDI in devices");
62 for (
unsigned i = 0; i < len; i++)
63 logMsg(
" %d = %s", i, midiDevs[i].toUTF8());
64 logMsg(
" Def: %d", MidiInput::getDefaultDeviceIndex());
65 midiDevs = MidiOutput::getDevices();
66 len = midiDevs.size();
67 logMsg(
"\n\tMIDI out devices");
68 for (
unsigned i = 0; i < len; i++)
69 logMsg(
" %d = %s", i, midiDevs[i].toUTF8());
70 logMsg(
" Def: %d", MidiOutput::getDefaultDeviceIndex());
88 open(MidiInput::getDefaultDeviceIndex());
123 #define CCOPY_MSG dest.channel = source.getChannel(); \
124 dest.data1 = source.getNoteNumber(); \
125 dest.data2 = source.getVelocity()
128 unsigned char *
data = source.getRawData();
129 unsigned char cmd = (data[0] & 0xf0) >> 4;
133 if (source.getVelocity() > 0) {
147 dest.
channel = source.getChannel();
148 dest.
data1 = source.getControllerNumber();
149 dest.
data2 = source.getControllerValue();
172 logMsg(
kLogError,
"Unknown MIDI input: stat=%d chan=%d value1=%d value2=%d",
173 cmd, source.getChannel(), source.getNoteNumber(), source.getVelocity());
180 unsigned cmd, voice, pitch = 0, vel;
234 mStartTime = Time::getMillisecondCounter() / 1000.0;
273 int t0 =
mBuffer.getFirstEventTime();
274 MidiBuffer::Iterator it(
mBuffer);
275 it.getNextEvent(*
mJMsg, t0);
294 printf(
"kPolyTouch");
297 printf(
"ControlChange");
300 printf(
"kProgramChange");
303 printf(
"kAftertouch");
306 printf(
"kPitchWheel");
330 MidiOutput::getDevices();
331 StringArray midiDevs = MidiInput::getDevices();
341 mOut = MidiOutput::openDevice (deviceID);
385 mFile.readFrom(*(fil.createInputStream()));
387 mTrak = (MidiMessageSequence *)
mFile.getTrack(0);
391 for (
int i = 0; i <
mNumTrax; i++) {
392 mTrak = (MidiMessageSequence *)
mFile.getTrack(i);
393 logMsg(
" track %d : %d evts", i,
mTrak->getNumEvents());
395 int tix =
mFile.getTimeFormat();
396 MidiMessageSequence tempi;
397 mFile.findAllTempoEvents(tempi);
398 if (tempi.getNumEvents() == 0) {
401 MidiMessageSequence::MidiEventHolder * t1 = tempi.getEventPointer(0);
402 MidiMessage msg = t1->message;
403 double sex = msg.getTempoSecondsPerQuarterNote();
411 String namS(nam.c_str());
421 String namS(abs.c_str());
432 mTrak = (MidiMessageSequence *)
mFile.getTrack(index);
433 mTrak->deleteSysExMessages();
434 mTrak->updateMatchedPairs();
439 unsigned numEvts =
mTrak->getNumEvents();
442 float * pPtr = & pos;
443 logMsg(
"MIDIPlayer playing %d evts %5.2f sec.", numEvts, timX - tim0);
445 while (
mIsOn && (timN < timX)) {
448 MidiMessageSequence::MidiEventHolder * evt
449 =
mTrak->getEventPointer(ind);
450 if ( ! evt)
continue;
451 MidiMessage msg = evt->message;
456 float timD =
mTrak->getTimeOfMatchingKeyUp(ind);
467 logMsg(
"MIDIPlayer empty iv");
471 logMsg(
"MIDIPlayer empty in");
475 if (which == iv.size()) {
508 MidiMessageSequence * tr =
new MidiMessageSequence;
510 tr->addSequence(*
mFile.getTrack(i), 0, 0,
mFile.getLastTimestamp());