コード例 #1
0
        static void MakeAllDataLength_Song(List <Address> list, int i, uint songpointer)
        {
            uint songaddr = Program.ROM.p32(songpointer);

            if (!U.isSafetyOffset(songaddr))
            {
                return;
            }

            {//楽譜
                string name = "Song" + U.ToHexString(i) + " ";
                //リサイクルで回収できるので、仮にこのデータをリサイクルするとしたら、どうなるだけ求める(実際にリサイクルはしない)
                SongUtil.RecycleOldSong(ref list, name, songpointer);
            }
        }
コード例 #2
0
        void ImportGBAWave(NumericUpDown addrNumObj)
        {
            uint addr = (uint)addrNumObj.Value;

            addr = U.toOffset(addr);

            if (AddressList.SelectedIndex < 0)
            {
                return;
            }
            uint songtable_address = InputFormRef.BaseAddress + (InputFormRef.BlockSize * (uint)AddressList.SelectedIndex);

            string title  = R._("インポートするwavファイルを選択してください");
            string filter = R._("wav|*.wav|All files|*");

            OpenFileDialog open = new OpenFileDialog();

            open.Title  = title;
            open.Filter = filter;
            Program.LastSelectedFilename.Load(this, "", open);
            DialogResult dr = open.ShowDialog();

            if (dr != DialogResult.OK)
            {
                return;
            }
            if (!U.CanReadFileRetry(open))
            {
                return;
            }
            Program.LastSelectedFilename.Save(this, "", open);
            string filename = open.FileNames[0];

            byte[] wave    = File.ReadAllBytes(filename);
            byte[] gbawave = SongUtil.wavToByte(wave, useFormatCheck: true);
            if (gbawave == null)
            {
                return;
            }

            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "Instrument Wave");
            uint          newaddr  = InputFormRef.WriteBinaryData(this, addr, gbawave, gbawave_length, undodata);

            Program.Undo.Push(undodata);

            addrNumObj.Value = newaddr;
            WriteButton.PerformClick();
        }
コード例 #3
0
        public void Init(uint instaddr, SongUtil.Track track)
        {
            this.SongInstrumentList     = SongInstrumentForm.MakeList(instaddr);
            this.ChangeVoices           = SongUtil.GetVoices(track);
            this.VolNumericUpDown.Value = 0;
            this.PanNumericUpDown.Value = 0;

            this.VoiceListbox.BeginUpdate();
            for (int i = 0; i < this.ChangeVoices.Count; i++)
            {
                string v = GetVoiceName(this.ChangeVoices[i]);
                this.VoiceListbox.Items.Add(v);
            }
            this.VoiceListbox.EndUpdate();

            this.Address.Value = Program.ROM.p32((uint)track.basepointer);
        }
コード例 #4
0
        static uint FindSongTable(byte[] data)
        {
            uint songpointer = SongUtil.FindSongTablePointer(data);

            if (songpointer == U.NOT_FOUND)
            {
                return(U.NOT_FOUND);
            }

            uint songlist = U.u32(data, songpointer);

            if (!U.isPointer(songlist))
            {
                return(U.NOT_FOUND);
            }
            return(U.toOffset(songlist));
        }
コード例 #5
0
        public void Init(uint instaddr, List <SongUtil.Track> tracks)
        {
            this.SongInstrumentList = SongInstrumentForm.MakeList(instaddr);

            this.ChangeVoices = new List <SongUtil.ChangeVoiceSt>();
            for (int i = 0; i < tracks.Count; i++)
            {
                SongUtil.GetVoices(tracks[i], ref this.ChangeVoices);
            }
            this.VolNumericUpDown.Value = 0;
            this.PanNumericUpDown.Value = 0;

            this.VoiceListbox.BeginUpdate();
            for (int i = 0; i < this.ChangeVoices.Count; i++)
            {
                string v = GetVoiceName(this.ChangeVoices[i]);
                this.VoiceListbox.Items.Add(v);
            }
            this.VoiceListbox.EndUpdate();
        }
コード例 #6
0
ファイル: SongTableForm.cs プロジェクト: delvier/FEBuilderGBA
        public static uint GetSoundTablePointer()
        {
            uint p = Program.ROM.RomInfo.sound_table_pointer();
            uint a = Program.ROM.u32(p);

            if (U.isSafetyPointer(a))
            {
                return(p);
            }
            p = SongUtil.FindSongTablePointer(Program.ROM.Data);
            if (U.isSafetyOffset(p))
            {
                a = Program.ROM.u32(p);
                if (U.isSafetyPointer(a))
                {
                    return(p);
                }
            }
            return(0);
        }
