/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void importDSPToolStripMenuItem_Click(object sender, EventArgs e) { var files = FileIO.OpenFiles(DSP.SupportedImportFilter); if (files != null) { foreach (var file in files) { var dsp = new DSP(); dsp.FromFormat(File.ReadAllBytes(file), Path.GetExtension(file)); Sounds.Add(dsp); } } }
private DSP ImportDSP(string filePath) { using (BinaryReaderExt r = new BinaryReaderExt(new FileStream(filePath, FileMode.Open))) { r.BigEndian = true; var dsp = new DSP(); r.ReadInt32(); var nibbleCount = r.ReadInt32(); dsp.Frequency = r.ReadInt32(); var channel = new DSPChannel(); channel.LoopFlag = r.ReadInt16(); channel.Format = r.ReadInt16(); var LoopStartOffset = r.ReadInt32(); var LoopEndOffset = r.ReadInt32(); var CurrentAddress = r.ReadInt32(); for (int k = 0; k < 0x10; k++) { channel.COEF[k] = r.ReadInt16(); } channel.Gain = r.ReadInt16(); channel.InitialPredictorScale = r.ReadInt16(); channel.InitialSampleHistory1 = r.ReadInt16(); channel.InitialSampleHistory2 = r.ReadInt16(); channel.LoopPredictorScale = r.ReadInt16(); channel.LoopSampleHistory1 = r.ReadInt16(); channel.LoopSampleHistory2 = r.ReadInt16(); r.ReadInt16(); // padding r.Seek(0x60); channel.NibbleCount = nibbleCount; channel.LoopStart = LoopStartOffset - CurrentAddress; channel.Data = r.ReadBytes((int)Math.Ceiling(nibbleCount / 2d)); dsp.Channels.Add(channel); r.BaseStream.Close(); return(dsp); } }
private void SaveSoundAsDSP(string filePath, DSP dsp) { if (dsp.Channels.Count == 1) { // mono SaveChannelAsDSP(filePath, dsp.Channels[0], dsp.Frequency); } else { // stereo or more var head = Path.GetDirectoryName(filePath) + "\\" + Path.GetFileNameWithoutExtension(filePath); var ext = Path.GetExtension(filePath); for (int i = 0; i < dsp.Channels.Count; i++) { SaveChannelAsDSP(head + $"_channel_{i}" + ext, dsp.Channels[i], dsp.Frequency); } } }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonSoundBankAdd_Click(object sender, EventArgs e) { if (_entry == null) return; var files = FileIO.OpenFiles(DSP.SupportedImportFilter); if (files != null) { foreach (var file in files) { var dsp = new DSP(); dsp.FromFile(file); soundArrayEditor.AddItem(dsp); } } }
private void PlaySound(DSP dsp) { // Stop the player if it is running. if (SoundPlayer != null) { SoundPlayer.Stop(); SoundPlayer.Stream.Close(); SoundPlayer.Stream.Dispose(); SoundPlayer.Dispose(); SoundPlayer = null; } // Make the new player for the WAV file. var wavFile = dsp.ToWAVE(); var stream = new MemoryStream(); stream.Write(wavFile, 0, wavFile.Length); stream.Position = 0; SoundPlayer = new SoundPlayer(stream); // Play. SoundPlayer.Play(); }
/// <summary> /// Used in Eighting Engine Games /// </summary> /// <param name="filePath"></param> private void OpenSDI(string filePath) { var sam = filePath.Replace(".sdi", ".sam"); if (!File.Exists(sam)) { return; } using (BinaryReaderExt r = new BinaryReaderExt(new FileStream(filePath, FileMode.Open))) using (BinaryReaderExt d = new BinaryReaderExt(new FileStream(sam, FileMode.Open))) { r.BigEndian = true; while (true) { var id = r.ReadInt32(); if (id == -1) { break; } var dataoffset = r.ReadUInt32(); var padding = r.ReadInt32(); var flags = r.ReadInt16(); var frequency = r.ReadInt16(); var value = r.ReadInt32(); r.Skip(8); // unknown uint coefOffset = r.ReadUInt32(); DSP dsp = new DSP(); dsp.Frequency = frequency; DSPChannel channel = new DSPChannel(); channel.NibbleCount = value; var temp = r.Position; var end = (uint)d.Length; if (r.ReadInt32() != -1) { end = r.ReadUInt32(); } r.Seek(coefOffset); r.ReadInt32(); r.ReadInt32(); for (int i = 0; i < 0x10; i++) { channel.COEF[i] = r.ReadInt16(); } r.Seek(temp); d.Seek(dataoffset); byte[] data = d.ReadBytes((int)(end - dataoffset)); channel.Data = data; channel.InitialPredictorScale = data[0]; dsp.Channels.Add(channel); Sounds.Add(dsp); } } }