public void MWRIT2(MubDat dat) { //Common.WriteLine("{0:x2}", dat); mucInfo.bufDst.Set(work.MDATA++, dat); if (work.MDATA - work.bufStartPtr > 0xffff) { throw new MucException( msg.get("E0200") , mucInfo.row, mucInfo.col); } muc88.DispHex4(work.MDATA, 36); }
//private int SaveMusic(string fname, ushort start, ushort length, int option) private int SaveMusic(string fname, int length, int option) { // 音楽データファイルを出力(コンパイルが必要) // filename = 出力される音楽データファイル // option : 1 = #タグによるvoice設定を無視 // 2 = PCM埋め込みをスキップ // (戻り値が0以外の場合はエラー) // if (string.IsNullOrEmpty(fname)) { return(-1); } int footsize; footsize = 1;//かならず1以上 int pcmsize = (pcmdata == null) ? 0 : pcmdata.Length; bool pcmuse = ((option & 2) == 0); pcmdata = (!pcmuse ? null : pcmdata); int pcmptr = (!pcmuse ? 0 : (32 + length + footsize)); pcmsize = (!pcmuse ? 0 : pcmsize); if (pcmuse) { if (pcmdata == null || pcmsize == 0) { pcmuse = false; pcmdata = null; pcmptr = 0; pcmsize = 0; } } int dataOffset = 0x50; int dataSize = length; int tagOffset = length + 0x50; dat.Clear(); dat.Add(new MubDat(0x4d)); // M dat.Add(new MubDat(0x55)); // U dat.Add(new MubDat(0x42)); // B dat.Add(new MubDat(0x38)); // 8 dat.Add(new MubDat((byte)dataOffset)); dat.Add(new MubDat((byte)(dataOffset >> 8))); dat.Add(new MubDat((byte)(dataOffset >> 16))); dat.Add(new MubDat((byte)(dataOffset >> 24))); dat.Add(new MubDat((byte)dataSize)); dat.Add(new MubDat((byte)(dataSize >> 8))); dat.Add(new MubDat((byte)(dataSize >> 16))); dat.Add(new MubDat((byte)(dataSize >> 24))); dat.Add(new MubDat((byte)tagOffset)); dat.Add(new MubDat((byte)(tagOffset >> 8))); dat.Add(new MubDat((byte)(tagOffset >> 16))); dat.Add(new MubDat((byte)(tagOffset >> 24))); dat.Add(new MubDat(0));//tagdata size(dummy) dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat((byte)pcmptr));//pcmdata ptr(32bit) dat.Add(new MubDat((byte)(pcmptr >> 8))); dat.Add(new MubDat((byte)(pcmptr >> 16))); dat.Add(new MubDat((byte)(pcmptr >> 24))); dat.Add(new MubDat((byte)pcmsize));//pcmdata size(32bit) dat.Add(new MubDat((byte)(pcmsize >> 8))); dat.Add(new MubDat((byte)(pcmsize >> 16))); dat.Add(new MubDat((byte)(pcmsize >> 24))); dat.Add(new MubDat((byte)work.JCLOCK));// JCLOCKの値(Jコマンドのタグ位置) dat.Add(new MubDat((byte)(work.JCLOCK >> 8))); dat.Add(new MubDat(0));//jump line number(dummy) dat.Add(new MubDat(0)); dat.Add(new MubDat(0));//ext_flags(?) dat.Add(new MubDat(0)); dat.Add(new MubDat(1)); //ext_system(?) dat.Add(new MubDat(2)); //ext_target(?) dat.Add(new MubDat(11)); //ext_channel_num dat.Add(new MubDat(0)); dat.Add(new MubDat((byte)work.OTONUM));//ext_fmvoice_num dat.Add(new MubDat((byte)(work.OTONUM >> 8))); dat.Add(new MubDat(0));//ext_player(?) dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat(0));//pad1 dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); for (int i = 0; i < 32; i++) { dat.Add(new MubDat((byte)mucInfo.bufDefVoice.Get(i))); } if (work.JCLOCK > 0) { Log.WriteLine(LogLevel.INFO, string.Format("#Jump count [{0}].\r\n", work.JCLOCK)); } for (int i = 0; i < length; i++) { dat.Add(mucInfo.bufDst.Get(i)); } dat[dataOffset + 0] = new MubDat(0);//バイナリに含まれる曲データ数-1 dat[dataOffset + 1] = new MubDat((byte)work.OTODAT); dat[dataOffset + 2] = new MubDat((byte)(work.OTODAT >> 8)); dat[dataOffset + 3] = new MubDat((byte)work.ENDADR); dat[dataOffset + 4] = new MubDat((byte)(work.ENDADR >> 8)); //dat[dataOffset + 5] = 0xff; //たぶん テンポコマンド(タイマーB)設定時に更新される if (tags != null) { footsize = 0; foreach (Tuple <string, string> tag in tags) { byte[] b = Encoding.GetEncoding("shift_jis").GetBytes(string.Format("#{0} {1}\r\n", tag.Item1, tag.Item2)); footsize += b.Length; foreach (byte bd in b) { dat.Add(new MubDat(bd)); } } if (footsize > 0) { dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); dat.Add(new MubDat(0)); footsize += 4; dat[16] = new MubDat((byte)footsize);//tagdata size(32bit) dat[17] = new MubDat((byte)(footsize >> 8)); dat[18] = new MubDat((byte)(footsize >> 16)); dat[19] = new MubDat((byte)(footsize >> 24)); } } if (pcmuse) { for (int i = 0; i < pcmsize; i++) { dat.Add(new MubDat(pcmdata[i])); } if (pcmsize > 0) { pcmptr = 16 * 3 + 32 + length + footsize; dat[20] = new MubDat((byte)pcmptr);//pcmdata size(32bit) dat[21] = new MubDat((byte)(pcmptr >> 8)); dat[22] = new MubDat((byte)(pcmptr >> 16)); dat[23] = new MubDat((byte)(pcmptr >> 24)); } } OutFileName = fname; Log.WriteLine(LogLevel.INFO, string.Format("#Saved [{0}].\r\n", fname)); return(0); }