/// <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} |"); }