Наследование: MidiDriverBase, IDisposable
Пример #1
0
 public Mt32Music(MidiDriver midiDrv, Mixer mixer, Disk disk) : base(mixer, disk)
 {
     _driverFileBase = 60200;
     _midiDrv = midiDrv;
     var midiRes = _midiDrv.Open();
     if (midiRes != 0)
         throw new InvalidOperationException(string.Format("Can't open midi device. Errorcode: {0}", midiRes));
     _timerCount = 0;
     _midiDrv.SetTimerCallback(this, TimerCall);
     _midiDrv.SendMt32Reset();
 }
Пример #2
0
        public GmChannel(byte[] musicData, ushort startOfData, MidiDriver midiDrv, byte[] instMap, byte[] veloTab)
        {
            _musicData = musicData;
            _midiDrv = midiDrv;
            _channelData.MidiChannelNumber = 0;
            _channelData.LoopPoint = startOfData;
            _channelData.EventDataPtr = startOfData;
            _channelData.ChannelActive = true;
            _channelData.NextEventTime = GetNextEventTime();
            _instMap = instMap;
            _veloTab = veloTab;

            _musicVolume = 0x7F;
            _currentChannelVolume = 0x7F;
        }
Пример #3
0
 public static IIMuse Create(MidiDriver nativeMidiDriver, MidiDriver adlibMidiDriver)
 {
     var imuse = new IMuseInternal();
     imuse.Initialize(nativeMidiDriver, adlibMidiDriver);
     return imuse;
 }
Пример #4
0
 public void FixAfterLoad()
 {
     _midi = _se.GetBestMidiDriver(_id);
     if (_midi == null)
     {
         Clear();
     }
     else
     {
         StartSeqSound(_id, false);
         SetSpeed(_speed);
         if (_parser != null)
             _parser.JumpToTick(_music_tick); // start_seqSound already switched tracks
         _isMT32 = _se.IsMT32(_id);
         _isMIDI = _se.IsMIDI(_id);
         _supportsPercussion = _se.SupportsPercussion(_id);
     }
 }
Пример #5
0
        public bool StartSound(int sound, MidiDriver midi)
        {

            // Not sure what the old code was doing,
            // but we'll go ahead and do a similar check.
            var ptr = _se.FindStartOfSound(sound);
            if (ptr == null)
            {
//                Console.Error.WriteLine("Player::startSound(): Couldn't find start of sound {0}", sound);
                return false;
            }

            _isMT32 = _se.IsMT32(sound);
            _isMIDI = _se.IsMIDI(sound);
            _supportsPercussion = _se.SupportsPercussion(sound);

            _parts = null;
            _active = true;
            _midi = midi;
            _id = sound;

            LoadStartParameters(sound);

            for (var i = 0; i < _parameterFaders.Length; ++i)
            {
                _parameterFaders[i].Init();
            }
            HookClear();

            if (StartSeqSound(sound) != 0)
            {
                _active = false;
                _midi = null;
                return false;
            }

            Debug.WriteLine("Starting music {0}", sound);
            return true;
        }
Пример #6
0
        public void Clear()
        {
            if (!_active)
                return;
            Debug.WriteLine("Stopping music {0}", _id);

            if (_parser != null)
            {
                _parser.UnloadMusic();
                _parser = null;
            }
            UninitParts();
            _se.ImFireAllTriggers(_id);
            _active = false;
            _midi = null;
            _id = 0;
            _note_offset = 0;
        }
Пример #7
0
        protected void HandleDeferredCommands(MidiDriver midi)
        {
            uint advance = midi.BaseTempo;

            foreach (var cmd in _deferredCommands)
            {
                if (cmd.TimeLeft == 0)
                    continue;
                if (cmd.TimeLeft <= advance)
                {
                    DoCommandInternal(cmd.A, cmd.B, cmd.C, cmd.D, cmd.E, cmd.F, 0, 0);
                    cmd.TimeLeft = advance;
                }
                cmd.TimeLeft -= advance;
            }
        }
