void Aeolus::play(const Event& event) { int ch = event.channel(); int type = event.type(); int m = _midimap [ch] & 127; // Keyboard and hold bits // printf("Aeolus::play %d %d %d\n", ch, type, m); // int f = (_midimap [ch] >> 12) & 7; // Control enabled if (f & 4) if (type == ME_NOTEON) { int n = event.dataA(); int v = event.dataB(); if (v == 0) { // note off if (n < 36) ; else if (n <= 96) key_off(n - 36, m); } else { // note on if (n < 36) ; else if (n <= 96) key_on(n - 36, m); } } else if (type == ME_CONTROLLER) { int p = event.dataA(); int v = event.dataB(); switch(p) { case MIDICTL_HOLD: case MIDICTL_ASOFF: case MIDICTL_ANOFF: break; case MIDICTL_BANK: break; case MIDICTL_IFELM: // if (!(f & 4)) enable control for all channels // break; if (v & 64) { // Set mode or clear group. _sc_cmode = (v >> 4) & 3; _sc_group = v & 7; if (_sc_cmode == 0) { model->clr_group(_sc_group); } } else if (_sc_cmode) {
void Aeolus::proc_queue (uint32_t k) { int c = k >> 24; int j = (k >> 16) & 255; int i = (k >> 8) & 255; int b = k & 255; switch (c) { case 0: // Single key off. key_off (i, b); break; case 1: // Single key on. key_on (i, b); break; case 2: // Conditional key off. cond_key_off (j, b); break; case 3: // Conditional key on. cond_key_on (j, b); break; case 4: // Clear bits in division mask. _divisp [j]->clr_div_mask (b); break; case 5: // Set bits in division mask. _divisp [j]->set_div_mask (b); break; case 6: // Clear bits in rank mask. _divisp [j]->clr_rank_mask (i, b); break; case 7: // Set bits in rank mask. _divisp [j]->set_rank_mask (i, b); break; case 8: // Hold off. _hold = KEYS_MASK; cond_key_off (HOLD_MASK, HOLD_MASK); break; case 9: // Hold on. _hold = KEYS_MASK | HOLD_MASK; cond_key_on (j, HOLD_MASK); break; case 16: // Tremulant on/off. if (b) _divisp [j]->trem_on (); else _divisp [j]->trem_off (); break; case 17: // Per-division performance controllers. #if 0 if (n < 2) return; //TODO u.i = Q->read (1); //TODO Q->read_commit (2); switch (i) { case 0: _divisp [j]->set_swell (u.f); break; case 1: _divisp [j]->set_tfreq (u.f); break; case 2: _divisp [j]->set_tmodd (u.f); break; break; } #endif break; } }