代码之家  ›  专栏  ›  技术社区  ›  Amir

如何在C中重复MIDI文件?

  •  1
  • Amir  · 技术社区  · 14 年前

    根据我上一篇文章 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 回复  |  直到 13 年前
        1
  •  2
  •   Shimmy Weitzhandler 500 - Internal Server Error    14 年前

    MSDN

    notify flag

    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();
        }
    }