Beispiel #1
0
        public static GlobalTimbreLibrary Serdes(GlobalTimbreLibrary library, ISerializer s)
        {
            if (s == null)
            {
                throw new ArgumentNullException(nameof(s));
            }
            library ??= new GlobalTimbreLibrary();
            var start = s.Offset;


            IList <TimbreHeader> headers = new List <TimbreHeader>();

            if (s.IsReading())
            {
                TimbreHeader header;
                do
                {
                    header = TimbreHeader.Serdes(null, s);
                    headers.Add(header);
                } while (!header.IsSentinel);
            }
            else
            {
                uint offset = (uint)(start + TimbreHeader.Size * library.Data.Count + 2);
                foreach (var data in library.Data)
                {
                    var header = new TimbreHeader
                    {
                        MidiPatchNumber      = data.MidiPatchNumber,
                        MidiBankNumber       = data.MidiBankNumber,
                        InstrumentDataOffset = offset
                    };

                    TimbreHeader.Serdes(header, s);
                    headers.Add(header);
                    offset += data.Length;
                }

                // Write sentinel
                TimbreHeader.Serdes(new TimbreHeader
                {
                    MidiPatchNumber = 0xff,
                    MidiBankNumber  = 0xff,
                }, s);
            }

            s.List(nameof(library.Data), library.Data, headers.Count - 1, TimbreData.Serdes);
            for (int i = 0; i < headers.Count - 1; i++)
            {
                library.Data[i].MidiPatchNumber = headers[i].MidiPatchNumber;
                library.Data[i].MidiBankNumber  = headers[i].MidiBankNumber;
            }

            return(library);
        }
Beispiel #2
0
        public WoplFile(GlobalTimbreLibrary timbreLibrary)
        {
            Version     = 3;
            GlobalFlags = GlobalBankFlags.DeepTremolo | GlobalBankFlags.DeepVibrato;
            VolumeModel = VolumeModel.Auto;

            Melodic.Add(new WoplBank {
                Id = 0, Name = ""
            });
            Percussion.Add(new WoplBank {
                Id = 0, Name = ""
            });

            for (int i = 0; i < timbreLibrary.Data.Count; i++)
            {
                var            timbre = timbreLibrary.Data[i];
                WoplInstrument x      =
                    i < 128
                        ? Melodic[0].Instruments[i] ?? new WoplInstrument()
                        : Percussion[0].Instruments[i - 128 + 35] ?? new WoplInstrument();

                x.Name           = "";
                x.NoteOffset1    = timbre.MidiPatchNumber;
                x.NoteOffset2    = timbre.MidiBankNumber;
                x.InstrumentMode = InstrumentMode.TwoOperator;
                x.FbConn1C0      = timbre.FeedbackConnection;
                x.Operator0      = timbre.Carrier;
                x.Operator1      = timbre.Modulation;
                x.Operator2      = Operator.Blank;
                x.Operator3      = Operator.Blank;

                if (i < 128)
                {
                    Melodic[0].Instruments[i] = x;
                }
                else
                {
                    Percussion[0].Instruments[i - 128 + 35] = x;
                }
            }
        }