using System.Collections.Concurrent; namespace SetAppVolumne { static class Program { static void Main(string[] args) { //Console.WriteLine(MidiIn.DeviceInfo(0).ProductName); var x = new LDP(); } } public class MidiEvent { public int controller; public float value; public DateTime time; public MidiEvent(int controller, float value) { this.controller = controller; this.value = getNormalizedValue(value); this.time = DateTime.Now.AddMilliseconds(8); } private float getNormalizedValue(float value) { // Max = 127 float range = Math.Clamp(value, 5f, 120f) - 5f; float norm = range / 115.0f; return norm; } } public class LDP { [DllImport("user32.dll")] public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId); [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); Dictionary lut = new Dictionary() { {51, "System"}, {52, "ActiveProcess"}, {55, "foobar2000"}, {57, "chrome"}, {58, "Discord"} }; ConcurrentDictionary event_list = new ConcurrentDictionary(); public LDP() { printProcessNames(); var inmidi = new MidiIn(0); inmidi.MessageReceived += midiIn_messageReceive; inmidi.Start(); while (true) { var now = DateTime.Now; foreach(var key in this.event_list.Keys) { var event_item = this.event_list[key]; if (now >= event_item.time) { setVolumeForMatchingProcessNames(this.lut[event_item.controller], event_item.value); while (!this.event_list.TryRemove(key, out _)) {} } } } } private void midiIn_messageReceive(object sender, MidiInMessageEventArgs e) { var concrete_event = ((NAudio.Midi.ControlChangeEvent)e.MidiEvent); int controller = (int)concrete_event.Controller; if (!lut.ContainsKey(controller) && !lut.ContainsKey(controller - 40)) { return; } if (controller > 90) { setMuteForMatchingProcessNames(lut[controller - 40], concrete_event.ControllerValue > 0); } else { var pod_event = new MidiEvent(controller, concrete_event.ControllerValue); this.event_list[controller] = pod_event; } } private void setVolumeForMatchingProcessNames(string proc_name, float volume) { var x = new MMDeviceEnumerator(); var device = x.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); if (proc_name == "System") { device.AudioEndpointVolume.MasterVolumeLevelScalar = volume; return; } if (proc_name == "ActiveProcess") { uint active_process; GetWindowThreadProcessId(GetForegroundWindow(), out active_process); var proc_name_ = Process.GetProcessById((int)active_process).ProcessName; for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++) { var session = device.AudioSessionManager.Sessions[i]; if (Process.GetProcessById((int)session.GetProcessID).ProcessName == proc_name_) { session.SimpleAudioVolume.Volume = volume; } } return; } for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++) { var session = device.AudioSessionManager.Sessions[i]; var process = Process.GetProcessById((int)session.GetProcessID); if (process.ProcessName.Contains(proc_name)) { session.SimpleAudioVolume.Volume = volume; } } } private void setMuteForMatchingProcessNames(string proc_name, bool mute) { var x = new MMDeviceEnumerator(); var device = x.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); if (proc_name == "System") { device.AudioEndpointVolume.Mute = mute; return; } if (proc_name == "ActiveProcess") { uint active_process; GetWindowThreadProcessId(GetForegroundWindow(), out active_process); var proc_name_ = Process.GetProcessById((int)active_process).ProcessName; for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++) { var session = device.AudioSessionManager.Sessions[i]; if (Process.GetProcessById((int)session.GetProcessID).ProcessName == proc_name_) { session.SimpleAudioVolume.Mute = mute; } } return; } for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++) { var session = device.AudioSessionManager.Sessions[i]; var process = Process.GetProcessById((int)session.GetProcessID); if (process.ProcessName.Contains(proc_name)) { session.SimpleAudioVolume.Mute = mute; } } } private void printProcessNames() { var x = new MMDeviceEnumerator(); var device = x.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); for (var i = 0; i < device.AudioSessionManager.Sessions.Count; i++) { var session = device.AudioSessionManager.Sessions[i]; var process = Process.GetProcessById((int)session.GetProcessID); Console.WriteLine(process.ProcessName); } } } }