예제 #1
0
        public MidiDevice()
        {
            mCDMusic = new CDirectMusic();
            mCDMusic.Initialize();
            // Initialize ports given the DirectMusic manager object
            try
            {
                // Initialize in ports
                mCInPort = new CInputPort();
                ((CMidiPort)mCInPort).Initialize(mCDMusic);
                CMidiPort midiIn = (CMidiPort)mCInPort;
                uint      num    = midiIn.GetNumPorts();
                for (uint i = 1; i <= num; i++)
                {
                    INFOPORT info;
                    midiIn.GetPortInfo(i, out info);
                    mMidiInPorts.Add(new MidiPort((int)i, info.szPortDescription + " (DirectSound)", true));
                }

                // Initialize out ports
                mCOutPort = new COutputPort();
                ((CMidiPort)mCOutPort).Initialize(mCDMusic);
                CMidiPort midiOut = (CMidiPort)mCOutPort;
                num = midiOut.GetNumPorts();
                for (uint i = 1; i <= num; i++)
                {
                    INFOPORT info;
                    midiOut.GetPortInfo(i, out info);
                    mMidiOutPorts.Add(new MidiPort((int)i, info.szPortDescription + " (DirectSound)", true));
                }
            }
            catch (CDMusicException DMEx)
            {
                MessageBox.Show(DMEx.GetErrorDescription() + DMEx.ToString());
            }

            // get Kernel32 midi in devices
            for (int i = 0; i < Kernel32Midi.InputDevice.InstalledDevices.Count; i++)
            {
                mMidiInPorts.Add(new MidiPort((int)i, Kernel32Midi.InputDevice.InstalledDevices[i].Name + " (Kernel32)", false));
            }

            // get Kernel32 midi out device
            for (int i = 0; i < Kernel32Midi.OutputDevice.InstalledDevices.Count; i++)
            {
                mMidiOutPorts.Add(new MidiPort((int)i, Kernel32Midi.OutputDevice.InstalledDevices[i].Name + " (Kernel32)", false));
            }
        }
예제 #2
0
        public void Play(string pt, bool loop = true)
        {
            if (cdm == null)
            {
                cdm = new CDirectMusic();
                cdm.Initialize();
                loader = new CDLSLoader();
                loader.Initialize();
                loader.LoadSegment(pt, out segment);
                ccollection = new CCollection();
                string pathDLS = Path.Combine(Memory.FF8DIRdata, "Music/dmusic_backup/FF8.dls");
                if (!File.Exists(pathDLS))
                {
                    pathDLS = Path.Combine(Memory.FF8DIRdata, "Music/dmusic/FF8.dls");
                }

                loader.LoadDLS(pathDLS, out ccollection);
                uint dwInstrumentIndex = 0;
                while (ccollection.EnumInstrument(++dwInstrumentIndex, out INSTRUMENTINFO iInfo) == S_OK)
                {
                    Debug.WriteLine(iInfo.szInstName);
                }
                instruments = new CInstrument[dwInstrumentIndex];

                path = new CAPathPerformance();
                path.Initialize(cdm, null, null, DMUS_APATH.DYNAMIC_3D, 128);
                cport = new CPortPerformance();
                cport.Initialize(cdm, null, null);
                outport = new COutputPort();
                outport.Initialize(cdm);

                uint     dwPortCount = 0;
                INFOPORT infoport;
                do
                {
                    outport.GetPortInfo(++dwPortCount, out infoport);
                }while ((infoport.dwFlags & DMUS_PC.SOFTWARESYNTH) == 0);

                outport.SetPortParams(0, 0, 0, DirectMidi.SET.REVERB | DirectMidi.SET.CHORUS, 44100);
                outport.ActivatePort(infoport);

                cport.AddPort(outport, 0, 1);

                for (int i = 0; i < dwInstrumentIndex; i++)
                {
                    ccollection.GetInstrument(out instruments[i], i);
                    outport.DownloadInstrument(instruments[i]);
                }
                segment.Download(cport);
                if (!loop)
                {
                    segment.SetRepeats(0);
                }

                cport.PlaySegment(segment);
            }
            else
            {
                cport.Stop(segment);
                segment.Dispose();
                //segment.ConnectToDLS
                loader.LoadSegment(pt, out segment);
                segment.Download(cport);
                if (!loop)
                {
                    segment.SetRepeats(0);
                }
                cport.PlaySegment(segment);
                cdm.Dispose();
            }

            //GCHandle.Alloc(cdm, GCHandleType.Pinned);
            //GCHandle.Alloc(loader, GCHandleType.Pinned);
            //GCHandle.Alloc(segment, GCHandleType.Pinned);
            //GCHandle.Alloc(path, GCHandleType.Pinned);
            //GCHandle.Alloc(cport, GCHandleType.Pinned);
            //GCHandle.Alloc(outport, GCHandleType.Pinned);
            //GCHandle.Alloc(infoport, GCHandleType.Pinned);
        }