From adf68695e9bf1e92abc552048ad5c55c5a6be087 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Tue, 11 Aug 2020 20:02:53 +0100 Subject: [PATCH] Start filling in more of the AE-10 schema At the moment there are some very odd fields - this is all very experimental at the moment. --- .../Data/Fields/NumericDataFieldBase.cs | 2 +- .../Schema/Fields/BooleanField.cs | 24 +- .../Schema/Fields/NumericCodec.cs | 20 ++ .../Schema/Fields/TempoField.cs | 2 +- .../Schema/Json/FieldJson.cs | 7 +- .../SchemaResources/AE10/Chorus/Chorus.json | 70 +++++- .../AE10/Reverb/Gm2Reverb.json | 37 ++- .../SchemaResources/AE10/Reverb/Reverb.json | 52 ++++- .../SchemaResources/AE10/Reverb/SrvHall.json | 213 +++++++++++++++++- .../SchemaResources/AE10/Reverb/SrvPlate.json | 213 +++++++++++++++++- .../SchemaResources/AE10/Reverb/SrvRoom.json | 161 ++++++++++++- 11 files changed, 773 insertions(+), 28 deletions(-) diff --git a/Drums/VDrumExplorer.Model/Data/Fields/NumericDataFieldBase.cs b/Drums/VDrumExplorer.Model/Data/Fields/NumericDataFieldBase.cs index 243266b8..027235de 100644 --- a/Drums/VDrumExplorer.Model/Data/Fields/NumericDataFieldBase.cs +++ b/Drums/VDrumExplorer.Model/Data/Fields/NumericDataFieldBase.cs @@ -31,7 +31,7 @@ public int RawValue { if (!TrySetRawValue(value)) { - throw new ArgumentOutOfRangeException(nameof(value)); + throw new ArgumentOutOfRangeException(nameof(value), $"Invalid raw value {value} for field {SchemaField.Path}"); } } } diff --git a/Drums/VDrumExplorer.Model/Schema/Fields/BooleanField.cs b/Drums/VDrumExplorer.Model/Schema/Fields/BooleanField.cs index 725cea24..25e5478a 100644 --- a/Drums/VDrumExplorer.Model/Schema/Fields/BooleanField.cs +++ b/Drums/VDrumExplorer.Model/Schema/Fields/BooleanField.cs @@ -2,7 +2,7 @@ // Use of this source code is governed by the Apache License 2.0, // as found in the LICENSE.txt file. -using System; +using System.Collections.Concurrent; using VDrumExplorer.Model.Schema.Physical; namespace VDrumExplorer.Model.Schema.Fields @@ -12,25 +12,21 @@ namespace VDrumExplorer.Model.Schema.Fields /// public sealed class BooleanField : NumericFieldBase { - private static readonly NumericFieldBaseParameters Boolean8Parameters = - new NumericFieldBaseParameters(min: 0, max: 1, @default: 0, NumericCodec.Range8); + private static ConcurrentDictionary parameterCache = + new ConcurrentDictionary(); - private static readonly NumericFieldBaseParameters Boolean32Parameters = - new NumericFieldBaseParameters(min: 0, max: 1, @default: 0, NumericCodec.Range32); - - internal BooleanField(FieldContainer? parent, FieldParameters common) - : base(parent, common, GetBaseParametersForSize(common.Size)) + private BooleanField(FieldContainer? parent, FieldParameters common, NumericFieldBaseParameters numericBaseParameters) + : base(parent, common, numericBaseParameters) { } - private static NumericFieldBaseParameters GetBaseParametersForSize(int size) => size switch + internal BooleanField(FieldContainer? parent, FieldParameters common, NumericCodec codec) + : this(parent, common, + parameterCache.GetOrAdd(codec, c => new NumericFieldBaseParameters(min: 0, max: 1, @default: 0, c))) { - 1 => Boolean8Parameters, - 4 => Boolean32Parameters, - _ => throw new ArgumentOutOfRangeException($"Invalid size: {size}") - }; + } internal override FieldBase WithParent(FieldContainer parent) => - new BooleanField(parent, Parameters); + new BooleanField(parent, Parameters, NumericBaseParameters); } } diff --git a/Drums/VDrumExplorer.Model/Schema/Fields/NumericCodec.cs b/Drums/VDrumExplorer.Model/Schema/Fields/NumericCodec.cs index ace7e9a8..f3add926 100644 --- a/Drums/VDrumExplorer.Model/Schema/Fields/NumericCodec.cs +++ b/Drums/VDrumExplorer.Model/Schema/Fields/NumericCodec.cs @@ -14,6 +14,8 @@ internal sealed class NumericCodec internal static NumericCodec Full24 { get; } = new NumericCodec(3, ReadFull24, WriteFull24, 0, (1 << 21) - 1); internal static NumericCodec Range32 { get; } = new NumericCodec(4, ReadRange32, WriteRange32, short.MinValue, short.MaxValue); + internal static NumericCodec Fixme32 { get; } = new NumericCodec(4, ReadFixme32, WriteFixme32, -20000, 2000); + private delegate void Int32Writer(Span data, int value); private delegate int Int32Reader(ReadOnlySpan data); @@ -82,5 +84,23 @@ private static void WriteRange32(Span data, int value) data[2] = (byte) ((value >> 4) & 0xf); data[3] = (byte) ((value >> 0) & 0xf); } + + // FIXME: I don't really understand these, but they're the reverb values on the AE-10 + + private static int ReadFixme32(ReadOnlySpan data) => + (short) + ((data[0] & 0x0700_0000 << 12) | + (data[1] << 8) | + (data[2] << 4) | + (data[3] << 0)); + + private static void WriteFixme32(Span data, int value) + { + value = value | 0x0800_0000; + data[0] = (byte) ((value >> 12) & 0xf); + data[1] = (byte) ((value >> 8) & 0xf); + data[2] = (byte) ((value >> 4) & 0xf); + data[3] = (byte) ((value >> 0) & 0xf); + } } } diff --git a/Drums/VDrumExplorer.Model/Schema/Fields/TempoField.cs b/Drums/VDrumExplorer.Model/Schema/Fields/TempoField.cs index cf6e2e7d..30767a79 100644 --- a/Drums/VDrumExplorer.Model/Schema/Fields/TempoField.cs +++ b/Drums/VDrumExplorer.Model/Schema/Fields/TempoField.cs @@ -51,7 +51,7 @@ internal TempoField(FieldContainer? parent, FieldParameters common, int min, int int? divisor, int? multiplier, int? valueOffset, string? suffix, (int value, string text)? customValueFormatting) : this( parent, common, - new BooleanField(parent, new FieldParameters(common.Name + "Sync", common.Description + " Sync", common.Offset, 4)), + new BooleanField(parent, new FieldParameters(common.Name + "Sync", common.Description + " Sync", common.Offset, 4), NumericCodec.Range32), new NumericField(parent, new FieldParameters(common.Name + "Numeric", common.Description + " FIXME", common.Offset + 4, 4), min, max, @default, NumericCodec.Range32, divisor, multiplier, valueOffset, suffix, customValueFormatting), new EnumField(parent, new FieldParameters(common.Name + "Note", common.Description + " FIXME", common.Offset + 8, 4), MusicalNoteValues, 0, NumericCodec.Range32)) { diff --git a/Drums/VDrumExplorer.Model/Schema/Json/FieldJson.cs b/Drums/VDrumExplorer.Model/Schema/Json/FieldJson.cs index fda611c6..4e78981a 100644 --- a/Drums/VDrumExplorer.Model/Schema/Json/FieldJson.cs +++ b/Drums/VDrumExplorer.Model/Schema/Json/FieldJson.cs @@ -136,8 +136,8 @@ internal FieldBase ToField(ModuleJson module, string name, string description, M { return Type switch { - "boolean" => new BooleanField(null, BuildCommon(1)), - "boolean32" => new BooleanField(null, BuildCommon(4)), + "boolean" => new BooleanField(null, BuildCommon(1), NumericCodec.Range8), + "boolean32" => new BooleanField(null, BuildCommon(4), NumericCodec.Range32), string ph when ph.StartsWith("placeholder") => new PlaceholderField(null, BuildCommon(int.Parse(ph.Substring("placeholder".Length)) / 8)), "enum" => BuildEnumField(NumericCodec.Range8), "enum16" => BuildEnumField(NumericCodec.Range16), @@ -154,6 +154,9 @@ internal FieldBase ToField(ModuleJson module, string name, string description, M "string16" => BuildStringField(2), "tempo" => BuildTempoField(), "volume32" => new NumericField(null, BuildCommon(4), -601, 60, 0, NumericCodec.Range32, 10, null, 0, "dB", (-601, "-INF")), + "fixme_enum32" => BuildEnumField(NumericCodec.Fixme32), + "fixme_range32" => BuildNumericField(NumericCodec.Fixme32), + "fixme_boolean32" => new BooleanField(null, BuildCommon(4), NumericCodec.Fixme32), _ => throw new InvalidOperationException($"Invalid field type: '{Type}'") }; diff --git a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Chorus/Chorus.json b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Chorus/Chorus.json index a3bd1d4c..3287bf0c 100644 --- a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Chorus/Chorus.json +++ b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Chorus/Chorus.json @@ -1,5 +1,73 @@ { "description": "Off", "fields": [ + { + "description": "Pre delay", + "type": "fixme_range32", + // FIXME: This has variable-sensitivity + "min": 0, + "max": 100 + }, + { + "description": "Rate", + "type": "fixme_range32", + "min": 0, + "max": 199, + "valueOffset": 1, + "divisor": 20 + }, + { + "description": "Depth", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Feedback", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Filter type", + "type": "fixme_enum32", + "valuesByNumber": [ + [0, "Off"], + [5, "LPF"], + [10, "HPF"] + ] + }, + { + "description": "Filter cutoff", + "type": "fixme_enum32", + "values": [ + "200Hz", + "250Hz", + "315Hz", + "400Hz", + "500Hz", + "630Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3150Hz", + "4000Hz", + "5000Hz", + "6300Hz", + "8000Hz", + "FIXME", + "FIXME 2" + ] + }, + { + "description": "Phase", + "type": "fixme_range32", + "min": 0, + "max": 180, + "suffix": "deg" + } ] -} \ No newline at end of file +} diff --git a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Gm2Reverb.json b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Gm2Reverb.json index a3bd1d4c..94c45f63 100644 --- a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Gm2Reverb.json +++ b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Gm2Reverb.json @@ -1,5 +1,38 @@ { - "description": "Off", + "description": "GM2 Reverb", "fields": [ + { + "description": "Character", + "type": "fixme_range32", + "min": 0, + "max": 7 + }, + { + "description": "Pre-LPF", + "type": "fixme_range32", + "min": 0, + "max": 7 + }, + { + "description": "Time", + "type": "fixme_range32", + "min": 0, + "max": 127, + "default": 64 + }, + { + "description": "Delay Feedback", + "type": "fixme_range32", + "min": 0, + "max": 127, + "default": 64 + }, + { + "description": "Level", + "type": "fixme_range32", + "min": 0, + "max": 127, + "default": 64 + } ] -} \ No newline at end of file +} diff --git a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Reverb.json b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Reverb.json index a3bd1d4c..c85759ae 100644 --- a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Reverb.json +++ b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/Reverb.json @@ -1,5 +1,55 @@ { - "description": "Off", + "description": "Reverb", "fields": [ + { + "description": "Type", + "type": "fixme_enum32", + "values": [ + "Room 1", + "Room 2", + "Stage 1", + "Stage 2", + "Hall 1", + "Hall 2", + "Delay", + "Pan-Delay" + ] + }, + { + "description": "Time", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "HF Damp", + "type": "fixme_enum32", + "values": [ + "160Hz", + "200Hz", + "250Hz", + "320Hz", + "400Hz", + "500Hz", + "640Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3200Hz", + "4000Hz", + "5000Hz", + "6400Hz", + "8000Hz" + ] + }, + { + "description": "Delay Feedback", + "type": "fixme_range32", + "min": 0, + "max": 127 + } ] } \ No newline at end of file diff --git a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvHall.json b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvHall.json index a3bd1d4c..a75b42bf 100644 --- a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvHall.json +++ b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvHall.json @@ -1,5 +1,214 @@ { - "description": "Off", + "description": "Srv Hall", "fields": [ + { + "description": "Pre delay", + "type": "fixme_range32", + // FIXME: This has variable-sensitivity + "min": 0, + "max": 100 + }, + { + "description": "Time", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Size", + "type": "fixme_range32", + "min": 1, + "max": 8 + }, + { + "description": "High cut", + "type": "fixme_enum32", + "values": [ + "160Hz", + "200Hz", + "250Hz", + "320Hz", + "400Hz", + "500Hz", + "640Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3200Hz", + "4000Hz", + "5000Hz", + "6400Hz", + "8000Hz", + "10000Hz", + "12500Hz", + "Bypass" + ] + }, + { + "description": "Density", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Diffusion", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "High freq damp (frequency)", + "type": "fixme_enum32", + "values": [ + "4000Hz", + "5000Hz", + "6400Hz", + "8000Hz", + "10000Hz", + "12500Hz" + ] + }, + { + "description": "High freq damp (gain)", + "type": "fixme_range32", + "min": -36, + "max": 0, + "suffix": "dB" + }, + { + "description": "Low freq damp (frequency)", + "type": "fixme_enum32", + "values": [ + "50Hz", + "64Hz", + "80Hz", + "100Hz", + "125Hz", + "160Hz", + "200Hz", + "250Hz", + "320Hz", + "400Hz", + "500Hz", + "640Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3200Hz", + "4000Hz" + ] + }, + { + "description": "Low freq damp (gain)", + "type": "fixme_range32", + "min": -36, + "max": 0, + "suffix": "dB" + }, + { + "description": "Equalizer switch", + "type": "fixme_boolean32" + }, + { + "description": "Equalizer high freq", + "type": "fixme_enum32", + "values": [ + "2000Hz", + "4000Hz", + "8000Hz" + ] + }, + { + "description": "Equality high freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Equalizer mid freq", + "type": "fixme_enum32", + "values": [ + "200Hz", + "250Hz", + "315Hz", + "400Hz", + "500Hz", + "630Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3150Hz", + "4000Hz", + "5000Hz", + "6300Hz", + "8000Hz" + ] + }, + { + "description": "Equality mid freq Q", + "type": "fixme_enum32", + "values": [ + "0.5", + "1.0", + "2.0", + "4.0", + "8.0" + ] + }, + { + "description": "Equality mid freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Equalizer low freq", + "type": "fixme_enum32", + "values": [ + "200Hz", + "400Hz" + ] + }, + { + "description": "Equality low freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Compressor switch", + "type": "fixme_boolean32" + }, + { + "description": "Compressor attack", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Compressor threshold", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Compressor post gain", + "type": "fixme_range32", + "min": -18, + "max": 0, + "suffix": "dB" + } ] -} \ No newline at end of file +} diff --git a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvPlate.json b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvPlate.json index a3bd1d4c..727e9432 100644 --- a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvPlate.json +++ b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvPlate.json @@ -1,5 +1,214 @@ { - "description": "Off", + "description": "Srv Plate", "fields": [ + { + "description": "Pre delay", + "type": "fixme_range32", + // FIXME: This has variable-sensitivity + "min": 0, + "max": 100 + }, + { + "description": "Time", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Size", + "type": "fixme_range32", + "min": 1, + "max": 8 + }, + { + "description": "High cut", + "type": "fixme_enum32", + "values": [ + "160Hz", + "200Hz", + "250Hz", + "320Hz", + "400Hz", + "500Hz", + "640Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3200Hz", + "4000Hz", + "5000Hz", + "6400Hz", + "8000Hz", + "10000Hz", + "12500Hz", + "Bypass" + ] + }, + { + "description": "Density", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Diffusion", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "High freq damp (frequency)", + "type": "fixme_enum32", + "values": [ + "4000Hz", + "5000Hz", + "6400Hz", + "8000Hz", + "10000Hz", + "12500Hz" + ] + }, + { + "description": "High freq damp (gain)", + "type": "fixme_range32", + "min": -36, + "max": 0, + "suffix": "dB" + }, + { + "description": "Low freq damp (frequency)", + "type": "fixme_enum32", + "values": [ + "50Hz", + "64Hz", + "80Hz", + "100Hz", + "125Hz", + "160Hz", + "200Hz", + "250Hz", + "320Hz", + "400Hz", + "500Hz", + "640Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3200Hz", + "4000Hz" + ] + }, + { + "description": "Low freq damp (gain)", + "type": "fixme_range32", + "min": -36, + "max": 0, + "suffix": "dB" + }, + { + "description": "Equalizer switch", + "type": "fixme_boolean32" + }, + { + "description": "Equalizer high freq", + "type": "fixme_enum32", + "values": [ + "2000Hz", + "4000Hz", + "8000Hz" + ] + }, + { + "description": "Equality high freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Equalizer mid freq", + "type": "fixme_enum32", + "values": [ + "200Hz", + "250Hz", + "315Hz", + "400Hz", + "500Hz", + "630Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3150Hz", + "4000Hz", + "5000Hz", + "6300Hz", + "8000Hz" + ] + }, + { + "description": "Equality mid freq Q", + "type": "fixme_enum32", + "values": [ + "0.5", + "1.0", + "2.0", + "4.0", + "8.0" + ] + }, + { + "description": "Equality mid freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Equalizer low freq", + "type": "fixme_enum32", + "values": [ + "200Hz", + "400Hz" + ] + }, + { + "description": "Equality low freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Compressor switch", + "type": "fixme_boolean32" + }, + { + "description": "Compressor attack", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Compressor threshold", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Compressor post gain", + "type": "fixme_range32", + "min": -18, + "max": 0, + "suffix": "dB" + } ] -} \ No newline at end of file +} diff --git a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvRoom.json b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvRoom.json index a3bd1d4c..11bdd117 100644 --- a/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvRoom.json +++ b/Drums/VDrumExplorer.Model/SchemaResources/AE10/Reverb/SrvRoom.json @@ -1,5 +1,162 @@ { - "description": "Off", + "description": "Srv Room", "fields": [ + { + "description": "Pre delay", + "type": "fixme_range32", + // FIXME: This has variable-sensitivity + "min": 0, + "max": 100 + }, + { + "description": "Time", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Size", + "type": "fixme_range32", + "min": 1, + "max": 8 + }, + { + "description": "High cut", + "type": "fixme_enum32", + "values": [ + "160Hz", + "200Hz", + "250Hz", + "320Hz", + "400Hz", + "500Hz", + "640Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3200Hz", + "4000Hz", + "5000Hz", + "6400Hz", + "8000Hz", + "10000Hz", + "12500Hz", + "Bypass" + ] + }, + { + "description": "Density", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Diffusion", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Equalizer switch", + "type": "fixme_boolean32" + }, + { + "description": "Equalizer high freq", + "type": "fixme_enum32", + "values": [ + "2000Hz", + "4000Hz", + "8000Hz" + ] + }, + { + "description": "Equality high freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Equalizer mid freq", + "type": "fixme_enum32", + "values": [ + "200Hz", + "250Hz", + "315Hz", + "400Hz", + "500Hz", + "630Hz", + "800Hz", + "1000Hz", + "1250Hz", + "1600Hz", + "2000Hz", + "2500Hz", + "3150Hz", + "4000Hz", + "5000Hz", + "6300Hz", + "8000Hz" + ] + }, + { + "description": "Equality mid freq Q", + "type": "fixme_enum32", + "values": [ + "0.5", + "1.0", + "2.0", + "4.0", + "8.0" + ] + }, + { + "description": "Equality mid freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Equalizer low freq", + "type": "fixme_enum32", + "values": [ + "200Hz", + "400Hz" + ] + }, + { + "description": "Equality low freq gain", + "type": "fixme_range32", + "min": -15, + "max": 15, + "suffix": "dB" + }, + { + "description": "Compressor switch", + "type": "fixme_boolean32" + }, + { + "description": "Compressor attack", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Compressor threshold", + "type": "fixme_range32", + "min": 0, + "max": 127 + }, + { + "description": "Compressor post gain", + "type": "fixme_range32", + "min": -18, + "max": 0, + "suffix": "dB" + } ] -} \ No newline at end of file +}