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()); }
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); }
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); }