A question of balance

There are three sound quality issues with all the audio CDs in my music collection.

  1. There is always a timing offset between the left and right channels, that varies from CD to CD.

  2. The amount of group delay always differs between the left and right channels, and the amount of difference varies from CD to CD.

  3. When there is a difference in balance between the left and right channels, the quieter channel may sound louder if it is the channel that arrives sooner.

For the past six years, I have been using the PHA-979 from Voxengo to address these three issues. From left to right, my most-used controls are:

  • Separate delay lines for the left and right channels
  • Separate all-pass filters for the left and right channels
  • The pan/balance control

I would prefer to have the delay lines and the pan control adjacent to each other, because of their psycho-acoustic relationship. The PHA-979 includes a 32-band correlometer which provides useful feedback about the timing between the left and right channels. I would like to develop a component that analyzes the amount of correlation for the user of the application and presents the data with 1-3 meters instead of 32.

With the PHA-979, each channel’s control for the all-pass filter consists of a single dial. Rotating the dial counter-clockwise from center provides up to 90 degrees of inductive phase shift. Rotating the dial clockwise from center provides up to 90 degrees of capacitive phase shift.

For years, I have wanted to work with all-pass filters that have an adjustable center frequency, and with the current version of JUCE this is finally a reality. I want to experiment with chaining all-pass filters, using instances of IIRFilterAudioSource, but as a newbie to JUCE and C++, I don’t know how to do this yet.

Can anyone recommend cookbook examples of how to chain instances of
IIRFilterAudioSource?