/// <summary>
        ///
        /// </summary>
        /// <param name="song"></param>
        /// <param name="chunkSize"></param>
        private void ReadBmt1Chunk(ISong song, int chunkSize)
        {
            song.ByteOffset = _index + 0x12C2 + 12;

            for (int timbre = 0; timbre < NumberOfSongTracks; timbre++)
            {
                ITimbre track = song.Timbres.TimbresCollection[timbre];
                track.ByteOffset = song.ByteOffset + timbre * SongTrackByteLength;
            }

            _index += chunkSize; // Skip chunk
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="timbre"></param>
 /// <returns></returns>
 bool ShowTimbre(ITimbre timbre)
 {
     return((!IgnoreMutedOffTimbres ||
             ((timbre.GetParam(ParameterNames.TimbreParameterName.Mute) == null) ||
              (!timbre.GetParam(ParameterNames.TimbreParameterName.Mute).Value) &&
              new List <string> {
         "Int", "On", "Both"
     }.Contains(timbre.GetParam(ParameterNames.TimbreParameterName.Status).Value))) &&
            (!IgnoreFirstProgram ||
             ((PcgMemory.ProgramBanks.BankCollection.IndexOf(timbre.UsedProgramBank) != 0) &&
              (timbre.UsedProgramBank.Patches.IndexOf(timbre.UsedProgram) != 0))) &&
            (SelectedProgramBanks.Contains(timbre.UsedProgramBank)));
 }
Example #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="timbre"></param>
        /// <param name="clipBoardCombi"></param>
        private void CopyTimbreOfCombiToClipboard(ITimbre timbre, IClipBoardCombi clipBoardCombi)
        {
            IClipBoardProgram clipBoardProgramToAdd = null;
            var usedProgramBank = timbre.UsedProgramBank;
            var usedProgram     = (usedProgramBank == null) ? null : timbre.UsedProgram;

            if (ShouldTimbreBeCopied(timbre, usedProgramBank, usedProgram))
            {
                clipBoardProgramToAdd = FindProgram(usedProgram) as IClipBoardProgram ??
                                        CopyProgramToClipBoard(usedProgram, false);
            }

            clipBoardCombi.References.CopiedPatches.Add(clipBoardProgramToAdd);
        }
Example #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="otherTimbre"></param>
        public virtual void Swap(ITimbre otherTimbre)
        {
            if (otherTimbre.TimbresOffset != TimbresOffset)
            {
                Util.SwapBytes(PcgRoot, Root.Content, TimbresOffset, Root.Content, otherTimbre.TimbresOffset,
                               TimbresSize);
                RaisePropertyChanged(string.Empty, false);
                otherTimbre.RaisePropertyChanged(string.Empty, false);

                UsedProgram.RaisePropertyChanged(string.Empty, false);
                otherTimbre.UsedProgram.RaisePropertyChanged(string.Empty, false);
                RefillColumns();
            }
        }
        /// <summary>
        ///
        /// </summary>
        private void MoveDown()
        {
            for (int timbreIndex = Combi.Timbres.TimbresCollection.Count - 1; timbreIndex >= 0; timbreIndex--)
            {
                ITimbre timbre = Combi.Timbres.TimbresCollection[timbreIndex];
                if (Combi.Timbres.TimbresCollection.Where(item => item.IsSelected).Contains(timbre))
                {
                    ITimbre otherTimbre = ((ICombi)(timbre.Parent.Parent)).Timbres.TimbresCollection[timbre.Index + 1];
                    otherTimbre.IsSelected = true;
                    timbre.IsSelected      = false;

                    timbre.Swap(otherTimbre);
                }
            }
            UpdateUiContent();
        }
Example #6
0
        /// <summary>
        /// Initialize as MIDI MPE:
        /// MIDI Channel equal to timbre nummer.
        /// Copy all parameters including used program from Timbre 0.
        /// </summary>
        public void InitAsMpe()
        {
            ITimbre timbre0     = Timbres.TimbresCollection[0];
            int     midiChannel = 0;

            timbre0.GetParam(ParameterNames.TimbreParameterName.MidiChannel).Value = midiChannel++; // MIDI channel 1 (value 0)

            foreach (ITimbre timbre in Timbres.TimbresCollection.Where(timbre => timbre != timbre0))
            {
                timbre.GetParam(ParameterNames.TimbreParameterName.MidiChannel).Value = midiChannel++; // MIDI channel same as timbre number

                timbre.UsedProgram = timbre0.UsedProgram;


                ParameterNames.TimbreParameterName[] parameterNames = new ParameterNames.TimbreParameterName[]
                {
                    ParameterNames.TimbreParameterName.Status,
                    ParameterNames.TimbreParameterName.Mute,
                    ParameterNames.TimbreParameterName.Volume,
                    ParameterNames.TimbreParameterName.BottomKey,
                    ParameterNames.TimbreParameterName.TopKey,
                    ParameterNames.TimbreParameterName.BottomVelocity,
                    ParameterNames.TimbreParameterName.TopVelocity,
                    ParameterNames.TimbreParameterName.OscMode,
                    ParameterNames.TimbreParameterName.OscSelect
                    // "Transpose", "Detune", "Portamento", "Bend Range" are not set since parameters with negative values cannot be set.
                };

                ITimbre timbreToChange = timbre;
                foreach (
                    ParameterNames.TimbreParameterName parameterName in
                    parameterNames.Where(parameterName => timbreToChange.GetParam(parameterName) != null))
                {
                    try
                    {
                        dynamic parameterValue = timbre0.GetParam(parameterName).Value;
                        timbre.GetParam(parameterName).Value = parameterValue;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine();
                    }
                }
            }
        }
Example #7
0
        /// <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)
        {
            ITimbre    timbre     = combi.Timbres.TimbresCollection[index];
            dynamic    status     = timbre.GetParam(ParameterNames.TimbreParameterName.Status).Value;
            IParameter muteParam  = timbre.GetParam(ParameterNames.TimbreParameterName.Mute);
            bool       mute       = muteParam != null && (bool)muteParam.Value;
            string     muteString = mute.ToYesNo();

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

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

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

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

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

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

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

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

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

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

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

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

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