public override async Task DoScan() { InitializeInternal(); var parser = new KoaBankFileParser(ExportConfig.KoaFileHeader, ExportConfig.KoaPresetNameLength, ExportConfig.KoaPresetLength, ExportConfig.KoaNumPresets); var converter = new RolandConverter(ExportConfig); converter.LoadDefinitionFromCsvString(Encoding.UTF8.GetString(GetDefinitionData())); foreach (var presetFile in PresetFiles) { var presets = parser.Parse(presetFile); var presetBankName = Path.GetFileNameWithoutExtension(presetFile); foreach (var parsedPreset in presets) { converter.SetFileMemory(parsedPreset.PresetData); var preset = new PresetParserMetadata { PresetName = parsedPreset.PresetName.Trim(), Plugin = PluginInstance.Plugin, BankPath = presetBankName, SourceFile = presetFile + ":" + parsedPreset.Index }; PostProcessPreset(preset, converter); await DataPersistence.PersistPreset(preset, converter.Export()); } } await base.DoScan(); }
static void Main() { /* var b = new byte[] {0x46, 0x61}; * * Debug.WriteLine(RolandMemory.DecodeValueAsInt(b, 2, 7)); * return;*/ var culture = CultureInfo.GetCultureInfo("en-US"); //Culture for any thread CultureInfo.DefaultThreadCurrentCulture = culture; //Culture for UI in any thread CultureInfo.DefaultThreadCurrentUICulture = culture; CultureInfo.CurrentUICulture = culture; CultureInfo.CurrentCulture = culture; var doStructureDump = false; foreach (var configFile in Directory.EnumerateFiles( @"DevData\Roland", "TestConfig.json", SearchOption.AllDirectories)) { /*if (!configFile.Contains("SYSTEM-1")) * { * continue; * }*/ var rolandTestConfig = RolandTestConfig.LoadTestConfig(configFile); var serviceLocator = ServiceLocator.Default; FrontendInitializer.RegisterTypes(serviceLocator); FrontendInitializer.Initialize(serviceLocator); var remoteVstService = serviceLocator.ResolveType <RemoteVstService>(); var plugin = new Plugin { PluginLocation = new PluginLocation { DllPath = rolandTestConfig.Plugin } }; var pluginInstance = remoteVstService.GetInteractivePluginInstance(plugin, false); pluginInstance.LoadPlugin().Wait(); var koaParser = new KoaBankFileParser(rolandTestConfig.ExportConfig.KoaFileHeader, rolandTestConfig.ExportConfig.KoaPresetNameLength, rolandTestConfig.ExportConfig.KoaPresetLength, rolandTestConfig.ExportConfig.KoaNumPresets); Directory.CreateDirectory(rolandTestConfig.OutputDirectory); var definitionCsv = Path.Combine(rolandTestConfig.OutputDirectory, "RolandScript.csv"); var rolandScript = ParseScript(rolandTestConfig, rolandTestConfig.ExportConfig); rolandScript.ConvertToCsv(definitionCsv); var converter = new RolandConverter(rolandTestConfig.ExportConfig); converter.LoadDefinitionFromCsvFile(definitionCsv); var hadOriginal = false; foreach (var patchDirectory in rolandTestConfig.PresetDirectories) { Debug.WriteLine($"Processing patch directory {patchDirectory}"); foreach (var patchFile in Directory.EnumerateFiles( patchDirectory, "*.bin", SearchOption.AllDirectories)) { var presets = koaParser.Parse(patchFile); Debug.WriteLine($"Processed patch file {patchFile}, found {presets.Count} patches"); foreach (var preset in presets) { var currentPreset = $"{Path.GetFileName(preset.BankFile)}.{preset.Index}.{PathUtils.SanitizeFilename(preset.PresetName.Trim())}"; var outputFile = Path.Combine(rolandTestConfig.OutputDirectory, currentPreset); var originalPatchDump = outputFile + ".originalpatchdump"; var okPluginPatchDumpFile = outputFile + ".okpluginpatchdump"; converter.SetFileMemory(preset.PresetData); var memory = new RolandMemory(); memory.SetFileData(preset.PresetData); Debug.WriteLine($"Processed {currentPreset}"); var sw = new Stopwatch(); sw.Start(); var exportedData = converter.Export(); try { var sortedDump = RolandPatchDump.SortDump(exportedData); byte[] sortedPluginDump; if (File.Exists(okPluginPatchDumpFile)) { sortedPluginDump = RolandPatchDump.SortDump(File.ReadAllBytes(okPluginPatchDumpFile)); } else { pluginInstance.SetChunk(sortedDump, false); sortedPluginDump = RolandPatchDump.SortDump(pluginInstance.GetChunk(false)); } var pluginDumpVsGeneratedDumpErrors = RolandPatchDump.ComparePatchDumps(sortedPluginDump, sortedDump, rolandTestConfig, rolandScript); var sortedDumpEqual = pluginDumpVsGeneratedDumpErrors.Count == 0; var sortedOriginalDumpEqual = true; var sortedOriginalDumpEqualToPluginDump = false; var originalDumpVsGeneratedDumpErrors = new List <string>(); if (File.Exists(originalPatchDump)) { var sortedOriginal = RolandPatchDump.SortDump(File.ReadAllBytes(originalPatchDump)); originalDumpVsGeneratedDumpErrors = RolandPatchDump.ComparePatchDumps(sortedOriginal, sortedDump, rolandTestConfig, rolandScript); sortedOriginalDumpEqual = originalDumpVsGeneratedDumpErrors.Count == 0; hadOriginal = true; } var patchDumpFile = outputFile + ".patchdump"; var structureDumpFile = outputFile + ".structure"; var pluginPatchDumpFile = outputFile + ".pluginpatchdump"; var presetDataFile = outputFile + ".presetdata"; File.WriteAllBytes(patchDumpFile, sortedDump); File.WriteAllBytes(pluginPatchDumpFile, sortedPluginDump); File.WriteAllBytes(presetDataFile, preset.PresetData); if (File.Exists(originalPatchDump)) { memory.Load(originalPatchDump); var sortedOriginal = RolandPatchDump.SortDump(File.ReadAllBytes(originalPatchDump)); File.WriteAllBytes(originalPatchDump + ".sorted", sortedOriginal); } if (doStructureDump || (!sortedDumpEqual || !sortedOriginalDumpEqual)) { File.WriteAllText(structureDumpFile, rolandScript.Dump(memory)); } if ((!sortedDumpEqual || !sortedOriginalDumpEqual) && !sortedOriginalDumpEqualToPluginDump) { // Last resort: Compare the plugin dump against the sorted original dump because of "if float goes in, float comes out slightly different" Debug.WriteLine("Plugin Dump vs Generated Dump Errors"); Debug.WriteLine("------------------------------------"); Debug.WriteLine(string.Join(Environment.NewLine, pluginDumpVsGeneratedDumpErrors)); Debug.WriteLine("Original Dump vs Generated Dump Errors"); Debug.WriteLine("------------------------------------"); Debug.WriteLine(string.Join(Environment.NewLine, originalDumpVsGeneratedDumpErrors)); throw new Exception( $"Dumps not equal. sortedDumpEqual {sortedDumpEqual} sortedOriginalDumpEqual {sortedOriginalDumpEqual}"); } if (!File.Exists(okPluginPatchDumpFile)) { File.Copy(pluginPatchDumpFile, okPluginPatchDumpFile); } } catch (Exception e) { var structureDumpFile = outputFile + ".structure"; File.WriteAllText(structureDumpFile, rolandScript.Dump(memory)); throw e; } Debug.WriteLine($"{sw.Elapsed.TotalMilliseconds} ms"); } } } if (!hadOriginal) { throw new Exception($"Had no original to test against for config {configFile}"); } } // return; }