从内存中播放C#中的MIDI文件

时间:2011-05-21 16:39:32

标签: c# winapi midi

如何直接从内存播放MIDI文件(例如参考资料)? 我发现this是一个解决方案,但我不明白如何从资源中播放MIDI。请帮助我使用正确的WinAPI命令

3 个答案:

答案 0 :(得分:1)

好的,我做了一个临时的解决方案。 不过,它有效吗

using (var midiStream = new MemoryStream(Resources.myMidi))
        {
            var data = midiStream.ToArray();
            try
            {
                using (var fs = new FileStream("midi.mid", FileMode.CreateNew, FileAccess.Write))
                {
                    fs.Write(data, 0, data.Length);
                } 
            }
            catch(IOException)
            {}
            string sCommand = "open \"" + Application.StartupPath + "/midi.mid" + "\" alias " + "MIDIapp";
            mciSendString(sCommand, null, 0, IntPtr.Zero);
            sCommand = "play " + "MIDIapp";
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

答案 1 :(得分:0)

您可以使用SoundPlayer类:

using (Stream midi = Resources.ResourceManager.GetStream("myMidi"))
{
    using (SoundPlayer player = new SoundPlayer(midi))
    {
        player.Play();
    }
}

答案 2 :(得分:0)

您可以使用具有播放功能的.NET库。 DryWetMIDI允许这样做(示例显示了通过默认的Windows合成器播放MIDI文件):

var midiFile = MidiFile.Read("Greatest song ever.mid");

// Or you can read a MIDI file from a stream
// var midiFile = MidiFile.Read(stream);

using (var outputDevice = OutputDevice.GetByName("Microsoft GS Wavetable Synth"))
{
    midiFile.Play(outputDevice);
}

您可以在Wiki库Playback上阅读有关播放MIDI数据的更多信息。