コード例 #7
0
        void ExportGBAWave(NumericUpDown addrNumObj, string fingerPrint)
        {
            string title  = R._("保存するファイル名を選択してください");
            string filter = R._("wav|*.wav|All files|*");

            string songname = "instrument_" + U.ToHexString(AddressList.SelectedIndex) + "_" + fingerPrint;
            uint   addr     = (uint)addrNumObj.Value;

            addr = U.toOffset(addr);

            SaveFileDialog save = new SaveFileDialog();

            save.Title        = title;
            save.Filter       = filter;
            save.AddExtension = true;
            Program.LastSelectedFilename.Load(this, "", save, songname);

            DialogResult dr = save.ShowDialog();

            if (dr != DialogResult.OK)
            {
                return;
            }
            if (save.FileNames.Length <= 0 || !U.CanWriteFileRetry(save.FileNames[0]))
            {
                return;
            }
            Program.LastSelectedFilename.Save(this, "", save);
            string filename = save.FileNames[0];


            if (!U.isSafetyOffset(addr))
            {
                return;
            }

            byte[] wave = SongUtil.byteToWav(Program.ROM.Data, addr);
            U.WriteAllBytes(filename, wave);

            U.SelectFileByExplorer(filename);
        }
コード例 #8
0
        private void TrackLabel_Click(object sender, EventArgs e)
        {
            if (!(sender is Label))
            {
                return;
            }
            Label  la       = (Label)sender;
            string noString = U.substr(la.Name, 10);
            int    no       = (int)U.atoi(noString);

            if (no <= 0)
            {
                return;
            }

            no = no - 1;
            if (no >= Tracks.Count)
            {
                return;
            }

            SongTrackChangeTrackForm f = (SongTrackChangeTrackForm)InputFormRef.JumpFormLow <SongTrackChangeTrackForm>();

            f.Init((uint)P4.Value, this.Tracks[no]);
            DialogResult dr = f.ShowDialog();

            if (dr != System.Windows.Forms.DialogResult.Yes)
            {
                return;
            }
            SongUtil.ChangeTrackAndWrite(this.Tracks[no]
                                         , f.GetChangeVoices()
                                         , f.GetChangeVol()
                                         , f.GetChangePan()
                                         , 0
                                         , f.IsChangeVelocity()
                                         );
            this.WriteButton.PerformClick();

            U.ReSelectList(this.AddressList);
        }
コード例 #9
0
        private void AllTracksLabel_Click(object sender, EventArgs e)
        {
            SongTrackAllChangeTrackForm f = (SongTrackAllChangeTrackForm)InputFormRef.JumpFormLow <SongTrackAllChangeTrackForm>();

            f.Init((uint)P4.Value, this.Tracks);
            DialogResult dr = f.ShowDialog();

            if (dr != System.Windows.Forms.DialogResult.Yes)
            {
                return;
            }
            for (int i = 0; i < this.Tracks.Count; i++)
            {
                SongUtil.ChangeTrackAndWrite(this.Tracks[i]
                                             , f.GetChangeVoices()
                                             , f.GetChangeVol()
                                             , f.GetChangePan()
                                             , f.GetChangeTempo()
                                             );
            }
            this.WriteButton.PerformClick();

            U.ReSelectList(this.AddressList);
        }
