### Initialize a MIDI file with track chunks Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/high-level-managing/Removing-objects.md Setup example showing a MIDI file structure with text and note events. ```csharp var midiFile = new MidiFile( new TrackChunk( new TextEvent("A") { DeltaTime = 10 }, new NoteOnEvent(), new NoteOffEvent()), new TrackChunk( new TextEvent("B"))); ``` -------------------------------- ### Record MIDI Data and Save to File Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/recording/Overview.md This example demonstrates the complete process of starting MIDI event listening, initiating recording, stopping it, converting recorded data to a MIDI file, and saving it. Remember to dispose of the recording object after use. ```csharp using (var inputDevice = InputDevice.GetByName("Input MIDI device")) { var recording = new Recording(TempoMap.Default, inputDevice); inputDevice.StartEventsListening(); recording.Start(); // ... recording.Stop(); var recordedFile = recording.ToFile(); recording.Dispose(); recordedFile.Write("Recorded data.mid"); } ``` -------------------------------- ### Example output for GetNotes Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/high-level-managing/Getting-objects.md The expected console output after running the GetNotes example. ```text Notes: note C-1 (note number = 0) time = 0 length = 0 velocity = 0 off velocity = 0 note A#4 (note number = 70) time = 10 length = 70 velocity = 50 off velocity = 30 ``` -------------------------------- ### NoteOnEvent Example Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiTrack/Middle/pilgrim.txt Demonstrates the creation of a NoteOnEvent with specified properties. ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)59,Velocity=(SevenBitNumber)47,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)47,Channel=(FourBitNumber)2,DeltaTime=66,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)57,Channel=(FourBitNumber)2,DeltaTime=0,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)59,Velocity=(SevenBitNumber)48,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)48,Channel=(FourBitNumber)2,DeltaTime=52,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)56,Channel=(FourBitNumber)2,DeltaTime=0,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)59,Velocity=(SevenBitNumber)43,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)51,Channel=(FourBitNumber)2,DeltaTime=92,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)50,Velocity=(SevenBitNumber)48,Channel=(FourBitNumber)2,DeltaTime=0,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)51,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)50,Velocity=(SevenBitNumber)45,Channel=(FourBitNumber)2,DeltaTime=66,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)51,Channel=(FourBitNumber)2,DeltaTime=0,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)51,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)54,Channel=(FourBitNumber)2,DeltaTime=62,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)52,Channel=(FourBitNumber)2,DeltaTime=4,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)50,Velocity=(SevenBitNumber)42,Channel=(FourBitNumber)2,DeltaTime=0,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)59,Channel=(FourBitNumber)2,DeltaTime=60,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)50,Velocity=(SevenBitNumber)46,Channel=(FourBitNumber)2,DeltaTime=0,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)52,Channel=(FourBitNumber)2,DeltaTime=4,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)46,Channel=(FourBitNumber)2,DeltaTime=146,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)53,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)59,Velocity=(SevenBitNumber)51,Channel=(FourBitNumber)2,DeltaTime= ``` -------------------------------- ### Create Note On Event for Repeated Sequence Start Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiTrack/Middle/63sjgm.txt Example of creating a Note On event at the start of a repeated sequence. ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)119,Channel=(FourBitNumber)0,DeltaTime=5,} ``` -------------------------------- ### Initial NoteOnEvent with DeltaTime Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiTrack/Middle/Sor_Fantaisie_No2_Op4.txt Example of an initial NoteOnEvent with a non-zero DeltaTime. This is useful for setting up the start of a MIDI sequence. ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64, Velocity=(SevenBitNumber)80, Channel=(FourBitNumber)0, DeltaTime=480, } ``` -------------------------------- ### Using InputDevice in a Console App - DryWetMIDI Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/devices/Input-device.md This example demonstrates how to set up an input MIDI device, listen for incoming events, and handle them in a console application. Ensure you dispose of the device instance when it's no longer needed. ```csharp using System; using Melanchall.DryWetMidi.Multimedia; namespace InputDeviceExample { class Program { private static IInputDevice _inputDevice; static void Main(string[] args) { _inputDevice = InputDevice.GetByName("Some MIDI device"); _inputDevice.EventReceived += OnEventReceived; _inputDevice.StartEventsListening(); Console.WriteLine("Input device is listening for events. Press any key to exit..."); Console.ReadKey(); (_inputDevice as IDisposable)?.Dispose(); } private static void OnEventReceived(object sender, MidiEventReceivedEventArgs e) { var midiDevice = (MidiDevice)sender; Console.WriteLine($"Event received from '{midiDevice.Name}' at {DateTime.Now}: {e.Event}"); } } } ``` -------------------------------- ### Initialize Recording with Tempo Map and Input Device Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/recording/Overview.md Instantiate the Recording class by providing a TempoMap and an InputDevice. Ensure the input device is properly obtained and managed. ```csharp using Melanchall.DryWetMidi.Multimedia; using Melanchall.DryWetMidi.Interaction; // ... using (var inputDevice = InputDevice.GetByName("Input MIDI device")) { var recording = new Recording(TempoMap.Default, inputDevice); // ... } ``` -------------------------------- ### MIDI Note On Events Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiSequence/Large/Fight6.txt Examples of creating NoteOnEvent objects, which signal the start of a musical note. Parameters include NoteNumber, Velocity, Channel, and DeltaTime. ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)56,Channel=(FourBitNumber)5,DeltaTime=2,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)124,Channel=(FourBitNumber)5,DeltaTime=30,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)70,Velocity=(SevenBitNumber)124,Channel=(FourBitNumber)3,DeltaTime=1,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)118,Channel=(FourBitNumber)2,DeltaTime=18,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=37,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)31,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=4,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)122,Channel=(FourBitNumber)2,DeltaTime=16,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)73,Velocity=(SevenBitNumber)125,Channel=(FourBitNumber)3,DeltaTime=0,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)58,Velocity=(SevenBitNumber)120,Channel=(FourBitNumber)5,DeltaTime=0,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)92,Channel=(FourBitNumber)6,DeltaTime=0,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)61,Velocity=(SevenBitNumber)107,Channel=(FourBitNumber)4,DeltaTime=0,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=38,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)31,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=7,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)74,Channel=(FourBitNumber)6,DeltaTime=15,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)31,Velocity=(SevenBitNumber)52,Channel=(FourBitNumber)11,DeltaTime=1,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=127,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)31,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=4,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)70,Velocity=(SevenBitNumber)124,Channel=(FourBitNumber)3,DeltaTime=21,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)58,Channel=(FourBitNumber)6,DeltaTime=0,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)113,Channel=(FourBitNumber)4,DeltaTime=2,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)70,Velocity=(SevenBitNumber)49,Channel=(FourBitNumber)3,DeltaTime=0,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)113,Channel=(FourBitNumber)4,DeltaTime=2,} ``` -------------------------------- ### Create and Play MIDI in Unity Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/dev/Using-in-Unity.md This script demonstrates creating a MIDI file with a pattern of notes and playing it through a specified output device. Ensure the OnApplicationQuit method is implemented to properly dispose of MIDI resources. ```csharp using System; using System.Linq; using System.Text; using Melanchall.DryWetMidi.Common; using Melanchall.DryWetMidi.Composing; using Melanchall.DryWetMidi.Core; using Melanchall.DryWetMidi.Interaction; using Melanchall.DryWetMidi.Multimedia; using Melanchall.DryWetMidi.Standards; using UnityEngine; public class DemoScript : MonoBehaviour { private const string OutputDeviceName = "Microsoft GS Wavetable Synth"; private OutputDevice _outputDevice; private Playback _playback; private void Start() { InitializeOutputDevice(); var midiFile = CreateTestFile(); InitializeFilePlayback(midiFile); StartPlayback(); } private void OnApplicationQuit() { Debug.Log("Releasing playback and device..."); if (_playback != null) { _playback.NotesPlaybackStarted -= OnNotesPlaybackStarted; _playback.NotesPlaybackFinished -= OnNotesPlaybackFinished; _playback.Dispose(); } if (_outputDevice != null) _outputDevice.Dispose(); Debug.Log("Playback and device released."); } private void InitializeOutputDevice() { Debug.Log($"Initializing output device [{OutputDeviceName}]..."); var allOutputDevices = OutputDevice.GetAll(); if (!allOutputDevices.Any(d => d.Name == OutputDeviceName)) { var allDevicesList = string.Join(Environment.NewLine, allOutputDevices.Select(d => $" {d.Name}")); Debug.Log($"There is no [{OutputDeviceName}] device presented in the system. Here the list of all device:{Environment.NewLine}{allDevicesList}"); return; } _outputDevice = OutputDevice.GetByName(OutputDeviceName); Debug.Log($"Output device [{OutputDeviceName}] initialized."); } private MidiFile CreateTestFile() { Debug.Log("Creating test MIDI file..."); var patternBuilder = new PatternBuilder() .SetNoteLength(MusicalTimeSpan.Eighth) .SetVelocity(SevenBitNumber.MaxValue) .ProgramChange(GeneralMidiProgram.Harpsichord); foreach (var noteNumber in SevenBitNumber.Values) { patternBuilder.Note(Melanchall.DryWetMidi.MusicTheory.Note.Get(noteNumber)); } var midiFile = patternBuilder.Build().ToFile(TempoMap.Default); Debug.Log("Test MIDI file created."); return midiFile; } private void InitializeFilePlayback(MidiFile midiFile) { Debug.Log("Initializing playback..."); _playback = midiFile.GetPlayback(_outputDevice); _playback.Loop = true; _playback.NotesPlaybackStarted += OnNotesPlaybackStarted; _playback.NotesPlaybackFinished += OnNotesPlaybackFinished; Debug.Log($"Output device [{OutputDeviceName}] initialized."); } private void StartPlayback() { Debug.Log("Starting playback..."); _playback.Start(); } private void OnNotesPlaybackFinished(object sender, NotesEventArgs e) { LogNotes("Notes finished:", e); } private void OnNotesPlaybackStarted(object sender, NotesEventArgs e) { LogNotes("Notes started:", e); } private void LogNotes(string title, NotesEventArgs e) { var message = new StringBuilder() .AppendLine(title) .AppendLine(string.Join(Environment.NewLine, e.Notes.Select(n => $" {n}"))) .ToString(); Debug.Log(message.Trim()); } } ``` -------------------------------- ### MIDI Note On Event Example Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiSequence/Large/tiedemo.txt Represents a MIDI Note On event with properties for note number, velocity, channel, and delta time. Used to signal the start of a note. ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)63,Channel=(FourBitNumber)2,DeltaTime=2,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)57,Velocity=(SevenBitNumber)74,Channel=(FourBitNumber)14,DeltaTime=12,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)60,Velocity=(SevenBitNumber)110,Channel=(FourBitNumber)12,DeltaTime=22,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)48,Velocity=(SevenBitNumber)108,Channel=(FourBitNumber)6,DeltaTime=2,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)2,DeltaTime=23,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)92,Channel=(FourBitNumber)14,DeltaTime=26,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)48,Velocity=(SevenBitNumber)89,Channel=(FourBitNumber)12,DeltaTime=2,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)48,Velocity=(SevenBitNumber)99,Channel=(FourBitNumber)6,DeltaTime=61,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)63,Velocity=(SevenBitNumber)102,Channel=(FourBitNumber)12,DeltaTime=2,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)51,Velocity=(SevenBitNumber)94,Channel=(FourBitNumber)12,DeltaTime=18,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)46,Velocity=(SevenBitNumber)112,Channel=(FourBitNumber)6,DeltaTime=7,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)114,Channel=(FourBitNumber)12,DeltaTime=4,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)54,Velocity=(SevenBitNumber)109,Channel=(FourBitNumber)12,DeltaTime=39,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)42,Velocity=(SevenBitNumber)114,Channel=(FourBitNumber)6,DeltaTime=24,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)30,Velocity=(SevenBitNumber)100,Channel=(FourBitNumber)15,DeltaTime=0,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)42,Velocity=(SevenBitNumber)105,Channel=(FourBitNumber)15,DeltaTime=0,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)70,Velocity=(SevenBitNumber)111,Channel=(FourBitNumber)12,DeltaTime=6,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)58,Velocity=(SevenBitNumber)95,Channel=(FourBitNumber)12,DeltaTime=8,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)42,Velocity=(SevenBitNumber)97,Channel=(FourBitNumber)6,DeltaTime=16,} ``` ```C# new NoteOnEvent { NoteNumber=(SevenBitNumber)60,Velocity=(SevenBitNumber)108,Channel=(FourBitNumber)4,DeltaTime=} ``` -------------------------------- ### MIDI Note On/Off Events Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiTrack/Middle/Sor_Fantaisie_No2_Op4.txt Examples of creating NoteOnEvent and NoteOffEvent objects. These events represent the start and end of a musical note, respectively. They include properties like NoteNumber, Velocity, Channel, and DeltaTime. ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)63,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)66,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)71,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)64,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)69,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)63,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)63,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=240,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)63,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)63,Velocity=(SevenBitNumber)80,Channel=(FourBitNumber)0,DeltaTime=480,} ``` ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)63,Velocity=(SevenBitNumber)127,Channel=(FourBitNumber)0,DeltaTime=0,} ``` ```csharp new NoteOffEvent { NoteNumber=(SevenBitNumber)63,Velocit ``` -------------------------------- ### Create and Access Virtual MIDI Devices Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/devices/Virtual-device.md Demonstrates creating a virtual device and accessing its underlying input and output subdevices. ```csharp using System; using Melanchall.DryWetMidi.Multimedia; namespace DwmExamples { class Program { static void Main(string[] args) { var virtualDevice = VirtualDevice.Create("MyDevice"); Console.WriteLine($"Virtual device {virtualDevice} created with subdevices:"); Console.WriteLine($" input = {virtualDevice.InputDevice.Name}"); Console.WriteLine($" output = {virtualDevice.OutputDevice.Name}"); var inputDevice = InputDevice.GetByName("MyDevice"); Console.WriteLine($"Input device {inputDevice.Name} got as regular input device."); var outputDevice = OutputDevice.GetByName("MyDevice"); Console.WriteLine($"Output device {outputDevice.Name} got as regular output device."); Console.ReadKey(); } } } ``` ```text Virtual device Virtual device created with subdevices: input = MyDevice output = MyDevice Input device MyDevice got as regular input device. Output device MyDevice got as regular output device. ``` -------------------------------- ### Define Custom Multi-Cell Actions for Piano Roll Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/composing/Pattern.md Define custom actions for multi-cell notes in the piano roll string. This example demonstrates creating quiet notes using custom start and end symbols. ```csharp var pianoRollSettings = new PianoRollSettings { CustomActions = new[] { PianoRollAction.CreateMultiCell('{', '}', (pianoRollBuilder, context) => pianoRollBuilder .Note(context.Note, context.Length, (SevenBitNumber)40)), } }; var pattern = new PatternBuilder() .SetNoteLength(MusicalTimeSpan.Eighth.SingleDotted()) .PianoRoll(@"\n A4 ----{==}\n B3 -{=}----\n G#3 -----{}-", pianoRollSettings) .Build(); ``` -------------------------------- ### Manage virtual MIDI devices and watch events Source: https://github.com/melanchall/drywetmidi/blob/develop/README.md Demonstrates how to monitor device connection changes and create a virtual loopback MIDI device. ```csharp DevicesWatcher.Instance.DeviceAdded += OnDeviceAdded; DevicesWatcher.Instance.DeviceRemoved += OnDeviceRemoved; // Virtual device creation will cause DevicesWatcher.Instance.DeviceAdded // will be fired since one input device and one output device // will be created var virtualDevice = VirtualDevice.Create("My Virtual Device"); virtualDevice.InputDevice.EventReceived += OnEventReceived; virtualDevice.InputDevice.StartEventsListening(); // Since virtual device is a loopback device in DryWetMIDI, // this event will be received on virtualDevice.InputDevice virtualDevice.OutputDevice.SendEvent(new PitchBendEvent(2000)); // Dispose the virtual device when you don't need it anymore virtualDevice.Dispose(); // Events handlers private static void OnDeviceAdded(object? sender, DeviceAddedRemovedEventArgs e) { // ... } private static void OnDeviceRemoved(object? sender, DeviceAddedRemovedEventArgs e) { // ... } private static void OnEventReceived(object sender, MidiEventReceivedEventArgs e) { // ... } ``` -------------------------------- ### MIDI Event Initializations Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiSequence/Large/executor.txt Examples of instantiating MIDI events including NoteOn, NoteOff, ControlChange, and SysEx events with specific parameters. ```C# Event { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)39,Channel=(FourBitNumber)6,DeltaTime=28,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)119,Channel=(FourBitNumber)14,DeltaTime=2,},new NoteOffEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)30,Channel=(FourBitNumber)15,DeltaTime=8,},new NoteOffEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)30,Channel=(FourBitNumber)12,DeltaTime=0,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)118,Channel=(FourBitNumber)14,DeltaTime=23,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)117,Channel=(FourBitNumber)14,DeltaTime=30,},new NoteOnEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)117,Channel=(FourBitNumber)15,DeltaTime=9,},new NoteOnEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)117,Channel=(FourBitNumber)12,DeltaTime=0,},new NoteOnEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)92,Channel=(FourBitNumber)6,DeltaTime=0,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)116,Channel=(FourBitNumber)14,DeltaTime=21,},new NormalSysExEvent { Data=new byte[] {125,1,1,3,0,1,4,3,16,0,247},DeltaTime=19,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)115,Channel=(FourBitNumber)14,DeltaTime=11,},new NoteOffEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)27,Channel=(FourBitNumber)15,DeltaTime=7,},new NoteOffEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)27,Channel=(FourBitNumber)12,DeltaTime=0,},new NoteOffEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)38,Channel=(FourBitNumber)6,DeltaTime=9,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)114,Channel=(FourBitNumber)14,DeltaTime=15,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)113,Channel=(FourBitNumber)14,DeltaTime=30,},new NoteOnEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)117,Channel=(FourBitNumber)15,DeltaTime=8,},new NoteOnEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)117,Channel=(FourBitNumber)12,DeltaTime=0,},new NoteOnEvent { NoteNumber=(SevenBitNumber)28,Velocity=(SevenBitNumber)117,Channel=(FourBitNumber)15,DeltaTime=0,},new NoteOnEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)89,Channel=(FourBitNumber)6,DeltaTime=0,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)112,Channel=(FourBitNumber)14,DeltaTime=22,},new NoteOffEvent { NoteNumber=(SevenBitNumber)35,Velocity=(SevenBitNumber)28,Channel=(FourBitNumber)15,DeltaTime=4,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)111,Channel=(FourBitNumber)14,DeltaTime=26,},new NoteOffEvent { NoteNumber=(SevenBitNumber)52,Velocity=(SevenBitNumber)43,Channel=(FourBitNumber)6,DeltaTime=2,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)110,Channel=(FourBitNumber)14,DeltaTime=29,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)109,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)108,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)107,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)106,Channel=(FourBitNumber)14,DeltaTime=31,},new NoteOffEvent { NoteNumber=(SevenBitNumber)40,Velocity=(SevenBitNumber)18,Channel=(FourBitNumber)12,DeltaTime=11,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)105,Channel=(FourBitNumber)14,DeltaTime=19,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)104,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)103,Channel=(FourBitNumber)14,DeltaTime=31,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)102,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)101,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)100,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)99,Channel=(FourBitNumber)14,DeltaTime=31,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)98,Channel=(FourBitNumber)14,DeltaTime=30,},new ControlChangeEvent { ControlNumber=(SevenBitNumber)7,ControlValue=(SevenBitNumber)97,Channel=(FourBitNumber)14,DeltaTime=30,},new NoteOnEvent { NoteNumber=(SevenBitNumber)36,Velo ``` -------------------------------- ### Final Chord Example Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiTrack/Middle/63sjgm.txt Presents a final example of creating a chord with NoteOnEvents. ```csharp new NoteOnEvent { NoteNumber=(SevenBitNumber)55,Velocity=(SevenBitNumber)87,Channel=(FourBitNumber)1,DeltaTime=5,}, new NoteOnEvent { NoteNumber=(SevenBitNumber)59,Veloc ``` -------------------------------- ### Create MIDI File with Sequence and Notes Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/SingleTrack/Small/119ReverseCymbal.txt Demonstrates creating a MIDI file with a sequence track, tempo, time signature, program change, and several note on/off events. This is useful for generating custom MIDI sequences programmatically. ```csharp new MidiFile(new TrackChunk(new SequenceTrackNameEvent { Text="RevCymbl",DeltaTime=0,},new SetTempoEvent { MicrosecondsPerQuarterNote=545450,DeltaTime=0,},new TimeSignatureEvent { Numerator=4,Denominator=4,ClocksPerClick=24,ThirtySecondNotesPerBeat=8,DeltaTime=0,},new ProgramChangeEvent { ProgramNumber=(SevenBitNumber)119,Channel=(FourBitNumber)0,DeltaTime=0,},new NoteOnEvent { NoteNumber=(SevenBitNumber)76,Velocity=(SevenBitNumber)100,Channel=(FourBitNumber)0,DeltaTime=276,},new NoteOffEvent { NoteNumber=(SevenBitNumber)76,Velocity=(SevenBitNumber)100,Channel=(FourBitNumber)0,DeltaTime=1205,},new NoteOnEvent { NoteNumber=(SevenBitNumber)59,Velocity=(SevenBitNumber)110,Channel=(FourBitNumber)0,DeltaTime=86,},new NoteOffEvent { NoteNumber=(SevenBitNumber)59,Velocity=(SevenBitNumber)110,Channel=(FourBitNumber)0,DeltaTime=1262,},new NoteOnEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)112,Channel=(FourBitNumber)0,DeltaTime=57,},new NoteOffEvent { NoteNumber=(SevenBitNumber)43,Velocity=(SevenBitNumber)112,Channel=(FourBitNumber)0,DeltaTime=1465,},new NoteOnEvent { NoteNumber=(SevenBitNumber)45,Velocity=(SevenBitNumber)32,Channel=(FourBitNumber)0,DeltaTime=1157,},new NoteOffEvent { NoteNumber=(SevenBitNumber)45,Velocity=(SevenBitNumber)32,Channel=(FourBitNumber)0,DeltaTime=4,})) { TimeDivision=new TicksPerQuarterNoteTimeDivision(384) } ``` -------------------------------- ### Event Example Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiSequence/Middle/sw2.txt A generic MIDI Event example, likely a placeholder or base class usage. ```csharp Event { NoteNumber=(SevenBitNumber)79,Velocity=(SevenBitNumber)64,Channel=(FourBitNumber)14,DeltaTime=3,} ``` -------------------------------- ### NormalSysExEvent Examples Source: https://github.com/melanchall/drywetmidi/blob/develop/Resources/MIDI files/ValidReferences/MultiSequence/Small/tesb_impmarch_slow.txt Examples of creating NormalSysExEvent instances. These events are used for System Exclusive MIDI messages. ```C# new NormalSysExEvent { Data=new byte[] {125,1,1,2,0,1,3,2,34,1,247},DeltaTime=200,} ``` ```C# new NormalSysExEvent { Data=new byte[] {125,1,2,2,0,1,3,2,34,1,247},DeltaTime=208,} ``` -------------------------------- ### Compose First Four Bars of Moonlight Sonata Source: https://github.com/melanchall/drywetmidi/blob/develop/Docs/articles/composing/Pattern.md This example demonstrates building a complex MIDI pattern, including main theme notes and bass chords, using various PatternBuilder methods like Anchor, SetRootNote, Note, Repeat, MoveToFirstAnchor, Chord, and Build. ```csharp // Define a chord for bass part which is just an octave var bassChord = new[] { Interval.Twelve }; // Build the composition var pattern = new PatternBuilder() // The length of all main theme's notes within four first bars is // triplet eight so set it which will free us from necessity to specify // the length of each note explicitly .SetNoteLength(MusicalTimeSpan.Eighth.Triplet()) // Anchor current time (start of the pattern) to jump to it // when we'll start to program bass part .Anchor() // We will add notes relative to G#3. // Instead of Octave.Get(3).GSharp it is possible to use Note.Get(NoteName.GSharp, 3) .SetRootNote(Octave.Get(3).GSharp) // Add first three notes and repeat them seven times which will // give us two bars of the main theme // G#3 .Note(Interval.Zero) // +0 (G#3) .Note(Interval.Five) // +5 (C#4) .Note(Interval.Eight) // +8 (E4) .Repeat(3, 7) // repeat three previous notes seven times // Add notes of the next two bars // G#3 .Note(Interval.One) // +1 (A3) .Note(Interval.Five) // +5 (C#4) .Note(Interval.Eight) // +8 (E4) .Repeat(3, 1) // repeat three previous notes .Note(Interval.One) // +1 (A3) .Note(Interval.Six) // +6 (D4) .Note(Interval.Ten) // +10 (F#4) .Repeat(3, 1) // repeat three previous notes // reaching the end of third bar .Note(Interval.Zero) // +0 (G#3) .Note(Interval.Four) // +4 (C4) .Note(Interval.Ten) // +10 (F#4) .Note(Interval.Zero) // +0 (G#3) .Note(Interval.Five) // +5 (C#4) .Note(Interval.Eight) // +8 (E4) .Note(Interval.Zero) // +0 (G#3) .Note(Interval.Five) // +5 (C#4) .Note(Interval.Seven) // +7 (D#4) .Note(-Interval.Two) // -2 (F#3) .Note(Interval.Four) // +4 (C4) .Note(Interval.Seven) // +7 (D#4) // Now we will program bass part. To start adding notes from the // beginning of the pattern we need to move to the anchor we set // above .MoveToFirstAnchor() // First two chords have whole length .SetNoteLength(MusicalTimeSpan.Whole) // insert a chord relative to .Chord(bassChord, Octave.Get(2).CSharp) // C#2 (C#2, C#3) .Chord(bassChord, Octave.Get(1).B) // B1 (B1, B2) // Remaining four chords has half length .SetNoteLength(MusicalTimeSpan.Half) .Chord(bassChord, Octave.Get(1).A) // A1 (A1, A2) .Chord(bassChord, Octave.Get(1).FSharp) // F#1 (F#1, F#2) .Chord(bassChord, Octave.Get(1).GSharp) // G#1 (G#1, G#2) .Repeat() // repeat the previous chord // Build a pattern that can be then saved to a MIDI file .Build(); ```