【问题标题】:Can I easily recognize MIDI Notes in Mac app?我可以在 Mac 应用程序中轻松识别 MIDI 音符吗?
【发布时间】:2020-06-27 01:52:55
【问题描述】:

首先,我对 Mac 开发几乎一无所知。我是一名 Windows 开发人员。当我发现在 C# 中没有简单的方法来完成我将要告诉你的事情时,我想也许是时候学习 Swift 了。但是,我想确保在我出去购买 Mac 并学习 Mac 开发之前,这很容易实现。

我有一个背面有 USB 端口的钢琴键盘。当我使用 USB-to-Lightning 适配器将钢琴插入 iPhone 并打开 iOS 版 GarageBand 时,当我在钢琴上弹奏一个琴键时,该琴键会在我的 iPhone 上演奏!我想使用相同的技术(根据研究,我相信它是 MIDI)做类似的事情来制作一个应用程序,当我在钢琴上按下一个键时,Mac 会根据按下的键执行某个命令。例如,如果按下 D 键,则会出现一个弹出框并说“你按下了 D-flat!”。

据我所知,如果不从 Internet 上安装一些以前没人听说过的阴暗第三方库,那么在 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!");
}

有没有人知道如何做到这一点,或者即使有可能?谢谢!

【问题讨论】:

  • 为什么投反对票?
  • 我没有否决你的问题,但我想有些人在发布这个问题之前似乎没有努力自己研究这个问题。
  • @calvedos 正如我在描述中所说,我是 Mac 开发的新手。我不知道怎么会有人指望我对一个我不太了解的主题做这么多的研究。转向那些了解该领域的人来获得答案似乎是合理的,即使这是一个新手问题。反正我不生你的气。我对那些否决我的问题的用户有点失望,因为我说我是新人,并且正在寻找有更多经验的人。但是,我将尝试在我未来的问题中展示更多的研究努力。感谢您的回复。
  • 不用担心。当人们投反对票并且不发表评论说明原因时,我也感到沮丧,但我猜是这样的人。祝项目好运,MIDI 很棒 :)
  • @calvedos 非常感谢!我真的很感谢你的时间、解释和鼓励的好话。好好休息一天! :)

标签: swift macos midi


【解决方案1】:

不久前这里有一个非常有用的答案,我正要检查,但它似乎已被删除。为了尊重原始用户,我不会说那个用户是谁。但是,我会重新发布用户发布的链接,因为我相信它很有帮助并且完美地回答了我的问题。如果用户决定重新发布他们的答案,我将删除此答案并检查原始用户的答案。

Apple 显然有一个名为 CoreMIDI 的框架,可用于从我的钢琴接收 MIDI 事件。 https://developer.apple.com/documentation/coremidi

如果 CoreMIDI 太难使用,您可以使用 AudioKit,它是一个第三方框架,其功能几乎相同。 https://audiokit.io/

我还没有测试过这些,因为我还没有 Mac,但从我在网上读到的关于它们的信息来看,它们似乎可以满足我的需求。

【讨论】:

    【解决方案2】:

    您可以使用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 事件。您可以在库documentation 网站上的帮助文章Input device 中了解更多信息。

    DryWetMIDI 是 .NET 世界中处理 MIDI 的非常流行的库。它有很多单元测试并且没有被放弃(看看NuGet package 版本历史)。在 .NET 现在支持的任何平台(包括 Windows、macOS、Linux 甚至移动平台)上使用它都是安全的。但目前仅在 Windows 和 macOS 的库中实现了使用 MIDI 设备。因此,您无需切换到新语言,即可继续使用 C# 和 .NET 进行 MIDI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2011-11-12
      • 2011-05-23
      • 2014-01-17
      • 2010-11-13
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多