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