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(); }
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; }
public static IIMuse Create(MidiDriver nativeMidiDriver, MidiDriver adlibMidiDriver) { var imuse = new IMuseInternal(); imuse.Initialize(nativeMidiDriver, adlibMidiDriver); return imuse; }
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); } }
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; }
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; }
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; } }
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(); } }
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(); } } }
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; }
protected void InitMT32(MidiDriver midi) { throw new NotImplementedException(); }
protected void OnTimer(MidiDriver midi) { lock (_mutex) { if (_paused || !_initialized) return; if (midi == _midi_native || _midi_native == null) HandleDeferredCommands(midi); SequencerTimers(midi); } }
void IIMuse.OnTimer(MidiDriver midi) { OnTimer(midi); }
// Factory function public static IMuseInternal Create(MidiDriver nativeMidiDriver, MidiDriver adlibMidiDriver) { var i = new IMuseInternal(); i.Initialize(nativeMidiDriver, adlibMidiDriver); return i; }
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; }