एमआईआईआई का उपयोग करने का सबसे अच्छा तरीका सी #

मैं एक पुराना मेट्रोनोम एप्लिकेशन पुनर्निर्माण करने की कोशिश कर रहा हूं जिसे मूल रूप से MFC में .NET C# का उपयोग करके .NET में लिखा जाना चाहिए। जिन मुद्दों में मैं चल रहा हूं उनमें से एक मिडी फाइलें चला रहा है जिसका उपयोग मेट्रोनोम "क्लिक" का प्रतिनिधित्व करने के लिए किया जाता है।

मुझे .NET में MIDI खेलने के बारे में कुछ लेख ऑनलाइन मिले हैं, लेकिन उनमें से अधिकतर कस्टम लाइब्रेरीज़ पर भरोसा करते हैं कि किसी ने एक साथ cobbled और उपलब्ध कराया है। मैं इनका उपयोग करने के विपरीत नहीं हूं, लेकिन मैं खुद को समझता हूं कि यह कैसे किया जा रहा है, क्योंकि ऐसा लगता है कि यह चाहिए अधिकतर मामूली व्यायाम होना चाहिए।

तो, क्या मुझे कुछ याद आ रही है? या क्या .NET अनुप्रयोग के अंदर MIDI का उपयोग करना मुश्किल है?

0
ro fr bn

9 उत्तर

.NET में विस्तृत MIDI और वेव मैनिपुलेशन के लिए, मुझे लगता है कि हाथों को NAudio समाधान है (यह भी NuGet )।

0
जोड़ा

मैं इसके बारे में ज्यादा जानने का दावा नहीं कर सकता, लेकिन मुझे नहीं लगता कि यह सीधा है - कार्ल फ्रैंकलिन DotNetRocks </ए> प्रसिद्धि ने इसके साथ काफी कुछ किया है - क्या आपने उसके डीएनआरटीवी को देखा है सकते हैं?

0
जोड़ा

मुझे लगता है कि आपको .NET से मिडी फाइलों को चलाने में सक्षम होने के लिए विंडोज एपीआई को पी/इनक्रा करने की आवश्यकता होगी।

This codeproject article does a good job on explaining how to do this: vb.net article to play midi files

इसे फिर से लिखने के लिए C# आपको mciSendString के लिए निम्न आयात कथन की आवश्यकता होगी:

[DllImport("winmm.dll")] 
static extern Int32 mciSendString(String command, StringBuilder buffer, 
                                  Int32 bufferSize, IntPtr hwndCallback);

उम्मीद है कि इससे मदद करेगी, सुसंयोग!

0
जोड़ा

System.Media। SoundPlayer WAV फ़ाइलों को चलाने का एक अच्छा, सरल तरीका है। डब्ल्यूएवी फाइलों में एमआईडीआई पर कुछ फायदे हैं, उनमें से एक यह है कि आप प्रत्येक उपकरण को ठीक तरह से नियंत्रित कर सकते हैं (कंप्यूटर के अंतर्निर्मित सिंथेसाइज़र पर भरोसा करने के बजाए)।

0
जोड़ा

क्षमा करें यह प्रश्न अब थोड़ा पुराना है, लेकिन मेरे लिए निम्नलिखित काम किया गया है (कुछ हद तक Win32 - Midi से कॉपी किया गया है MCISendString के साथ लूपिंग ):

[DllImport("winmm.dll")]
static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

public static void playMidi(String fileName, String alias)
{
  mciSendString("open " + fileName + " type sequencer alias " + alias, new StringBuilder(), 0, new IntPtr());
  mciSendString("play " + alias, new StringBuilder(), 0, new IntPtr());
}

public static void stopMidi(String alias)
{
  mciSendString("stop " + alias, null, 0, new IntPtr());
  mciSendString("close " + alias, null, 0, new IntPtr());
}

कमांड स्ट्रिंग की पूरी सूची यहां । इसके बारे में अच्छा हिस्सा यह है कि आप अलग-अलग चीजें , .wav फ़ाइलों को चलाने के लिए waveaudio कहें। मैं यह नहीं समझ सकता कि इसे कैसे खेलें। एमपी 3 हालांकि।

साथ ही, ध्यान दें कि स्टॉप और क्लोज कमांड उसी थ्रेड पर भेजा जाना चाहिए जिसे खुले और प्ले कमांड भेजे गए थे, अन्यथा उनका कोई प्रभाव नहीं पड़ेगा और फ़ाइल खुली रहेगी। उदाहरण के लिए:

[DllImport("winmm.dll")]
static extern Int32 mciSendString(String command, StringBuilder buffer,
                                    Int32 bufferSize, IntPtr hwndCallback);

