예제 #1
0
파일: sf2xrni.cs 프로젝트: zeromus/sf2xrni
        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 ();
        }
예제 #2
0
파일: sf2xrni.cs 프로젝트: thenfour/sf2xrni
        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();
        }