/// <summary>
        /// IMPR: Reduce complexity by creating a 'result' structure and split method in several parts.
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="combi"></param>
        /// <param name="index"></param>
        private void PrintTimbre(TextWriter writer, ICombi combi, int index)
        {
            var timbre     = combi.Timbres.TimbresCollection[index];
            var status     = timbre.GetParam(ParameterNames.TimbreParameterName.Status).Value;
            var muteParam  = timbre.GetParam(ParameterNames.TimbreParameterName.Mute);
            var mute       = muteParam != null && (bool)muteParam.Value;
            var muteString = mute.ToYesNo();

            if (!ShowTimbre(timbre))
            {
                return;
            }

            var usedProgram = timbre.UsedProgram;
            var timbreId    = (usedProgram == null) ? "???" : timbre.ColumnProgramId;

            var isGmProgram    = (usedProgram != null) && ((ProgramBank)(timbre.UsedProgram.Parent)).Type == BankType.EType.Gm;
            var byteOffset     = (usedProgram == null) ? 0 : timbre.UsedProgram.ByteOffset;
            var name           = isGmProgram ? "-" : (byteOffset == 0) ? "???" : timbre.ColumnProgramName;
            var category       = isGmProgram ? "-" : (byteOffset == 0) ? "???" : timbre.UsedProgram.CategoryAsName;
            var subCategory    = isGmProgram ? "-" : ((byteOffset == 0) ? "???" : timbre.UsedProgram.SubCategoryAsName);
            var volume         = (string)(timbre.GetParam(ParameterNames.TimbreParameterName.Volume).Value.ToString());
            var priority       = timbre.GetParam(ParameterNames.TimbreParameterName.Priority);
            var priorityString = (isGmProgram || (priority == null))
                ? "No"
                : ((byteOffset == 0) ? "???" : ((bool)priority.Value).ToYesNo());

            var midiChannelString = ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.MidiChannel,
                                                                   (int)timbre.GetParam(ParameterNames.TimbreParameterName.MidiChannel).Value);

            var bottomKey = (string)ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.BottomKey,
                                                                   timbre.GetParam(ParameterNames.TimbreParameterName.BottomKey).Value);

            var topKey = (string)ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.TopKey,
                                                                timbre.GetParam(ParameterNames.TimbreParameterName.TopKey).Value);

            var bottomVelocity = (string)timbre.GetParam(ParameterNames.TimbreParameterName.BottomVelocity).Value.ToString();
            var topVelocity    = (string)timbre.GetParam(ParameterNames.TimbreParameterName.TopVelocity).Value.ToString();

            var paramOscMode = timbre.GetParam(ParameterNames.TimbreParameterName.OscMode);
            var oscMode      = (paramOscMode == null) ? "-" : (string)paramOscMode.Value;

            var paramOscSelect = timbre.GetParam(ParameterNames.TimbreParameterName.OscSelect);
            var oscSelect      = (paramOscSelect == null) ? "-" : (string)paramOscSelect.Value;

            var transpose = (string)ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.Transpose,
                                                                   timbre.GetParam(ParameterNames.TimbreParameterName.Transpose).Value);

            var paramDetune = timbre.GetParam(ParameterNames.TimbreParameterName.Detune);
            var detune      = (paramDetune == null) ? "-" : (string)ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.Detune, paramDetune.Value);

            var paramPortamento = timbre.GetParam(ParameterNames.TimbreParameterName.Portamento);
            var portamento      = (paramPortamento == null)
                ? "-"
                : (string)ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.Portamento, paramPortamento.Value);

            var bendRange = (string)ParameterValues.GetStringValue(ParameterNames.TimbreParameterName.BendRange,
                                                                   timbre.GetParam(ParameterNames.TimbreParameterName.BendRange).Value);

            writer.Write(
                $"|{index + 1,2} |{timbreId,-10}|{name,-24}|{category,-24}|{subCategory,-24}|{volume,3}|{status,-3}|{muteString,-4}|{priorityString,-4}|{midiChannelString,-4}|");

// ReSharper disable RedundantStringFormatCall
            writer.WriteLine(
                $"{bottomKey,-4}~{topKey,-4}|{bottomVelocity,3}~{topVelocity,3}|{oscMode,-4}|{oscSelect,-4}|{transpose,3}|{detune,5}|{portamento,3}|{bendRange,-3} |");
        }