Я хочу использовать свое пианино Midi для взаимодействия с Windows Form C# (DryWetMidi).

Я работаю над небольшим программным обеспечением в Visual Studio (Windows Form .NET на С#). Я сделал простое пианино, которое меняет цвет клавиш при нажатии некоторых кнопок клавиатуры (QWERTY)

введите здесь описание изображения

Теперь я хочу использовать свое MIDI-пианино вместо этого, чтобы сделать это событие. В моем фактическом коде я использовал KeyDown (чтобы показать цветное изображение клавиши пианино поверх оригинала) и KeyUp (чтобы скрыть его) для этого события, и я знаю, что сделать это с MIDI-пианино будет сложнее, чем это.

Я нашел DryWetMidi API (от Melanchall) здесь (и Я загрузил его с помощью NuGet и применил в своем проекте), который может делать много огромных вещей с MIDI, но я просто хочу делать эти простые вещи:

  1. Распознавать MIDI-устройства, которые распознает Windows.

  2. Позвольте пользователю выбрать свое MIDI-устройство в «форме настроек» (которая у меня уже есть пустой)

  3. Может играть на пианино MIDI, чтобы активировать «событие изменения цвета».

  4. (не нужно распознавать скорость)

  5. (не нужно воспроизводить файлы MIDI)

  6. (не нужно озвучивать, потому что я планирую использовать его одновременно с программным обеспечением виртуального инструмента)

В документации DryWetMidi говорится, что "довольно легко настроить получение событий", используя это:

using System;
using Melanchall.DryWetMidi.Devices;
using Melanchall.DryWetMidi.Core;

// ...

using (var inputDevice = InputDevice.GetByName("MIDI Device"))
{
    inputDevice.EventReceived += OnEventReceived;
    inputDevice.StartEventsListening();
}

// ...

private void OnEventReceived(object sender, MidiEventReceivedEventArgs e)
{
    MidiDevice midiDevice = (MidiDevice)sender;
    MidiEvent midiEvent = e.Event;
    Console.WriteLine($"Event received from '{midiDevice.Name}' at {DateTime.Now}: {midiEvent}");
}

... но у меня это не работает (как вы можете видеть здесь) : (да, я уже написал эти 3 строки в начале моего Form1.cs):

using System;

using Melanchall.DryWetMidi.Devices;

using Melanchall.DryWetMidi.Core;

Эти ошибки (подчеркнутые красным) не позволяют мне продолжать кодирование моего проекта, чтобы достичь конечной цели выполнения события изменения цвета ключа.

Я принцип, и я просто пишу простые коды (как вы можете видеть), поэтому, вероятно, я не знаю, нужно ли мне помещать эти коды в новый документ или форму класса, вызывать их или что-то еще, что может быть очевидно для вас.

Хочу уточнить, что я уже прочитал всю документацию библиотеки, которая относится к Device Connectivity, но решения я там не нашел.

Я клянусь вам, что буду очень признателен за любую помощь, которую вы можете мне оказать.


person iben Music    schedule 03.05.2020    source источник


Ответы (1)


Я автор DryWetMIDI.

Вы получаете эти ошибки, потому что просто копируете/вставляете образец кода. Блок using можно использовать только внутри методов.

Если ваша задача "подсветка клавиши в вашем приложении при нажатии клавиши на MIDI-устройстве", ваш рабочий процесс должен быть таким:

  1. Заполните список устройств, используя InputDevice.GetAll.
  2. Когда пользователь выбирает устройство из списка, сохраните выбранное устройство в varibale (например, _inputDevice)
  3. Установить обработчик события EventReceived для < a href="https://melanchall.github.io/drywetmidi/api/Melanchall.DryWetMidi.Devices.IInputDevice.html" rel="nofollow noreferrer">IInputDevice как во фрагменте из документации библиотеки, показано, и не забудьте вызвать StartEventsListening< /а> метод
  4. Когда вы получите NoteOnEvent, зажгите клавишу на ваше пианино в вашем приложении
  5. Когда вы получите NoteOffEvent, погасите ключ
  6. Когда пользователь выбирает другое устройство или приложение закрывается, вы должны удалять _inputDevice методом Dispose; также удалите обработчик событий, который вы установили на шаге 3

Прочтите Устройство ввода в документации библиотеки.

person Maxim    schedule 03.05.2020
comment
Я полагаю, он имеет в виду, что нажатие клавиши на миди-устройстве приводит к тому, что соответствующая клавиша внутри его приложения загорается. В основном он спрашивает, как использовать IInputDevice.EventReceived. - person Scott Chamberlain; 04.05.2020
comment
Привет! Спасибо за отличную библиотеку. Недавно я попробовал это и влюбился в это :) Но мне любопытно, можно ли распознавать MIDI-клавиатуры, подключенные к устройствам Android, если я использую вашу библиотеку с Unity. - person Jenix; 16.01.2021
comment
К сожалению, сейчас Devices API библиотеки не поддерживает другие операционные системы, кроме Windows. - person Maxim; 16.01.2021