如何在C#中重复MIDI文件?

时间:2010-10-11 11:23:50

标签: c# audio

根据我在here的上一篇文章,其中一位朋友建议使用此代码:

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace TeaTimer
{
    /// <summary>
    /// MCIPlayer is based off code by Slain.
    /// Found here: http://www.sadeveloper.net/Articles_View.aspx?articleID=212
    /// </summary>
    public class MCIPlayer
    {
        private static readonly string sAlias="TeaTimerAudio";

        [DllImport("winmm.dll")]
        private static extern long mciSendString(string strCommand,StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback);
        [DllImport("Winmm.dll")]
        private static extern long PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);

        public static void Play(string sFile)
        {
            _Open(sFile);
            _Play();
        }
        public static void Stop() 
        {
            _Close();
        }

        private static void _Open(string sFileName)
        {
            if(_Status()!="")
                _Close();

            string sCommand = "open \"" + sFileName + "\" alias "+sAlias;
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

        private static void _Close()
        {
            string sCommand = "close "+sAlias;
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

        private static void _Play()
        {
            string sCommand = "play "+sAlias;
            mciSendString(sCommand, null, 0, IntPtr.Zero);
        }

        private static string _Status()
        {
            StringBuilder sBuffer = new StringBuilder(128);
            mciSendString("status "+sAlias+" mode", sBuffer, sBuffer.Capacity, IntPtr.Zero);
            return sBuffer.ToString();
        }
    }
}

它工作正常,但现在的问题是,我无法重复我的MIDI文件。 我看到了一些代码,但我不知道为什么它不起作用。 我试过了:

Scommand = "play "+sAlias+" repeat "; 
mciSendString(Scommand, null, 0, IntPtr.Zero);

1 个答案:

答案 0 :(得分:2)

为什么你认为“重复”是受支持的命令? 根据{{​​3}}我无法看到它得到支持。

我看到的解决方案是使用MSDN

以下是为我工作的示例:

public class MCIPlayer
{
    private class Form2: Form
    {
        public Form2()
        {
            if (!IsHandleCreated) CreateHandle();
        }

        private const int MM_MCINOTIFY = 953;

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == MM_MCINOTIFY)
                MCIPlayer.Play(file);
        }

        public string file;
    }

    private static Form2 f = new Form2();

    private static readonly string sAlias = "TeaTimerAudio";

    [DllImport("winmm.dll", SetLastError = true)]
    private static extern int mciSendString(string strCommand, 
                    StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
    [DllImport("Winmm.dll")]
    private static extern long PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);

    public static void Play(string sFile)
    {
        _Open(sFile);
        _Play();
    }

    public static void PlayTwice(string sFile)
    {
        _Open(sFile);
        f.file = sFile;
        _PlayTwice();
    }

    public static void Stop()
    {
        _Close();
    }

    private static void _Open(string sFileName)
    {
        if (_Status() != "")
            _Close();

        string sCommand = "open \"" + sFileName + "\" alias " + sAlias;
        mciSendString(sCommand, null, 0, IntPtr.Zero);
    }

    private static void _Close()
    {
        string sCommand = "close " + sAlias;
        mciSendString(sCommand, null, 0, IntPtr.Zero);
    }

    private static void _Play()
    {
        string sCommand = "play " + sAlias;
        mciSendString(sCommand, null, 0, IntPtr.Zero);
    }

    private static void _PlayTwice()
    {
        string sCommand = "play " + sAlias + " notify";
        mciSendString(sCommand, null, 0, f.Handle);
    }

    private static string _Status()
    {
        StringBuilder sBuffer = new StringBuilder(128);
        mciSendString("status " + sAlias + " mode", sBuffer, 
                              sBuffer.Capacity, IntPtr.Zero);
        return sBuffer.ToString();
    }
}