diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 4a4ce46..d62077d 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -237,6 +237,14 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, float masterVolNorm = (float)(pConfig->GetMasterVolume()) / 127.0f; setMasterVolume(masterVolNorm); + // Setup master volume fade-in (soft start) + m_fadeCurrentVolume = 0.0f; + m_fadeTargetVolume = nMasterVolume; // nMasterVolume is set by setMasterVolume above + m_fadeInActive = true; + m_fadeInFrames = 0; + // 50ms fade-in: total frames = 0.05 * sample rate + m_fadeInTotalFrames = (unsigned)(0.05f * (float)pConfig->GetSampleRate()); + // BEGIN setup tg_mixer tg_mixer = new AudioStereoMixer(pConfig->GetChunkSize()/2); // END setup tgmixer @@ -1340,6 +1348,21 @@ void CMiniDexed::ProcessSound (void) // Audio signal path after tone generators starts here // + // Fade-in logic (soft start) + float32_t fadeVolume = nMasterVolume; + if (m_fadeInActive) { + if (m_fadeInFrames < m_fadeInTotalFrames) { + float progress = (float)m_fadeInFrames / (float)m_fadeInTotalFrames; + m_fadeCurrentVolume = m_fadeTargetVolume * progress; + fadeVolume = m_fadeCurrentVolume; + m_fadeInFrames += nFrames; + } else { + m_fadeCurrentVolume = m_fadeTargetVolume; + fadeVolume = m_fadeCurrentVolume; + m_fadeInActive = false; + } + } + if (m_bQuadDAC8Chan) { // This is only supported when there are 8 TGs assert (m_nToneGenerators == 8); @@ -1350,7 +1373,7 @@ void CMiniDexed::ProcessSound (void) float32_t tmp_float[nFrames*Channels]; int32_t tmp_int[nFrames*Channels]; - if(nMasterVolume > 0.0) + if(fadeVolume > 0.0) { // Convert dual float array (8 chan) to single int16 array (8 chan) for(uint16_t i=0; i0.0 && nMasterVolume <1.0) + if(fadeVolume >0.0 && fadeVolume <1.0) { - tmp_float[(i*Channels)+tg]=m_OutputLevel[tg][i] * nMasterVolume; + tmp_float[(i*Channels)+tg]=m_OutputLevel[tg][i] * fadeVolume; } - else if(nMasterVolume == 1.0) + else if(fadeVolume == 1.0) { tmp_float[(i*Channels)+tg]=m_OutputLevel[tg][i]; } @@ -1400,7 +1423,7 @@ void CMiniDexed::ProcessSound (void) float32_t tmp_float[nFrames*2]; int32_t tmp_int[nFrames*2]; - if(nMasterVolume > 0.0) + if(fadeVolume > 0.0) { for (uint8_t i = 0; i < m_nToneGenerators; i++) { @@ -1453,12 +1476,12 @@ void CMiniDexed::ProcessSound (void) // Convert dual float array (left, right) to single int16 array (left/right) for(uint16_t i=0; i0.0 && nMasterVolume <1.0) + if(fadeVolume >0.0 && fadeVolume <1.0) { - tmp_float[i*2]=SampleBuffer[indexL][i] * nMasterVolume; - tmp_float[(i*2)+1]=SampleBuffer[indexR][i] * nMasterVolume; + tmp_float[i*2]=SampleBuffer[indexL][i] * fadeVolume; + tmp_float[(i*2)+1]=SampleBuffer[indexR][i] * fadeVolume; } - else if(nMasterVolume == 1.0) + else if(fadeVolume == 1.0) { tmp_float[i*2]=SampleBuffer[indexL][i]; tmp_float[(i*2)+1]=SampleBuffer[indexR][i]; @@ -1886,6 +1909,10 @@ void CMiniDexed::setMasterVolume(float32_t vol) vol = powf(vol, 2.0f); nMasterVolume = vol; + // If called during fade-in, update target + if (m_fadeInActive) { + m_fadeTargetVolume = nMasterVolume; + } } std::string CMiniDexed::GetPerformanceFileName(unsigned nID) diff --git a/src/minidexed.h b/src/minidexed.h index 1658482..0df86b4 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -311,6 +311,13 @@ private: float32_t nMasterVolume; + // Soft start (fade-in) for master volume + float32_t m_fadeCurrentVolume = 0.0f; + float32_t m_fadeTargetVolume = 1.0f; + bool m_fadeInActive = false; + unsigned m_fadeInFrames = 0; + unsigned m_fadeInTotalFrames = 0; + CUserInterface m_UI; CSysExFileLoader m_SysExFileLoader; CPerformanceConfig m_PerformanceConfig;