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); } }
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(); }
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); }
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)); }
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(); }
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); }
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); }
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); }
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); }
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); }
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); } } }
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); }
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); }
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); } }
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(); }