예제 #1
0
파일: msub.cs 프로젝트: KuSunda/mucomDotNET
        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);
        }
예제 #2
0
        //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);
        }