inline void ay::ayStep(short &s0, short &s1, short &s2) { s0 = s1 = s2 = 0; while(ay_tacts_counter < ay_tacts) { ay_tacts_counter += TACTS_MULT; if(++chnl_period0 >= tone_period_init0) { chnl_period0 -= tone_period_init0; chnl_trigger0 ^= 1; } if(++chnl_period1 >= tone_period_init1) { chnl_period1 -= tone_period_init1; chnl_trigger1 ^= 1; } if(++chnl_period2 >= tone_period_init2) { chnl_period2 -= tone_period_init2; chnl_trigger2 ^= 1; } if(++noise_period >= noise_period_init) { noise_period = 0; if((noise_reg + 1) & 2) noise_trigger ^= 1; if(noise_reg & 1) noise_reg ^= 0x24000; noise_reg >>= 1; } updateEnvelope(); }
void OperatorWidget::setContent(const OpaOperatorParams * params, bool send) { QString text; opa.setEnable(false); setFlags(params->flags); ui->volumeSlide->setValue(params->volume); on_volumeSlide_valueChanged(params->volume); int coarse = (params->flags & OPA_OP_ABSOLUTE) ? ((int8_t) params->coarse) + 128 : params->coarse; ui->coarseDial->setValue(coarse); on_coarseDial_valueChanged(coarse); ui->fineDial->setValue(params->fine); on_fineDial_valueChanged(params->fine); ui->LFOSpeedDial->setValue(params->LFOSpeed); ui->LFOAmountDial->setValue(params->LFOAmount); ui->feedbackDial->setValue(params->feedback); ui->attackDial->setValue(params->envAttack); ui->decayDial->setValue(params->envDecay); ui->sustainDial->setValue(params->envSusLevel); ui->initDial ->setValue(params->envIniLevel); ui->releaseDial->setValue(params->envRelease); updateEnvelope(); opa.setEnable(true); if (send) { opa.programParamWrite(programIndex, getParamIndex(OPA_OP_VOLUME), params->volume); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_COARSE), params->coarse); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_FINE), params->fine); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_LFOSPEED), params->LFOSpeed); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_LFOAMOUNT), params->LFOAmount); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_FEEDBACK), params->feedback); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVATTACK), params->envAttack); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVDECAY), params->envDecay); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVSUSTAIN_LEVEL), params->envSusLevel); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVINIT_LEVEL), params->envIniLevel); opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVRELEASE), params->envRelease); writeFlags(); } }
void SoundGenerator::run() { static int nextCC = 0; m_clockCount++; // every 16 clock cycles => 62,5 kHz if ((m_clockCount & 0x0f) == 0) { updateEnvelope(); updateNoise(); updateChannel(m_channelA, m_mixerA); updateChannel(m_channelB, m_mixerB); updateChannel(m_channelC, m_mixerC); *m_bufferPtr++ = (m_channelC.mixValue & 0xff) - 128; m_bufferPos += 1; if (m_bufferPos >= m_audioBuffer.length()) { m_bufferPtr = reinterpret_cast<qint8 *>(m_audioBuffer.data()); m_bufferPos = 0; } *m_bufferPtr++ = (m_channelA.mixValue & 0xff) - 128; m_bufferPos += 1; if (m_bufferPos >= m_audioBuffer.length()) { m_bufferPtr = reinterpret_cast<qint8 *>(m_audioBuffer.data()); m_bufferPos = 0; } m_channelA.mixValue = 0; m_channelB.mixValue = 0; m_channelC.mixValue = 0; } }
void OperatorWidget::on_releaseDial_valueChanged(int value) { opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVRELEASE), value); updateEnvelope(); }
void OperatorWidget::on_initDial_valueChanged(int value) { opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVINIT_LEVEL), value); updateEnvelope(); }
void OperatorWidget::on_sustainDial_valueChanged(int value) { opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVSUSTAIN_LEVEL), value); updateEnvelope(); }
void OperatorWidget::on_decayDial_valueChanged(int value) { opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVDECAY), value); updateEnvelope(); }
void OperatorWidget::on_attackDial_valueChanged(int value) { opa.programParamWrite(programIndex, getParamIndex(OPA_OP_ENVATTACK), value); updateEnvelope(); }