public bool ReadFFP(string filePath) { BinaryFile binFile = new BinaryFile(filePath, BinaryFile.ByteOrder.LittleEndian); string header = binFile.ReadString(4); if (header != "FQ2p") { return(false); } Version = binFile.ReadInt32(); ParameterCount = binFile.ReadInt32(); Bands = new List <ProQ2Band>(); for (int i = 0; i < 24; i++) { var band = new ProQ2Band(); // 1 = Enabled, 2 = Disabled band.Enabled = binFile.ReadSingle() == 1 ? true : false; band.Frequency = FreqConvertBack(binFile.ReadSingle()); band.Gain = binFile.ReadSingle(); // actual gain in dB band.Q = QConvertBack(binFile.ReadSingle()); // 0 - 7 var filterType = binFile.ReadSingle(); switch (filterType) { case (float)ProQ2Shape.Bell: band.Shape = ProQ2Shape.Bell; break; case (float)ProQ2Shape.LowShelf: band.Shape = ProQ2Shape.LowShelf; break; case (float)ProQ2Shape.LowCut: band.Shape = ProQ2Shape.LowCut; break; case (float)ProQ2Shape.HighShelf: band.Shape = ProQ2Shape.HighShelf; break; case (float)ProQ2Shape.HighCut: band.Shape = ProQ2Shape.HighCut; break; case (float)ProQ2Shape.Notch: band.Shape = ProQ2Shape.Notch; break; case (float)ProQ2Shape.BandPass: band.Shape = ProQ2Shape.BandPass; break; case (float)ProQ2Shape.TiltShelf: band.Shape = ProQ2Shape.TiltShelf; break; default: throw new ArgumentOutOfRangeException(string.Format("Filter type is outside range: {0}", filterType)); } // 0 - 8 var filterSlope = binFile.ReadSingle(); switch (filterSlope) { case (float)ProQSlope.Slope6dB_oct: band.Slope = ProQSlope.Slope6dB_oct; break; case (float)ProQSlope.Slope12dB_oct: band.Slope = ProQSlope.Slope12dB_oct; break; case (float)ProQSlope.Slope18dB_oct: band.Slope = ProQSlope.Slope18dB_oct; break; case (float)ProQSlope.Slope24dB_oct: band.Slope = ProQSlope.Slope24dB_oct; break; case (float)ProQSlope.Slope30dB_oct: band.Slope = ProQSlope.Slope30dB_oct; break; case (float)ProQSlope.Slope36dB_oct: band.Slope = ProQSlope.Slope36dB_oct; break; case (float)ProQSlope.Slope48dB_oct: band.Slope = ProQSlope.Slope48dB_oct; break; case (float)ProQSlope.Slope72dB_oct: band.Slope = ProQSlope.Slope72dB_oct; break; case (float)ProQSlope.Slope96dB_oct: band.Slope = ProQSlope.Slope96dB_oct; break; default: throw new ArgumentOutOfRangeException(string.Format("Filter slope is outside range: {0}", filterSlope)); } // 0 = Left, 1 = Right, 2 = Stereo var filterStereoPlacement = binFile.ReadSingle(); switch (filterStereoPlacement) { case (float)ProQ2StereoPlacement.LeftOrMid: band.StereoPlacement = ProQ2StereoPlacement.LeftOrMid; break; case (float)ProQ2StereoPlacement.RightOrSide: band.StereoPlacement = ProQ2StereoPlacement.RightOrSide; break; case (float)ProQ2StereoPlacement.Stereo: band.StereoPlacement = ProQ2StereoPlacement.Stereo; break; default: throw new ArgumentOutOfRangeException(string.Format("Filter stereo placement is outside range: {0}", filterStereoPlacement)); } Bands.Add(band); } // read the remaining floats // int remainingParameterCount = ParameterCount - 7 * Bands.Count; try { ProcessingMode = binFile.ReadSingle(); // Zero Latency: 0.0, Natural Phase: 1.0, Linear Phase: 2.0 ProcessingResolution = binFile.ReadSingle(); // 0 - 4, Medium ChannelMode = binFile.ReadSingle(); // 0 = Left/Right, 1 = Mid/Side GainScale = binFile.ReadSingle(); // 100% OutputLevel = binFile.ReadSingle(); // 0.0 dB, -1 to 1 (- Infinity to +36 dB , 0 = 0 dB) OutputPan = binFile.ReadSingle(); // Left 0 dB, Right: 0 dB, -1 to 1 (0 = middle) ByPass = binFile.ReadSingle(); // Not Bypassed OutputInvertPhase = binFile.ReadSingle(); // Normal AutoGain = binFile.ReadSingle(); // Off AnalyzerShowPreProcessing = binFile.ReadSingle(); // Disabled - 0: Off, 1: On AnalyzerShowPostProcessing = binFile.ReadSingle(); // Disabled - 0: Off, 1: On AnalyzerShowSidechain = binFile.ReadSingle(); // Disabled - 0: Off, 1: On AnalyzerRange = binFile.ReadSingle(); // Analyzer Range in dB. 0.0: 60dB, 1.0: 90dB, 2.0: 120dB AnalyzerResolution = binFile.ReadSingle(); // Analyzer Resolution. 0.0: Low, 1.0: Medium, 2.0: High, 3.00: Maximum AnalyzerSpeed = binFile.ReadSingle(); // Analyzer Speed. 0.0: Very Slow, 1.0: Slow, 2.0: Medium, 3.0 Fast, 4.0: Very Fast AnalyzerTilt = binFile.ReadSingle(); // Analyzer Tilt in dB/oct. 0.0: 0.0, 1.0: 1.5, 2.0: 3.0, 3.0: 4.5, 4.0: 6.0 AnalyzerFreeze = binFile.ReadSingle(); // 0: Off, 1: On SpectrumGrab = binFile.ReadSingle(); // Enabled DisplayRange = binFile.ReadSingle(); // 12dB ReceiveMidi = binFile.ReadSingle(); // Enabled SoloBand = binFile.ReadSingle(); // -1 SoloGain = binFile.ReadSingle(); // 0.00 } catch { } // check if mid/side if (ChannelMode == 1) { Bands.ForEach(b => b.ChannelMode = ProQ2ChannelMode.MidSide); } binFile.Close(); return(true); }
/// <summary> /// Initialize the class specific variables using float parameters /// </summary> public void InitFromParameters(float[] floatParameters, bool isIEEE = true) { this.Bands = new List <ProQ2Band>(); float[] floatArray; if (isIEEE) { // convert the ieee float parameters to fabfilter floats floatArray = Convert2FabfilterProQ2Floats(floatParameters); } else { floatArray = floatParameters; } int index = 0; for (int i = 0; i < 24; i++) { var band = new ProQ2Band(); // 1 = Enabled, 2 = Disabled band.Enabled = floatArray[index++] == 1 ? true : false; band.Frequency = FabfilterProQ2.FreqConvertBack(floatArray[index++]); band.Gain = floatArray[index++]; // actual gain in dB band.Q = FabfilterProQ2.QConvertBack(floatArray[index++]); // 0 - 7 var filterType = floatArray[index++]; switch (filterType) { case (float)ProQ2Shape.Bell: band.Shape = ProQ2Shape.Bell; break; case (float)ProQ2Shape.LowShelf: band.Shape = ProQ2Shape.LowShelf; break; case (float)ProQ2Shape.LowCut: band.Shape = ProQ2Shape.LowCut; break; case (float)ProQ2Shape.HighShelf: band.Shape = ProQ2Shape.HighShelf; break; case (float)ProQ2Shape.HighCut: band.Shape = ProQ2Shape.HighCut; break; case (float)ProQ2Shape.Notch: band.Shape = ProQ2Shape.Notch; break; case (float)ProQ2Shape.BandPass: band.Shape = ProQ2Shape.BandPass; break; case (float)ProQ2Shape.TiltShelf: band.Shape = ProQ2Shape.TiltShelf; break; default: throw new ArgumentOutOfRangeException(string.Format("Filter type is outside range: {0}", filterType)); } // 0 - 8 var filterSlope = floatArray[index++]; switch (filterSlope) { case (float)ProQSlope.Slope6dB_oct: band.Slope = ProQSlope.Slope6dB_oct; break; case (float)ProQSlope.Slope12dB_oct: band.Slope = ProQSlope.Slope12dB_oct; break; case (float)ProQSlope.Slope18dB_oct: band.Slope = ProQSlope.Slope18dB_oct; break; case (float)ProQSlope.Slope24dB_oct: band.Slope = ProQSlope.Slope24dB_oct; break; case (float)ProQSlope.Slope30dB_oct: band.Slope = ProQSlope.Slope30dB_oct; break; case (float)ProQSlope.Slope36dB_oct: band.Slope = ProQSlope.Slope36dB_oct; break; case (float)ProQSlope.Slope48dB_oct: band.Slope = ProQSlope.Slope48dB_oct; break; case (float)ProQSlope.Slope72dB_oct: band.Slope = ProQSlope.Slope72dB_oct; break; case (float)ProQSlope.Slope96dB_oct: band.Slope = ProQSlope.Slope96dB_oct; break; default: throw new ArgumentOutOfRangeException(string.Format("Filter slope is outside range: {0}", filterSlope)); } // 0 = Left, 1 = Right, 2 = Stereo var filterStereoPlacement = floatArray[index++]; switch (filterStereoPlacement) { case (float)ProQ2StereoPlacement.LeftOrMid: band.StereoPlacement = ProQ2StereoPlacement.LeftOrMid; break; case (float)ProQ2StereoPlacement.RightOrSide: band.StereoPlacement = ProQ2StereoPlacement.RightOrSide; break; case (float)ProQ2StereoPlacement.Stereo: band.StereoPlacement = ProQ2StereoPlacement.Stereo; break; default: throw new ArgumentOutOfRangeException(string.Format("Filter stereo placement is outside range: {0}", filterStereoPlacement)); } this.Bands.Add(band); } // read the remaining floats try { this.ProcessingMode = floatArray[index++]; // Zero Latency: 0.0, Natural Phase: 1.0, Linear Phase: 2.0 this.ProcessingResolution = floatArray[index++]; // 0 - 4, Medium this.ChannelMode = floatArray[index++]; // 0 = Left/Right, 1 = Mid/Side this.GainScale = floatArray[index++]; // 100% this.OutputLevel = floatArray[index++]; // 0.0 dB, -1 to 1 (- Infinity to +36 dB , 0 = 0 dB) this.OutputPan = floatArray[index++]; // Left 0 dB, Right: 0 dB, -1 to 1 (0 = middle) this.ByPass = floatArray[index++]; // Not Bypassed this.OutputInvertPhase = floatArray[index++]; // Normal this.AutoGain = floatArray[index++]; // Off this.AnalyzerShowPreProcessing = floatArray[index++]; // Disabled - 0: Off, 1: On this.AnalyzerShowPostProcessing = floatArray[index++]; // Disabled - 0: Off, 1: On this.AnalyzerShowSidechain = floatArray[index++]; // Disabled - 0: Off, 1: On this.AnalyzerRange = floatArray[index++]; // Analyzer Range in dB. 0.0: 60dB, 1.0: 90dB, 2.0: 120dB this.AnalyzerResolution = floatArray[index++]; // Analyzer Resolution. 0.0: Low, 1.0: Medium, 2.0: High, 3.00: Maximum this.AnalyzerSpeed = floatArray[index++]; // Analyzer Speed. 0.0: Very Slow, 1.0: Slow, 2.0: Medium, 3.0 Fast, 4.0: Very Fast this.AnalyzerTilt = floatArray[index++]; // Analyzer Tilt in dB/oct. 0.0: 0.0, 1.0: 1.5, 2.0: 3.0, 3.0: 4.5, 4.0: 6.0 this.AnalyzerFreeze = floatArray[index++]; // 0: Off, 1: On this.SpectrumGrab = floatArray[index++]; // Enabled this.DisplayRange = floatArray[index++]; // 12dB this.ReceiveMidi = floatArray[index++]; // Enabled this.SoloBand = floatArray[index++]; // -1, -1 to 1 this.SoloGain = floatArray[index++]; // 0.00, -1 to 1 } catch { } // check if mid/side if (this.ChannelMode == 1) { this.Bands.ForEach(b => b.ChannelMode = ProQ2ChannelMode.MidSide); } }
private static void SetBand(ProQ2Band band, int bandNumber, SteinbergFrequency frequency) { if (band != null) { frequency.Parameters[String.Format("equalizerAbandon{0}", bandNumber)].Number = band.Enabled ? 1.00 : 0.00; string channel = ""; // empty for main channel (channel 1). 'Ch2' for secondary channel // due to the way fabfilter have only one stereo placement per band (frequency has two) we need to modify both channels in frequency // we could have in theory instead updated both channels per band in frequency if (band.StereoPlacement != ProQ2StereoPlacement.Stereo) { switch (band.StereoPlacement) { case ProQ2StereoPlacement.LeftOrMid: frequency.Parameters[String.Format("equalizerAon{0}", bandNumber)].Number = 1.0; frequency.Parameters[String.Format("equalizerAon{0}Ch2", bandNumber)].Number = 0.0; if (band.ChannelMode == ProQ2ChannelMode.LeftRight) { frequency.Parameters[String.Format("equalizerAeditchannel{0}", bandNumber)].Number = SteinbergFrequency.ChannelMode.LeftRightModeLeft; } else { frequency.Parameters[String.Format("equalizerAeditchannel{0}", bandNumber)].Number = SteinbergFrequency.ChannelMode.MidSideModeMid; } break; case ProQ2StereoPlacement.RightOrSide: frequency.Parameters[String.Format("equalizerAon{0}", bandNumber)].Number = 0.0; frequency.Parameters[String.Format("equalizerAon{0}Ch2", bandNumber)].Number = 1.0; channel = "Ch2"; if (band.ChannelMode == ProQ2ChannelMode.LeftRight) { frequency.Parameters[String.Format("equalizerAeditchannel{0}", bandNumber)].Number = SteinbergFrequency.ChannelMode.LeftRightModeRight; } else { frequency.Parameters[String.Format("equalizerAeditchannel{0}", bandNumber)].Number = SteinbergFrequency.ChannelMode.MidSideModeSide; } break; case ProQ2StereoPlacement.Stereo: // don't change - this is the default break; } } frequency.Parameters[String.Format("equalizerAgain{0}{1}", bandNumber, channel)].Number = band.Gain; frequency.Parameters[String.Format("equalizerAfreq{0}{1}", bandNumber, channel)].Number = band.Frequency; frequency.Parameters[String.Format("equalizerAq{0}{1}", bandNumber, channel)].Number = band.Q; switch (band.Shape) { case ProQ2Shape.BandPass: case ProQ2Shape.TiltShelf: case ProQ2Shape.Bell: if (bandNumber == 1 || bandNumber == 8) { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Peak; } else { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode2To7.Peak; } break; case ProQ2Shape.LowShelf: if (bandNumber == 1 || bandNumber == 8) { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.LowShelf; } else { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode2To7.LowShelf; } break; case ProQ2Shape.LowCut: switch (band.Slope) { case ProQSlope.Slope6dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut6; break; case ProQSlope.Slope12dB_oct: case ProQSlope.Slope18dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut12; break; case ProQSlope.Slope24dB_oct: case ProQSlope.Slope30dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut24; break; case ProQSlope.Slope36dB_oct: case ProQSlope.Slope48dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut48; break; case ProQSlope.Slope72dB_oct: case ProQSlope.Slope96dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut96; break; } break; case ProQ2Shape.HighShelf: if (bandNumber == 1 || bandNumber == 8) { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.HighShelf; } else { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode2To7.HighShelf; } break; case ProQ2Shape.HighCut: switch (band.Slope) { case ProQSlope.Slope6dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut6; break; case ProQSlope.Slope12dB_oct: case ProQSlope.Slope18dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut12; break; case ProQSlope.Slope24dB_oct: case ProQSlope.Slope30dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut24; break; case ProQSlope.Slope36dB_oct: case ProQSlope.Slope48dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut48; break; case ProQSlope.Slope72dB_oct: case ProQSlope.Slope96dB_oct: frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Cut96; break; } break; case ProQ2Shape.Notch: if (bandNumber == 1 || bandNumber == 8) { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode1And8.Notch; } else { frequency.Parameters[String.Format("equalizerAtype{0}{1}", bandNumber, channel)].Number = SteinbergFrequency.BandMode2To7.Notch; } break; } Log.Debug(band.ToString()); } else { // disable band frequency.Parameters[String.Format("equalizerAbandon{0}", bandNumber)].Number = 0.00; } }