public void GetVoiceTest() { var _target = new SoundFontInfo("../data/OmegaGMGS2.sf2"); var _result1 = _target.GetVoice(0, 0); AreEqual("Grand Piano", _result1); // bank:0, prog:0 var _result2 = _target.GetVoice(8, 38); AreEqual("Synth Bass 3", _result2); // bank:8, prog:38 var _result3 = _target.GetVoice(128, 8); AreEqual("Room Kit", _result3); // bank:128, prog:8 }
public static void LoadCurrentSF() { // Load simplfied soundfont try { DateTime start = DateTime.Now; if (CurrentMidiSet == null) { Debug.LogWarning("No SoundFont defined, go to Unity menu Tools to add a Soundfont"); } else { SoundFontInfo sfi = CurrentMidiSet.ActiveSounFontInfo; if (sfi == null) { Debug.LogWarning("No SoundFont defined, go to Unity menu Tools to add a Soundfont"); } else { // Path to the soundfonts directory for this SF, start from resource folder string pathToImSF = Path.Combine(SoundfontsDB + "/", sfi.Name); // Path to the soundfonts file for this SF TextAsset sf = Resources.Load <TextAsset>(Path.Combine(pathToImSF + "/", sfi.Name)); if (sf == null) { Debug.LogWarning("No SoundFont found " + pathToImSF); } else { WavePath = Path.Combine(pathToImSF + "/", PathToWave); // Load all presets defined in the XML sf ImSFCurrent = ImSoundFont.Load(sf.text); timeToLoadSoundFont = DateTime.Now - start; BuildPresetList(); BuildDrumList(); } } } } catch (System.Exception ex) { MidiPlayerGlobal.ErrorDetail(ex); } if (ImSFCurrent == null) { Debug.LogWarning("SoundFont not loaded."); return; } // Load samples only in run mode if (Application.isPlaying) { try { MPTK_CountWaveLoaded = 0; MPTK_CountPresetLoaded = 0; DateTime start = DateTime.Now; for (int ibank = 0; ibank < ImSFCurrent.Banks.Length; ibank++) { if (ImSFCurrent.Banks[ibank] != null) { for (int ipreset = 0; ipreset < ImSFCurrent.Banks[ibank].Presets.Length; ipreset++) { MPTK_CountPresetLoaded++; if (ImSFCurrent.Banks[ibank].Presets[ipreset] != null) { LoadSamples(ibank, ipreset); } } } } timeToLoadWave = DateTime.Now - start; } catch (System.Exception ex) { MidiPlayerGlobal.ErrorDetail(ex); } } if (OnEventPresetLoaded != null) { OnEventPresetLoaded.Invoke(); } }
private void ShowListBanks(float localstartX, float localstartY, float width, float height) { try { Rect zone = new Rect(localstartX, localstartY, width, height); GUI.color = new Color(.8f, .8f, .8f, 1f); GUI.Box(zone, ""); GUI.color = Color.white; if (MidiPlayerGlobal.ImSFCurrent != null && MidiPlayerGlobal.ImSFCurrent.Banks != null) { string tooltip = "Each bank contains a set of patchs (instrument).\nOnly two banks can be active at the same time : default sound (piano, ...) and drum kit (percussive)"; GUIContent content = new GUIContent() { text = "Banks available in SoundFont " + MidiPlayerGlobal.ImSFCurrent.SoundFontName, tooltip = tooltip }; //GUIContent content = new GUIContent() { text = "Banks available in SoundFont ", tooltip = tooltip }; EditorGUI.LabelField(new Rect(localstartX + xpostitlebox, localstartY + ypostitlebox, width, itemHeight), content, styleBold); //if (GUI.Button(new Rect(localstartX + width - buttonWidth - espace, localstartY + ypostitlebox, buttonWidth, buttonHeight), new GUIContent() { text = "2) Removed not used", tooltip = tooltip })) //{ // SoundFontOptim.OptimizeBanks(MidiPlayerGlobal.ImSFCurrent); // MidiPlayerGlobal.CurrentMidiSet.Save(); //} // Count available banks int countBank = 0; foreach (ImBank bank in MidiPlayerGlobal.ImSFCurrent.Banks) { if (bank != null) { countBank++; } } Rect listVisibleRect = new Rect(localstartX, localstartY + itemHeight, width, height - itemHeight - 5); Rect listContentRect = new Rect(0, 0, width - 15, countBank * itemHeight + 5); scrollPosBanks = GUI.BeginScrollView(listVisibleRect, scrollPosBanks, listContentRect); float boxY = 0; SoundFontInfo sfi = MidiPlayerGlobal.CurrentMidiSet.ActiveSounFontInfo; if (sfi != null) { foreach (ImBank bank in MidiPlayerGlobal.ImSFCurrent.Banks) { if (bank != null) { GUI.color = new Color(.7f, .7f, .7f, 1f); GUI.Box(new Rect(5, boxY + 5, width - 25, itemHeight), ""); GUI.color = Color.white; content = new GUIContent() { text = string.Format("Bank [{0,3:000}] Patch:{1}", bank.BankNumber, bank.PatchCount), tooltip = bank.Description }; GUI.Label(new Rect(10, boxY + 9, 130, itemHeight), content); //Debug.Log(sfi.DefaultBankNumber ); if (sfi.DefaultBankNumber == bank.BankNumber) { GUI.color = ToolsEditor.ButtonColor; } if (GUI.Button(new Rect(155, boxY + 9, 120, buttonHeight), new GUIContent("Default Bank", "Select this bank to be used for all instruments except drum"))) { sfi.DefaultBankNumber = sfi.DefaultBankNumber != bank.BankNumber ? bank.BankNumber : -1; MidiPlayerGlobal.ImSFCurrent.DefaultBankNumber = bank.BankNumber; MidiPlayerGlobal.CurrentMidiSet.Save(); } GUI.color = Color.white; if (sfi.DrumKitBankNumber == bank.BankNumber) { GUI.color = ToolsEditor.ButtonColor; } if (GUI.Button(new Rect(155 + 120 + 5, boxY + 9, 120, buttonHeight), new GUIContent("Drum Bank", "Select this bank to be used for playing drum hit"))) { sfi.DrumKitBankNumber = sfi.DrumKitBankNumber != bank.BankNumber ? bank.BankNumber : -1; MidiPlayerGlobal.ImSFCurrent.DrumKitBankNumber = bank.BankNumber; MidiPlayerGlobal.CurrentMidiSet.Save(); } GUI.color = Color.white; boxY += itemHeight; } } } GUI.EndScrollView(); } else { EditorGUI.LabelField(new Rect(localstartX + xpostitlebox, localstartY + ypostitlebox, 300, itemHeight), "No SoundFont selected", styleBold); } } catch (Exception ex) { MidiPlayerGlobal.ErrorDetail(ex); } }
/// <summary> /// Display, add, remove Soundfont /// </summary> /// <param name="localstartX"></param> /// <param name="localstartY"></param> private void ShowListSoundFonts(float localstartX, float localstartY, float width, float height) { try { Rect zone = new Rect(localstartX, localstartY, width, height); GUI.color = new Color(.8f, .8f, .8f, 1f); GUI.Box(zone, ""); GUI.color = Color.white; if (MidiPlayerGlobal.CurrentMidiSet != null && MidiPlayerGlobal.CurrentMidiSet.SoundFonts != null) { string caption = "SoundFont available"; if (MidiPlayerGlobal.CurrentMidiSet.SoundFonts.Count == 0) { caption = "No SoundFont available yet"; MidiPlayerGlobal.ImSFCurrent = null; } GUIContent content = new GUIContent() { text = caption, tooltip = "Each SoundFonts contains a set of bank of sound. \nOnly one SoundFont can be active at the same time for the midi player" }; EditorGUI.LabelField(new Rect(localstartX + xpostitlebox, localstartY + ypostitlebox, 300, itemHeight), content, styleBold); Rect rect = new Rect(width - buttonWidth, localstartY + ypostitlebox, buttonWidth, buttonHeight); #if MPTK_PRO if (GUI.Button(rect, "Add SoundFont")) { //if (EditorUtility.DisplayDialog("Import SoundFont", "This action could take time, do you confirm ?", "Ok", "Cancel")) { SoundFontOptim.AddSoundFont(); scrollPosSoundFont = Vector2.zero; KeepAllPatchs = false; KeepAllZones = false; //listPatchs = PatchOptim.PatchUsed(); } } #else if (GUI.Button(rect, "Add SoundFont [PRO]")) { try { PopupWindow.Show(rect, new GetVersionPro()); } catch (Exception) { // generate some weird exception ... } } #endif Rect listVisibleRect = new Rect(localstartX, localstartY + itemHeight, width - 5, height - itemHeight - 5); Rect listContentRect = new Rect(0, 0, width - 20, MidiPlayerGlobal.CurrentMidiSet.SoundFonts.Count * itemHeight + 5); scrollPosSoundFont = GUI.BeginScrollView(listVisibleRect, scrollPosSoundFont, listContentRect); float boxY = 0; for (int i = 0; i < MidiPlayerGlobal.CurrentMidiSet.SoundFonts.Count; i++) { SoundFontInfo sf = MidiPlayerGlobal.CurrentMidiSet.SoundFonts[i]; GUI.color = new Color(.7f, .7f, .7f, 1f); float boxX = 5; GUI.Box(new Rect(boxX, boxY + 5, width - 30, itemHeight), ""); GUI.color = Color.white; content = new GUIContent() { text = sf.Name, tooltip = "" }; EditorGUI.LabelField(new Rect(boxX, boxY + 9, 200, itemHeight), content); if (sf.Name == MidiPlayerGlobal.CurrentMidiSet.ActiveSounFontInfo.Name) { GUI.color = ToolsEditor.ButtonColor; } boxX += 200 + espace; if (GUI.Button(new Rect(boxX, boxY + 9, 80, buttonHeight), "Select")) { #if MPTK_PRO OptimInfo = new BuilderInfo(); #endif MidiPlayerGlobal.CurrentMidiSet.SetActiveSoundFont(i); string soundPath = Path.Combine(Application.dataPath + "/", MidiPlayerGlobal.PathToSoundfonts); soundPath = Path.Combine(soundPath + "/", sf.Name); ToolsEditor.LoadImSF(soundPath, sf.Name); MidiPlayerGlobal.CurrentMidiSet.Save(); if (MidiPlayerGlobal.ImSFCurrent != null) { KeepAllPatchs = MidiPlayerGlobal.ImSFCurrent.KeepAllPatchs; KeepAllZones = MidiPlayerGlobal.ImSFCurrent.KeepAllZones; RemoveUnusedWaves = MidiPlayerGlobal.ImSFCurrent.RemoveUnusedWaves; if (Application.isPlaying) { MidiPlayerGlobal.MPTK_SelectSoundFont(null); } } //listPatchs = PatchOptim.PatchUsed(); } boxX += 80 + espace; GUI.color = Color.white; rect = new Rect(boxX, boxY + 9, 80, buttonHeight); if (GUI.Button(rect, "Remove")) { #if MPTK_PRO OptimInfo = new BuilderInfo(); string soundFontPath = Path.Combine(Application.dataPath + "/", MidiPlayerGlobal.PathToSoundfonts); string path = Path.Combine(soundFontPath, sf.Name); if (!string.IsNullOrEmpty(path) && EditorUtility.DisplayDialog("Delete SoundFont", "Are you sure to delete all the content of this folder ? " + path, "ok", "cancel")) { try { Directory.Delete(path, true); File.Delete(path + ".meta"); } catch (Exception ex) { Debug.Log("Remove SF " + ex.Message); } AssetDatabase.Refresh(); ToolsEditor.CheckMidiSet(); } #else try { PopupWindow.Show(rect, new GetVersionPro()); } catch (Exception) { // generate some weird exception ... } #endif } GUI.color = Color.white; //boxX = 5; //boxY += itemHeight; //if (MidiPlayerGlobal.ImSFCurrent.WaveSize < 1000000) // strSize = Math.Round((double)MidiPlayerGlobal.ImSFCurrent.WaveSize / 1000d).ToString() + " Ko"; //else // strSize = Math.Round((double)MidiPlayerGlobal.ImSFCurrent.WaveSize / 1000000d).ToString() + " Mo"; //string.Format("Patch count: {0} Wave count:{1} Wave size:{2}", MidiPlayerGlobal.ImSFCurrent.PatchCount, MidiPlayerGlobal.ImSFCurrent.WaveCount, strSize); //content = new GUIContent() { text = sf.Name, tooltip = "" }; //EditorGUI.LabelField(new Rect(boxX, boxY + 9, 200, itemHeight), content); boxY += itemHeight; } GUI.EndScrollView(); } } catch (Exception ex) { MidiPlayerGlobal.ErrorDetail(ex); } }