Во-первых, я не профессиональный программист, а всего лишь студент, у которого есть небольшая проблема с отличной библиотекой Midi-Dot-Net.
Я использую библиотеку Midi-Dot-Net для написания простого приложения в Visual Studio на языке C#. Но я застрял на очень запутанной проблеме.
Я поместил небольшой код в Form1.cs
public void NoteOn(NoteOnMessage msg) {
if (InvokeRequired) {
BeginInvoke(noteOnHandler, msg);
return;
}
inputStatusLabel.Text = String.Format("{0}", msg.Pitch);
String nutka = inputStatusLabel.Text;
if (nutka == "A0") {
clock.Schedule(new NoteOnMessage(outputDevice, Channel.Channel1, Pitch.A0, 80, 2));
}
}
Итак, я поместил новую String и назвал ее nutka, а nutka получит имя нажатой ноты на моей USB MIDI клавиатуре. Затем я поставил статус IF и сравнил нутку с «A0» (первая нота на клавиатуре).
Затем, если это «A0», я нажал, что мое устройство outputDevice воспроизводит определенную ноту. И он играет, но играет два раза, один раз - когда я нажимаю клавишу (с нотой А0) на клавиатуре и второй раз - когда я отпускаю эту клавишу.
Я сделал точку останова на public void NoteOn(NoteOnMessage msg)
и заметил, что приложение возвращается сюда дважды и дважды воспроизводит эту ноту, до сих пор не знаю, почему.
Еще один момент, есть способ public void NoteOff(NoteOffMessage message)
, но он вроде не работает.
Я действительно не могу понять это, и я ищу любую помощь.
ОБНОВЛЕНИЕ ... ОБНОВЛЕНИЕ... ОБНОВЛЕНИЕ
Возникает еще одна проблема (первая часть была решена благодаря совету CL и Криса Данауэя и пошаговому объяснению Джастина).
Спасибо Джастин :) я вижу жизнь без проблем невозможна :)
С clock.Schedule
я могу воспроизводить только MIDI-звук, но я хочу воспроизводить примеры фортепианных нот (файл в формате wav), и через 4-5 недель мой колледж поможет мне записать мои собственные фортепианные звуки для каждой ноты. Я тоже хочу играть в них одновременно.
Думал, все будет хорошо, а тут... возникла проблема с одновременной игрой. Я пытался проверить три возможности:
1) Я пытался воспроизвести звуки пианино из имеющейся у меня базовой библиотеки нот и использовать для этого SoundPlayer:
SoundPlayer noteA0 = new SoundPlayer(Properties.Resources.A0);
noteA0.Play();
я использую его для каждого оператора ноты с другим именем SoundPlayer (зависит от имени ноты), и я заметил, что я не могу воспроизводить ноты одновременно.
2), поэтому я использовал следующую библиотеку WMP и WindowsMediaPlayer:
Например:
var noteA0 = new WMPLib.WindowsMediaPlayer();
noteA0.URL = @"c:\sounds\piano\A0.wav";
Хорошо ... он воспроизводится одновременно, но похоже, что чем больше нот я играю или просто играю песню, тем больше у меня задержка, и, наконец, моя программа застряла на воспроизведении чего-либо ...
3) я пытался использовать Microsoft.DirectX.AudioVideoPlayback:
Audio noteA1 = new Audio(@"C:\sounds\piano\A1.wav");
noteA1.Play();
Я запустил свою программу, нажал клавишу и бум! вылетел с сообщением об ошибке:
An unhandled exception of type 'System.BadImageFormatException' occurred in Midi.dll
Additional information: Could not load file or assembly 'Microsoft.DirectX.AudioVideoPlayback.dll' or one of its dependencies.
It is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
Конечно, я не забыл использовать:
using System.Media;
using Microsoft.DirectX.AudioVideoPlayback;
using Microsoft.DirectX;
Прямо сейчас я понятия не имею, что я могу сделать снова и снова - мне нужна помощь опытного человека :)
Invoke
, не следует ли вызватьNoteOn
? Что такоеnoteOnHandler
? Как вы называетеNoteOn
? Откуда? - person Sinatr   schedule 19.06.2015