diff --git a/MidiPlayer.Droid/MidiPlayer.Droid.csproj b/MidiPlayer.Droid/MidiPlayer.Droid.csproj index 93d91c4..7dfc72b 100644 --- a/MidiPlayer.Droid/MidiPlayer.Droid.csproj +++ b/MidiPlayer.Droid/MidiPlayer.Droid.csproj @@ -367,13 +367,16 @@ - 4.7.7 + 4.7.8 - 4.7.7 + 4.7.8 + + + 1.7.1 - 4.7.7 + 4.7.8 diff --git a/MidiPlayer.FluidSynth/Fluidsynth.cs b/MidiPlayer.FluidSynth/Fluidsynth.cs index 3d62184..931620f 100644 --- a/MidiPlayer.FluidSynth/Fluidsynth.cs +++ b/MidiPlayer.FluidSynth/Fluidsynth.cs @@ -11,75 +11,81 @@ namespace NativeFuncs { internal static class Fluidsynth { + // must set to MidiPlayer.FluidSynth.csproj +#if RUNTIME_LINUX + const string LIBLARY = "libfluidsynth.so"; +#elif RUNTIME_WINDOWS + const string LIBLARY = "libs/libfluidsynth-2.dll"; +#endif const UnmanagedType LP_Str = UnmanagedType.LPStr; internal const int FLUID_OK = 0; internal const int FLUID_FAILED = -1; - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern fluid_settings_t new_fluid_settings(); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern void delete_fluid_settings(fluid_settings_t settings); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern fluid_synth_t new_fluid_synth(fluid_settings_t settings); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern void delete_fluid_synth(fluid_synth_t synth); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern fluid_audio_driver_t new_fluid_audio_driver(fluid_settings_t settings, fluid_synth_t synth); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern void delete_fluid_audio_driver(fluid_audio_driver_t driver); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_synth_sfload(fluid_synth_t synth, [MarshalAs(LP_Str)] string filename, bool reset_presets); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_is_soundfont([MarshalAs(LP_Str)] string filename); // 1 or 0 - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_synth_noteon(fluid_synth_t synth, int chan, int key, int vel); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_synth_noteoff(fluid_synth_t synth, int chan, int key); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern fluid_player_t new_fluid_player(fluid_synth_t synth); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int delete_fluid_player(fluid_player_t player); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_player_add(fluid_player_t player, [MarshalAs(LP_Str)] string midifile); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_is_midifile([MarshalAs(LP_Str)] string filename); // 1 or 0 - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_player_play(fluid_player_t player); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_player_join(fluid_player_t player); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_player_stop(fluid_player_t player); internal delegate int handle_midi_event_func_t(void_ptr data, fluid_midi_event_t evt); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_player_set_playback_callback(fluid_player_t player, handle_midi_event_func_t handler, void_ptr handler_data); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_synth_handle_midi_event(void_ptr data, fluid_midi_event_t evt); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_synth_program_change(fluid_synth_t synth, int chan, int program); - [DllImport("libfluidsynth.so")] + [DllImport(LIBLARY)] internal static extern int fluid_synth_cc(fluid_synth_t synth, int chan, int ctrl, int val); } } diff --git a/MidiPlayer.FluidSynth/MidiPlayer.FluidSynth.csproj b/MidiPlayer.FluidSynth/MidiPlayer.FluidSynth.csproj index 7149be1..c377e8b 100644 --- a/MidiPlayer.FluidSynth/MidiPlayer.FluidSynth.csproj +++ b/MidiPlayer.FluidSynth/MidiPlayer.FluidSynth.csproj @@ -2,10 +2,14 @@ netstandard2.0 + RUNTIME_LINUX - + + + + diff --git a/MidiPlayer.FluidSynth/Synth.cs b/MidiPlayer.FluidSynth/Synth.cs index 33acbfd..5eebe02 100644 --- a/MidiPlayer.FluidSynth/Synth.cs +++ b/MidiPlayer.FluidSynth/Synth.cs @@ -129,6 +129,10 @@ public static void Start() { try { if (!ready) { Init(); + if (!ready) { + Log.Error("failed to init."); + return; + } } adriver = Fluidsynth.new_fluid_audio_driver(setting, synth); Fluidsynth.fluid_player_play(player); diff --git a/MidiPlayer.Win64/MainForm.Designer.cs b/MidiPlayer.Win64/MainForm.Designer.cs new file mode 100644 index 0000000..1f41703 --- /dev/null +++ b/MidiPlayer.Win64/MainForm.Designer.cs @@ -0,0 +1,107 @@ + +namespace MidiPlayer.Win64 { + partial class MainForm { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.buttonLoadSoundFont = new System.Windows.Forms.Button(); + this.buttonLoadMidiFile = new System.Windows.Forms.Button(); + this.buttonStart = new System.Windows.Forms.Button(); + this.buttonStop = new System.Windows.Forms.Button(); + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.SuspendLayout(); + // + // buttonLoadSoundFont + // + this.buttonLoadSoundFont.Font = new System.Drawing.Font("Yu Gothic UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.buttonLoadSoundFont.Location = new System.Drawing.Point(12, 12); + this.buttonLoadSoundFont.Name = "buttonLoadSoundFont"; + this.buttonLoadSoundFont.Size = new System.Drawing.Size(84, 40); + this.buttonLoadSoundFont.TabIndex = 0; + this.buttonLoadSoundFont.Text = "SOUND"; + this.buttonLoadSoundFont.UseVisualStyleBackColor = true; + this.buttonLoadSoundFont.Click += new System.EventHandler(this.buttonLoadSoundFont_Click); + // + // buttonLoadMidiFile + // + this.buttonLoadMidiFile.Font = new System.Drawing.Font("Yu Gothic UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.buttonLoadMidiFile.Location = new System.Drawing.Point(107, 12); + this.buttonLoadMidiFile.Name = "buttonLoadMidiFile"; + this.buttonLoadMidiFile.Size = new System.Drawing.Size(84, 40); + this.buttonLoadMidiFile.TabIndex = 1; + this.buttonLoadMidiFile.Text = "SONG"; + this.buttonLoadMidiFile.UseVisualStyleBackColor = true; + this.buttonLoadMidiFile.Click += new System.EventHandler(this.buttonLoadMidiFile_Click); + // + // buttonStart + // + this.buttonStart.Font = new System.Drawing.Font("Yu Gothic UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.buttonStart.Location = new System.Drawing.Point(202, 12); + this.buttonStart.Name = "buttonStart"; + this.buttonStart.Size = new System.Drawing.Size(84, 40); + this.buttonStart.TabIndex = 2; + this.buttonStart.Text = "START"; + this.buttonStart.UseVisualStyleBackColor = true; + this.buttonStart.Click += new System.EventHandler(this.buttonStart_Click); + // + // buttonStop + // + this.buttonStop.Font = new System.Drawing.Font("Yu Gothic UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point); + this.buttonStop.Location = new System.Drawing.Point(297, 12); + this.buttonStop.Name = "buttonStop"; + this.buttonStop.Size = new System.Drawing.Size(84, 40); + this.buttonStop.TabIndex = 3; + this.buttonStop.Text = "STOP"; + this.buttonStop.UseVisualStyleBackColor = true; + this.buttonStop.Click += new System.EventHandler(this.buttonStop_Click); + // + // openFileDialog + // + this.openFileDialog.FileName = "openFileDialog"; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(628, 297); + this.Controls.Add(this.buttonStop); + this.Controls.Add(this.buttonStart); + this.Controls.Add(this.buttonLoadMidiFile); + this.Controls.Add(this.buttonLoadSoundFont); + this.Name = "MainForm"; + this.Text = "MIDIPlayer"; + this.Load += new System.EventHandler(this.MainForm_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button buttonLoadSoundFont; + private System.Windows.Forms.Button buttonLoadMidiFile; + private System.Windows.Forms.Button buttonStart; + private System.Windows.Forms.Button buttonStop; + private System.Windows.Forms.OpenFileDialog openFileDialog; + } +} + diff --git a/MidiPlayer.Win64/MainForm.cs b/MidiPlayer.Win64/MainForm.cs new file mode 100644 index 0000000..8b0fe81 --- /dev/null +++ b/MidiPlayer.Win64/MainForm.cs @@ -0,0 +1,144 @@ + +using System; +using System.IO; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MidiPlayer.Win64 { + /// + /// main form for app + /// + public partial class MainForm : Form { + + /////////////////////////////////////////////////////////////////////////////////////////////// + // Fields + + string soundFontPath = "undefined"; + + string midiFilePath = "undefined"; + + PlayList playList; + + /////////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + + public MainForm() { + InitializeComponent(); + + playList = new PlayList(); + } + + /////////////////////////////////////////////////////////////////////////////////////////////// + // EventHandler + + void MainForm_Load(object sender, EventArgs e) { + Conf.Load(); + + int _count = 0; + Synth.OnMessage += (IntPtr data, IntPtr evt) => { + Log.Info($"OnMessage count: {_count}"); + _count++; + return Synth.HandleEvent(data, evt); + }; + + Synth.OnStart += () => { + Log.Info("OnStart called."); + Invoke((MethodInvoker) (() => { + this.Text = $"MidiPlayer: {Synth.MidiFilePath.ToFileName()} {Synth.SoundFontPath.ToFileName()}"; + })); + }; + + Synth.OnEnd += () => { + Log.Info("OnEnd called."); + if (!playList.Ready) { + Synth.Stop(); + Synth.Start(); + } else { + Synth.Stop(); + Synth.MidiFilePath = playList.Next; + Synth.Start(); + } + }; + } + + void buttonLoadSoundFont_Click(object sender, EventArgs e) { + Log.Info("buttonLoadSoundFont clicked."); + try { + if (Synth.Playing) { + stopSong(); + } + var _dialog = openFileDialog.ShowDialog(); + if (_dialog == DialogResult.OK) { + soundFontPath = Path.GetFullPath(openFileDialog.FileName); + Synth.SoundFontPath = soundFontPath; + } + } catch (Exception ex) { + Log.Error(ex.Message); + } + } + + void buttonLoadMidiFile_Click(object sender, EventArgs e) { + Log.Info("buttonLoadMidiFile clicked."); + try { + if (Synth.Playing) { + stopSong(); + } + var _dialog = openFileDialog.ShowDialog(); + if (_dialog == DialogResult.OK) { + midiFilePath = Path.GetFullPath(openFileDialog.FileName); + Synth.MidiFilePath = midiFilePath; + } + } catch (Exception ex) { + Log.Error(ex.Message); + } + } + + void buttonStart_Click(object sender, EventArgs e) { + Log.Info("buttonStart clicked."); + try { + if (!midiFilePath.HasValue()) { + return; + } + playSong(); + } catch (Exception ex) { + Log.Error(ex.Message); + } + } + + void buttonStop_Click(object sender, EventArgs e) { + Log.Info("buttonStop clicked."); + try { + stopSong(); + } catch (Exception ex) { + Log.Error(ex.Message); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////////// + // private Methods [verb] + + async void playSong() { + try { + await Task.Run(() => { + if (!playList.Ready) { + Synth.MidiFilePath = midiFilePath; + Synth.Start(); + } else { + Synth.MidiFilePath = playList.Next; + Synth.Start(); + } + }); + } catch (Exception ex) { + Log.Error(ex.Message); + } + } + + async void stopSong() { + try { + await Task.Run(() => Synth.Stop()); + } catch (Exception ex) { + Log.Error(ex.Message); + } + } + } +} diff --git a/MidiPlayer.Win64/MainForm.resx b/MidiPlayer.Win64/MainForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/MidiPlayer.Win64/MainForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MidiPlayer.Win64/MidiPlayer.Win64.csproj b/MidiPlayer.Win64/MidiPlayer.Win64.csproj new file mode 100644 index 0000000..250bcb5 --- /dev/null +++ b/MidiPlayer.Win64/MidiPlayer.Win64.csproj @@ -0,0 +1,72 @@ + + + + WinExe + netcoreapp3.1 + true + MidiPlayer.Win64.Program + STUDIO MeowToon + Hiroyuki Adachi + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + + + + + + + + + + + + + + + + Never + + + + \ No newline at end of file diff --git a/MidiPlayer.Win64/NLog.config b/MidiPlayer.Win64/NLog.config new file mode 100644 index 0000000..bea6380 --- /dev/null +++ b/MidiPlayer.Win64/NLog.config @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MidiPlayer.Win64/NLog.xsd b/MidiPlayer.Win64/NLog.xsd new file mode 100644 index 0000000..32246a7 --- /dev/null +++ b/MidiPlayer.Win64/NLog.xsd @@ -0,0 +1,3644 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged. + + + + + Throw an exception when there is an internal error. Default value is: false. Not recommend to set to true in production! + + + + + Throw an exception when there is a configuration error. If not set, determined by throwExceptions. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. Default value is: false. + + + + + Write internal NLog messages to the System.Diagnostics.Trace. Default value is: false. + + + + + Write timestamps for internal NLog messages. Default value is: true. + + + + + Use InvariantCulture as default culture instead of CurrentCulture. Default value is: false. + + + + + Perform message template parsing and formatting of LogEvent messages (true = Always, false = Never, empty = Auto Detect). Default value is: empty. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Filter on the name of the logger. May include wildcard characters ('*' or '?'). + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable this rule. Note: disabled rules aren't available from the API. + + + + + Rule identifier to allow rule lookup with Configuration.FindRuleByName and Configuration.RemoveRuleByName. + + + + + + + + + + + + + + + Default action if none of the filters match. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. You could use * wildcard. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + + Variable value. Note, the 'value' attribute has precedence over this one. + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Whether to use the locking queue, instead of a lock-free concurrent queue The locking queue is less concurrent when many logger threads, but reduces memory allocation + + + + + Limit of full s to write before yielding into Performance is better when writing many small batches, than writing a single large batch + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. (1 or less means trigger on new activity) + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + Condition expression. Log events who meet this condition will cause a flush on the wrapped target. + + + + + Only flush when LogEvent matches condition. Ignore explicit-flush, config-reload-flush and shutdown-flush + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Action to take if the buffer overflows. + + + + + Indicates whether to use sliding timeout. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Maximum queue size. + + + + + Maximum current connections. 0 = no maximum. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Indicates whether to keep connection open whenever possible. + + + + + NDLC item separator. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Renderer for log4j:event logger-xml-attribute (Default ${logger}) + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + NDC item separator. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Viewer parameter name. + + + + + Whether an attribute with empty value should be included in the output + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + Enables output using ANSI Color Codes + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + Indicates whether to auto-flush after + + + + + Indicates whether to auto-check if the console has been redirected to file - Disables coloring logic when System.Console.IsOutputRedirected = true + + + + + Indicates whether to use default row highlighting rules. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + Condition that must be met before scanning the row for highlight of words + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to auto-flush after + + + + + Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + Whether to enable batch writing using char[]-buffers, instead of using + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. Gets or sets a value indicating whether to use database transactions. Some data providers require this. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Name of the database provider. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Configures isolated transaction batch writing. If supported by the database, then it will improve insert performance. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Convert format of the property value + + + + + Culture used for parsing property string-value for type-conversion + + + + + Value to assign on the object-property + + + + + Name for the object-property + + + + + Type of the object-property + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + + + + + + Database parameter name. + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Database parameter DbType. + + + + + Database parameter size. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Type of the parameter. + + + + + Whether empty value should translate into DbNull. Requires database column to allow NULL values. + + + + + Convert format of the database parameter value. + + + + + Culture used for parsing parameter string-value for type-conversion + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Optional entry type. When not set, or when not convertible to then determined by + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Maximum Event log size in kilobytes. + + + + + Message length limit to write to the Event Log. + + + + + Value to be used as the event Source. + + + + + Action to take if the message is larger than the option. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Maximum days of archive files that should be kept. + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Is the an absolute or relative path? + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose: + + + + + Maximum number of archive files that should be kept. + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Maximum number of log file names that should be stored as existing. + + + + + Indicates whether to delete old log file on startup. + + + + + File attributes (Windows only). + + + + + Indicates whether to create directories if they do not exist. + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong. + + + + + Value of the file size threshold to archive old log file on startup. + + + + + Indicates whether to archive old log file on startup. + + + + + Value specifying the date format to use when archiving files. + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Indicates whether to write BOM (byte order mark) in created files + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Indicates whether file creation calls should be synchronized by a system global mutex. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + Is the an absolute or relative path? + + + + + Name of the file to write to. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + Log file buffer size in bytes. + + + + + Maximum number of seconds before open files are flushed. If this number is negative or zero the files are not flushed by timer. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interval in which messages will be written up to the number of messages. + + + + + Maximum allowed number of messages written per . + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + Type of the parameter. Obsolete alias for + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Priority used for sending mails. + + + + + Encoding to be used for sending e-mail. + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Indicates whether to add new lines between log entries. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Indicates the SMTP client timeout. + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + Folder where applications save mail messages to be processed by the local SMTP server. + + + + + Specifies how outgoing email messages will be handled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Max number of items to have in memory + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum current connections. 0 = no maximum. + + + + + Maximum queue size. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Maximum queue size. + + + + + Maximum current connections. 0 = no maximum. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Indicates whether to keep connection open whenever possible. + + + + + NDLC item separator. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Renderer for log4j:event logger-xml-attribute (Default ${logger}) + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + NDC item separator. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + The value by which to increment the counter. + + + + + Performance counter instance name. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Forward to (Instead of ) + + + + + Always use independent of + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Protocol to be used when calling web service. + + + + + Custom proxy address, include port separated by a colon + + + + + Encoding. + + + + + Web service URL. + + + + + Value whether escaping be done according to the old NLog style (Very non-standard) + + + + + Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters) + + + + + Name of the root XML element, if POST of XML document chosen. If so, this property must not be null. (see and ). + + + + + (optional) root namespace of the XML document, if POST of XML document chosen. (see and ). + + + + + Proxy configuration when calling web service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + Override of Quoting mode + + + + + + + + + + + + + + + + + + + + + Should forward slashes be escaped? If true, / will be converted to \/ + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json + + + + + List of property names to exclude when is true + + + + + Option to include all properties from the log event (as JSON) + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + How far should the JSON serializer follow object references before backing off + + + + + + + + + + + + + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + Determines whether or not this attribute will be Json encoded. + + + + + Should forward slashes be escaped? If true, / will be converted to \/ + + + + + Indicates whether to escape non-ascii characters + + + + + Whether an attribute with empty value should be included in the output + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + + + + Option to include all properties from the log events + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of property names to exclude when is true + + + + + Option to include all properties from the log event (as XML) + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + How far should the XML serializer follow object references before backing off + + + + + XML element name to use for rendering IList-collections items + + + + + XML attribute name to use when rendering property-key When null (or empty) then key-attribute is not included + + + + + XML element name to use when rendering properties + + + + + XML attribute name to use when rendering property-value When null (or empty) then value-attribute is not included and value is formatted as XML-element-value + + + + + Name of the root XML element + + + + + Value inside the root XML element + + + + + Whether a ElementValue with empty value should be included in the output + + + + + Auto indent and create new lines + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + + + + + + + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + Whether an attribute with empty value should be included in the output + + + + + + + + + + + + + + + + + + + + + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + Name of the element + + + + + Value inside the element + + + + + Whether a ElementValue with empty value should be included in the output + + + + + Auto indent and create new lines + + + + + List of property names to exclude when is true + + + + + Option to include all properties from the log event (as XML) + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + How far should the XML serializer follow object references before backing off + + + + + XML element name to use for rendering IList-collections items + + + + + XML attribute name to use when rendering property-key When null (or empty) then key-attribute is not included + + + + + XML element name to use when rendering properties + + + + + XML attribute name to use when rendering property-value When null (or empty) then value-attribute is not included and value is formatted as XML-element-value + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout. + + + + + Layout to be used to filter log messages. + + + + + Max number of unique filter values to expect simultaneously + + + + + Max length of filter values, will truncate if above limit + + + + + How long before a filter expires, and logging is accepted again + + + + + Default buffer size for the internal buffers + + + + + Reuse internal buffers, and doesn't have to constantly allocate new buffers + + + + + Append FilterCount to the when an event is no longer filtered + + + + + Insert FilterCount value into when an event is no longer filtered + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MidiPlayer.Win64/Program.cs b/MidiPlayer.Win64/Program.cs new file mode 100644 index 0000000..ff926e8 --- /dev/null +++ b/MidiPlayer.Win64/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MidiPlayer.Win64 { + static class Program { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() { + Application.SetHighDpiMode(HighDpiMode.SystemAware); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/MidiPlayer.Win64/libs/libfluidsynth-2.dll b/MidiPlayer.Win64/libs/libfluidsynth-2.dll new file mode 100644 index 0000000..b5db757 Binary files /dev/null and b/MidiPlayer.Win64/libs/libfluidsynth-2.dll differ diff --git a/MidiPlayer.Win64/libs/libglib-2.0-0.dll b/MidiPlayer.Win64/libs/libglib-2.0-0.dll new file mode 100644 index 0000000..cde4d25 Binary files /dev/null and b/MidiPlayer.Win64/libs/libglib-2.0-0.dll differ diff --git a/MidiPlayer.Win64/libs/libgobject-2.0-0.dll b/MidiPlayer.Win64/libs/libgobject-2.0-0.dll new file mode 100644 index 0000000..c47b668 Binary files /dev/null and b/MidiPlayer.Win64/libs/libgobject-2.0-0.dll differ diff --git a/MidiPlayer.Win64/libs/libgthread-2.0-0.dll b/MidiPlayer.Win64/libs/libgthread-2.0-0.dll new file mode 100644 index 0000000..8dfe463 Binary files /dev/null and b/MidiPlayer.Win64/libs/libgthread-2.0-0.dll differ diff --git a/MidiPlayer.Win64/libs/libinstpatch-2.dll b/MidiPlayer.Win64/libs/libinstpatch-2.dll new file mode 100644 index 0000000..0302fd6 Binary files /dev/null and b/MidiPlayer.Win64/libs/libinstpatch-2.dll differ diff --git a/MidiPlayer.Win64/libs/libintl-8.dll b/MidiPlayer.Win64/libs/libintl-8.dll new file mode 100644 index 0000000..de0ef30 Binary files /dev/null and b/MidiPlayer.Win64/libs/libintl-8.dll differ diff --git a/MidiPlayer.Win64/libs/libsndfile-1.dll b/MidiPlayer.Win64/libs/libsndfile-1.dll new file mode 100644 index 0000000..9817e8b Binary files /dev/null and b/MidiPlayer.Win64/libs/libsndfile-1.dll differ diff --git a/MidiPlayer.sln b/MidiPlayer.sln index 44d6895..5862a6c 100644 --- a/MidiPlayer.sln +++ b/MidiPlayer.sln @@ -11,6 +11,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MidiPlayer.FluidSynth", "Mi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MidiPlayerTests", "MidiPlayerTests\MidiPlayerTests.csproj", "{0C4ED722-5C23-4C5B-A478-A8D9279C413C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiPlayer.Win64", "MidiPlayer.Win64\MidiPlayer.Win64.csproj", "{A99AAD96-61C9-481B-8156-DBCD279A742A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,6 +37,10 @@ Global {0C4ED722-5C23-4C5B-A478-A8D9279C413C}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C4ED722-5C23-4C5B-A478-A8D9279C413C}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C4ED722-5C23-4C5B-A478-A8D9279C413C}.Release|Any CPU.Build.0 = Release|Any CPU + {A99AAD96-61C9-481B-8156-DBCD279A742A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A99AAD96-61C9-481B-8156-DBCD279A742A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A99AAD96-61C9-481B-8156-DBCD279A742A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A99AAD96-61C9-481B-8156-DBCD279A742A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MidiPlayer/MidiPlayer.csproj b/MidiPlayer/MidiPlayer.csproj index 5ee367a..19284d4 100644 --- a/MidiPlayer/MidiPlayer.csproj +++ b/MidiPlayer/MidiPlayer.csproj @@ -5,7 +5,10 @@ - + + + + diff --git a/MidiPlayerTests/MidiPlayerTests.csproj b/MidiPlayerTests/MidiPlayerTests.csproj index 09e7fb0..9a553cc 100644 --- a/MidiPlayerTests/MidiPlayerTests.csproj +++ b/MidiPlayerTests/MidiPlayerTests.csproj @@ -15,6 +15,10 @@ + + + +