Ejemplo n.º 1
0
        public static int RunDumpAndReturnExitCode(DumpOptions opts)
        {
            string fileName = opts.FileName;

            byte[] fileData = File.ReadAllBytes(fileName);
            Console.WriteLine($"SysEx file: '{fileName}' ({fileData.Length} bytes)");

            List <byte[]> messages = Util.SplitBytesByDelimiter(fileData, 0xf7);

            Console.WriteLine($"Got {messages.Count} messages");

            foreach (byte[] message in messages)
            {
                byte[] rawData = ExtractPatchData(message);
                byte[] data    = Util.ConvertFromTwoNybbleFormat(rawData);

                SystemExclusiveHeader header = new SystemExclusiveHeader(message);
                Console.WriteLine(header);
                // TODO: Check the SysEx file header for validity

                Console.WriteLine(String.Format("Function = {0}", ((SystemExclusiveFunction)header.Function)).ToString().ToUpper());

                if (header.Substatus1 == 0x00)
                {
                    Console.WriteLine("SINGLE");
                }
                else if (header.Substatus1 == 0x01)
                {
                    Console.WriteLine("MULTI");
                }

                Console.WriteLine(String.Format("Program = {0}", header.Substatus2));
                int    programNumber = header.Substatus2;
                string programType   = "INTERNAL";
                if (programNumber >= 48)
                {
                    programType    = "EXTERNAL";
                    programNumber -= 48;
                }
                string programName = GetProgramName(programNumber);
                Console.WriteLine(String.Format("{0} {1}", programType, programName));

                SinglePatch s = new SinglePatch(data);
                System.Console.WriteLine(s.ToString());
            }

            return(0);
        }
Ejemplo n.º 2
0
        // Create an init patch. This is a single patch with basic settings.
        public static int RunInitAndReturnExitCode(InitOptions opts)
        {
            Console.WriteLine("Init");

            var patch = new SinglePatch();

            patch.SingleCommon.Name         = "DS Init";
            patch.SingleCommon.Volume.Value = 115;
            patch.SingleCommon.SourceCount  = 2;

            patch.Sources = new Source[patch.SingleCommon.SourceCount];
            for (int i = 0; i < patch.SingleCommon.SourceCount; i++)
            {
                patch.Sources[i] = new Source();
            }

            Console.WriteLine(patch.ToString());

            return(0);
        }
Ejemplo n.º 3
0
        public static int RunCreateAndReturnExitCode(CreateOptions opts)
        {
            var header = new SystemExclusiveHeader(0x00);

            header.Function   = (byte)SystemExclusiveFunction.OneBlockDump;
            header.Group      = 0x00;
            header.MachineID  = 0x0A;
            header.Substatus1 = 0x00;  // single

            // Get the right bank. Since it is a required parameter, I suppose we can trust that it exists.
            string bankName = opts.BankName.ToLower();
            char   ch       = bankName[0];

            switch (ch)
            {
            case 'a':
                header.Substatus2 = 0x00;
                break;

            case 'd':
                header.Substatus2 = 0x02;
                break;

            case 'e':
                header.Substatus2 = 0x03;
                break;

            case 'f':
                header.Substatus2 = 0x04;
                break;

            default:
                Console.WriteLine(string.Format("Unknown bank: '{0}'", opts.BankName));
                return(-1);
            }

            var allData = new List <byte>();

            // SysEx initiator and basic header data
            allData.Add(SystemExclusiveHeader.Initiator);
            allData.AddRange(header.ToData());

            // Additional header data as required
            var patchNumber = opts.PatchNumber - 1;

            if (patchNumber < 0 || patchNumber > 127)
            {
                Console.WriteLine("Patch number must be 1...128");
                return(-1);
            }
            allData.Add((byte)patchNumber);

            SinglePatchGenerator  generator;
            SinglePatchDescriptor descriptor;

            if (opts.PatchType.Equals("single"))
            {
                if (!string.IsNullOrEmpty(opts.Descriptor))  // we have a JSON descriptor file, parse it
                {
                    var jsonText = File.ReadAllText(opts.Descriptor);
                    descriptor = JsonConvert.DeserializeObject <SinglePatchDescriptor>(jsonText);
                    generator  = new SinglePatchGenerator(descriptor);
                }
                else
                {
                    descriptor = new SinglePatchDescriptor();
                    generator  = new SinglePatchGenerator(descriptor);
                }

                SinglePatch single     = generator.Generate();
                byte[]      singleData = single.ToData();
                Console.Error.WriteLine(string.Format("Generated single data size: {0} bytes", singleData.Length));
                Console.Error.WriteLine(single.ToString());
                allData.AddRange(singleData);

                allData.Add(SystemExclusiveHeader.Terminator);

                File.WriteAllBytes(opts.OutputFileName, allData.ToArray());
            }
            else if (opts.PatchType.Equals("multi"))
            {
                Console.WriteLine("Don't know how to make a multi patch yet");
                return(1);
            }

            return(0);
        }
Ejemplo n.º 4
0
        static int Main(string[] args)
        {
            if (args.Length < 2)
            {
                System.Console.WriteLine("Usage: K5KTool cmd filename.syx");
                return(1);
            }

            string command   = args[0];
            string fileName  = args[1];
            string patchName = "";

            if (args.Length > 2)
            {
                patchName = args[2];
            }

            byte[] fileData = File.ReadAllBytes(fileName);
            System.Console.WriteLine($"SysEx file: '{fileName}' ({fileData.Length} bytes)");

            List <byte[]> messages = Util.SplitBytesByDelimiter(fileData, Constants.SystemExclusiveTerminator);

            System.Console.WriteLine($"Got {messages.Count} messages");

            foreach (byte[] message in messages)
            {
                SystemExclusiveHeader header = new SystemExclusiveHeader(message);
                //System.Console.WriteLine(Util.HexDump(header.Data));
                System.Console.WriteLine(header.ToString());
                int headerLength = header.Data.Length;

                // Examine the header to see what kind of message this is:
                SystemExclusiveFunction function = (SystemExclusiveFunction)header.Function;
                if (function == SystemExclusiveFunction.AllPatchDataDump)
                {
                    // sub2: 0=I or E, 20H=i or e singles
                    if (header.Substatus2 == 0x00 || header.Substatus2 == 0x20)
                    {
                        int offset = headerLength;
                        for (int i = 0; i < NumSingles; i++)
                        {
                            byte[] singleData = new byte[SinglePatch.DataSize];
                            Buffer.BlockCopy(message, offset, singleData, 0, SinglePatch.DataSize);
                            System.Console.WriteLine("INGOING SINGLE DATA = \n" + Util.HexDump(singleData));
                            SinglePatch single = new SinglePatch(singleData);
                            System.Console.WriteLine(single.ToString());

                            byte[] sysExData = single.ToData();
                            System.Console.WriteLine("OUTCOMING SINGLE DATA = \n" + Util.HexDump(sysExData));

                            (bool result, int diffIndex) = Util.ByteArrayCompare(singleData, sysExData);
                            System.Console.WriteLine(String.Format("match = {0}, diff index = {1}", result ? "YES :-)" : "NO :-(", diffIndex));

                            offset += SinglePatch.DataSize;
                        }
                    }
                    else if (header.Substatus2 == 0x40)
                    {
                        System.Console.WriteLine("Multis not handled yet");
                        return(1);
                    }
                }
                else if (function == SystemExclusiveFunction.OnePatchDataDump)
                {
                    System.Console.WriteLine("One patch dumps not handled yet");
                    return(1);
                }
            }

            return(0);
        }