public IMidiRenderer GetNewRenderer() { if (!FluidsynthInitialized) { InitializeFluidsynth(); } var soundfontLoader = SoundFontLoader.NewDefaultSoundFontLoader(_settings); soundfontLoader.SetCallbacks(_soundfontLoaderCallbacks); var renderer = new MidiRenderer(_settings, soundfontLoader); // Since the last loaded soundfont takes priority, we load the fallback soundfont first. renderer.LoadSoundfont(FallbackSoundfont); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { foreach (var filepath in LinuxSoundfonts) { if (!File.Exists(filepath) || !SoundFont.IsSoundFont(filepath)) { continue; } try { renderer.LoadSoundfont(filepath, true); } catch (Exception) { continue; } break; } } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { if (File.Exists(OSXSoundfont) && SoundFont.IsSoundFont(OSXSoundfont)) { renderer.LoadSoundfont(OSXSoundfont, true); } } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { if (File.Exists(WindowsSoundfont) && SoundFont.IsSoundFont(WindowsSoundfont)) { renderer.LoadSoundfont(WindowsSoundfont, true); } } lock (_renderers) _renderers.Add(renderer); return(renderer); }
public FluidsynthMidiReceiver(Context context) { #if MIDI_MANAGER access = new FluidsynthMidiAccess (); access.ConfigureSettings = (settings) => { #else var settings = new Settings (); #endif //settings [ConfigurationKeys.AudioDriver].StringValue = "opensles"; //settings [ConfigurationKeys.SynthParallelRender].IntValue = 0; //settings [ConfigurationKeys.SynthThreadsafeApi].IntValue = 0; //settings [ConfigurationKeys.AudioPeriods].IntValue = 16; //settings [ConfigurationKeys.AudioPeriods].IntValue = 64; settings [ConfigurationKeys.AudioSampleFormat].StringValue = "16bits"; // float or 16bits var manager = context.GetSystemService (Context.AudioService).JavaCast<AudioManager> (); // Note that it is NOT audio sample rate but *synthesizing* sample rate. // So it is kind of wrong assumption that AudioManager.PropertyOutputSampleRate would give the best outcome... //var sr = double.Parse (manager.GetProperty (AudioManager.PropertyOutputSampleRate)); //settings [ConfigurationKeys.SynthSampleRate].DoubleValue = sr; settings [ConfigurationKeys.SynthSampleRate].DoubleValue = 11025; var fpb = double.Parse (manager.GetProperty (AudioManager.PropertyOutputFramesPerBuffer)); settings [ConfigurationKeys.AudioPeriodSize].IntValue = (int) fpb; #if MIDI_MANAGER }; SynthAndroidExtensions.GetSoundFonts (access.SoundFonts, context, predefined_temp_path); output = access.OpenOutputAsync (access.Outputs.First ().Id).Result; #else syn = new Synth (settings); var sfs = new List<string> (); SynthAndroidExtensions.GetSoundFonts (sfs, context, predefined_temp_path); asset_stream_loader = new AndroidAssetStreamLoader (context.Assets); asset_sfloader = new SoundFontLoader (syn, asset_stream_loader); syn.AddSoundFontLoader (asset_sfloader); foreach (var sf in sfs) syn.LoadSoundFont (sf, false); adriver = new AudioDriver (syn.Settings, syn); #endif }
public IMidiRenderer GetNewRenderer() { if (!FluidsynthInitialized) { InitializeFluidsynth(); if (!FluidsynthInitialized) // init failed { return(null); } } var soundfontLoader = SoundFontLoader.NewDefaultSoundFontLoader(_settings); // Just making double sure these don't get GC'd. // They shouldn't, MidiRenderer keeps a ref, but making sure... var handle = GCHandle.Alloc(soundfontLoader); try { soundfontLoader.SetCallbacks(_soundfontLoaderCallbacks); var renderer = new MidiRenderer(_settings, soundfontLoader); // Since the last loaded soundfont takes priority, we load the fallback soundfont first. renderer.LoadSoundfont(FallbackSoundfont); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { foreach (var filepath in LinuxSoundfonts) { if (!File.Exists(filepath) || !SoundFont.IsSoundFont(filepath)) { continue; } try { renderer.LoadSoundfont(filepath, true); } catch (Exception) { continue; } break; } } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { if (File.Exists(OsxSoundfont) && SoundFont.IsSoundFont(OsxSoundfont)) { renderer.LoadSoundfont(OsxSoundfont, true); } } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { if (File.Exists(WindowsSoundfont) && SoundFont.IsSoundFont(WindowsSoundfont)) { renderer.LoadSoundfont(WindowsSoundfont, true); } } lock (_renderers) _renderers.Add(renderer); return(renderer); } finally { handle.Free(); } }