void SampleChannel::clear() { /** TODO - these memsets can be done only if status PLAY (if below), * but it would require extra clearPChan calls when samples stop */ memset(vChan, 0, sizeof(float) * bufferSize); memset(pChan, 0, sizeof(float) * bufferSize); if (status & (STATUS_PLAY | STATUS_ENDING)) { tracker = fillChan(vChan, tracker, 0); if (fadeoutOn && fadeoutType == XFADE) { gLog("[clear] filling pChan fadeoutTracker=%d\n", fadeoutTracker); fadeoutTracker = fillChan(pChan, fadeoutTracker, 0); } } }
void SampleChannel::quantize(int index, int localFrame, int globalFrame) { /* skip if LOOP_ANY or not in quantizer-wait mode */ if ((mode & LOOP_ANY) || !qWait) return; /* no fadeout if the sample starts for the first time (from a * STATUS_OFF), it would be meaningless. */ if (status == STATUS_OFF) { status = STATUS_PLAY; sendMidiLplay(); qWait = false; tracker = fillChan(vChan, tracker, localFrame); /// FIXME: ??? } else //setXFade(localFrame); reset(localFrame); /* this is the moment in which we record the keypress, if the * quantizer is on. SINGLE_PRESS needs overdub */ if (recorder::canRec(this)) { if (mode == SINGLE_PRESS) recorder::startOverdub(index, ACTION_KEYS, globalFrame); else recorder::rec(index, ACTION_KEYPRESS, globalFrame); } }
void SampleChannel::reset(int frame) { //fadeoutTracker = tracker; // store old frame number for xfade tracker = begin; mute_i = false; if (frame > 0 && status & (STATUS_PLAY | STATUS_ENDING)) tracker = fillChan(vChan, tracker, frame); }
void SampleChannel::start(int frame, bool doQuantize) { switch (status) { case STATUS_EMPTY: case STATUS_MISSING: case STATUS_WRONG: { return; } case STATUS_OFF: { if (mode & LOOP_ANY) { status = STATUS_WAIT; } else { if (G_Mixer.quantize > 0 && G_Mixer.running && doQuantize) qWait = true; else { status = STATUS_PLAY; tracker = fillChan(vChan, tracker, frame); /// FIXME - check if frame == 0, possible duplicated fillChan call } } break; } case STATUS_PLAY: { if (mode == SINGLE_BASIC) setFadeOut(DO_STOP); else if (mode == SINGLE_RETRIG) { if (G_Mixer.quantize > 0 && G_Mixer.running && doQuantize) qWait = true; else //mute ? reset(frame) : setXFade(frame); // do xfade only if not muted in order to avoid clicks reset(frame); } else if (mode & (LOOP_ANY | SINGLE_ENDLESS)) status = STATUS_ENDING; break; } case STATUS_WAIT: { status = STATUS_OFF; break; } case STATUS_ENDING: { status = STATUS_PLAY; break; } } }
void SampleChannel::setXFade(int frame) { gLog("[xFade] frame=%d tracker=%d\n", frame, tracker); calcFadeoutStep(); fadeoutOn = true; fadeoutVol = 1.0f; fadeoutType = XFADE; fadeoutTracker = fillChan(pChan, tracker, 0, false); reset(frame); }
void SampleChannel::onBar(int frame) { ///if (mode == LOOP_REPEAT && status == STATUS_PLAY) /// //setXFade(frame); /// reset(frame); if (mode == LOOP_REPEAT) { if (status == STATUS_PLAY) //setXFade(frame); reset(frame); } else if (mode == LOOP_ONCE_BAR) { if (status == STATUS_WAIT) { status = STATUS_PLAY; tracker = fillChan(vChan, tracker, frame); } } }
void SampleChannel::onZero(int frame) { if (wave == NULL) return; if (mode & LOOP_ANY) { /* do a crossfade if the sample is playing. Regular chanReset * instead if it's muted, otherwise a click occurs */ if (status == STATUS_PLAY) { /* if (mute || mute_i) reset(frame); else setXFade(frame); */ reset(frame); } else if (status == STATUS_ENDING) hardStop(frame); } if (status == STATUS_WAIT) { /// FIXME - should be inside previous if! status = STATUS_PLAY; sendMidiLplay(); tracker = fillChan(vChan, tracker, frame); } if (recStatus == REC_ENDING) { recStatus = REC_STOPPED; setReadActions(false); // rec stop } else if (recStatus == REC_WAITING) { recStatus = REC_READING; setReadActions(true); // rec start } }
void SampleChannel::start(int frame, bool doQuantize) { switch (status) { case STATUS_EMPTY: case STATUS_MISSING: case STATUS_WRONG: { return; } case STATUS_OFF: { if (mode & LOOP_ANY) { status = STATUS_WAIT; sendMidiLplay(); } else { if (G_Mixer.quantize > 0 && G_Mixer.running && doQuantize) qWait = true; else { /* fillChan only if frame != 0. If you call fillChan on frame == 0 * a duplicate call to fillChan occurs with loss of data. */ status = STATUS_PLAY; sendMidiLplay(); if (frame != 0) tracker = fillChan(vChan, tracker, frame); } } break; } case STATUS_PLAY: { if (mode == SINGLE_BASIC) setFadeOut(DO_STOP); else if (mode == SINGLE_RETRIG) { if (G_Mixer.quantize > 0 && G_Mixer.running && doQuantize) qWait = true; else reset(frame); } else if (mode & (LOOP_ANY | SINGLE_ENDLESS)) { status = STATUS_ENDING; sendMidiLplay(); } break; } case STATUS_WAIT: { status = STATUS_OFF; sendMidiLplay(); break; } case STATUS_ENDING: { status = STATUS_PLAY; sendMidiLplay(); break; } } }