コード例 #10
0
        static void ExportAllLow(string filename, uint voca_baseaddress, bool isNest)
        {
            voca_baseaddress = U.toOffset(voca_baseaddress);
            if (!U.isSafetyOffset(voca_baseaddress))
            {
                return;
            }

            string dir      = Path.GetDirectoryName(filename);
            string basename = Path.GetFileNameWithoutExtension(filename);

            //楽器リスト本体
            InputFormRef InputFormRef = Init(null);

            InputFormRef.ReInit(voca_baseaddress);

            List <string> lines = new List <string>();

            uint voca_endaddress = voca_baseaddress + ((InputFormRef.DataCount + 1) * InputFormRef.BlockSize);
            uint addr            = voca_baseaddress;

            for (int i = 0; i < InputFormRef.DataCount; i++, addr += InputFormRef.BlockSize)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 0))); sb.Append("\t");
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 1))); sb.Append("\t");
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 2))); sb.Append("\t");
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 3))); sb.Append("\t");

                uint type = Program.ROM.u8(addr);
                if (type == 0x00 ||
                    type == 0x08 ||
                    type == 0x10 ||
                    type == 0x18
                    )
                {//directsound waveデータ.
                    uint songdata_addr = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(songdata_addr))
                    {
                        continue;
                    }
                    uint sample_length = Program.ROM.u32(songdata_addr + 12);
                    if (!U.isSafetyLength(songdata_addr + 12 + 4, sample_length))
                    {
                        continue;
                    }
                    if (!SongUtil.IsDirectSoundData(Program.ROM.Data, songdata_addr))
                    {//壊れたデータ
                        continue;
                    }

                    string waveFilename = basename + U.To0xHexString(i) + ".DirectSound.bin";
                    byte[] bin          = Program.ROM.getBinaryData(songdata_addr, 12 + 4 + sample_length);
                    U.WriteAllBytes(Path.Combine(dir, waveFilename), bin);

                    sb.Append(waveFilename); sb.Append("\t");
                }
                else if (type == 0x03 ||
                         type == 0x0B
                         )
                {//波形データ
                    uint songdata_addr = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(songdata_addr))
                    {
                        continue;
                    }

                    byte[] bin          = Program.ROM.getBinaryData(songdata_addr, 16);
                    string waveFilename = basename + U.To0xHexString(i) + ".Wave.bin";
                    U.WriteAllBytes(Path.Combine(dir, waveFilename), bin);

                    sb.Append(waveFilename); sb.Append("\t");
                }
                else if (type == 0x80)
                {//ドラム
                    uint drum_voices = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(drum_voices))
                    {
                        continue;
                    }

                    if (drum_voices == voca_baseaddress)
                    {
                        sb.Append("@SELF+0"); sb.Append("\t");
                    }
                    else if (isNest)
                    {
                        if (drum_voices >= voca_baseaddress && drum_voices < voca_endaddress)
                        {
                            sb.Append("@SELF+" + U.ToHexString(drum_voices - voca_baseaddress)); sb.Append("\t");
                        }
                        else
                        {
                            sb.Append("@BROKENDATA"); sb.Append("\t");
                        }
                    }
                    else
                    {
                        string drumFilename = basename + U.To0xHexString(i) + ".Drum.instrument";
                        ExportAllLow(Path.Combine(dir, drumFilename), drum_voices, true);
                        sb.Append(drumFilename); sb.Append("\t");
                    }
                }
                else if (type == 0x40)
                {//マルチサンプル
                    uint multisample_voices = Program.ROM.p32(addr + 4);
                    uint sample_location    = Program.ROM.p32(addr + 8);
                    if (!U.isSafetyOffset(multisample_voices))
                    {
                        continue;
                    }
                    if (!U.isSafetyOffset(sample_location))
                    {
                        continue;
                    }

                    if (multisample_voices == voca_baseaddress)
                    {
                        sb.Append("@SELF+0"); sb.Append("\t");
                    }
                    else if (isNest)
                    {
                        if (multisample_voices >= voca_baseaddress && multisample_voices < voca_endaddress)
                        {
                            sb.Append("@SELF+" + U.ToHexString(multisample_voices - voca_baseaddress)); sb.Append("\t");
                        }
                        else
                        {
                            sb.Append("@BROKENDATA"); sb.Append("\t");
                        }
                    }
                    else
                    {//自己参照以外を記録します
                        string multiFilename = basename + U.To0xHexString(i) + ".Multi.instrument";
                        ExportAllLow(Path.Combine(dir, multiFilename), multisample_voices, true);
                        sb.Append(multiFilename); sb.Append("\t");
                    }

                    byte[] bin          = Program.ROM.getBinaryData(sample_location, 128);
                    string waveFilename = basename + U.To0xHexString(i) + ".Multi.keys.bin";
                    U.WriteAllBytes(Path.Combine(dir, waveFilename), bin);

                    sb.Append(waveFilename); sb.Append("\t");
                }
                else
                {
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 4))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 5))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 6))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 7))); sb.Append("\t");
                }

                if (type != 0x40)
                {//マルチサンプル以外は、最後の4バイトはデータです
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 8))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 9))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 10))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 11)));
                }

                U.AddrResult ar = InputFormRef.LoopCallback(i, addr);
                if (!ar.isNULL())
                {
                    sb.Append("\t//");
                    sb.Append(ar.name);
                }

                lines.Add(sb.ToString());
            }
            File.WriteAllLines(filename, lines);
        }