public static Dictionary playingMidi = new Dictionary();

public static void PlayMidi(String fileName, String alias)
{
    if (playingMidi.ContainsKey(alias))
        throw new Exception("Midi with alias '" + alias + "' is already playing");

    playingMidi.Add(alias, false);

    Thread stoppingThread = new Thread(() => { StartAndStopMidiWithDelay(fileName, alias); });
    stoppingThread.Start();
}

public static void StopMidiFromOtherThread(String alias)
{
    if (!playingMidi.ContainsKey(alias))
        return;

    playingMidi[alias] = true;
}

public static bool isPlaying(String alias)
{
    return playingMidi.ContainsKey(alias);
}

private static void StartAndStopMidiWithDelay(String fileName, String alias)
{
    mciSendString("open " + fileName + " type sequencer alias " + alias, null, 0, new IntPtr());
    mciSendString("play " + alias, null, 0, new IntPtr());

    StringBuilder result = new StringBuilder(100);
    mciSendString("set " + alias + " time format milliseconds", null, 0, new IntPtr());
    mciSendString("status " + alias + " length", result, 100, new IntPtr());

    int midiLengthInMilliseconds;
    Int32.TryParse(result.ToString(), out midiLengthInMilliseconds);

    Stopwatch timer = new Stopwatch();
    timer.Start();

    while(timer.ElapsedMilliseconds < midiLengthInMilliseconds && !playingMidi[alias])
    {

    }

    timer.Stop();

    StopMidi(alias);
}

private static void StopMidi(String alias)
{
    if (!playingMidi.ContainsKey(alias))
        throw new Exception("Midi with alias '" + alias + "' is already stopped");

   //Execute calls to close and stop the player, on the same thread as the play and open calls
    mciSendString("stop " + alias, null, 0, new IntPtr());
    mciSendString("close " + alias, null, 0, new IntPtr());

    playingMidi.Remove(alias);
}
0
जोड़ा
mciSendString ("खुला" + fileName + "उपनाम" + उपनाम, नया स्ट्रिंगबिल्डर (), 0, नया IntPtr ()) का उपयोग करें; mciSendString के बजाय ("खुला" + फ़ाइल नाम + "प्रकार अनुक्रमक उपनाम" + उपनाम, नया स्ट्रिंगबिल्डर (), 0, नया IntPtr ()); .mp3 फ़ाइलों को चला सकते हैं (और एक गुच्छा अधिक .wav, .wma, आदि)
जोड़ा लेखक Silent Sojourner, स्रोत

हालिया जोड़ा MIDI.NET है जो मिडी पोर्ट्स, मिडी फाइल्स और SysEx का समर्थन करता है।

0
जोड़ा

आप मीडिया प्लेयर का उपयोग कर सकते हैं:

using WMPLib;
//...
WindowsMediaPlayer wmp = new WindowsMediaPlayer();
wmp.URL = Path.Combine(Application.StartupPath ,"Resources/mymidi1.mid");
wmp.controls.play();
0
जोड़ा

मैं इस समय एक सी # MIDI एप्लिकेशन पर काम कर रहा हूं, और अन्य सही हैं - आपको इसके लिए पी/इनवॉक का उपयोग करने की आवश्यकता है। मैं अपना खुद का रोलिंग कर रहा हूं क्योंकि यह एप्लिकेशन के लिए अधिक उपयुक्त लग रहा था (मुझे केवल MIDI कार्यक्षमता का एक छोटा सबसेट चाहिए), लेकिन आपके उद्देश्यों के लिए सी # MIDI टूलकिट एक बेहतर फिट हो सकता है। यह कम से कम सबसे अच्छी .NET MIDI लाइब्रेरी मिली है, और मैंने प्रोजेक्ट शुरू करने से पहले बड़े पैमाने पर खोज की है।

0
जोड़ा
लेस्ली की मिडी टूलकिट निश्चित रूप से MIDI रिकॉर्डिंग, खेलने के लिए सबसे व्यापक सी # समाधान है। मैंने इसे एक बहुत ही जटिल परियोजना के लिए इस्तेमाल किया है और यह अच्छी तरह से काम करता है।
जोड़ा लेखक andynormancx, स्रोत

midi-dot-net got me up and running in minutes - lightweight and right-sized for my home project. It's also available on GitHub. (Not to be confused with the previously mentioned MIDI.NET, which also looks promising, I just never got around to it.)

बेशक NAudio (ऊपर वर्णित) में बहुत सी क्षमता है, लेकिन मूल पोस्टर की तरह मैं बस खेलना चाहता था कुछ नोट्स और स्रोत कोड को तुरंत पढ़ और समझते हैं।

0
जोड़ा