Exemplo n.º 1
0
void Zerberus::trigger(Channel* channel, int key, int velo, Trigger trigger)
      {
      ZInstrument* i = channel->instrument();
      for (Zone* z : i->zones()) {
            if (z->match(channel, key, velo, trigger)) {
                  if (freeVoices.empty()) {
                        qDebug("Zerberus: out of voices...");
                        return;
                        }
                  Voice* voice = freeVoices.pop();
                  if (!voice->isOff())
                        abort();
                  voice->start(channel, key, velo, z);
                  if (trigger == Trigger::RELEASE)
                        voice->stop();    // start voice in stop mode
                  voice->setNext(activeVoices);
                  activeVoices = voice;

                  //
                  // handle offBy voices
                  //
                  if (z->group) {
                        for (Voice* v = activeVoices; v; v = v->next()) {
                              if (v->offBy() == z->group) {
                                    if (v->offMode() == OffMode::FAST)
                                          v->stop(1);
                                    else
                                          v->stop();
                                    }
                              }
                        }
                  }
            }
      }