コード例 #11
0
        public static void RecycleOldInstrument(ref List <Address> recycle, string basename, uint voca_basepointer)
        {
            if (!U.isSafetyOffset(voca_basepointer))
            {
                return;
            }

            uint voca_baseaddress = Program.ROM.u32(voca_basepointer);

            if (!U.isPointer(voca_baseaddress))
            {
                return;
            }
            voca_baseaddress = U.toOffset(voca_baseaddress);
            if (!U.isSafetyOffset(voca_baseaddress))
            {
                return;
            }

            //既に記録しているならば無視.
            for (int i = 0; i < recycle.Count; i++)
            {
                if (recycle[i].Addr == voca_baseaddress)
                {
                    return;
                }
            }

            //楽器リスト本体
            InputFormRef InputFormRef = Init(null);

            InputFormRef.ReInitPointer(voca_basepointer);
            FEBuilderGBA.Address.AddAddress(recycle
                                            , InputFormRef
                                            , basename
                                            , new uint[] { 4, 8 }
                                            );

            uint voca_endaddress = voca_baseaddress + ((InputFormRef.DataCount + 1) * InputFormRef.BlockSize);
            uint addr            = voca_baseaddress;

            for (int i = 0; i < InputFormRef.DataCount; i++, addr += InputFormRef.BlockSize)
            {
                uint type = Program.ROM.u8(addr);
                if (type == 0x00 ||
                    type == 0x08 ||
                    type == 0x10 ||
                    type == 0x18
                    )
                {//directsound waveデータ.
                    uint songdata_addr = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(songdata_addr))
                    {
                        continue;
                    }
                    uint sample_length = Program.ROM.u32(songdata_addr + 12);
                    if (!U.isSafetyLength(songdata_addr + 12 + 4, sample_length))
                    {//壊れたデータ 長さが取れない
                        FEBuilderGBA.Address.AddPointer(recycle
                                                        , addr + 4
                                                        , 0
                                                        , basename + U.To0xHexString(i) + "DIRECTSOUND(BROKEN)"
                                                        , FEBuilderGBA.Address.DataTypeEnum.SONGINSTDIRECTSOUND);
                        continue;
                    }
                    if (!SongUtil.IsDirectSoundData(Program.ROM.Data, songdata_addr))
                    {//壊れたデータ
                        FEBuilderGBA.Address.AddPointer(recycle
                                                        , addr + 4
                                                        , 0
                                                        , basename + U.To0xHexString(i) + "DIRECTSOUND(BROKEN)"
                                                        , FEBuilderGBA.Address.DataTypeEnum.SONGINSTDIRECTSOUND);
                        continue;
                    }

                    FEBuilderGBA.Address.AddPointer(recycle
                                                    , addr + 4
                                                    , 12 + 4 + sample_length
                                                    , basename + U.To0xHexString(i) + "DIRECTSOUND"
                                                    , FEBuilderGBA.Address.DataTypeEnum.SONGINSTDIRECTSOUND);
                }
                else if (type == 0x03 ||
                         type == 0x0B
                         )
                {//波形データ
                    uint songdata_addr = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(songdata_addr))
                    {
                        continue;
                    }
                    FEBuilderGBA.Address.AddPointer(recycle
                                                    , addr + 4
                                                    , 16
                                                    , basename + U.To0xHexString(i) + "WAVE"
                                                    , FEBuilderGBA.Address.DataTypeEnum.SONGINSTWAVE);
                }
                else if (type == 0x80)
                {//ドラム
                    uint drum_voices = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(drum_voices))
                    {
                        continue;
                    }

                    RecycleOldInstrument(ref recycle
                                         , basename + U.To0xHexString(i) + "DRUM "
                                         , addr + 4);
                }
                else if (type == 0x40)
                {//マルチサンプル
                    uint multisample_voices = Program.ROM.p32(addr + 4);
                    uint sample_location    = Program.ROM.p32(addr + 8);
                    if (!U.isSafetyOffset(multisample_voices))
                    {
                        continue;
                    }
                    if (!U.isSafetyOffset(sample_location))
                    {
                        continue;
                    }

                    RecycleOldInstrument(ref recycle
                                         , basename + U.To0xHexString(i) + "MULTI "
                                         , addr + 4);

                    FEBuilderGBA.Address.AddPointer(recycle
                                                    , addr + 8
                                                    , 128
                                                    , basename + U.To0xHexString(i) + "MULTI2"
                                                    , FEBuilderGBA.Address.DataTypeEnum.BIN);
                }
            }
        }
