예제 #1
0
        /// <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);
                }
            }
        }
예제 #2
0
파일: SSMTool.cs 프로젝트: Ripple884/HSDLib
        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);
            }
        }
예제 #3
0
파일: SSMTool.cs 프로젝트: Ripple884/HSDLib
        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);
                }
            }
        }
예제 #4
0
        /// <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);
                }
            }
        }
예제 #5
0
파일: SSMTool.cs 프로젝트: Ripple884/HSDLib
        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();
        }
예제 #6
0
        /// <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);
                    }
                }
        }