void ImportSamples(SoundFont sf2, Preset preset, XInstrument xrni) { var xl = new List<XSample> (); var ml = new List<SampleMap> (); var il = new List<int> (); foreach (var pzone in preset.Zones) { // perc. bank likely has more than one instrument here. var i = pzone.Instrument (); var kr = pzone.KeyRange (); // FIXME: where should I use it? if (i == null) continue; // FIXME: is it possible? var vr = pzone.VelocityRange (); // an Instrument contains a set of zones that contain sample headers. int sampleCount = 0; foreach (var izone in i.Zones) { var ikr = izone.KeyRange (); var ivr = izone.VelocityRange (); var sh = izone.SampleHeader (); if (sh == null) continue; // FIXME: is it possible? // FIXME: sample data must become monoral (panpot neutral) var xs = ConvertSample (sampleCount++, sh, sf2.SampleData, izone); xs.Name = NormalizePathName (sh.SampleName); ml.Add (new SampleMap (ikr, ivr, xs, sh)); } } ml.Sort ((m1, m2) => m1.KeyLowRange != m2.KeyLowRange ? m1.KeyLowRange - m2.KeyLowRange : m1.KeyHighRange != m2.KeyHighRange ? m1.KeyHighRange - m2.KeyHighRange : m1.VelocityLowRange != m2.VelocityLowRange ? m1.VelocityLowRange - m2.VelocityLowRange : m1.VelocityHighRange - m2.VelocityHighRange); int prev = -1; foreach (var m in ml) { prev = m.KeyLowRange; il.Add (m.KeyLowRange); xl.Add (m.Sample); } xrni.SampleSplitMap = new SampleSplitMap (); xrni.SampleSplitMap.NoteOnMappings = new SampleSplitMapNoteOnMappings (); var nm = new SampleSplitMapping [ml.Count]; xrni.SampleSplitMap.NoteOnMappings.NoteOnMapping = nm; for (int i = 0; i < ml.Count; i++) { var m = ml [i]; var n = new SampleSplitMapping (); n.BaseNote = m.Sample.BaseNote; n.NoteStart = m.KeyLowRange; n.NoteEnd = m.KeyHighRange <= 0 ? 128 : m.KeyHighRange; n.SampleIndex = i; if (m.VelocityHighRange > 0) { n.MapVelocityToVolume = true; n.VelocityStart = m.VelocityLowRange; n.VelocityEnd = m.VelocityHighRange; } nm [i] = n; } xrni.Samples = new RenoiseInstrumentSamples (); xrni.Samples.Sample = xl.ToArray (); }
void ImportSamples(SoundFont sf2, Preset preset, XInstrument xrni) { var xl = new List <XSample> (); var ml = new List <SampleMap> (); var il = new List <int> (); foreach (var pzone in preset.Zones) // perc. bank likely has more than one instrument here. { var i = pzone.Instrument(); var kr = pzone.KeyRange(); // FIXME: where should I use it? if (i == null) { continue; // FIXME: is it possible? } var vr = pzone.VelocityRange(); // an Instrument contains a set of zones that contain sample headers. int sampleCount = 0; foreach (var izone in i.Zones) { var ikr = izone.KeyRange(); var ivr = izone.VelocityRange(); var sh = izone.SampleHeader(); if (sh == null) { continue; // FIXME: is it possible? } // FIXME: sample data must become monoral (panpot neutral) var xs = ConvertSample(sampleCount++, sh, sf2.SampleData, izone); xs.Name = NormalizePathName(sh.SampleName); ml.Add(new SampleMap(ikr, ivr, xs, sh)); } } ml.Sort((m1, m2) => m1.KeyLowRange != m2.KeyLowRange ? m1.KeyLowRange - m2.KeyLowRange : m1.KeyHighRange != m2.KeyHighRange ? m1.KeyHighRange - m2.KeyHighRange : m1.VelocityLowRange != m2.VelocityLowRange ? m1.VelocityLowRange - m2.VelocityLowRange : m1.VelocityHighRange - m2.VelocityHighRange); int prev = -1; foreach (var m in ml) { prev = m.KeyLowRange; il.Add(m.KeyLowRange); xl.Add(m.Sample); } xrni.SampleSplitMap = new SampleSplitMap(); xrni.SampleSplitMap.NoteOnMappings = new SampleSplitMapNoteOnMappings(); var nm = new SampleSplitMapping [ml.Count]; xrni.SampleSplitMap.NoteOnMappings.NoteOnMapping = nm; for (int i = 0; i < ml.Count; i++) { var m = ml [i]; var n = new SampleSplitMapping(); n.BaseNote = m.Sample.BaseNote; n.NoteStart = m.KeyLowRange; n.NoteEnd = m.KeyHighRange <= 0 ? 128 : m.KeyHighRange; n.SampleIndex = i; if (m.VelocityHighRange > 0) { n.MapVelocityToVolume = true; n.VelocityStart = m.VelocityLowRange; n.VelocityEnd = m.VelocityHighRange; } nm [i] = n; } xrni.Samples = new RenoiseInstrumentSamples(); xrni.Samples.Sample = xl.ToArray(); }