private void SyncState(Serializer ser) { byte[] core = null; if (ser.IsWriter) { var ms = new MemoryStream(); ms.Close(); core = ms.ToArray(); } Cpu.SyncState(ser); ser.BeginSection("SMS"); Vdp.SyncState(ser); PSG.SyncState(ser); ser.Sync("RAM", ref SystemRam, false); ser.Sync("RomBank0", ref RomBank0); ser.Sync("RomBank1", ref RomBank1); ser.Sync("RomBank2", ref RomBank2); ser.Sync("RomBank3", ref RomBank3); ser.Sync("Port01", ref Port01); ser.Sync("Port02", ref Port02); ser.Sync("Port3E", ref Port3E); ser.Sync("Port3F", ref Port3F); ser.Sync("Paddle1High", ref Paddle1High); ser.Sync("Paddle2High", ref Paddle2High); ser.Sync("LatchLightPhaser", ref LatchLightPhaser); if (SaveRAM != null) { ser.Sync("SaveRAM", ref SaveRAM, false); ser.Sync("SaveRamBank", ref SaveRamBank); } if (ExtRam != null) { ser.Sync("ExtRAM", ref ExtRam, true); } if (HasYM2413) { YM2413.SyncState(ser); } if (EEPROM != null) { EEPROM.SyncState(ser); } ser.Sync("Frame", ref _frame); ser.Sync("LagCount", ref _lagCount); ser.Sync("IsLag", ref _isLag); ser.EndSection(); if (ser.IsReader) { SyncAllByteArrayDomains(); } }
private void WritePort(ushort port, byte value) { port &= 0xFF; if (port < 0x40) // general IO ports { switch (port & 0xFF) { case 0x01: Port01 = value; break; case 0x02: Port02 = value; break; case 0x03: p3_write = true; Port03 = value; break; case 0x04: /*Port04 = value;*/ break; // receive port, not sure what writing does case 0x05: Port05 = (byte)(value & 0xF8); break; case 0x06: PSG.Set_Panning(value); break; case 0x3E: Port3E = value; break; case 0x3F: Port3F = value; break; } } else if (port < 0x80) // PSG { PSG.WriteReg(value); } else if (port < 0xC0) // VDP { if ((port & 1) == 0) { Vdp.WriteVdpData(value); } else { Vdp.WriteVdpControl(value); } } else if (port == 0xDE && PortDEEnabled) { PortDE = value; } else if (port == 0xF0 && HasYM2413) { YM2413.RegisterLatch = value; } else if (port == 0xF1 && HasYM2413) { YM2413.Write(value); } else if (port == 0xF2 && HasYM2413) { YM2413.DetectionValue = value; } }
public override bool Configure(NES.EDetectionOrigin origin) { switch (Cart.board_type) { case "MAPPER085": // as in some VRC2/VRC4 cases, this is actually a "composite" mapping that catches // both kinds of VRC7 (but screws up some of the address mirrors) remap = (addr) => (addr & 0xF000) | (addr & 0x30) >> 4 | (addr & 0x8) >> 3; fm = new YM2413(YM2413.ChipType.VRC7); break; case "KONAMI-VRC-7": AssertPrg(128, 512); AssertChr(0, 128); AssertVram(0, 8); AssertWram(0, 8); if (Cart.pcb == "353429") { //tiny toons 2 // for consistency, we map the addr line used for the FM chip even though // there is no resonator or crystal on the board for the fm chip remap = (addr) => (addr & 0xF000) | ((addr & 0x8) >> 3) | (addr & 0x20) >> 4; fm = null; } else if (Cart.pcb == "352402") { //lagrange point remap = addr => ((addr & 0xF000) | ((addr & 0x30) >> 4)); fm = new YM2413(YM2413.ChipType.VRC7); } else { throw new Exception("Unknown PCB type for VRC7"); } break; case "MAPPER117": // not sure quite what this is // different address mapping, and somewhat different irq logic Cart.vram_size = 0; Cart.wram_size = 0; remap = RemapM117; fm = null; break; default: return(false); } prg_bank_mask_8k = Cart.prg_size / 8 - 1; chr_bank_mask_1k = 0xff; // Cart.chr_size - 1; SetMirrorType(EMirrorType.Vertical); prg_banks_8k[3] = (byte)(0xFF & prg_bank_mask_8k); return(true); }
/// <summary> /// /// </summary> public FormYM2413Editor(YM2413 inst, YM2413Timbre timbre, bool singleSelect) : base(inst, timbre, singleSelect) { this.timbre = timbre; InitializeComponent(); Size = Settings.Default.YM2413EdSize; AddControl(new YM2413GeneralContainer(inst, timbre, "General")); AddControl(new YM2413OperatorContainer(timbre.Modulator, "Modulator")); AddControl(new YM2413OperatorContainer(timbre.Career, "Career")); }
public void ApplyYMAudio(short[] samples) { if (HasYM2413) { short[] fmsamples = new short[samples.Length]; YM2413.GetSamples(fmsamples); //naive mixing. need to study more int len = samples.Length; for (int i = 0; i < len; i++) { short fmsamp = fmsamples[i]; samples[i] = (short)(samples[i] + fmsamp); } } }
private void SyncState(Serializer ser) { ser.BeginSection("SMS"); Cpu.SyncState(ser); Vdp.SyncState(ser); PSG.SyncState(ser); ser.Sync("RAM", ref SystemRam, false); ser.Sync("RomBank0", ref RomBank0); ser.Sync("RomBank1", ref RomBank1); ser.Sync("RomBank2", ref RomBank2); ser.Sync("RomBank3", ref RomBank3); ser.Sync("Port01", ref Port01); ser.Sync("Port02", ref Port02); ser.Sync("Port3E", ref Port3E); ser.Sync("Port3F", ref Port3F); if (SaveRAM != null) { ser.Sync("SaveRAM", ref SaveRAM, false); ser.Sync("SaveRamBank", ref SaveRamBank); } if (ExtRam != null) { ser.Sync("ExtRAM", ref ExtRam, true); } if (HasYM2413) { YM2413.SyncState(ser); } ser.Sync("Frame", ref frame); ser.Sync("LagCount", ref _lagCount); ser.Sync("IsLag", ref _isLag); ser.EndSection(); if (ser.IsReader) { SyncAllByteArrayDomains(); } }
public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { ServiceProvider = new BasicServiceProvider(this); Settings = (SmsSettings)settings ?? new SmsSettings(); SyncSettings = (SmsSyncSettings)syncSettings ?? new SmsSyncSettings(); CoreComm = comm; MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" }); IsGameGear = game.System == "GG"; IsGameGear_C = game.System == "GG"; IsSG1000 = game.System == "SG"; RomData = rom; if (RomData.Length % BankSize != 0) { Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize); } RomBanks = (byte)(RomData.Length / BankSize); Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region); if (game["PAL"] && Region != DisplayType.PAL) { Region = DisplayType.PAL; CoreComm.Notify("Display was forced to PAL mode for game compatibility."); } if (IsGameGear) { Region = DisplayType.NTSC; // all game gears run at 60hz/NTSC mode } _region = SyncSettings.ConsoleRegion; if (_region == SmsSyncSettings.Regions.Auto) { _region = DetermineRegion(game.Region); } if (game["Japan"] && _region != SmsSyncSettings.Regions.Japan) { _region = SmsSyncSettings.Regions.Japan; CoreComm.Notify("Region was forced to Japan for game compatibility."); } if (game["Korea"] && _region != SmsSyncSettings.Regions.Korea) { _region = SmsSyncSettings.Regions.Korea; CoreComm.Notify("Region was forced to Korea for game compatibility."); } if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFm && !IsGameGear) { HasYM2413 = true; } Cpu = new Z80A() { ReadHardware = ReadPort, WriteHardware = WritePort, FetchMemory = FetchMemory, ReadMemory = ReadMemory, WriteMemory = WriteMemory, MemoryCallbacks = MemoryCallbacks, OnExecFetch = OnExecMemory }; if (game["GG_in_SMS"]) { // skip setting the BIOS because this is a game gear game that puts the system // in SMS compatibility mode (it will fail the check sum if played on an actual SMS though.) IsGameGear = false; IsGameGear_C = true; game.System = "GG"; Console.WriteLine("Using SMS Compatibility mode for Game Gear System"); } Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, Region); (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(Vdp); PSG = new SN76489sms(); YM2413 = new YM2413(); //SoundMixer = new SoundMixer(YM2413, PSG); if (HasYM2413 && game["WhenFMDisablePSG"]) { disablePSG = true; } blip_L.SetRates(3579545, 44100); blip_R.SetRates(3579545, 44100); (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(this); SystemRam = new byte[0x2000]; if (game["CMMapper"]) { InitCodeMastersMapper(); } else if (game["CMMapperWithRam"]) { InitCodeMastersMapperRam(); } else if (game["ExtRam"]) { InitExt2kMapper(int.Parse(game.OptionValue("ExtRam"))); } else if (game["KoreaMapper"]) { InitKoreaMapper(); } else if (game["MSXMapper"]) { InitMSXMapper(); } else if (game["NemesisMapper"]) { InitNemesisMapper(); } else if (game["TerebiOekaki"]) { InitTerebiOekaki(); } else if (game["EEPROM"]) { InitEEPROMMapper(); } else { InitSegaMapper(); } if (Settings.ForceStereoSeparation && !IsGameGear) { if (game["StereoByte"]) { ForceStereoByte = byte.Parse(game.OptionValue("StereoByte")); } PSG.Set_Panning(ForceStereoByte); } if (SyncSettings.AllowOverClock && game["OverclockSafe"]) { Vdp.IPeriod = 512; } if (Settings.SpriteLimit) { Vdp.SpriteLimit = true; } if (game["3D"]) { IsGame3D = true; } if (game["BIOS"]) { Port3E = 0xF7; // Disable cartridge, enable BIOS rom InitBiosMapper(); } else if (game.System == "SMS" && !game["GG_in_SMS"]) { BiosRom = comm.CoreFileProvider.GetFirmware("SMS", _region.ToString(), false); if (BiosRom == null) { throw new MissingFirmwareException("No BIOS found"); } if (!game["RequireBios"] && !SyncSettings.UseBios) { // we are skipping the BIOS // but only if it won't break the game } else { Port3E = 0xF7; } } if (game["SRAM"]) { SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))]; Console.WriteLine(SaveRAM.Length); } else if (game.NotInDatabase) { SaveRAM = new byte[0x8000]; } SetupMemoryDomains(); //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete ((ICodeDataLogger)this).SetCDL(null); InputCallbacks = new InputCallbackSystem(); Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; var serviceProvider = ServiceProvider as BasicServiceProvider; serviceProvider.Register <ITraceable>(Tracer); serviceProvider.Register <IDisassemblable>(Cpu); Vdp.ProcessOverscan(); Cpu.ReadMemory = ReadMemory; Cpu.WriteMemory = WriteMemory; // Z80 SP initialization // stops a few SMS and GG games from crashing Cpu.Regs[Cpu.SPl] = 0xF0; Cpu.Regs[Cpu.SPh] = 0xDF; }
public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { ServiceProvider = new BasicServiceProvider(this); Settings = (SMSSettings)settings ?? new SMSSettings(); SyncSettings = (SMSSyncSettings)syncSettings ?? new SMSSyncSettings(); CoreComm = comm; MemoryCallbacks = new MemoryCallbackSystem(); IsGameGear = game.System == "GG"; IsSG1000 = game.System == "SG"; RomData = rom; Tracer = new TraceBuffer(); (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer); if (RomData.Length % BankSize != 0) { Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize); } RomBanks = (byte)(RomData.Length / BankSize); Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region); if (game["PAL"] && Region != DisplayType.PAL) { Region = DisplayType.PAL; CoreComm.Notify("Display was forced to PAL mode for game compatibility."); } if (IsGameGear) { Region = DisplayType.NTSC; // all game gears run at 60hz/NTSC mode } CoreComm.VsyncNum = Region == DisplayType.NTSC ? 60 : 50; CoreComm.VsyncDen = 1; RegionStr = SyncSettings.ConsoleRegion; if (RegionStr == "Auto") { RegionStr = DetermineRegion(game.Region); } if (game["Japan"] && RegionStr != "Japan") { RegionStr = "Japan"; CoreComm.Notify("Region was forced to Japan for game compatibility."); } if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFM && !IsGameGear) { HasYM2413 = true; } if (Controller == null) { Controller = NullController.GetNullController(); } Cpu = new Z80A(); Cpu.RegisterSP = 0xDFF0; Cpu.ReadHardware = ReadPort; Cpu.WriteHardware = WritePort; Cpu.MemoryCallbacks = MemoryCallbacks; Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, Region); (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(Vdp); PSG = new SN76489(); YM2413 = new YM2413(); SoundMixer = new SoundMixer(YM2413, PSG); if (HasYM2413 && game["WhenFMDisablePSG"]) { SoundMixer.DisableSource(PSG); } ActiveSoundProvider = HasYM2413 ? (ISoundProvider)SoundMixer : PSG; SystemRam = new byte[0x2000]; if (game["CMMapper"]) { InitCodeMastersMapper(); } else if (game["CMMapperWithRam"]) { InitCodeMastersMapperRam(); } else if (game["ExtRam"]) { InitExt2kMapper(int.Parse(game.OptionValue("ExtRam"))); } else if (game["KoreaMapper"]) { InitKoreaMapper(); } else if (game["MSXMapper"]) { InitMSXMapper(); } else if (game["NemesisMapper"]) { InitNemesisMapper(); } else if (game["TerebiOekaki"]) { InitTerebiOekaki(); } else { InitSegaMapper(); } if (Settings.ForceStereoSeparation && !IsGameGear) { if (game["StereoByte"]) { ForceStereoByte = byte.Parse(game.OptionValue("StereoByte")); } PSG.StereoPanning = ForceStereoByte; } if (SyncSettings.AllowOverlock && game["OverclockSafe"]) { Vdp.IPeriod = 512; } if (Settings.SpriteLimit) { Vdp.SpriteLimit = true; } if (game["3D"]) { IsGame3D = true; } if (game["BIOS"]) { Port3E = 0xF7; // Disable cartridge, enable BIOS rom InitBiosMapper(); } else if (game.System == "SMS") { BiosRom = comm.CoreFileProvider.GetFirmware("SMS", RegionStr, false); if (BiosRom != null && (game["RequireBios"] || SyncSettings.UseBIOS)) { Port3E = 0xF7; } if (BiosRom == null && game["RequireBios"]) { throw new MissingFirmwareException("BIOS image not available. This game requires BIOS to function."); } if (SyncSettings.UseBIOS && BiosRom == null) { CoreComm.Notify("BIOS was selected, but rom image not available. BIOS not enabled."); } } if (game["SRAM"]) { SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))]; } else if (game.NotInDatabase) { SaveRAM = new byte[0x8000]; } SetupMemoryDomains(); //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete ((ICodeDataLogger)this).SetCDL(null); (ServiceProvider as BasicServiceProvider).Register <IDisassemblable>(new Disassembler()); }
private void SyncState(Serializer ser) { byte[] core = null; if (ser.IsWriter) { using var ms = new MemoryStream(); ms.Close(); core = ms.ToArray(); } ser.BeginSection(nameof(SMS)); Cpu.SyncState(ser); Vdp.SyncState(ser); PSG.SyncState(ser); ser.Sync("RAM", ref SystemRam, false); ser.Sync(nameof(RomBank0), ref RomBank0); ser.Sync(nameof(RomBank1), ref RomBank1); ser.Sync(nameof(RomBank2), ref RomBank2); ser.Sync(nameof(RomBank3), ref RomBank3); ser.Sync(nameof(Bios_bank), ref Bios_bank); ser.Sync(nameof(Port01), ref Port01); ser.Sync(nameof(Port02), ref Port02); ser.Sync(nameof(Port03), ref Port03); ser.Sync(nameof(Port04), ref Port04); ser.Sync(nameof(Port05), ref Port05); ser.Sync(nameof(Port3E), ref Port3E); ser.Sync(nameof(Port3F), ref Port3F); ser.Sync(nameof(Controller1SelectHigh), ref Controller1SelectHigh); ser.Sync(nameof(Controller2SelectHigh), ref Controller2SelectHigh); ser.Sync(nameof(LatchLightPhaser), ref LatchLightPhaser); ser.Sync(nameof(start_pressed), ref start_pressed); ser.Sync(nameof(cntr_rd_0), ref cntr_rd_0); ser.Sync(nameof(cntr_rd_1), ref cntr_rd_1); ser.Sync(nameof(cntr_rd_2), ref cntr_rd_2); ser.Sync(nameof(p3_write), ref p3_write); ser.Sync(nameof(p4_read), ref p4_read); ser.Sync(nameof(stand_alone), ref stand_alone); ser.Sync(nameof(disablePSG), ref disablePSG); ser.Sync(nameof(sampleclock), ref sampleclock); ser.Sync(nameof(old_s_L), ref old_s_L); ser.Sync(nameof(old_s_R), ref old_s_R); if (SaveRAM != null) { ser.Sync(nameof(SaveRAM), ref SaveRAM, false); } ser.Sync(nameof(SaveRamBank), ref SaveRamBank); if (ExtRam != null) { ser.Sync("ExtRAM", ref ExtRam, true); } if (HasYM2413) { YM2413.SyncState(ser); } EEPROM?.SyncState(ser); ser.Sync("Frame", ref _frame); ser.Sync("LagCount", ref _lagCount); ser.Sync("IsLag", ref _isLag); ser.EndSection(); if (ser.IsReader) { SyncAllByteArrayDomains(); } }
public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { ServiceProvider = new BasicServiceProvider(this); Settings = (SMSSettings)settings ?? new SMSSettings(); SyncSettings = (SMSSyncSettings)syncSettings ?? new SMSSyncSettings(); CoreComm = comm; MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" }); IsGameGear = game.System == "GG"; IsSG1000 = game.System == "SG"; RomData = rom; if (RomData.Length % BankSize != 0) { Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize); } RomBanks = (byte)(RomData.Length / BankSize); Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region); if (game["PAL"] && Region != DisplayType.PAL) { Region = DisplayType.PAL; CoreComm.Notify("Display was forced to PAL mode for game compatibility."); } if (IsGameGear) { Region = DisplayType.NTSC; // all game gears run at 60hz/NTSC mode } RegionStr = SyncSettings.ConsoleRegion; if (RegionStr == "Auto") { RegionStr = DetermineRegion(game.Region); } if (game["Japan"] && RegionStr != "Japan") { RegionStr = "Japan"; CoreComm.Notify("Region was forced to Japan for game compatibility."); } if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFM && !IsGameGear) { HasYM2413 = true; } Cpu = new Z80A() { ReadHardware = ReadPort, WriteHardware = WritePort, FetchMemory = FetchMemory, ReadMemory = ReadMemory, WriteMemory = WriteMemory, MemoryCallbacks = MemoryCallbacks, OnExecFetch = OnExecMemory }; Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, Region); (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(Vdp); PSG = new SN76489(); YM2413 = new YM2413(); SoundMixer = new SoundMixer(YM2413, PSG); if (HasYM2413 && game["WhenFMDisablePSG"]) { SoundMixer.DisableSource(PSG); } ActiveSoundProvider = HasYM2413 ? (IAsyncSoundProvider)SoundMixer : PSG; _fakeSyncSound = new FakeSyncSound(ActiveSoundProvider, 735); (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(_fakeSyncSound); SystemRam = new byte[0x2000]; if (game["CMMapper"]) { InitCodeMastersMapper(); } else if (game["CMMapperWithRam"]) { InitCodeMastersMapperRam(); } else if (game["ExtRam"]) { InitExt2kMapper(int.Parse(game.OptionValue("ExtRam"))); } else if (game["KoreaMapper"]) { InitKoreaMapper(); } else if (game["MSXMapper"]) { InitMSXMapper(); } else if (game["NemesisMapper"]) { InitNemesisMapper(); } else if (game["TerebiOekaki"]) { InitTerebiOekaki(); } else if (game["EEPROM"]) { InitEEPROMMapper(); } else { InitSegaMapper(); } if (Settings.ForceStereoSeparation && !IsGameGear) { if (game["StereoByte"]) { ForceStereoByte = byte.Parse(game.OptionValue("StereoByte")); } PSG.StereoPanning = ForceStereoByte; } if (SyncSettings.AllowOverlock && game["OverclockSafe"]) { Vdp.IPeriod = 512; } if (Settings.SpriteLimit) { Vdp.SpriteLimit = true; } if (game["3D"]) { IsGame3D = true; } if (game["BIOS"]) { Port3E = 0xF7; // Disable cartridge, enable BIOS rom InitBiosMapper(); } else if (game.System == "SMS") { BiosRom = comm.CoreFileProvider.GetFirmware("SMS", RegionStr, false); if (BiosRom == null) { throw new MissingFirmwareException("No BIOS found"); } else if (!game["RequireBios"] && !SyncSettings.UseBIOS) { // we are skipping the BIOS // but only if it won't break the game } else { Port3E = 0xF7; } } if (game["SRAM"]) { SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))]; Console.WriteLine(SaveRAM.Length); } else if (game.NotInDatabase) { SaveRAM = new byte[0x8000]; } SetupMemoryDomains(); //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete ((ICodeDataLogger)this).SetCDL(null); InputCallbacks = new InputCallbackSystem(); Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; var serviceProvider = ServiceProvider as BasicServiceProvider; serviceProvider.Register <ITraceable>(Tracer); serviceProvider.Register <IDisassemblable>(Cpu); Vdp.ProcessOverscan(); Cpu.ReadMemory = ReadMemory; Cpu.WriteMemory = WriteMemory; }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="provider"></param> /// <param name="value"></param> /// <returns></returns> public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { IWindowsFormsEditorService editorService = null; if (provider != null) { editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; } if (editorService == null) { return(value); } bool singleSel = true; YM2413Timbre tim = context.Instance as YM2413Timbre; YM2413Timbre[] tims = value as YM2413Timbre[]; if (tims != null) { tim = tims[0]; singleSel = false; } YM2413 inst = null; try { //InstrumentManager.ExclusiveLockObject.EnterReadLock(); inst = InstrumentManager.FindParentInstrument(InstrumentType.YM2413, tim) as YM2413; } finally { //InstrumentManager.ExclusiveLockObject.ExitReadLock(); } if (inst != null) { if (singleSel) { var mmlValueGeneral = SimpleSerializer.SerializeProps(tim, nameof(tim.FB), nameof(tim.SUS)); var tt = tim.ToneType; tim.ToneType = ToneType.Custom; List <string> mmlValueOps = new List <string>(); var mod = tim.Modulator; mmlValueOps.Add(SimpleSerializer.SerializeProps(mod, nameof(mod.AR), nameof(mod.DR), nameof(mod.RR), nameof(mod.SL), nameof(mod.SR), nameof(mod.TL), nameof(mod.KSL), nameof(mod.KSR), nameof(mod.MUL), nameof(mod.AM), nameof(mod.VIB), nameof(mod.EG), nameof(mod.DIST) )); var ca = tim.Career; mmlValueOps.Add(SimpleSerializer.SerializeProps(ca, nameof(ca.AR), nameof(ca.DR), nameof(ca.RR), nameof(ca.SL), nameof(ca.SR), nameof(ca.KSL), nameof(ca.KSR), nameof(ca.MUL), nameof(ca.AM), nameof(ca.VIB), nameof(ca.EG), nameof(ca.DIST) )); FormYM2413Editor ed = new FormYM2413Editor(inst, tim, singleSel); { ed.MmlValueGeneral = mmlValueGeneral; ed.FormClosed += (s, e) => { if (ed.DialogResult == DialogResult.OK) { tim.Detailed = ed.MmlValueGeneral + "," + ed.MmlValueOps[0] + "," + ed.MmlValueOps[1]; } else if (ed.DialogResult == DialogResult.Cancel) { tim.ToneType = tt; tim.Detailed = mmlValueGeneral + "," + mmlValueOps[0] + "," + mmlValueOps[1]; } }; ed.Show(); ed.Activated += (s, e) => { tim.Detailed = ed.MmlValueGeneral + "," + ed.MmlValueOps[0] + "," + ed.MmlValueOps[1]; }; } } else { using (FormYM2413Editor ed = new FormYM2413Editor(inst, tim, singleSel)) { string org = JsonConvert.SerializeObject(tims, Formatting.Indented); DialogResult dr = editorService.ShowDialog(ed); if (dr == DialogResult.OK || dr == DialogResult.Abort) { return(value); } else { return(JsonConvert.DeserializeObject <YM2413Timbre[]>(org)); } } } } return(value); // エディタ呼び出し直前の設定値をそのまま返す }