void tempopopup::tap () { m_is_typing = false; double bpm = update_bpm(); set_tap_button(m_current_beats); if (m_current_beats > 1) /* first one is useless */ m_adjust_bpm->set_value(double(bpm)); }
static void run(LV2_Handle instance, uint32_t n_samples) { ADelay* adelay = (ADelay*)instance; const float* const input = adelay->input; float* const output = adelay->output; float srate = adelay->srate; uint32_t i; float in; int delaysamples; unsigned int tmp; float inv; float xfade; int recalc; if (*(adelay->inv) < 0.5) { inv = -1.f; } else { inv = 1.f; } recalc = 0; if (*(adelay->inv) != adelay->invertold) { recalc = 1; } if (*(adelay->sync) != adelay->syncold) { recalc = 1; } if (*(adelay->time) != adelay->timeold) { recalc = 1; } if (*(adelay->divisor) != adelay->divisorold) { recalc = 1; } if (*(adelay->lpf) != adelay->lpfold) { lpfRbj(adelay, *(adelay->lpf), srate); } if (*(adelay->gain) != adelay->gainold) { recalc = 1; } if (recalc) { if (*(adelay->sync) > 0.5f && adelay->bpmvalid) { *(adelay->delaytime) = adelay->beatunit * 1000.f * 60.f / (adelay->bpm * *(adelay->divisor)); } else { *(adelay->delaytime) = *(adelay->time); } delaysamples = (int)(*(adelay->delaytime) * srate) / 1000; adelay->tap[adelay->next] = delaysamples; } xfade = 0.f; for (i = 0; i < n_samples; i++) { in = input[i]; adelay->z[adelay->posz] = in; // + feedb / 100. * fbstate; adelay->fbstate = 0.f; int p = adelay->posz - adelay->tap[adelay->active]; // active line if (p<0) p += MAX_DELAY; adelay->fbstate += adelay->z[p]; if (recalc) { xfade += 1.0f / (float)n_samples; adelay->fbstate *= (1.-xfade); int p = adelay->posz - adelay->tap[adelay->next]; // next line if (p<0) p += MAX_DELAY; adelay->fbstate += adelay->z[p] * xfade; } output[i] = from_dB(*(adelay->gain)) * ((100.-*(adelay->wetdry)) / 100. * in + *(adelay->wetdry) / 100. * -inv * runfilter(adelay, adelay->fbstate)); if (++(adelay->posz) >= MAX_DELAY) { adelay->posz = 0; } } adelay->lpfold = *(adelay->lpf); adelay->divisorold = *(adelay->divisor); adelay->gainold = *(adelay->gain); adelay->invertold = *(adelay->inv); adelay->timeold = *(adelay->time); adelay->syncold = *(adelay->sync); adelay->wetdryold = *(adelay->wetdry); adelay->delaytimeold = *(adelay->delaytime); adelay->delaysamplesold = delaysamples; if (recalc) { tmp = adelay->active; adelay->active = adelay->next; adelay->next = tmp; } if (adelay->atombpm) { LV2_Atom_Event* ev = lv2_atom_sequence_begin(&(adelay->atombpm)->body); while(!lv2_atom_sequence_is_end(&(adelay->atombpm)->body, (adelay->atombpm)->atom.size, ev)) { if (ev->body.type == adelay->uris.atom_Blank || ev->body.type == adelay->uris.atom_Object) { const LV2_Atom_Object* obj = (LV2_Atom_Object*)&ev->body; if (obj->body.otype == adelay->uris.time_Position) { update_bpm(adelay, obj); } } ev = lv2_atom_sequence_next(ev); } } }