コード例 #12
0
        private void ExportButton_Click(object sender, EventArgs e)
        {
            string title  = R._("保存するファイル名を選択してください");
            string filter = R._("sound|*.s;*.mid|s|*.s|midi|*.mid|MusicalInstrument|*.instrument|SondFont|*.sf2|All files|*");

            string songname = "song" + U.ToHexString(AddressList.SelectedIndex);

            SaveFileDialog save = new SaveFileDialog();

            save.Title        = title;
            save.Filter       = filter;
            save.AddExtension = true;
            Program.LastSelectedFilename.Load(this, "", save, songname);

            DialogResult dr = save.ShowDialog();

            if (dr != DialogResult.OK)
            {
                return;
            }
            if (save.FileNames.Length <= 0 || !U.CanWriteFileRetry(save.FileNames[0]))
            {
                return;
            }
            Program.LastSelectedFilename.Save(this, "", save);
            string filename = save.FileNames[0];

            int  NumBlks         = (int)B1.Value;
            int  Priority        = (int)B2.Value;
            int  Reverb          = (int)B3.Value;
            uint instrument_addr = (uint)P4.Value;

            string ext = U.GetFilenameExt(filename);

            if (ext == ".MID" || ext == ".MIDI")
            {
                if (SongUtil.UseGBAMusRiper())
                {
                    SongUtil.ExportMidiFileByGBAMusRiper(filename, (uint)this.Address.Value);
                }
                else
                {
                    SongUtil.ExportMidiFile(filename, songname
                                            , Tracks, NumBlks, Priority, Reverb, instrument_addr);
                }
            }
            else if (ext == ".SF2")
            {
                SongUtil.ExportSoundFontByGBAMusRiper(filename, (uint)this.Address.Value);
            }
            else if (ext == ".INSTRUMENT")
            {
                //少し時間がかかるので、しばらくお待ちください表示.
                using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
                {
                    SongUtil.ExportInstrument(filename, instrument_addr);
                }
            }
            else
            {
                SongUtil.ExportSFile(filename, songname
                                     , Tracks, NumBlks, Priority, Reverb, instrument_addr);
            }

            //エクスプローラで選択しよう
            U.SelectFileByExplorer(filename);
        }
