Код: Выделить всё
NAudio.PlayNote(28, 100); // 28 == 41.203 == Open E String on a bass
Я понимаю, что это хотя, вероятно, не все так просто; может ли кто-нибудь указать мне правильное направление?
ОБНОВЛЕНИЕ
Когда я пытаюсь использовать NAudio.Midi, как предложено ниже, я получите это в предложении using:

< /p>
...и это при попытке вызвать этот метод в коде:

ОБНОВЛЕНИЕ 2
Вот ошибка, которую я получаю, когда пытаюсь добавьте использование:

...а вот пакет в моем решении (это Winforms); я пропустил свой шаг или что-то еще?

ОБНОВЛЕНИЕ 3
Нужно ли мне устанавливать дополнительные пакеты? Когда я открываю «Управление пакетами NuGet», он показывает, что NAudio.WinForms установлен, но есть также несколько «переходных пакетов» (6). Нужно ли мне также устанавливать эти пакеты (MS и NAudio)?
ОБНОВЛЕНИЕ 4
В консоли диспетчера пакетов я ввел Install-Package NAudio и, похоже, это сработало. Завтра я выложу код в ответ...
ОБНОВЛЕНИЕ 5
Я получаю сообщения об ошибках "Тип или имя пространства имен «NoteOffEvent» не найдено (вам не хватает директивы using или ссылки на сборку?)"
Это мой соответствующий код:
Код: Выделить всё
using System.Windows.Forms;
using System.Collections;
using System.Threading.Channels;
using NAudio.Midi;
using NAudio.Wave;
namespace EarTrainingAndCreativityForBassGtr_VS2022
{
public partial class Form1 : Form
{
int NoteToPlay = 0;
int wrongGuesses = 0;
private System.Windows.Forms.Timer noteOffTimer;
private MidiOut midiOut;
public Form1()
{
InitializeComponent();
midiOut = new MidiOut(0);
noteOffTimer = new System.Windows.Forms.Timer();
noteOffTimer.Tick += NoteOffTimer_Tick;
}
private void PlayMidiNote(int note, int velocity, int duration)
{
var noteOn = new NoteOnEvent(0, 1, note, velocity, 0);
midiOut.Send(noteOn.GetAsShortMessage());
noteOffTimer.Interval = duration;
noteOffTimer.Start();
}
private void NoteOffTimer_Tick(object sender, EventArgs e)
{
noteOffTimer.Stop();
var noteOff = new NoteOffEvent(0, 1, 28, 100, 0);
midiOut.Send(noteOff.GetAsShortMessage());
}
private void btnPlayNote_Click(object sender, EventArgs e)
{
ClearPreviousVals();
btnPlayNote.Enabled = false;
int[] randomNotes = GetFourRandomNumbers(28, 67);
NoteToPlay = randomNotes[0];
// now play that note
using (var midiOut = new MidiOut(0)) // 0 is the device number, adjust as needed
{
// Send a NoteOn event to start the note
var noteOn = new NoteOnEvent(0, 1, NoteToPlay, 100, 0); // channel 1, NoteToPlay, velocity 100, at time 0
midiOut.Send(noteOn.GetAsShortMessage());
// Wait for the duration of the note
//System.Threading.Thread.Sleep(1000); // 1000ms = 1 second
System.Windows.Forms.
// Send a NoteOff event to stop the note
var noteOff = new NoteOffEvent(0, 1, 28, 100, 0); // channel 1, note 28, velocity 100, at time 0
midiOut.Send(noteOff.GetAsShortMessage());
}
radbtn1.Checked = false;
radBtn2.Checked = false;
radbtn3.Checked = false;
radbtn4.Checked = false;
}
private void ClearPreviousVals()
{
radbtn1.Text = "Note 1";
radbtn1.Tag = null;
//rest elided
}
private string ConvertNoteNumberToNoteName(int noteToPlay)
{
if (noteToPlay == 28) return "E1";
// .... elided
else return "Bad arg to ConvertNoteNumberToNoteName() — not within the expected bounds";
}
private int[] GetFourRandomNumbers(int LowestVal, int HighestVal)
{
// elided
}
private void radbtn1_Click(object sender, EventArgs e)
{
if (radbtn1.Tag == null) return;
bool correctChoice = NoteToPlay.ToString() == radbtn1.Tag.ToString();
if (correctChoice)
{
MessageBox.Show("Correct! You chose the correct note after " + wrongGuesses.ToString() + " incorrect choices!");
btnPlayNote.Enabled = true;
}
else
{
wrongGuesses = wrongGuesses + 1;
MessageBox.Show("Wrong choice. Try again.");
};
}
private void radBtn2_Click(object sender, EventArgs e)
{
// elided
}
private void radbtn3_Click(object sender, EventArgs e)
{
// elided
}
private void radbtn4_Click(object sender, EventArgs e)
{
// elided
}
}
}
Код: Выделить всё
var noteOff = new NoteOffEvent(0, 1, 28, 100, 0);
ОБНОВЛЕНИЕ 6
Мое приложение ориентировано на .NET Framework 8:

NoteOffset отсутствует в списке NAudio.Midi:

Подробнее здесь: https://stackoverflow.com/questions/782 ... rwise-in-c