Example #1
0
bool MidiAlsaDevice::putMidiEvent(const MidiPlayEvent& e)
{
    if (midiOutputTrace)
    {
        printf("MidiOut: midiAlsa: ");
        e.dump();
    }
    int chn = e.channel();
    int a = e.dataA();
    int b = e.dataB();

    snd_seq_event_t event;
    memset(&event, 0, sizeof (event));
    event.queue = SND_SEQ_QUEUE_DIRECT;
    event.source = losPort;
    event.dest = adr;

    switch (e.type())
    {
        case ME_NOTEON:
            snd_seq_ev_set_noteon(&event, chn, a, b);
            break;
        case ME_NOTEOFF:
            snd_seq_ev_set_noteoff(&event, chn, a, 0);
            break;
        case ME_PROGRAM:
            snd_seq_ev_set_pgmchange(&event, chn, a);
            break;
        case ME_CONTROLLER:
#if 1
            snd_seq_ev_set_controller(&event, chn, a, b);
#else
        {
            int a = e.dataA();
            int b = e.dataB();
            int chn = e.channel();
            if (a < CTRL_14_OFFSET)
            { // 7 Bit Controller
                snd_seq_ev_set_controller(&event, chn, a, b);
            }
            else if (a < CTRL_RPN_OFFSET)
            { // 14 bit high resolution controller
                int ctrlH = (a >> 8) & 0x7f;
                int ctrlL = a & 0x7f;
                a = (ctrlH << 7) + ctrlL;
                snd_seq_ev_set_controller(&event, chn, a, b);
                event.type = SND_SEQ_EVENT_CONTROL14;
            }
            else if (a < CTRL_NRPN_OFFSET)
            { // RPN 7-Bit Controller
                int ctrlH = (a >> 8) & 0x7f;
                int ctrlL = a & 0x7f;
                a = (ctrlH << 7) + ctrlL;
                b <<= 7;
                snd_seq_ev_set_controller(&event, chn, a, b);
                event.type = SND_SEQ_EVENT_REGPARAM;
            }
Example #2
0
bool VstSynthIF::putEvent(const MidiPlayEvent& ev)
      {
      if (midiOutputTrace)
            ev.dump();
      AEffect* plugin = _fst->plugin;
      static struct VstEvents events;
      static struct VstMidiEvent event;
      events.numEvents = 1;
      events.reserved  = 0;
      events.events[0] = (VstEvent*)(&event);

      event.type         = kVstMidiType;
      event.byteSize     = 24;
      event.deltaFrames  = 0;
      event.flags        = 0;
      event.detune       = 0;
      event.noteLength   = 0;
      event.noteOffset   = 0;
      event.reserved1    = 0;
      event.reserved2    = 0;
      event.noteOffVelocity = 0;
      switch (ev.type()) {
            case ME_PITCHBEND:
                  {
                  int a = ev.dataA() + 8192;
                  int b = a >> 7;
                  event.midiData[0]  = (ev.type() | ev.channel()) & 0xff;
                  event.midiData[1]  = a & 0x7f;
                  event.midiData[2]  = b & 0x7f;
                  event.midiData[3]  = 0;
                  }
                  break;

            case ME_CONTROLLER:
            case ME_NOTEON:
            default:
                  event.midiData[0]  = (ev.type() | ev.channel()) & 0xff;
                  event.midiData[1]  = ev.dataA() & 0xff;
                  event.midiData[2]  = ev.dataB() & 0xff;
                  event.midiData[3]  = 0;
                  break;
            }
      int rv = plugin->dispatcher(plugin, effProcessEvents, 0, 0, &events, 0.0f);
      return false;
      }