Pertama, saya bukan seorang programmer PRO tetapi hanya seorang pelajar yang memiliki sedikit masalah dengan perpustakaan Midi-Dot-Net yang unggul.
Saya menggunakan perpustakaan Midi-Dot-Net untuk menulis aplikasi sederhana di Visual Studio dalam bahasa C#. Tapi saya terjebak pada masalah yang sangat membingungkan.
Saya menempatkan sedikit kode ke dalam 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));
}
}
Jadi, saya menempatkan String baru dan menamainya nutka, dan nutka akan menerima nama not yang ditekan di Keyboard USB MIDI saya. Kemudian saya menempatkan pernyataan IF, dan membandingkan nutka dengan "A0" (not pertama di keyboard).
Lalu jika "A0" saya menekan outputDevice saya memainkan nada tertentu. Dan itu diputar tetapi diputar dua kali, satu - saat saya menekan tombol (dengan catatan A0) pada keyboard dan kedua kalinya - saat saya melepaskan tombol itu.
Saya melakukan breakpoint pada public void NoteOn(NoteOnMessage msg)
dan memperhatikan bahwa aplikasi kembali ke sini dua kali dan memutar nada itu dua kali, masih tidak tahu alasannya.
Satu lagi, ada metode public void NoteOff(NoteOffMessage message)
, tapi sepertinya tidak berhasil.
Saya benar-benar tidak dapat memahaminya, dan saya sedang mencari bantuan.
PEMBARUAN ... PERBARUI ... PEMBARUAN
Masalah lain muncul (bagian pertama terselesaikan berkat saran CL dan Chris Dunaway serta penjelasan Justin langkah demi langkah).
Terima kasih Justin :) saya melihat hidup tanpa masalah tidak mungkin :)
Dengan clock.Schedule
saya hanya dapat memainkan suara MIDI tetapi saya ingin memainkan contoh not piano (format file wav) dan dalam 4-5 minggu kampus saya akan membantu saya merekam suara piano saya sendiri untuk setiap not. Saya juga ingin memainkannya secara bersamaan.
Saya pikir semuanya akan baik-baik saja dan sekarang... ada masalah dengan bermain secara bersamaan. Saya mencoba memeriksa tiga kemungkinan:
1) Saya mencoba memainkan suara piano dari perpustakaan nada dasar yang saya miliki dan menggunakan SoundPlayer untuk itu:
SoundPlayer noteA0 = new SoundPlayer(Properties.Resources.A0);
noteA0.Play();
saya menggunakannya untuk setiap pernyataan nada dengan nama SoundPlayer yang berbeda (tergantung pada nama nada) dan yang saya perhatikan adalah - saya tidak dapat memutar nada secara bersamaan.
2) jadi saya menggunakan perpustakaan WMP dan WindowsMediaPlayer berikutnya:
Misalnya:
var noteA0 = new WMPLib.WindowsMediaPlayer();
noteA0.URL = @"c:\sounds\piano\A0.wav";
Oke... ini diputar secara bersamaan tetapi sepertinya semakin banyak nada yang saya mainkan atau saya hanya memutar sebuah lagu, semakin besar latensi yang saya dapatkan dan akhirnya program saya macet saat memainkan apa pun...
3) saya mencoba menggunakan Microsoft.DirectX.AudioVideoPlayback:
Audio noteA1 = new Audio(@"C:\sounds\piano\A1.wav");
noteA1.Play();
saya memulai program saya, menekan tombol dan boom! mogok dengan pesan kesalahan:
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)
Tentu saja saya tidak lupa menggunakan:
using System.Media;
using Microsoft.DirectX.AudioVideoPlayback;
using Microsoft.DirectX;
Saat ini saya tidak tahu apa yang bisa saya lakukan lagi dan lagi - saya butuh bantuan orang yang berpengalaman :)
Invoke
, bukankah sebaiknya Anda memanggilNoteOn
? Apa itunoteOnHandler
? Bagaimana cara meneleponNoteOn
? Dari mana? - person Sinatr   schedule 19.06.2015