Represents a SoundFont
        public MidiModuleDefinition RegisterOrUpdate(SoundFont sf2)
        {
            var existing = Modules.FirstOrDefault (m => m.Name == sf2.FileInfo.BankName);
            if (existing != null)
                return existing;

            var mod = new MidiModuleDefinition ();
            mod.Name = sf2.FileInfo.BankName;

            // only one map for one sf2.
            var map = new MidiInstrumentMap () { Name = sf2.FileInfo.BankName };
            mod.Instrument.Maps.Add (map);

            foreach (var preset in sf2.Presets.OrderBy (p => p.PatchNumber).ThenBy (p => p.Bank)) {
                var prog = map.Programs.FirstOrDefault (p => p.Index == preset.PatchNumber);
                if (prog == null) {
                    prog = new MidiProgramDefinition () { Index = preset.PatchNumber, Name = preset.Name };
                    map.Programs.Add (prog);
                }
                prog.Banks.Add (new MidiBankDefinition () { Name = preset.Name, Msb = preset.Bank });
            }

            Modules.Add (mod);

            return mod;
        }
Example #2
0
        public void Import(string file, string filter)
        {
            var sf2 = new SoundFont (file);
            foreach (var preset in sf2.Presets) {
                if (filter != null && preset.Name.IndexOf (filter) < 0)
                    continue;
                Console.WriteLine ("Processing " + preset.Name);
                var xrni = new XInstrument ();
                xrni.Name = NormalizePathName (preset.Name);
                ImportSamples (sf2, preset, xrni);

                OnXrniCreated (xrni);
            }
        }
        public string Describe(string fileName)
        {
			SoundFont sf = new SoundFont(fileName);
            StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.AppendFormat("{0}\r\n",sf.FileInfo);
			stringBuilder.Append("Presets\r\n");
			foreach(Preset p in sf.Presets)
			{
				stringBuilder.AppendFormat("{0}\r\n",p);
				foreach(Zone z in p.Zones)
				{
					stringBuilder.AppendFormat("   {0}\r\n",z);
					foreach(Generator g in z.Generators)
					{
						stringBuilder.AppendFormat("      {0}\r\n",g);
					}
					foreach(Modulator m in z.Modulators)
					{
						stringBuilder.AppendFormat("      {0}\r\n",m);
					}
				}
			}

			stringBuilder.Append("Instruments\r\n");
			foreach(Instrument i in sf.Instruments)
			{
				stringBuilder.AppendFormat("{0}\r\n",i);
				foreach(Zone z in i.Zones)
				{
					stringBuilder.AppendFormat("   {0}\r\n",z);
					foreach(Generator g in z.Generators)
					{
						stringBuilder.AppendFormat("      {0}\r\n",g);
					}
					foreach(Modulator m in z.Modulators)
					{
						stringBuilder.AppendFormat("      {0}\r\n",m);
					}
				}
			}
            return stringBuilder.ToString();
        }
Example #4
0
        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 ();
        }
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate (savedInstanceState);

            SetContentView (Resource.Layout.SoundFontDetails);

            var sf = Intent.GetStringExtra ("soundfont");

            var model = ApplicationModel.Instance;

            var mod = model.Database.Modules.First (m => m.Name == sf);
            var sfFile = model.Files.FirstOrDefault (p => p.Value == mod.Name).Key;
            if (!File.Exists (sfFile)) {
                Toast.MakeText (this, string.Format ("SoundFont file '{0}' was not found. Details not shown", sfFile), ToastLength.Long).Show ();
            } else {
                var sf2 = new SoundFont (new MemoryStream (File.ReadAllBytes (sfFile)));

                var infoList = new JavaList<IDictionary<string,object>> ();
                var map = mod.Instrument.Maps.First ();

                var labels = new string [] {"BankName", "FileName", "Author", "Copyright", "Comments", "Created", "SFVersion", "ROMVersion", "WaveTableEngine", "Tools", "TargetProduct", "DataROM"};
                var values = new string [] {
                    mod.Name,
                    sfFile,
                    sf2.FileInfo.Author,
                    sf2.FileInfo.Copyright,
                    sf2.FileInfo.Comments,
                    sf2.FileInfo.SoundFontVersion == null ? null : string.Format ("{0}.{1}", sf2.FileInfo.SoundFontVersion.Major, sf2.FileInfo.SoundFontVersion.Minor),
                    sf2.FileInfo.ROMVersion == null ? null : string.Format ("{0}.{1}", sf2.FileInfo.ROMVersion.Major, sf2.FileInfo.ROMVersion.Minor),
                    sf2.FileInfo.CreationDate,
                    sf2.FileInfo.WaveTableSoundEngine,
                    sf2.FileInfo.Tools,
                    sf2.FileInfo.TargetProduct,
                    sf2.FileInfo.DataROM,
                    };
                for (int i = 0; i < labels.Length; i++) {
                    var items = new JavaDictionary<string,object> ();
                    items.Add ("text1", labels [i]);
                    items.Add ("text2", values [i]);
                    infoList.Add (items);
                }

                var bankList = new JavaList<IDictionary<string,object>> ();
                foreach (var p in map.Programs) {
                    foreach (var b in p.Banks) {
                        var items = new JavaDictionary<string,object> ();
                        items.Add ("text1", string.Format ("{0:D03}.{1:D03}.{2:D03}", p.Index, b.Msb, b.Lsb));
                        items.Add ("text2", b.Name);
                        bankList.Add (items);
                    }
                }

                var fromKeys = new string [] {"text1", "text2"};
                var toIds = new int [] { Resource.Id.soundFontDetailFileInfoLabel, Resource.Id.soundFontDetailFileInfoValue };

                var lvfi = FindViewById<ListView> (Resource.Id.soundFontDetailsFileInfo);
                lvfi.Adapter = new SimpleAdapter (this, infoList, Resource.Layout.SoundFontFileInfoItem, fromKeys, toIds);

                var lvbanks = FindViewById<ListView> (Resource.Id.soundFontDetailsBankList);
                lvbanks.Adapter = new SimpleAdapter (this, bankList, Resource.Layout.SoundFontFileInfoItem, fromKeys, toIds);
            }
        }