void Zerberus::process(const MidiEvent& event) { if (busy) return; Channel* cp = _channel[int(event.channel())]; if (cp->instrument() == 0) { // printf("Zerberus::process(): no instrument for channel %d\n", event.channel()); return; } switch(event.type()) { case MidiEventType::NOTEOFF: processNoteOff(cp, event.dataA()); break; case MidiEventType::NOTEON: { int key = event.dataA(); int vel = event.dataB(); if (vel) processNoteOn(cp, key, vel); else processNoteOff(cp, key); } break; case MidiEventType::CONTROLLER: cp->controller(event.dataA(), event.dataB()); break; default: printf("event type 0x%02x\n", event.type()); break; } }
void MidiFile::writeEvent(const MidiEvent& event) { switch(event.type()) { case ME_NOTEON: writeStatus(ME_NOTEON, event.channel()); put(event.pitch()); put(event.velo()); break; case ME_NOTEOFF: writeStatus(ME_NOTEOFF, event.channel()); put(event.pitch()); put(event.velo()); break; case ME_PITCHBEND: writeStatus(ME_PITCHBEND, event.channel()); put(event.dataA()); put(event.dataB()); break; case ME_CONTROLLER: switch(event.controller()) { case CTRL_PROGRAM: writeStatus(ME_PROGRAM, event.channel()); put(event.value() & 0x7f); break; case CTRL_PRESS: writeStatus(ME_AFTERTOUCH, event.channel()); put(event.value() & 0x7f); break; default: writeStatus(ME_CONTROLLER, event.channel()); put(event.controller()); put(event.value() & 0x7f); break; } break; case ME_META: put(ME_META); put(event.metaType()); putvl(event.len()); write(event.edata(), event.len()); resetRunningStatus(); // really ?! break; case ME_SYSEX: put(ME_SYSEX); putvl(event.len() + 1); // including 0xf7 write(event.edata(), event.len()); put(ME_ENDSYSEX); resetRunningStatus(); break; } }