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; }
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(); }
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); } }