我可以在 Mac 应用程序中轻松识别 MIDI 音符吗?
Can I easily recognize MIDI Notes in Mac app?
首先,我对 Mac 开发几乎一无所知。我是 Windows 开发人员。在发现没有简单的方法可以用 C# 完成我要告诉您的内容后,我想也许是时候学习 Swift。但是,在我出去购买 Mac 并学习 Mac 开发之前,我想确保这很容易实现。
我有一个背面有 USB 端口的钢琴键盘。当我使用 USB 转闪电适配器将我的钢琴插入我的 iPhone 并为 iOS 打开 GarageBand 时,当我在我的钢琴上弹奏一个键时,该键会在我的 iPhone 上演奏!我想使用相同的技术(根据研究,我认为是 MIDI)做一些类似的事情来制作一个应用程序,当我按下钢琴上的一个键时,Mac 会根据什么执行某个命令键被按下。例如,如果按下 D 键,将出现一个弹出框并显示 "You pressed D-flat!".
据我所知,如果不从互联网上安装一些以前没人听说过的可疑第三方库,就没有简单的方法可以在 C# 中执行此操作。我认为,由于 Apple 制作了 GarageBand,并且在音乐行业的使用比 PC 更多,所以可能有更简单的方法来做这样的事情。
我想做这样的事情:
//Pseudo code
if (pianoKeyPressed == C) {
alert("You pressed the C key!");
}
else if (pianoKeyPressed == Dflat) {
alert("You pressed the C-sharp / D-flat key!");
}
else if (pianoKeyPressed == D) {
alert("You pressed the D key!");
}
else if (pianoKeyPressed == Eflat) {
alert("You pressed the D-sharp / E-flat key!");
}
//etc
//or maybe something like this
when key is pressed {
alert ("You pressed the " + pianoKeyPressed + " key!");
}
有没有人知道如何做到这一点,或者即使这是可能的?谢谢!
前阵子这里有一个非常有用的答案,我正要查看,但似乎已被删除。出于对原用户的尊重,我不会说那个用户是谁。但是,我会重新发布用户发布的链接,因为我相信它很有帮助并且完美地回答了我的问题。如果用户决定重新发布他们的答案,我将删除此答案并检查原用户的答案。
Apple 显然有一个名为 CoreMIDI 的框架,可用于从我的钢琴接收 MIDI 事件。 https://developer.apple.com/documentation/coremidi
如果CoreMIDI太难用,你可以使用AudioKit,这是一个第三方框架,功能差不多。 https://audiokit.io/
我还没有测试过这些,因为我还没有 Mac 但是从我在网上读到的关于它们的内容来看,它们似乎可以满足我的需求。
您可以使用 DryWetMIDI 库(我是它的作者),它提供 Windows 和 macOS 所需的所有功能。显示如何打印从 MIDI 设备传入的 MIDI 事件(不仅是音符事件)的小示例:
using System;
using Melanchall.DryWetMidi.Core;
using Melanchall.DryWetMidi.Multimedia;
namespace DwmExamples
{
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}");
if (e.Event is NoteOnEvent noteOnEvent)
Console.WriteLine($"Note pressed: {noteOnEvent.GetNoteName()}{noteOnEvent.GetNoteOctave()}");
}
}
}
它只是一个简单的控制台应用程序,用于侦听来自名称为 Some MIDI device 的 MIDI 设备的 MIDI 事件。您可以在帮助文章 Input device on the library documentation 站点中了解更多信息。
DryWetMIDI 是 .NET 世界中处理 MIDI 的非常流行的库。它有很多单元测试并且没有被废弃(只要看看 NuGet package 版本历史)。现在可以在 .NET 支持的任何平台(包括 Windows、macOS、Linux 甚至移动平台)上安全地使用它。但是现在仅在 Windows 和 macOS 的库中实现了对 MIDI 设备的处理。因此,您无需切换到新语言,即可使用 C# 和 .NET 继续使用 MIDI。
首先,我对 Mac 开发几乎一无所知。我是 Windows 开发人员。在发现没有简单的方法可以用 C# 完成我要告诉您的内容后,我想也许是时候学习 Swift。但是,在我出去购买 Mac 并学习 Mac 开发之前,我想确保这很容易实现。
我有一个背面有 USB 端口的钢琴键盘。当我使用 USB 转闪电适配器将我的钢琴插入我的 iPhone 并为 iOS 打开 GarageBand 时,当我在我的钢琴上弹奏一个键时,该键会在我的 iPhone 上演奏!我想使用相同的技术(根据研究,我认为是 MIDI)做一些类似的事情来制作一个应用程序,当我按下钢琴上的一个键时,Mac 会根据什么执行某个命令键被按下。例如,如果按下 D 键,将出现一个弹出框并显示 "You pressed D-flat!".
据我所知,如果不从互联网上安装一些以前没人听说过的可疑第三方库,就没有简单的方法可以在 C# 中执行此操作。我认为,由于 Apple 制作了 GarageBand,并且在音乐行业的使用比 PC 更多,所以可能有更简单的方法来做这样的事情。
我想做这样的事情:
//Pseudo code
if (pianoKeyPressed == C) {
alert("You pressed the C key!");
}
else if (pianoKeyPressed == Dflat) {
alert("You pressed the C-sharp / D-flat key!");
}
else if (pianoKeyPressed == D) {
alert("You pressed the D key!");
}
else if (pianoKeyPressed == Eflat) {
alert("You pressed the D-sharp / E-flat key!");
}
//etc
//or maybe something like this
when key is pressed {
alert ("You pressed the " + pianoKeyPressed + " key!");
}
有没有人知道如何做到这一点,或者即使这是可能的?谢谢!
前阵子这里有一个非常有用的答案,我正要查看,但似乎已被删除。出于对原用户的尊重,我不会说那个用户是谁。但是,我会重新发布用户发布的链接,因为我相信它很有帮助并且完美地回答了我的问题。如果用户决定重新发布他们的答案,我将删除此答案并检查原用户的答案。
Apple 显然有一个名为 CoreMIDI 的框架,可用于从我的钢琴接收 MIDI 事件。 https://developer.apple.com/documentation/coremidi
如果CoreMIDI太难用,你可以使用AudioKit,这是一个第三方框架,功能差不多。 https://audiokit.io/
我还没有测试过这些,因为我还没有 Mac 但是从我在网上读到的关于它们的内容来看,它们似乎可以满足我的需求。
您可以使用 DryWetMIDI 库(我是它的作者),它提供 Windows 和 macOS 所需的所有功能。显示如何打印从 MIDI 设备传入的 MIDI 事件(不仅是音符事件)的小示例:
using System;
using Melanchall.DryWetMidi.Core;
using Melanchall.DryWetMidi.Multimedia;
namespace DwmExamples
{
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}");
if (e.Event is NoteOnEvent noteOnEvent)
Console.WriteLine($"Note pressed: {noteOnEvent.GetNoteName()}{noteOnEvent.GetNoteOctave()}");
}
}
}
它只是一个简单的控制台应用程序,用于侦听来自名称为 Some MIDI device 的 MIDI 设备的 MIDI 事件。您可以在帮助文章 Input device on the library documentation 站点中了解更多信息。
DryWetMIDI 是 .NET 世界中处理 MIDI 的非常流行的库。它有很多单元测试并且没有被废弃(只要看看 NuGet package 版本历史)。现在可以在 .NET 支持的任何平台(包括 Windows、macOS、Linux 甚至移动平台)上安全地使用它。但是现在仅在 Windows 和 macOS 的库中实现了对 MIDI 设备的处理。因此,您无需切换到新语言,即可使用 C# 和 .NET 继续使用 MIDI。