void AddInstruments(MLSSVoiceTable table) { for (int i = 0; i < table.Length; i++) { var voice = (MLSSWrappedVoice)table[i]; var entries = voice.GetSubVoices().Cast <MLSSVoiceEntry>(); if (entries.Count() == 0) { continue; } string name = "Instrument " + i; sf2.AddPreset(name, (ushort)i, 0); sf2.AddPresetBag(); sf2.AddPresetGenerator(SF2Generator.Instrument, new SF2GeneratorAmount { Amount = (short)sf2.AddInstrument(name) }); foreach (var entry in entries) { sf2.AddInstrumentBag(); if (!(entry.MinKey == 0 && entry.MaxKey == 0x7F)) { sf2.AddInstrumentGenerator(SF2Generator.KeyRange, new SF2GeneratorAmount { LowByte = entry.MinKey, HighByte = entry.MaxKey }); } if (entry.IsFixedFrequency == 0x80) { sf2.AddInstrumentGenerator(SF2Generator.ScaleTuning, new SF2GeneratorAmount { Amount = 0 }); } if (entry.Sample < table.Samples.Length) { var sample = table.Samples[entry.Sample]; if (sample != null) { sf2.AddInstrumentGenerator(SF2Generator.SampleModes, new SF2GeneratorAmount { Amount = (short)(sample.GetSample().bLoop ? 1 : 0) }); sf2.AddInstrumentGenerator(SF2Generator.SampleID, new SF2GeneratorAmount { Amount = (short)addedSamples[sample] }); } else { Console.WriteLine("Voice {0} uses a null sample id ({1})", i, entry.Sample); } } else { Console.WriteLine("Voice {0} uses an invalid sample id ({1})", i, entry.Sample); } } } }
void AddSamples(MLSSVoiceTable table) { for (int i = 0; i < table.Samples.Length; i++) { var sample = table.Samples[i]; if (sample == null) { continue; } var gSample = sample.GetSample(); byte[] pcmU8 = ROM.Instance.Reader.ReadBytes(gSample.Length, gSample.GetOffset()); short[] pcm16 = PCMU8ToPCM16(pcmU8); addedSamples.Add(sample, (int)sf2.AddSample(pcm16, string.Format("Sample {0}", i), gSample.bLoop, (uint)gSample.LoopPoint, (uint)gSample.Frequency, 60, 0)); } }