コード例 #1
0
        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);
        }
コード例 #2
0
        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
        }
コード例 #3
0
        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();
            }
        }