コード例 #13
0
        private void ImportButton_Click(object sender, EventArgs e)
        {
            if (InputFormRef.IsPleaseWaitDialog(this))
            {//2重割り込み禁止
                return;
            }
            if (AddressList.SelectedIndex <= 0)
            {
                return;
            }
            if (!this.InputFormRef.CheckWriteProtectionID00())
            {
                return;
            }

            string filename;

            if (ImageFormRef.GetDragFilePath(out filename))
            {
            }
            else
            {
                string title  = R._("インポートする音楽ファイルを選択してください");
                string filter = R._("sound|*.s;*.wav;*.mid;*.midi;*.instrument|s|*.s|midi|*.mid;*.midi|wav|*.wav|MusicalInstrument|*.instrument|All files|*");

                OpenFileDialog open = new OpenFileDialog();
                open.Title  = title;
                open.Filter = filter;
                Program.LastSelectedFilename.Load(this, "", open);
                DialogResult dr = open.ShowDialog();
                if (dr != DialogResult.OK)
                {
                    return;
                }
                if (!U.CanReadFileRetry(open))
                {
                    return;
                }
                Program.LastSelectedFilename.Save(this, "", open);
                filename = open.FileNames[0];
            }

            uint songtable_address = InputFormRef.BaseAddress + (InputFormRef.BlockSize * (uint)AddressList.SelectedIndex);

            string error = "";

            string ext = U.GetFilenameExt(filename);

            if (ext == ".WAV" || ext == ".WAVE")
            {
                SongTrackImportWaveForm f = (SongTrackImportWaveForm)InputFormRef.JumpFormLow <SongTrackImportWaveForm>();
                f.Init(filename);
                DialogResult dr = f.ShowDialog();
                if (dr != System.Windows.Forms.DialogResult.OK)
                {
                    f.Dettach();
                    return;
                }
                error = SongUtil.ImportWave(f.GetFilename(), songtable_address, f.UseLoop());
                f.Dettach();
            }
            else if (ext == ".MID" || ext == ".MIDI")
            {
                //楽器セットとオプションを選択してもらう.
                SongTrackImportMidiForm f = (SongTrackImportMidiForm)InputFormRef.JumpFormLow <SongTrackImportMidiForm>();
                f.Init((uint)P4.Value);
                DialogResult dr = f.ShowDialog();
                if (dr != System.Windows.Forms.DialogResult.OK)
                {
                    return;
                }

                //少し時間がかかるので、しばらくお待ちください表示.
                using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
                {
                    if (f.GetUseMID2AGB() == SongTrackImportMidiForm.ImportMethod.FEBuilderGBA)
                    {//FEBuilderGBAでimport
                        error = SongUtil.ImportMidiFile(filename, songtable_address
                                                        , f.GetInstrumentAddr()
                                                        , f.GetIgnoreMOD()
                                                        , f.GetIgnoreBEND()
                                                        , f.GetIgnoreLFOS()
                                                        , f.GetIgnoreHEAD()
                                                        , f.GetIgnoreBACK()
                                                        );
                    }
                    else
                    {//mid2agbでimport
                        error = SongUtil.ImportMidiFileMID2AGB(filename, songtable_address
                                                               , f.GetInstrumentAddr()
                                                               , f.GetMID2AGB_V()
                                                               , f.GetMID2AGB_R()
                                                               , f.GetIgnoreMOD()
                                                               , f.GetIgnoreBEND()
                                                               , f.GetIgnoreLFOS()
                                                               );
                    }
                }
            }
            else if (ext == ".INSTRUMENT")
            {
                //少し時間がかかるので、しばらくお待ちください表示.
                using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
                {
                    error = SongUtil.ImportInstrument(filename, songtable_address);
                }
            }
            else
            {
                //楽器セットを選択してもらう.
                SongTrackImportSelectInstrumentForm f = (SongTrackImportSelectInstrumentForm)InputFormRef.JumpFormLow <SongTrackImportSelectInstrumentForm>();
                f.Init((uint)P4.Value);
                DialogResult dr = f.ShowDialog();
                if (dr != System.Windows.Forms.DialogResult.OK)
                {
                    return;
                }

                //少し時間がかかるので、しばらくお待ちください表示.
                using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
                {
                    error = SongUtil.ImportS(filename, songtable_address, f.GetInstrumentAddr());
                }
            }


            if (error != "")
            {
                R.ShowStopError(error);
                return;
            }

            int selectedIndex = AddressList.SelectedIndex;

            ReloadListButton.PerformClick();
            AddressList.SelectedIndex = selectedIndex;

            SongTableForm.ReloadList();
            InputFormRef.ShowWriteNotifyAnimation(this, 0);
        }
