예제 #1
0
        private static byte[] GenerateSystemExclusiveMessage(SinglePatch patch, int patchNumber, int channel = 0)
        {
            List <byte> data = new List <byte>();

            SystemExclusiveHeader header = new SystemExclusiveHeader();

            header.ManufacturerID = 0x40;  // Kawai
            header.Channel        = (byte)channel;
            header.Function       = (byte)SystemExclusiveFunction.OnePatchDataDump;
            header.Group          = 0x00; // synth group
            header.MachineID      = 0x04; // K4/K4r
            header.Substatus1     = 0x00; // INT
            header.Substatus2     = (byte)patchNumber;

            data.Add(SystemExclusiveHeader.Initiator);
            data.AddRange(header.ToData());
            data.AddRange(patch.ToData());
            data.Add(SystemExclusiveHeader.Terminator);

            return(data.ToArray());
        }
예제 #2
0
        public static int RunInitAndReturnExitCode(InitOptions opts)
        {
            List <SinglePatch> singlePatches = new List <SinglePatch>();

            for (int i = 0; i < SinglePatchCount; i++)
            {
                SinglePatch single = new SinglePatch();
                singlePatches.Add(single);
            }

            List <MultiPatch> multiPatches = new List <MultiPatch>();

            for (int i = 0; i < MultiPatchCount; i++)
            {
                MultiPatch multi = new MultiPatch();
                multiPatches.Add(multi);
            }

            // Create a System Exclusive header for an "All Patch Data Dump"
            SystemExclusiveHeader header = new SystemExclusiveHeader();

            header.ManufacturerID = 0x40; // Kawai
            header.Channel        = 0;    // MIDI channel 1
            header.Function       = (byte)SystemExclusiveFunction.AllPatchDataDump;
            header.Group          = 0;    // synthesizer group
            header.MachineID      = 0x04; // K4/K4r ID
            header.Substatus1     = 0;    // INT
            header.Substatus2     = 0;    // always zero

            List <byte> data = new List <byte>();

            data.Add(SystemExclusiveHeader.Initiator);
            data.AddRange(header.ToData());

            // Single patches: 64 * 131 = 8384 bytes of data
            foreach (SinglePatch s in singlePatches)
            {
                data.AddRange(s.ToData());
            }

            // Multi patches: 64 * 77 = 4928 bytes of data
            // The K4 MIDI spec has an error in the "All Patch Data" description;
            // multi patches are listed as 87, not 77 bytes
            foreach (MultiPatch m in multiPatches)
            {
                data.AddRange(m.ToData());
            }

            // Drums: 682 bytes of data
            DrumPatch drums = new DrumPatch();

            data.AddRange(drums.ToData());

            List <EffectPatch> effectPatches = new List <EffectPatch>();

            for (int i = 0; i < EffectPatchCount; i++)
            {
                EffectPatch effect = new EffectPatch();
                effectPatches.Add(effect);
            }

            // Effect patches: 32 * 35 = 1120 bytes of data
            foreach (EffectPatch e in effectPatches)
            {
                data.AddRange(e.ToData());
            }

            data.Add(SystemExclusiveHeader.Terminator);

            // SysEx initiator:    1
            // SysEx header:       7
            // Single patches:  8384
            // Multi patches:   4928
            // Drum settings:    682
            // Effect patches:  1120
            // SysEx terminator:   1
            // Total bytes:    15123

            // Write the data to the output file
            File.WriteAllBytes(opts.OutputFileName, data.ToArray());

            return(0);
        }
예제 #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);
        }