Пример #8
0
        internal protected void ReallocateMidiChannels(MidiDriver midi)
        {
            Part part, hipart;
            byte hipri, lopri;

            while (true)
            {
                hipri = 0;
                hipart = null;
                for (var i = 0; i < 32; i++)
                {
                    part = _parts[i];
                    if (part.Player != null && part.Player.MidiDriver == midi &&
                        !part.Percussion && part.On &&
                        part.MidiChannel == null && part.PriorityEffective >= hipri)
                    {
                        hipri = (byte)part.PriorityEffective;
                        hipart = part;
                    }
                }

                if (hipart == null)
                    return;

                if ((hipart.MidiChannel = midi.AllocateChannel()) == null)
                {
                    lopri = 255;
                    Part lopart = null;
                    for (var i = 0; i < 32; i++)
                    {
                        part = _parts[i];
                        if (part.MidiChannel != null && part.MidiChannel.Device == midi && part.PriorityEffective <= lopri)
                        {
                            lopri = (byte)part.PriorityEffective;
                            lopart = part;
                        }
                    }

                    if (lopart == null || lopri >= hipri)
                        return;
                    lopart.Off();

                    if ((hipart.MidiChannel = midi.AllocateChannel()) == null)
                        return;
                }
                hipart.SendAll();
            }
        }
Пример #9
0
 protected void SequencerTimers(MidiDriver midi)
 {
     for (var i = _players.Length; i != 0; i--)
     {
         var player = _players[i - 1];
         if (player.IsActive && player.MidiDriver == midi)
         {
             player.OnTimer();
         }
     }
 }
Пример #10
0
        internal protected Part AllocatePart(byte pri, MidiDriver midi)
        {
            Part best = null;

            for (var i = 0; i < _parts.Length; i++)
            {
                var part = _parts[i];
                if (part.Player == null)
                {
                    return part;
                }
                if (pri >= part.PriorityEffective)
                {
                    pri = (byte)part.PriorityEffective;
                    best = part;
                }
            }

            if (best != null)
            {
                best.Uninit();
                ReallocateMidiChannels(midi);
            }
            else
            {
                Debug.WriteLine("Denying part request");
            }
            return best;
        }
Пример #11
0
 protected void InitMT32(MidiDriver midi)
 {
     throw new NotImplementedException();
 }
Пример #12
0
        protected void OnTimer(MidiDriver midi)
        {
            lock (_mutex)
            {
                if (_paused || !_initialized)
                    return;

                if (midi == _midi_native || _midi_native == null)
                    HandleDeferredCommands(midi);
                SequencerTimers(midi);
            }
        }
Пример #13
0
 void IIMuse.OnTimer(MidiDriver midi)
 {
     OnTimer(midi);
 }
Пример #14
0
 // Factory function
 public static IMuseInternal Create(MidiDriver nativeMidiDriver, MidiDriver adlibMidiDriver)
 {
     var i = new IMuseInternal();
     i.Initialize(nativeMidiDriver, adlibMidiDriver);
     return i;
 }
Пример #15
0
        internal protected int Initialize(MidiDriver nativeMidiDriver, MidiDriver adlibMidiDriver)
        {
            _midi_native = nativeMidiDriver;
            _midi_adlib = adlibMidiDriver;
            if (nativeMidiDriver != null)
            {
                _timer_info_native.IMuse = this;
                _timer_info_native.Driver = nativeMidiDriver;
                InitMidiDriver(_timer_info_native);
            }
            if (adlibMidiDriver != null)
            {
                _timer_info_adlib.IMuse = this;
                _timer_info_adlib.Driver = adlibMidiDriver;
                InitMidiDriver(_timer_info_adlib);
            }

            if (TempoFactor == 0)
                TempoFactor = 100;
            _master_volume = 255;

            for (var i = 0; i != 8; i++)
                _channel_volume[i] = _channel_volume_eff[i] = _volchan_table[i] = 127;

            InitPlayers();
            InitQueue();
            InitParts();

            _initialized = true;

            return 0;
        }