/// <summary> /// Creates a new recording session object /// </summary> /// <param name="midiInput">Expected to be injected</param> public RecordSession(IMidiInput midiInput, IOutput output, IVirtualKeyBoard virtualKeyboard) { _midiInput = midiInput; _output = output; _virtualKeyboard = virtualKeyboard; Init(); }
public MidiBusAdapter(IEventBus eventBus, IMidiInput midiBus) { _eventBus = eventBus; _midiBus = midiBus; _midiBus.MessageReceived += ConsumeMidiEvent; }
public VirtualKeyBoard(IInputEvents inputEvents, IMidiInput midiInput, ILogger logger) { _inputEvents = inputEvents; _midiInput = midiInput; _logger = logger; Initialise(); }
public ScoreControl(IUnityContainer container, IOutput output, IMidiInput midiInput, IInputEvents inputEvents, IMediaServiceHost mediaServiceHost, IVirtualKeyBoard virtualKeyboard, ILogger logger, XScore musicScore) : this() { _container = container; _output = output; _intputEvents = inputEvents; _midiInput = midiInput; _virtualKeyboard = virtualKeyboard; _musicScore = musicScore; _mediaServiceHost = mediaServiceHost; _logger = logger; _updateScrollTimer = new Timer(ScrollTimerHandler, null, Timeout.Infinite, _scrollTimingPerdiod); _scoreParser = new ScoreParser(_musicScore, ScoreGrid); _scoreParser.Render(); ScoreGrid.Width = _scoreParser.GetMaxHorizontalPosition(); nextBarDetails = new BarDetails(); nextBarDetails.NoteTime = 0; nextBarDetails.XCoord = 0; _intputEvents.MessageReceived += HandleInputEvent; _midiInput.StartRecording(); ConfigureSongEventController(); }
/// <summary> /// Opens a new midi device from a device name and *should* automatically close the previous connection /// </summary> /// <param name="deviceInput">Midi input device name</param> /// <param name="deviceOutput">Midi output device name</param> public void OpenMidiDevice(string deviceInput, string deviceOutput) { if (midiOutput != null) { midiOutput.CloseAsync();//Will this wait for the port to be closed or does it really matter? } if (midiInput != null) { midiInput.MessageReceived -= MidiInput_MessageReceived; midiInput.CloseAsync();//Will this wait for the port to be closed or does it really matter? } var access = MidiAccessManager.Default; try { midiOutput = access.OpenOutputAsync(deviceOutput).Result; midiInput = access.OpenInputAsync(deviceInput).Result; midiInput.MessageReceived += MidiInput_MessageReceived; } catch (Exception e) { Console.WriteLine(e); } }
private RawMidiClient(IMidiInput input, string inputName, IMidiOutput output, string outputName, Action <RawMidiMessage> messageHandler) { this.input = input; InputName = inputName; this.output = output; OutputName = outputName; input.MessageReceived += (sender, args) => messageHandler(ConvertMessage(args)); }
private void closeDevice(IMidiInput device) { device.MessageReceived -= onMidiMessageReceived; // some devices may take some time to close, so this should be fire-and-forget. // the internal implementations look to have their own (eventual) timeout logic. Task.Factory.StartNew(() => device.CloseAsync(), TaskCreationOptions.LongRunning); }
public PushPad(IMidiInput pushIn, IMidiOutput pushOut, IMidiOutput virtualOutput, PushControl pushControl) { PushControl = pushControl; PushIn = pushIn; PushOut = pushOut; VirtualOut = virtualOutput; PushIn.MessageReceived += OnMidiData; }
public PushEncoder(IMidiInput pushIn, IMidiOutput pushOut, IMidiOutput virtualOut, PushControl pushControl, int mapToCC, MidiValueStore store) { PushControl = pushControl; PushIn = pushIn; PushOut = pushOut; VirtualOut = virtualOut; PushIn.MessageReceived += OnMidiData; MappedToCC = mapToCC; Store = store; }
internal RolandMidiClient(IMidiInput input, IMidiOutput output, string inputName, string outputName, byte rawDeviceId, ModuleIdentifier identifier) { this.input = input; this.output = output; input.MessageReceived += HandleMessage; InputName = inputName; OutputName = outputName; this.rawDeviceId = rawDeviceId; this.Identifier = identifier; }
public MidiCommunicationChannel(IMidiInput input, IMidiOutput output) { Input = input; Output = output; InputPortDetails = new MidiPortDetails(input.Details); OutputPortDetails = new MidiPortDetails(output.Details); Input.MessageReceived += Input_MessageReceived; }
public MidiInputDevice(IMidiInput midiInput) { MidiInput = midiInput; // Initialise these higher-level actions with empty callbacks MessageReceived = (MidiReceivedEventArgs e) => { }; NoteOn = (int noteNumber, int velocity) => { }; NoteOff = (int noteNumber) => { }; ControlChange = (int ccNumber, int value) => { }; // And add the message routing method to the base callback MidiInput.MessageReceived += ProcessMessageReceived; }
public LaunchPadManager(IMidiAccess access, IMidiInput input, IMidiOutput output) { if (input == null || output == null) { throw new ArgumentException("Please choose the connected Launchpad S before going further"); } this.access = access; this.input = input; this.output = output; StartListener(); }
public async Task InitAsync() { var inputs = MidiAccessManager.Default.Inputs; foreach (var inputDevice in inputs) { if (inputDevice.Name == "nanoKONTROL2") { _input = await MidiAccessManager.Default.OpenInputAsync(inputDevice.Id); _input.MessageReceived += Input_MessageReceived; } } }
private void ConfirmButtonPressed(object sender, RoutedEventArgs e) { input = access.OpenInputAsync(LaunchPadInputs.SelectedValue.ToString()).Result; output = access.OpenOutputAsync(LaunchPadOutputs.SelectedValue.ToString()).Result; try { lpmngr = new LaunchPadManager(access, input, output); InitMacroGrid(); } catch (ArgumentException ex) { MessageBox.Show(ex.Message, "LaunchPad Macros", MessageBoxButton.OK, MessageBoxImage.Exclamation); } }
//, ITestControlService currentTest) public MainWindowViewModel(IUnityContainer container, IMediaService mediaService, IDialogService dialogService, IOutput outputDevice, IMidiInput inputDevice, IVirtualKeyBoard keyBoard) { _container =container; _dialoagService = dialogService; _mediaService = mediaService; _output = outputDevice; _input = inputDevice; _keyBoard = keyBoard; //_currentTest = currentTest.Control; ResolveViews(); //Hook up keyboard (mouse presses) to output _keyBoard.KeyPressEvent += (o, e) => _output.Send(e); }
public MainWindowViewModel(IUnityContainer container, IMediaServiceHost mediaServiceHost, IDialogService dialogService, IOutput outputDevice, IMidiInput inputDevice, IVirtualKeyBoard keyBoard, ITestControlService currentTest, IInputEvents inputEvents) { _container =container; _dialoagService = dialogService; _mediaServiceHost = mediaServiceHost; _output = outputDevice; _input = inputDevice; _keyBoard = keyBoard; _currentTestControl = currentTest; availableTestControls = new ObservableCollection<ITestControlService>(); availableTestControls.Add(_currentTestControl); availableTestControls.Add(_container.Resolve<NoteGuess.NoteGuessControl>()); ResolveViews(); }
public MainWindowViewModel(IUnityContainer container, IMediaServiceHost mediaServiceHost, IDialogService dialogService, IOutput outputDevice, IMidiInput inputDevice, IVirtualKeyBoard keyBoard, ITestControlService currentTest, IInputEvents inputEvents) { _container = container; _dialoagService = dialogService; _mediaServiceHost = mediaServiceHost; _output = outputDevice; _input = inputDevice; _keyBoard = keyBoard; _currentTestControl = currentTest; availableTestControls = new ObservableCollection <ITestControlService>(); availableTestControls.Add(_currentTestControl); availableTestControls.Add(_container.Resolve <NoteGuess.NoteGuessControl>()); ResolveViews(); }
private async Task PollMidiConnection() { //Checking for added devices int numDevices = midi.Inputs.Count(); if (numDevices > inDevice.Count) { foreach (IMidiPortDetails details in midi.Inputs) { IMidiInput input = inDevice.Find(x => x.Details.Name.Equals(details.Name)); if (input == null) { IMidiInput newInput = midi.OpenInputAsync(details.Id).Result; inDevice.Add(newInput); this.Monitor.Log($"{newInput.Details.Name} connected", LogLevel.Info); break; } } } //Checking for removed devices if (numDevices < inDevice.Count) { foreach (IMidiInput input in inDevice) { IMidiPortDetails details = midi.Inputs.ToList().Find(x => x.Id.Equals(input.Details.Id)); if (details == null) { this.Monitor.Log($"{input.Details.Name} disconnected", LogLevel.Info); await input.CloseAsync(); inDevice.Remove(input); break; } } } await Task.Delay(1000 / 60); }
public APCIntance(IMidiOutput output, IMidiInput input) { outdevice = output; indevice = input; indevice.MessageReceived += Message_Received; for (int row = 0; row < 64; row++) { Seq64.Add(row, false); Clips.Add(row, false); } for (int row = 0; row < 8; row++) { Seq8a.Add(row, new Dictionary <int, bool>()); Seq8b.Add(row, new Dictionary <int, bool>()); Chords.Add(row, new List <int>()); for (int col = 0; col < 8; col++) { Seq8a[row].Add(col, false); Seq8b[row].Add(col, false); } } DrawPage(true); }
private void closeDevice(IMidiInput device) { device.CloseAsync().Wait(); device.MessageReceived -= onMidiMessageReceived; }
public Recorder() { this.access = (IMidiAccess2)MidiAccessManager.Default; this.input = access.OpenInputAsync(access.Inputs.Last().Id).Result; }
static void Main(string[] args) { //MIDIEngine.ListInputs(); //MIDIEngine.ListOutputs(); PushIn = MIDIEngine.UseInput("Ableton Push 2"); if (PushIn == null) { Console.WriteLine("\nCouldn't find an ableton Push 2 midi input, make sure it's plugged in and switched on"); return; } PushOut = MIDIEngine.UseOutput("Ableton Push 2"); if (PushOut == null) { Console.WriteLine("\nCouldn't find an Ableton Push 2 midi output make sure it's plugged in and switched on"); return; } VirtualOut = MIDIEngine.UseOutput("Push2Standalone"); if (VirtualOut == null) { Console.WriteLine( "Couldn't find a Virtual midi device.\n" + "Install a virtual midi device (https://www.tobias-erichsen.de/software/loopmidi.html)\n" + "and then create a virtual device named \"Push2Standalone\"" ); return; } Console.WriteLine("USING INPUT: " + PushIn.Details.Name); Console.WriteLine("USING OUTPUT: " + VirtualOut.Details.Name); var store = new MidiValueStore(); Enc1 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder1, 1, store); Enc2 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder2, 2, store); Enc3 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder3, 3, store); Enc4 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder4, 4, store); Enc5 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder5, 5, store); Enc6 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder6, 6, store); Enc7 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder7, 7, store); Enc8 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder8, 8, store); Pad11 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad11); Pad12 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad12); Pad13 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad13); Pad14 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad14); Pad15 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad15); Pad16 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad16); Pad17 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad17); Pad18 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad18); Pad21 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad21); Pad22 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad22); Pad23 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad23); Pad24 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad24); Pad25 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad25); Pad26 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad26); Pad27 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad27); Pad28 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad28); PadGroup CCSelectGroup = new PadGroup(122); CCSelectGroup.Add(Pad11); CCSelectGroup.Add(Pad12); CCSelectGroup.Add(Pad13); CCSelectGroup.Add(Pad14); CCSelectGroup.Add(Pad15); CCSelectGroup.Add(Pad16); CCSelectGroup.Add(Pad17); CCSelectGroup.Add(Pad18); CCSelectGroup.Add(Pad21); CCSelectGroup.Add(Pad22); CCSelectGroup.Add(Pad23); CCSelectGroup.Add(Pad24); CCSelectGroup.Add(Pad25); CCSelectGroup.Add(Pad26); CCSelectGroup.Add(Pad27); CCSelectGroup.Add(Pad28); var CCBank1 = Enumerable.Range(0, 8).ToArray(); var CCBank2 = Enumerable.Range(8, 16).ToArray(); var CCBank3 = Enumerable.Range(16, 24).ToArray(); var CCBank4 = Enumerable.Range(24, 32).ToArray(); var CCBank5 = Enumerable.Range(32, 40).ToArray(); var CCBank6 = Enumerable.Range(40, 48).ToArray(); var CCBank7 = Enumerable.Range(48, 56).ToArray(); var CCBank8 = Enumerable.Range(56, 64).ToArray(); var CCBank9 = Enumerable.Range(64, 72).ToArray(); var CCBank10 = Enumerable.Range(72, 80).ToArray(); var CCBank11 = Enumerable.Range(80, 88).ToArray(); var CCBank12 = Enumerable.Range(88, 96).ToArray(); var CCBank13 = Enumerable.Range(96, 104).ToArray(); var CCBank14 = Enumerable.Range(104, 112).ToArray(); var CCBank15 = Enumerable.Range(112, 120).ToArray(); var CCBank16 = Enumerable.Range(120, 127).ToArray(); EncoderGroup Encoders = new EncoderGroup(); Encoders.Add(Enc1); Encoders.Add(Enc2); Encoders.Add(Enc3); Encoders.Add(Enc4); Encoders.Add(Enc5); Encoders.Add(Enc6); Encoders.Add(Enc7); Encoders.Add(Enc8); Pad11.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad11.SetColor(4); Encoders.MapTo(CCBank1); }; Pad12.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad12.SetColor(4); Encoders.MapTo(CCBank2); }; Pad13.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad13.SetColor(4); Encoders.MapTo(CCBank3); }; Pad14.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad14.SetColor(4); Encoders.MapTo(CCBank4); }; Pad15.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad15.SetColor(4); Encoders.MapTo(CCBank5); }; Pad16.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad16.SetColor(4); Encoders.MapTo(CCBank6); }; Pad17.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad17.SetColor(4); Encoders.MapTo(CCBank7); }; Pad18.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad18.SetColor(4); Encoders.MapTo(CCBank8); }; Pad21.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad21.SetColor(4); Encoders.MapTo(CCBank9); }; Pad22.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad22.SetColor(4); Encoders.MapTo(CCBank10); }; Pad23.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad23.SetColor(4); Encoders.MapTo(CCBank11); }; Pad24.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad24.SetColor(4); Encoders.MapTo(CCBank12); }; Pad25.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad25.SetColor(4); Encoders.MapTo(CCBank13); }; Pad26.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad26.SetColor(4); Encoders.MapTo(CCBank14); }; Pad27.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad27.SetColor(4); Encoders.MapTo(CCBank15); }; Pad28.OnNoteOn += (data) => { CCSelectGroup.SetColor(122); Pad28.SetColor(4); Encoders.MapTo(CCBank16); }; Console.WriteLine("\nActive. Press escape to leave..."); while (true) { var key = Console.ReadKey().Key; if (key == ConsoleKey.Escape) { break; } ; } // Turn off lights CCSelectGroup.SetColor(0); // Clean up PushIn.Dispose(); PushOut.Dispose(); VirtualOut.Dispose(); }
public async void SetInputPort(IMidiPortDetails port) { await input.CloseAsync(); this.input = access.OpenInputAsync(port.Id).Result; }
static async Task Main(string[] args) { Console.WriteLine("MIDI to BLE Bridge"); var access = MidiAccessManager.Default; var midiPort = access.Inputs.FirstOrDefault(inp => inp.Name.Contains("mio", StringComparison.OrdinalIgnoreCase)); if (midiPort == null) { midiPort = access.Inputs.FirstOrDefault(inp => inp.Name.Contains("vmpk", StringComparison.OrdinalIgnoreCase)); } IMidiInput input = null; if (midiPort != null) { Console.WriteLine($"Found {midiPort.Name}. Opening..."); input = await access.OpenInputAsync(midiPort.Id); // There seems to be a pretty bad race condition inside the library. // If your MIDI device is streaming data but there is no MessageReceived delegate, it will // throw a NRE. So register this dummy here for now. input.MessageReceived += (obj, e) => {}; } else { Console.WriteLine("No suitable MIDI port found."); } Task.Run(async() => { using (var connection = new Connection(Address.System)) { await connection.ConnectAsync(); var hci0Path = new ObjectPath("/org/bluez/hci0"); var serviceName = "org.bluez"; var hci0Adapter = connection.CreateProxy <IAdapter1>(serviceName, hci0Path); // Based on BlueZ sample code. Verify what it does. Does it really turn my BT adapeter on if it was off? Console.WriteLine("Setting power to true on device 1"); await hci0Adapter.SetPoweredAsync(true); var advertisement = new LEAdvertisement(new LEAdvertisementProperties { Type = "peripheral", LocalName = "MIDI-BRIDGE" }); advertisement.LEAdvertisementProperties.ServiceUUIDs = new string[] { "03B80E5A-EDE8-4B33-A751-6CE34EC4C700" }; // Generic computer icon advertisement.LEAdvertisementProperties.Appearance = 0x0080; // We need to register the LEAdvertisement object. This basically publishes the object // so that when we get the DBus callback to read all the properties, we're good to go. await connection.RegisterObjectAsync(advertisement); var advertisingManager = connection.CreateProxy <ILEAdvertisingManager1>(serviceName, hci0Path); await advertisingManager.RegisterAdvertisementAsync(advertisement, new Dictionary <string, object>()); Application application = new Application(@"/org/bluez/example"); GattService1 service = new GattService1(application.ObjectPath, 0, "03B80E5A-EDE8-4B33-A751-6CE34EC4C700", true); GattCharacteristic1 gattCharacteristic1 = new GattCharacteristic1(service.ObjectPath, 0, "7772E5DB-3868-4112-A1A9-F2669D106BF3", new string[] { "notify", "read", "write-without-response" }); // TODO: Remove PlayNote out of gattCharacteristic. Bridge should handle locking. Bridge midiBleBridge = new Bridge(data => gattCharacteristic1.Value = data); midiBleBridge.StartActiveSense(); if (input != null) { input.MessageReceived += (obj, e) => { midiBleBridge.ReceiveMidiMessage(e.Length, e.Data); }; } service.AddCharacteristic(gattCharacteristic1); application.AddService(service); await connection.RegisterObjectAsync(application); var gattManager = connection.CreateProxy <IGattManager1>(serviceName, new ObjectPath(@"/org/bluez/hci0")); await connection.RegisterObjectAsync(gattCharacteristic1); await gattManager.RegisterApplicationAsync(application, new Dictionary <string, object>()); Console.WriteLine("Press <Ctrl>+c to exit..."); await Task.Delay(int.MaxValue); } }).Wait(); await input.CloseAsync(); }
/// <summary> /// Creates a new recording session object /// </summary> /// <param name="midiInput">Expected to be injected</param> public RecordSession(IMidiInput midiInput) { _midiInput = midiInput; }
//A client to read MIDI inputs, send them to a light server, and (optionally) forwards them to an output MIDI device static void Main(string[] args) { Console.WriteLine("MIDI Message splitter client"); var testmode = false; var remapNotes = true; //remap MIDI notes here (src,target) Dictionary <int, int> noteMapping = new Dictionary <int, int> { { 39, 38 }, //Snare Rim -> Snare { 28, 26 }, //Lcymbal -> Hihat { 52, 51 }, //Ride bell -> Ride { 53, 51 }, //Mcymbal -> Ride { 59, 49 }, //xLCymbal -> RCymbal }; string targetAddress = "127.0.0.1"; int targetPort = 5005; if (args.Length > 0) { if (args[0] != null) { targetAddress = args[0]; } if (args[1] != null) { int.TryParse(args[1], out targetPort); } } TcpClient client = new TcpClient(targetAddress, targetPort); NetworkStream stream = client.GetStream(); try { if (testmode) { while (true) { var inputstr = Console.ReadLine(); TransmitMessage(inputstr, stream); Console.WriteLine($"Sent message {inputstr}"); } } var access = MidiAccessManager.Default; IMidiInput input = null; IMidiOutput output = null; string chosenIdIn = ""; string chosenIdOut = ""; foreach (IMidiPortDetails portdetails in access.Inputs) { Console.WriteLine($"Input: {portdetails.Name} / ID: {portdetails.Id}"); } if (access.Inputs.Count() <= 0) { throw new InvalidOperationException("No input devices detected!"); } else if (access.Inputs.Count() == 1) { //Default chosenIdIn = access.Inputs.First().Id; Console.WriteLine("Using default input..."); } else { //Choose from list Console.WriteLine("Enter input device ID to use:"); chosenIdIn = Console.ReadLine(); } input = access.OpenInputAsync(chosenIdIn).Result; if (access.Outputs.Count() > 0) { foreach (IMidiPortDetails portdetails in access.Outputs) { Console.WriteLine($"Output: {portdetails.Name} / ID: {portdetails.Id}"); } Console.WriteLine("Enter output device ID to use:"); chosenIdOut = Console.ReadLine(); } try { output = access.OpenOutputAsync(chosenIdOut).Result; } catch { Console.WriteLine("Couldn't open output device, ignoring..."); } Console.WriteLine("Reading events..."); input.MessageReceived += (object sender, MidiReceivedEventArgs e) => { string[] outputs = new string[5] { "0", "0", "0", "0", "0" }; for (int i = 0; i < e.Length; i++) { outputs[i] = e.Data[i].ToString(); } outputs[4] = e.Timestamp.ToString(); TransmitMessage($"{outputs[0]},{outputs[1]},{outputs[2]},{outputs[3]},{outputs[4]},", stream); Console.WriteLine($"{outputs[0]},{outputs[1]},{outputs[2]},{outputs[3]},{outputs[4]}"); if (output != null) { if (remapNotes) { int noteNumberIn = e.Data[1]; byte noteNumberOut = 0; if (noteMapping.ContainsKey(noteNumberIn)) { Console.WriteLine($"Remapping note {noteNumberIn} to {noteMapping[noteNumberIn]}"); noteNumberOut = (byte)noteMapping[noteNumberIn]; e.Data[1] = noteNumberOut; } } output.Send(e.Data, 0, e.Data.Length, e.Timestamp); } }; Console.ReadKey(); } finally { TransmitMessage("disconnect", stream); stream.Close(); client.Close(); } }