コード例 #14
0
        public static void MakeCheckError(List <FELint.ErrorSt> errors, uint songid, uint songaddr, bool isMapBGM)
        {
            if (songaddr == 0)
            {
                return;
            }
            if (!U.isSafetyOffset(songaddr))
            {
                return;
            }
            uint trackCount = Program.ROM.u8(songaddr + 0);

            if (songid == 0)
            {
                if (trackCount != 0)
                {
                    errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, songaddr
                                                  , R._("SongID {0}のトラックは常に0である必要があります。現在値:{1}", U.To0xHexString(songid), U.To0xHexString(trackCount)), songid));
                }
                return;
            }
            if (trackCount > 16)
            {
                errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, songaddr
                                              , R._("SongID {0}のトラックは常に16以内である必要があります。現在値:{1}", U.To0xHexString(songid), U.To0xHexString(trackCount)), songid));
            }
            if (trackCount == 0)
            {//トラック数が0のダミートラックの場合、チェックしない
                return;
            }

            //楽器のチェック
            uint instPointer = Program.ROM.u32(songaddr + 4);

            if (!U.isSafetyPointer(instPointer))
            {//無効なポインタ
                errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, U.toOffset(songaddr)
                                              , R._("SongID {0}の楽器ポインタ「{1}」は無効です。", U.To0xHexString(songid), U.To0xHexString(instPointer)), songid));
                return;
            }
            //他のゲームからインポートした楽器は、複雑すぎて誤爆するのでEOTの検出するの辞めようと思いました
            bool othergame_song = SongInstrumentForm.IsOtherGameInst(instPointer);

            if (othergame_song)
            {
                isMapBGM = false;
            }

            //トラックのポインタチェック
            List <SongUtil.Track> tracks = SongUtil.ParseTrack(songaddr, trackCount);

            for (uint tracknumber = 0; tracknumber < trackCount; tracknumber++)
            {
                uint trackAddr    = songaddr + 8 + (tracknumber * 4);
                uint trackPointer = Program.ROM.u32(trackAddr);
                if (!U.isSafetyPointer(trackPointer))
                {//無効なポインタ
                    errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, U.toOffset(songaddr)
                                                  , R._("SongID {0}のトラック{1}のポインタ「{2}」は無効です。\r\nトラック数が間違っていませんか?", U.To0xHexString(songid), tracknumber, U.To0xHexString(trackPointer)), songid));
                    continue;
                }
                if (tracknumber >= tracks.Count)
                {
                    continue;
                }
                SongUtil.Track track = tracks[(int)tracknumber];
                SongUtil.MakeCheckError(errors, track, U.toOffset(instPointer), songaddr, songid, tracknumber, isMapBGM);
            }
        }
コード例 #15
0
        private void Preview_button_Click(object sender, EventArgs e)
        {
            Dettach();

            RunSox();
            if (!File.Exists(this.TempFilename))
            {
                PreviewResult.Text = R._("");
                return;
            }

            long   fromFileSize = U.GetFileSize(this.FromFilename);
            long   tempFileSize;
            string playTempWave;
            string ext = U.GetFilenameExt(this.TempFilename);

            if (ext == ".S")
            {
                byte[] dpcmBin;
                string error = SongUtil.LoadWavS(this.TempFilename, out dpcmBin);
                if (error != "")
                {
                    PreviewResult.Text = error;
                    return;
                }
                tempFileSize = dpcmBin.Length;

                byte[] uncmpWavBin = SongUtil.byteToWavForDPCM(dpcmBin, 0);
                this.TempFilename2 = U.mktemp(".wav");
                File.WriteAllBytes(this.TempFilename2, uncmpWavBin);
                playTempWave = this.TempFilename2;

                double snr = SongUtil.CalculateSNR(this.UncompressWavBIN, uncmpWavBin);
                string str = R._("ファイルサイズ {0} -> {1} ({2}%)\r\n圧縮品質 SNR: {3}dB (高いほど良い。20dB以下は圧縮を使わない方がいいかも。)", fromFileSize, tempFileSize,
                                 Math.Round(tempFileSize * 100 / (double)fromFileSize, 2), Math.Round(snr, 3));
                PreviewResult.Text = str;
            }
            else if (ext == ".DPCM")
            {
                byte[] dpcmBin = File.ReadAllBytes(this.TempFilename);
                tempFileSize = dpcmBin.Length;

                byte[] uncmpWavBin = SongUtil.byteToWavForDPCM(dpcmBin, 0);
                this.TempFilename2 = U.mktemp(".wav");
                File.WriteAllBytes(this.TempFilename2, uncmpWavBin);
                playTempWave = this.TempFilename2;

                double snr = SongUtil.CalculateSNR(this.UncompressWavBIN, uncmpWavBin);
                string str = R._("ファイルサイズ {0} -> {1} ({2}%)\r\n圧縮品質 SNR: {3}dB (高いほど良い。20dB以下は圧縮を使わない方がいいかも。)", fromFileSize, tempFileSize,
                                 Math.Round(tempFileSize * 100 / (double)fromFileSize, 2), Math.Round(snr, 3));
                PreviewResult.Text = str;
            }
            else
            {
                playTempWave = this.TempFilename;
                tempFileSize = U.GetFileSize(this.TempFilename);

                string str = R._("ファイルサイズ {0} -> {1} ({2}%)", fromFileSize, tempFileSize,
                                 Math.Round(tempFileSize * 100 / (double)fromFileSize, 2));
                PreviewResult.Text = str;
            }


            this.WavePlayer = new System.Media.SoundPlayer(playTempWave);
            this.WavePlayer.Play();
        }