diff --git a/App.ico b/App.ico
new file mode 100644
index 0000000..34b87df
Binary files /dev/null and b/App.ico differ
diff --git a/License.txt b/License.txt
new file mode 100644
index 0000000..83d2c48
--- /dev/null
+++ b/License.txt
@@ -0,0 +1,413 @@
+
+ Mozilla Public License
+ Version 2.0
+
+
+ 1. Definitions
+
+1.1. “Contributor”
+
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. “Contributor Version”
+
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor’s Contribution.
+
+1.3. “Contribution”
+
+ means Covered Software of a particular Contributor.
+
+1.4. “Covered Software”
+
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. “Incompatible With Secondary Licenses”
+
+ means
+
+ 1.
+
+ that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ 2.
+
+ that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. “Executable Form”
+
+ means any form of the work other than Source Code Form.
+
+1.7. “Larger Work”
+
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. “License”
+
+ means this document.
+
+1.9. “Licensable”
+
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. “Modifications”
+
+ means any of the following:
+
+ 1.
+
+ any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ 2.
+
+ any new file in Source Code Form that contains any Covered Software.
+
+1.11. “Patent Claims” of a Contributor
+
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. “Secondary License”
+
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those licenses.
+
+1.13. “Source Code Form”
+
+ means the form of the work preferred for making modifications.
+
+1.14. “You” (or “Your”)
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, “You” includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, “control” means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+
+ 2. License Grants and Conditions
+
+
+ 2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+ 1.
+
+ under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+ 2.
+
+ under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+
+ 2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+
+ 2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+ 1.
+
+ for any code that a Contributor has removed from Covered Software; or
+
+ 2.
+
+ for infringements caused by: (i) Your and any other third party’s
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ 3.
+
+ under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+
+ 2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+
+ 2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+
+ 2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+
+ 2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+
+ 3. Responsibilities
+
+
+ 3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients’ rights in the Source Code Form.
+
+
+ 3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+ 1.
+
+ such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+ 2.
+
+ You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients’ rights in the Source Code Form under this License.
+
+
+ 3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+
+ 3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+
+ 3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+
+ 4. Inability to Comply Due to Statute or Regulation
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+
+ 5. Termination
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under
+Section 2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+
+ 6. Disclaimer of Warranty
+
+/Covered Software is provided under this License on an “as is” basis,
+without warranty of any kind, either expressed, implied, or statutory,
+including, without limitation, warranties that the Covered Software is
+free of defects, merchantable, fit for a particular purpose or
+non-infringing. The entire risk as to the quality and performance of the
+Covered Software is with You. Should any Covered Software prove
+defective in any respect, You (not any Contributor) assume the cost of
+any necessary servicing, repair, or correction. This disclaimer of
+warranty constitutes an essential part of this License. No use of any
+Covered Software is authorized under this License except under this
+disclaimer./
+
+
+ 7. Limitation of Liability
+
+/Under no circumstances and under no legal theory, whether tort
+(including negligence), contract, or otherwise, shall any Contributor,
+or anyone who distributes Covered Software as permitted above, be liable
+to You for any direct, indirect, special, incidental, or consequential
+damages of any character including, without limitation, damages for lost
+profits, loss of goodwill, work stoppage, computer failure or
+malfunction, or any and all other commercial damages or losses, even if
+such party shall have been informed of the possibility of such damages.
+This limitation of liability shall not apply to liability for death or
+personal injury resulting from such party’s negligence to the extent
+applicable law prohibits such limitation. Some jurisdictions do not
+allow the exclusion or limitation of incidental or consequential
+damages, so this exclusion and limitation may not apply to You./
+
+
+ 8. Litigation
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party’s ability to bring
+cross-claims or counter-claims.
+
+
+ 9. Miscellaneous
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+
+ 10. Versions of the License
+
+
+ 10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in
+Section 10.3, no one other than the license steward has the right to
+modify or publish new versions of this License. Each version will be
+given a distinguishing version number.
+
+
+ 10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+
+ 10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+
+ 10.4. Distributing Source Code Form that is Incompatible With
+ Secondary Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+
+ Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+
+ Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+ This Source Code Form is “Incompatible With Secondary Licenses”, as
+ defined by the Mozilla Public License, v. 2.0.
+
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..214b126
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,37 @@
+/*
+ * TieSoundEditor.exe, Editor for BLAS and VOIC resources in LFD files
+ * Copyright (C) 2007 Michael Gaisser (mjgaisser@gmail.com)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the Mozilla Public License; either version 2.0 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is "as is" without warranty of any kind; including that the
+ * program is free of defects, merchantable, fit for a particular purpose or
+ * non-infringing. See the full license text for more details.
+ *
+ * If a copy of the MPL (MPL.txt) was not distributed with this file,
+ * you can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Version: 1.1.1
+ */
+
+using System;
+using System.Windows.Forms;
+
+namespace Idmr.TieSoundEditor
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new frmTSE());
+ }
+ }
+}
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8724135
--- /dev/null
+++ b/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+/*
+ * TieSoundEditor.exe, Editor for BLAS and VOIC resources in LFD files
+ * Copyright (C) 2007 Michael Gaisser (mjgaisser@gmail.com)
+ * Licensed under the MPL v2.0 or later.
+ *
+ * Full notice in Program.cs
+ * Version: 1.1.1
+ */
+
+using System.Reflection;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("TIE95 Sound Editor")]
+[assembly: AssemblyDescription("Exports and imports BLAS and VOIC resource types as .WAV files")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Imperial Department of Military Research")]
+[assembly: AssemblyProduct("TSE")]
+[assembly: AssemblyCopyright("Copyright © 2007 Michael Gaisser")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.1.1")]
+[assembly: AssemblyFileVersion("1.1.1.0")]
+[assembly: AssemblyInformationalVersion("1.1 Final")]
diff --git a/Readme.txt b/Readme.txt
new file mode 100644
index 0000000..8500262
--- /dev/null
+++ b/Readme.txt
@@ -0,0 +1,60 @@
+TIE Sound Editor
+===============================================================================
+Author: Michael Gaisser (mjgaisser@gmail.com)
+Version 1.1
+Date: 2009.09.18
+===============================================================================
+
+This editor reads and writes the WAV files within the VOIC and BLAS resource
+types found in TIE95 LFD files.
+
+===================
+VERSION HISTORY
+
+v1.1.1 - 29 Jul 2015
+ - Released under MPL 2.0
+
+v1.1 - 18 Sep 2009
+ - Updates to WAV processing
+
+v1.0 - 15 Dec 2007
+ - Release
+
+===================
+WAV GUIDELINES
+
+Filenames for WAV to be imported must match the name of the resource they are
+replacing as shown in the list. This is to orevent accidental overwrites.
+
+Exported WAV files will be 8-bit mono, 11,025 Hz.
+
+===================
+INSTRUCTIONS
+
+- Open the LFD you wish to search using the '...' button next to the LFD text
+box. The VOIC and BLAS resources will be displayed to the right. Selecting a
+sound effect in the list will automatically play the sound.
+
+- To save a resource as WAV, ensure that "Export" is selected, choose your
+source LFD, choose your sound, and then choose your save location. Click the
+Save button to commit. It is highly recommended to not change the filename.
+
+- To import a sound, ensure that "Import" is selected, choose the LFD and
+resource to replace, and then choose the WAV file with the same name as the
+resource you are replacing. Click the Save button to commit.
+
+As always, backup your original files first.
+
+===============================================================================
+Copyright © 2007 Michael Gaisser
+This program and related files are licensed under the Mozilla Public License.
+See License.txt for the full text. If for some reason the license was not
+distributed with this program, you can obtain the full text of the license at
+http://mozilla.org/MPL/2.0/.
+
+"Star Wars" and related items are trademarks of LucasFilm Ltd and
+LucasArts Entertainment Co.
+
+This software is provided "as is" without warranty of any kind; including that
+the software is free of defects, merchantable, fit for a particular purpose or
+non-infringing. See the full license text for more details.
\ No newline at end of file
diff --git a/frmTSE.Designer.cs b/frmTSE.Designer.cs
new file mode 100644
index 0000000..15ad177
--- /dev/null
+++ b/frmTSE.Designer.cs
@@ -0,0 +1,220 @@
+namespace Idmr.TieSoundEditor
+{
+ partial class frmTSE
+ {
+ private System.ComponentModel.IContainer components = null;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox txtLFD;
+ private System.Windows.Forms.TextBox txtWave;
+ private System.Windows.Forms.RadioButton optExport;
+ private System.Windows.Forms.RadioButton optImport;
+ private System.Windows.Forms.ListBox lstVOIC;
+ private System.Windows.Forms.Button cmdLFD;
+ private System.Windows.Forms.Button cmdWave;
+ private System.Windows.Forms.OpenFileDialog opnFile;
+ private System.Windows.Forms.SaveFileDialog savFile;
+ private System.Windows.Forms.Button cmdSave;
+ private System.Windows.Forms.Button cmdExit;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmTSE));
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.txtLFD = new System.Windows.Forms.TextBox();
+ this.txtWave = new System.Windows.Forms.TextBox();
+ this.optExport = new System.Windows.Forms.RadioButton();
+ this.optImport = new System.Windows.Forms.RadioButton();
+ this.lstVOIC = new System.Windows.Forms.ListBox();
+ this.cmdLFD = new System.Windows.Forms.Button();
+ this.cmdWave = new System.Windows.Forms.Button();
+ this.opnFile = new System.Windows.Forms.OpenFileDialog();
+ this.savFile = new System.Windows.Forms.SaveFileDialog();
+ this.cmdSave = new System.Windows.Forms.Button();
+ this.cmdExit = new System.Windows.Forms.Button();
+ this.cmdDump = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.Location = new System.Drawing.Point(8, 24);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(264, 23);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Resource file (LFD) to extract sound from";
+ //
+ // label2
+ //
+ this.label2.Location = new System.Drawing.Point(312, 40);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(120, 16);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "VOIC/BLAS resources";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label3
+ //
+ this.label3.Location = new System.Drawing.Point(8, 88);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(264, 23);
+ this.label3.TabIndex = 2;
+ this.label3.Text = "Wave file to save as";
+ //
+ // txtLFD
+ //
+ this.txtLFD.Location = new System.Drawing.Point(8, 48);
+ this.txtLFD.Name = "txtLFD";
+ this.txtLFD.Size = new System.Drawing.Size(232, 20);
+ this.txtLFD.TabIndex = 3;
+ //
+ // txtWave
+ //
+ this.txtWave.Enabled = false;
+ this.txtWave.Location = new System.Drawing.Point(8, 120);
+ this.txtWave.Name = "txtWave";
+ this.txtWave.Size = new System.Drawing.Size(232, 20);
+ this.txtWave.TabIndex = 4;
+ //
+ // optExport
+ //
+ this.optExport.Checked = true;
+ this.optExport.Location = new System.Drawing.Point(312, 240);
+ this.optExport.Name = "optExport";
+ this.optExport.Size = new System.Drawing.Size(56, 16);
+ this.optExport.TabIndex = 5;
+ this.optExport.TabStop = true;
+ this.optExport.Text = "Export";
+ this.optExport.CheckedChanged += new System.EventHandler(this.optExport_CheckedChanged);
+ //
+ // optImport
+ //
+ this.optImport.Location = new System.Drawing.Point(384, 240);
+ this.optImport.Name = "optImport";
+ this.optImport.Size = new System.Drawing.Size(72, 16);
+ this.optImport.TabIndex = 6;
+ this.optImport.Text = "Import";
+ //
+ // lstVOIC
+ //
+ this.lstVOIC.Location = new System.Drawing.Point(312, 64);
+ this.lstVOIC.Name = "lstVOIC";
+ this.lstVOIC.Size = new System.Drawing.Size(120, 160);
+ this.lstVOIC.TabIndex = 7;
+ this.lstVOIC.SelectedIndexChanged += new System.EventHandler(this.lstVOIC_SelectedIndexChanged);
+ //
+ // cmdLFD
+ //
+ this.cmdLFD.Location = new System.Drawing.Point(248, 48);
+ this.cmdLFD.Name = "cmdLFD";
+ this.cmdLFD.Size = new System.Drawing.Size(24, 23);
+ this.cmdLFD.TabIndex = 8;
+ this.cmdLFD.Text = "...";
+ this.cmdLFD.Click += new System.EventHandler(this.cmdLFD_Click);
+ //
+ // cmdWave
+ //
+ this.cmdWave.Enabled = false;
+ this.cmdWave.Location = new System.Drawing.Point(248, 120);
+ this.cmdWave.Name = "cmdWave";
+ this.cmdWave.Size = new System.Drawing.Size(24, 23);
+ this.cmdWave.TabIndex = 10;
+ this.cmdWave.Text = "...";
+ this.cmdWave.Click += new System.EventHandler(this.cmdWave_Click);
+ //
+ // opnFile
+ //
+ this.opnFile.DefaultExt = "lfd";
+ this.opnFile.Filter = "LFD Resources Files|*.lfd";
+ this.opnFile.Title = "LFD File";
+ this.opnFile.FileOk += new System.ComponentModel.CancelEventHandler(this.opnFile_FileOk);
+ //
+ // savFile
+ //
+ this.savFile.DefaultExt = "wav";
+ this.savFile.Filter = "Wave Files|*.wav";
+ this.savFile.OverwritePrompt = false;
+ this.savFile.Title = "WAV File";
+ this.savFile.FileOk += new System.ComponentModel.CancelEventHandler(this.savFile_FileOk);
+ //
+ // cmdSave
+ //
+ this.cmdSave.Enabled = false;
+ this.cmdSave.Location = new System.Drawing.Point(48, 184);
+ this.cmdSave.Name = "cmdSave";
+ this.cmdSave.Size = new System.Drawing.Size(80, 23);
+ this.cmdSave.TabIndex = 9;
+ this.cmdSave.Text = "Save File";
+ this.cmdSave.Click += new System.EventHandler(this.cmdSave_Click);
+ //
+ // cmdExit
+ //
+ this.cmdExit.Location = new System.Drawing.Point(160, 184);
+ this.cmdExit.Name = "cmdExit";
+ this.cmdExit.Size = new System.Drawing.Size(80, 24);
+ this.cmdExit.TabIndex = 11;
+ this.cmdExit.Text = "E&xit";
+ this.cmdExit.Click += new System.EventHandler(this.cmdExit_Click);
+ //
+ // cmdDump
+ //
+ this.cmdDump.Location = new System.Drawing.Point(244, 225);
+ this.cmdDump.Name = "cmdDump";
+ this.cmdDump.Size = new System.Drawing.Size(50, 30);
+ this.cmdDump.TabIndex = 13;
+ this.cmdDump.Text = "dump";
+ this.cmdDump.UseVisualStyleBackColor = true;
+ this.cmdDump.Click += new System.EventHandler(this.cmdDump_Click);
+ //
+ // frmTSE
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.ClientSize = new System.Drawing.Size(480, 269);
+ this.Controls.Add(this.cmdDump);
+ this.Controls.Add(this.cmdExit);
+ this.Controls.Add(this.cmdWave);
+ this.Controls.Add(this.cmdLFD);
+ this.Controls.Add(this.lstVOIC);
+ this.Controls.Add(this.optImport);
+ this.Controls.Add(this.optExport);
+ this.Controls.Add(this.txtWave);
+ this.Controls.Add(this.txtLFD);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.cmdSave);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "frmTSE";
+ this.Text = "TIE Sound Extractor";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button cmdDump;
+ }
+}
+
diff --git a/frmTSE.cs b/frmTSE.cs
new file mode 100644
index 0000000..5fd2537
--- /dev/null
+++ b/frmTSE.cs
@@ -0,0 +1,279 @@
+/*
+ * TieSoundEditor.exe, Editor for BLAS and VOIC resources in LFD files
+ * Copyright (C) 2007 Michael Gaisser (mjgaisser@gmail.com)
+ * Licensed under the MPL v2.0 or later.
+ *
+ * Full notice in Program.cs
+ * Version: 1.1.1
+ */
+
+/* CHANGELOG
+ * v1.1.1, 150729
+ * - Released under MPL 2.0
+ *
+ * v1.1, 090918
+ * - Updates to WAV processing
+ *
+ * v1.0, 071215
+ * - Release
+*/
+using System;
+using System.IO;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+using Idmr.LfdReader;
+
+namespace Idmr.TieSoundEditor
+{
+ public partial class frmTSE : Form
+ {
+ LfdFile _lfd;
+
+ public frmTSE()
+ {
+ InitializeComponent();
+ }
+
+ // this gets us the required function to play .WAV
+ [DllImport("winmm.dll", SetLastError=true, CallingConvention=CallingConvention.Winapi)]
+ static extern bool PlaySound(byte[] b_ary, IntPtr ptr, SoundFlags sf); // from memory
+ [Flags]
+ public enum SoundFlags : int
+ {
+ //SND_SYNC = 0x0000, // play synchronously (default)
+ SND_ASYNC=0x0001, // play asynchronously
+ //SND_NODEFAULT = 0x0002, // silence (!default) if sound not found
+ SND_MEMORY=0x0004, // pszSound points to a memory file
+ //SND_LOOP = 0x0008, // loop the sound until next sndPlaySound
+ //SND_NOSTOP = 0x0010, // don't stop any currently playing sound
+ //SND_NOWAIT = 0x00002000, // don't wait if the driver is busy
+ //SND_ALIAS = 0x00010000, // name is a registry alias
+ //SND_ALIAS_ID = 0x00110000, // alias is a predefined ID
+ SND_FILENAME=0x00020000, // name is file name
+ //SND_RESOURCE = 0x00040004 // name is resource name or atom
+ }
+
+ private void cmdLFD_Click(object sender, System.EventArgs e)
+ {
+ opnFile.ShowDialog(); // yes, I'm aware I'm using opn even for the WAVtoLFD
+ }
+ private void cmdWave_Click(object sender, System.EventArgs e)
+ {
+ savFile.FileName = lstVOIC.SelectedItem.ToString();
+ savFile.ShowDialog(); // yes, I'm aware I'm using sav even for the WAVtoLFD
+ }
+ private void opnFile_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ try { _lfd = new LfdFile(opnFile.FileName); }
+ catch (Exception x)
+ {
+ MessageBox.Show(x.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ txtLFD.Text = opnFile.FileName;
+ lstVOIC.Items.Clear();
+ txtWave.Enabled = false;
+ cmdWave.Enabled = false;
+ if (!_lfd.HasRmap)
+ if (_lfd.Resources[0].Type == Resource.ResourceType.Voic || _lfd.Resources[0].Type == Resource.ResourceType.Blas)
+ {
+ _lfd.Resources[0].Tag = lstVOIC.Items.Add(_lfd.Resources[0].Name);
+ return;
+ }
+ else return;
+
+ for (int i = 0; i < _lfd.Rmap.NumberOfHeaders; i++)
+ if (_lfd.Rmap.SubHeaders[i].Type == Resource.ResourceType.Voic || _lfd.Rmap.SubHeaders[i].Type == Resource.ResourceType.Blas)
+ {
+ _lfd.Resources[i].Tag = lstVOIC.Items.Add(_lfd.Rmap.SubHeaders[i].Name); // if valid source, add it to the lst
+ }
+ }
+ private void lstVOIC_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ txtWave.Enabled = true;
+ cmdWave.Enabled = true;
+ txtWave.Text = Directory.GetCurrentDirectory() + "\\" + lstVOIC.SelectedItem.ToString() + ".wav";
+ cmdSave.Enabled = true;
+ // play sound from memory as index changes for preview
+ MemoryStream mem = new MemoryStream();
+ VOCtoWAV(mem);
+ byte[] soundBytes = new byte[mem.Length];
+ mem.Position = 0;
+ mem.Read(soundBytes, 0, (int)mem.Length); //read it back into an array
+ PlaySound(soundBytes, IntPtr.Zero, SoundFlags.SND_MEMORY | SoundFlags.SND_ASYNC);
+ mem.Close();
+ }
+ private void savFile_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ cmdSave.Enabled = true;
+ txtWave.Text = savFile.FileName;
+ }
+ private void cmdSave_Click(object sender, System.EventArgs e)
+ {
+ if (optExport.Checked)
+ {
+ FileStream stream = null;
+ try
+ {
+ stream = File.OpenWrite(txtWave.Text);
+ stream.SetLength(1); //resets file in case of overwrite
+ VOCtoWAV(stream);
+ stream.Close();
+ }
+ catch (Exception x)
+ {
+ MessageBox.Show(x.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ stream.Close();
+ return;
+ }
+ }
+ else
+ {
+ try
+ {
+ string s_name = Path.GetFileNameWithoutExtension(txtWave.Text);
+ if (lstVOIC.Items.IndexOf(s_name) == -1) throw new Exception("WAV file name must match an existing VOIC/BLAS to overwrite");
+ WAVtoVOC(lstVOIC.Items.IndexOf(s_name));
+ }
+ catch (Exception x) { MessageBox.Show(x.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
+ }
+ }
+
+ private void VOCtoWAV(Stream s)
+ {
+ BinaryWriter bw = new BinaryWriter(s);
+ Blas blas = _currentBlas;
+ // WAV_HEADER
+ bw.Write("RIFF".ToCharArray());
+ s.Position += 4; // skip over, come back to later, P = 4 (file.length-8)
+ bw.Write("WAVE".ToCharArray());
+ // WAV_DATA_BLOCK
+ // fmt_HEADER
+ bw.Write("fmt ".ToCharArray());
+ bw.Write((uint)16); // fmt block length
+ // fmt_DATA_BLOCK
+ bw.Write((short)1); // uncompressed PCM
+ bw.Write((short)1); // NumChannels (Mono)
+ bw.Write((uint)blas.Frequency); // SampleRate
+ bw.Write((uint)blas.Frequency); // ByteRate (SampleRate * NumChannels * BitsPerSample/8) [SR * 1 * 8/8]
+ bw.Write((short)1); // BlockAlign (NumChannels * BitsPerSample/8) [1 * 8/8]
+ bw.Write((short)8); // BitsPerSample
+ // data_HEADER
+ bw.Write("data".ToCharArray());
+ s.Position += 4; // skip over, come back to later, P = 40 (file.length-44);
+ foreach (Blas.SoundDataBlock sdb in blas.SoundBlocks)
+ if (sdb.Data != null)
+ if (sdb.DoesRepeat)
+ for (int i = 0; i < (sdb.NumberOfRepeats != -1 ? sdb.NumberOfRepeats + 1 : 4); i++) // repeat 4 times for infinite repeats
+ bw.Write(sdb.Data);
+ else bw.Write(sdb.Data);
+ s.SetLength(s.Position);
+ s.Position = 4;
+ bw.Write((uint)(s.Length-8));
+ s.Position = 40;
+ bw.Write((uint)(s.Length-44));
+ }
+ private void WAVtoVOC(int index)
+ {
+ /// okay, here's what I'm going to allow:
+ /// 10-12 kHz , mono, 8bit sample size, uncompressed, single data chunk, filename must match VOIC name
+ /// anything other than that, and I'll try to figure something out (after a lot of testing)
+ FileStream stream = File.Open(txtWave.Text, FileMode.Open, FileAccess.ReadWrite);
+ long pos_fmt, pos_data, data_length;
+ BinaryReader br = new BinaryReader(stream);
+ stream.Position = 0;
+ // going to start with just ensuring the format is right
+ #region validation
+ if (new string(br.ReadChars(4)) != "RIFF") throw new Exception("Invalid file type");
+ stream.Position += 4;
+ if (new string(br.ReadChars(4)) != "WAVE") throw new Exception("Invalid file type");
+ // find the right chunks, since they can technically be *anywhere* in the file (fucking non-standard filetype)
+ for (;;)
+ {
+ if (new string(br.ReadChars(4)) == "fmt ")
+ {
+ pos_fmt = stream.Position - 4;
+ break;
+ }
+ if ((stream.Position + 10) == stream.Length) throw new Exception("fmt chunk missing, invalid WAV file");
+ stream.Position -= 3;
+ }
+ stream.Position = 12;
+ for (;;)
+ {
+ if (new string(br.ReadChars(4)) == "data")
+ {
+ pos_data = stream.Position - 4;
+ break;
+ }
+ if ((stream.Position + 4) == stream.Length) throw new Exception("data chunk missing, invalid WAV file");
+ stream.Position -= 3;
+ }
+ stream.Position = pos_fmt + 8;
+ if (br.ReadUInt16() != 1) throw new Exception("Incorrect format, WAV must be uncompressed PCM");
+ if (br.ReadUInt16() != 1) throw new Exception("Incorrect format, WAV must be mono");
+ int freq = br.ReadInt32();
+ if (freq < 10000 || freq > 12000) throw new Exception("Incorrect format, WAV must be between 10-12 kHz");
+ stream.Position += 6;
+ if (br.ReadUInt16() != 8) throw new Exception("Incorrect format, WAV must be 8-bit");
+ #endregion
+ /// okay, now that the file has been confirmed as legit, time to write this thing.
+ /// the header (including the VOC header) is predetermined, and already in place.
+ /// Really only need to take care of a couple length values, which we need to calculate first
+ /// to determine if we need to follow up with shifting the entire file past that point (which is most likely)
+ stream.Position = pos_data + 4;
+ data_length = br.ReadUInt32(); // WAV data block length
+ Blas blas = null;
+ for (int i = 0; i < _lfd.Resources.Count; i++)
+ if ((int)_lfd.Resources[i].Tag == index)
+ {
+ blas = (Blas)_lfd.Resources[i];
+ index = i;
+ break;
+ }
+ stream.Position = pos_data + 8;
+ blas.SoundBlocks[0].Data = br.ReadBytes((int)data_length);
+ stream.Close();
+ blas.Frequency = freq;
+ _lfd.Resources[index] = blas;
+ _lfd.Write();
+ }
+
+ private void optExport_CheckedChanged(object sender, System.EventArgs e)
+ {
+ if (optExport.Checked)
+ {
+ label1.Text = "Resource file (LFD) to extract sound from";
+ label3.Text = "Wave file to save as";
+ }
+ else
+ {
+ label1.Text = "Resource file (LFD) to save sound in";
+ label3.Text = "Wave file to load (must match VOIC/BLAS name)";
+ }
+ }
+ private void cmdExit_Click(object sender, System.EventArgs e)
+ {
+ Application.Exit();
+ }
+
+ private void cmdDump_Click(object sender, EventArgs e)
+ {
+ Blas blas = _currentBlas;
+ FileStream dump = File.OpenWrite(_lfd.FilePath + "_dump.txt");
+ new BinaryWriter(dump).Write(blas.RawData);
+ dump.SetLength(dump.Position);
+ dump.Close();
+ }
+
+ Blas _currentBlas
+ {
+ get
+ {
+ for (int i = 0; i < _lfd.Resources.Count; i++)
+ if ((int)_lfd.Resources[i].Tag == lstVOIC.SelectedIndex) return (Blas)_lfd.Resources[i];
+ return null;
+ }
+ }
+ }
+}