Master volume fade-in (soft start)

pull/909/head
probonopd 1 week ago
parent 284ba96c87
commit f13f223dbe
  1. 45
      src/minidexed.cpp
  2. 7
      src/minidexed.h

@ -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<CConfig::AllToneGenerators>(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; i<nFrames;i++)
@ -1360,11 +1383,11 @@ void CMiniDexed::ProcessSound (void)
// no additional processing.
for (uint8_t tg = 0; tg < Channels; tg++)
{
if(nMasterVolume >0.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; i<nFrames;i++)
{
if(nMasterVolume >0.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)

@ -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;

Loading…
Cancel
Save