private void ImportKitFromFile(DataTreeNodeViewModel kitNode) { string?file = ViewServices.ShowOpenFileDialog(FileFilters.KitFiles); if (file is null) { return; } object loaded; try { loaded = ProtoIo.LoadModel(file, Logger); } catch (Exception ex) { Logger.LogError($"Error loading {file}", ex); return; } if (!(loaded is Kit kit)) { Logger.LogError("Loaded file was not a kit"); return; } if (!kit.Schema.Identifier.Equals(Module.Schema.Identifier)) { Logger.LogError($"Kit was from {kit.Schema.Identifier.Name}; this module is {Module.Schema.Identifier.Name}"); return; } Module.ImportKit(kit, kitNode.KitNumber !.Value); }
// TODO: Once we have ModuleData cloning, we can just load once. public static Module LoadTD27() { using (var stream = typeof(ModuleSchemaTest).Assembly.GetManifestResourceStream("td27.vdrum")) { return((Module)ProtoIo.ReadModel(stream)); } }
// TODO: Once we have ModuleData cloning, we can just load once. public static Module LoadTD27() { using (var stream = typeof(ModuleSchemaTest).Assembly.GetManifestResourceStream("td27.vdrum")) { // TODO: Validate that there are no validation errors via a logger. return((Module)ProtoIo.ReadModel(stream, NullLogger.Instance)); } }
private static Module TryLoadModule(string name) { var ns = typeof(ModuleSchemaTest).Namespace; string filename = name.ToLowerInvariant().Replace("-", "") + ".vdrum"; string resourceName = $"{ns}.{filename}"; using (var stream = typeof(ModuleSchemaTest).Assembly.GetManifestResourceStream(resourceName)) { if (stream == null) { return(null); } return((Module)ProtoIo.ReadStream(stream)); } }
public Task <int> InvokeAsync(InvocationContext context) { var console = context.Console.Out; var file = context.ParseResult.ValueForOption <string>("file"); DrumFile proto; using (var stream = File.OpenRead(file)) { proto = ProtoIo.ReadDrumFile(stream); } switch (proto.FileCase) { case DrumFile.FileOneofCase.Module: DumpModule(proto.Module); break; case DrumFile.FileOneofCase.Kit: DumpKit(proto.Kit); break; case DrumFile.FileOneofCase.ModuleAudio: DumpModuleAudio(proto.ModuleAudio); break; } return(Task.FromResult(0)); void DumpModule(Module module) { console.WriteLine($"File type: module"); DumpIdentifier(module.Identifier); console.WriteLine("Data segments:"); DumpDataSegments(module.Containers); } void DumpKit(Kit kit) { console.WriteLine($"File type: kit"); DumpIdentifier(kit.Identifier); console.WriteLine($"Kit number: {kit.DefaultKitNumber}"); console.WriteLine("Data segments:"); DumpDataSegments(kit.Containers); } void DumpModuleAudio(ModuleAudio moduleAudio) { console.WriteLine($"File type: module audio"); DumpIdentifier(moduleAudio.Identifier); console.WriteLine($"Format: {moduleAudio.Format}"); console.WriteLine($"Duration per instrument: {moduleAudio.DurationPerInstrument}"); foreach (var capture in moduleAudio.InstrumentCaptures) { console.WriteLine($"{(capture.Preset ? "Preset" : "Sample")} {capture.InstrumentId}: {capture.AudioData}"); } } void DumpIdentifier(ModuleIdentifier identifier) { // JSON representation is fine here. console.WriteLine($"Identifier: {identifier}"); } void DumpDataSegments(IEnumerable <FieldContainerData> segments) { foreach (var segment in segments) { console.WriteLine($"{segment.Address:x8}: {BitConverter.ToString(segment.Data.ToByteArray())}"); } } }
static void Main(string[] args) { string file = args[0]; for (int i = 0; i < 10; i++) { var model = (Module)Timing.DebugConsoleLogTiming("Loaded model", () => ProtoIo.LoadModel(file, NullLogger.Instance)); var containers = model.Schema.PhysicalRoot.DescendantsAndSelf().OfType <FieldContainer>().ToList(); Timing.DebugConsoleLogTiming("Populated dictionaries", () => containers.ForEach(fc => fc.GetFieldOrNull("".AsSpan()))); } }
// It's unpleasant having this here, but I'm not sure of the alternative... /// <summary> /// Reads the given stream as drum data, returning a Kit or a Module depending /// on the data within the stream. /// </summary> public static object ReadStream(Stream stream) => ProtoIo.ReadStream(stream);