コード例 #1
0
ファイル: PresetBuilder.cs プロジェクト: hanistory/hasuite
		public override object Read(BinaryReader br) 
		{
			Preset p = new Preset();
			string s = Encoding.ASCII.GetString(br.ReadBytes(20));
			if(s.IndexOf('\0') >= 0) {
				s = s.Substring(0,s.IndexOf('\0'));
			}
			p.Name = s;
			p.PatchNumber = br.ReadUInt16();
			p.Bank = br.ReadUInt16();
			p.startPresetZoneIndex = br.ReadUInt16();
			p.library = br.ReadUInt32();
			p.genre = br.ReadUInt32();
			p.morphology = br.ReadUInt32();			
			if(lastPreset != null)
				lastPreset.endPresetZoneIndex = (ushort) (p.startPresetZoneIndex - 1);
			data.Add(p);
			lastPreset = p;
			return p;
		}
コード例 #2
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 ();
        }