protected override void ReadList(IntPtr ptr, IntPtr ptrTerm, string listType) { switch (listType) { case "ins ": var inst = new INS(ptr, ptrTerm); if (List.ContainsKey(inst.Header.Locale)) { return; } List.Add(inst.Header.Locale, inst); break; default: throw new Exception(string.Format("Unknown ListId [{0}]", listType)); } }
public static void SaveFromPack(string filePath, Pack pack) { var saveFile = new File(); // WAVE saveFile.WavePool = new WVPL(); saveFile.WavePool.List = new Dictionary <int, WAVE>(); foreach (var wav in pack.Wave.ToArray()) { var wavh = new WAVE(); wavh.Format = new CK_FMT(); wavh.Format.Tag = 1; wavh.Format.Bits = 16; wavh.Format.Channels = 1; wavh.Format.SampleRate = wav.Header.SampleRate; wavh.Format.BlockAlign = (ushort)(wavh.Format.Bits * wavh.Format.Channels / 8); wavh.Format.BytesPerSec = wavh.Format.SampleRate * wavh.Format.BlockAlign; wavh.Sampler = new CK_WSMP(); wavh.Sampler.Gain = wav.Header.Gain; wavh.Sampler.FineTune = (short)(Math.Log(wav.Header.Pitch, 2.0) * 1200); wavh.Sampler.UnityNote = wav.Header.UnityNote; if (0 != wav.Header.LoopEnable) { wavh.Sampler.LoopCount = 1; var loop = new WaveLoop(); loop.Type = 1; loop.Start = wav.Header.LoopBegin; loop.Length = wav.Header.LoopLength; wavh.Loops = new Dictionary <int, WaveLoop>(); wavh.Loops.Add(0, loop); } wavh.Info = new Info(); wavh.Info.Name = wav.Info.Name; wavh.Data = new byte[wav.Data.Length * 2]; var pData = Marshal.AllocHGlobal(wavh.Data.Length); Marshal.Copy(wav.Data, 0, pData, wav.Data.Length); Marshal.Copy(pData, wavh.Data, 0, wavh.Data.Length); Marshal.FreeHGlobal(pData); saveFile.WavePool.List.Add(saveFile.WavePool.List.Count, wavh); } // Inst saveFile.Instruments = new LINS(); saveFile.Instruments.List = new SortedDictionary <MidiLocale, INS>(new LINS.Sort()); foreach (var srcPre in pack.Preset.Values) { if (1 != srcPre.Layer.Count) { continue; } var srcIns = pack.Inst[srcPre.Layer[0].InstIndex]; var ins = new INS(); ins.Header = new CK_INSH(); ins.Header.Locale = new MidiLocale(); ins.Header.Locale.BankFlg = (byte)(srcPre.Header.IsDrum ? 0x80 : 0x00); ins.Header.Locale.BankMSB = srcPre.Header.BankMSB; ins.Header.Locale.BankLSB = srcPre.Header.BankLSB; ins.Header.Locale.ProgNum = srcPre.Header.ProgNum; ins.Header.Regions = (uint)srcIns.Region.Count; ins.Info = new Info(); ins.Info.Name = srcPre.Info.Name; ins.Info.Category = srcPre.Info.Category; ins.Articulations = new LART(); ins.Articulations.ART = new ART(); ins.Articulations.ART.List = new Dictionary <int, Connection>(); foreach (var srcArt in srcIns.Art.ToArray()) { switch (srcArt.Type) { case ART_TYPE.EG_AMP_ATTACK: var ampA = new Connection(); ampA.Source = SRC_TYPE.NONE; ampA.Control = SRC_TYPE.NONE; ampA.Destination = DST_TYPE.EG1_ATTACK_TIME; ampA.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, ampA); break; case ART_TYPE.EG_AMP_HOLD: var ampH = new Connection(); ampH.Source = SRC_TYPE.NONE; ampH.Control = SRC_TYPE.NONE; ampH.Destination = DST_TYPE.EG1_HOLD_TIME; ampH.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, ampH); break; case ART_TYPE.EG_AMP_DECAY: var ampD = new Connection(); ampD.Source = SRC_TYPE.NONE; ampD.Control = SRC_TYPE.NONE; ampD.Destination = DST_TYPE.EG1_DECAY_TIME; ampD.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, ampD); break; case ART_TYPE.EG_AMP_SUSTAIN: var ampS = new Connection(); ampS.Source = SRC_TYPE.NONE; ampS.Control = SRC_TYPE.NONE; ampS.Destination = DST_TYPE.EG1_SUSTAIN_LEVEL; ampS.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, ampS); break; case ART_TYPE.EG_AMP_RELEASE: var ampR = new Connection(); ampR.Source = SRC_TYPE.NONE; ampR.Control = SRC_TYPE.NONE; ampR.Destination = DST_TYPE.EG1_RELEASE_TIME; ampR.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, ampR); break; case ART_TYPE.EG_CUTOFF_ATTACK: var fcA = new Connection(); fcA.Source = SRC_TYPE.NONE; fcA.Control = SRC_TYPE.NONE; fcA.Destination = DST_TYPE.EG1_ATTACK_TIME; fcA.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, fcA); break; case ART_TYPE.EG_CUTOFF_HOLD: var fcH = new Connection(); fcH.Source = SRC_TYPE.NONE; fcH.Control = SRC_TYPE.NONE; fcH.Destination = DST_TYPE.EG1_HOLD_TIME; fcH.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, fcH); break; case ART_TYPE.EG_CUTOFF_DECAY: var fcD = new Connection(); fcD.Source = SRC_TYPE.NONE; fcD.Control = SRC_TYPE.NONE; fcD.Destination = DST_TYPE.EG1_DECAY_TIME; fcD.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, fcD); break; case ART_TYPE.EG_CUTOFF_SUSTAIN: var fcS = new Connection(); fcS.Source = SRC_TYPE.NONE; fcS.Control = SRC_TYPE.NONE; fcS.Destination = DST_TYPE.EG1_SUSTAIN_LEVEL; fcS.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, fcS); break; case ART_TYPE.EG_CUTOFF_RELEASE: var fcR = new Connection(); fcR.Source = SRC_TYPE.NONE; fcR.Control = SRC_TYPE.NONE; fcR.Destination = DST_TYPE.EG1_RELEASE_TIME; fcR.Value = srcArt.Value; ins.Articulations.ART.List.Add(ins.Articulations.ART.List.Count, fcR); break; } } ins.Regions = new LRGN(); ins.Regions.List = new SortedDictionary <CK_RGNH, RGN>(new LRGN.Sort()); foreach (var srcRgn in srcIns.Region.Array) { var rgn = new RGN(); rgn.Header.Key.Hi = srcRgn.Header.KeyHi; rgn.Header.Key.Lo = srcRgn.Header.KeyLo; rgn.Header.Vel.Hi = srcRgn.Header.VelHi; rgn.Header.Vel.Lo = srcRgn.Header.VelLo; rgn.Articulations = new LART(); rgn.Articulations.ART = new ART(); rgn.Articulations.ART.List = new Dictionary <int, Connection>(); foreach (var srcArt in srcRgn.Art.ToArray()) { switch (srcArt.Type) { case ART_TYPE.WAVE_INDEX: rgn.WaveLink.Channel = 1; rgn.WaveLink.TableIndex = (uint)srcArt.Value; break; case ART_TYPE.GAIN: rgn.Sampler.Gain = srcArt.Value; break; case ART_TYPE.UNITY_KEY: rgn.Sampler.UnityNote = (ushort)srcArt.Value; break; case ART_TYPE.FINE_TUNE: rgn.Sampler.FineTune = (short)(Math.Log(srcArt.Value, 2.0) * 1200); break; case ART_TYPE.EG_AMP_ATTACK: var ampA = new Connection(); ampA.Source = SRC_TYPE.NONE; ampA.Control = SRC_TYPE.NONE; ampA.Destination = DST_TYPE.EG1_ATTACK_TIME; ampA.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, ampA); break; case ART_TYPE.EG_AMP_HOLD: var ampH = new Connection(); ampH.Source = SRC_TYPE.NONE; ampH.Control = SRC_TYPE.NONE; ampH.Destination = DST_TYPE.EG1_HOLD_TIME; ampH.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, ampH); break; case ART_TYPE.EG_AMP_DECAY: var ampD = new Connection(); ampD.Source = SRC_TYPE.NONE; ampD.Control = SRC_TYPE.NONE; ampD.Destination = DST_TYPE.EG1_DECAY_TIME; ampD.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, ampD); break; case ART_TYPE.EG_AMP_SUSTAIN: var ampS = new Connection(); ampS.Source = SRC_TYPE.NONE; ampS.Control = SRC_TYPE.NONE; ampS.Destination = DST_TYPE.EG1_SUSTAIN_LEVEL; ampS.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, ampS); break; case ART_TYPE.EG_AMP_RELEASE: var ampR = new Connection(); ampR.Source = SRC_TYPE.NONE; ampR.Control = SRC_TYPE.NONE; ampR.Destination = DST_TYPE.EG1_RELEASE_TIME; ampR.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, ampR); break; case ART_TYPE.EG_CUTOFF_ATTACK: var fcA = new Connection(); fcA.Source = SRC_TYPE.NONE; fcA.Control = SRC_TYPE.NONE; fcA.Destination = DST_TYPE.EG1_ATTACK_TIME; fcA.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, fcA); break; case ART_TYPE.EG_CUTOFF_HOLD: var fcH = new Connection(); fcH.Source = SRC_TYPE.NONE; fcH.Control = SRC_TYPE.NONE; fcH.Destination = DST_TYPE.EG1_HOLD_TIME; fcH.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, fcH); break; case ART_TYPE.EG_CUTOFF_DECAY: var fcD = new Connection(); fcD.Source = SRC_TYPE.NONE; fcD.Control = SRC_TYPE.NONE; fcD.Destination = DST_TYPE.EG1_DECAY_TIME; fcD.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, fcD); break; case ART_TYPE.EG_CUTOFF_SUSTAIN: var fcS = new Connection(); fcS.Source = SRC_TYPE.NONE; fcS.Control = SRC_TYPE.NONE; fcS.Destination = DST_TYPE.EG1_SUSTAIN_LEVEL; fcS.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, fcS); break; case ART_TYPE.EG_CUTOFF_RELEASE: var fcR = new Connection(); fcR.Source = SRC_TYPE.NONE; fcR.Control = SRC_TYPE.NONE; fcR.Destination = DST_TYPE.EG1_RELEASE_TIME; fcR.Value = srcArt.Value; rgn.Articulations.ART.List.Add(rgn.Articulations.ART.List.Count, fcR); break; } } ins.Regions.List.Add(rgn.Header, rgn); } saveFile.Instruments.List.Add(ins.Header.Locale, ins); } saveFile.Save(filePath); }