Exemplo n.º 1
0
        public virtual void SetPCMDataBlock()
        {
            if (!CanUsePcm)
            {
                return;
            }
            if (!use)
            {
                return;
            }

            int maxSize = 0;

            if (pcmDataEasy != null && pcmDataEasy.Length > 0)
            {
                maxSize =
                    pcmDataEasy[7]
                    + (pcmDataEasy[8] << 8)
                    + (pcmDataEasy[9] << 16)
                    + (pcmDataEasy[10] << 24);
            }
            if (pcmDataDirect.Count > 0)
            {
                foreach (byte[] dat in pcmDataDirect)
                {
                    if (dat != null && dat.Length > 0)
                    {
                        int size =
                            dat[7]
                            + (dat[8] << 8)
                            + (dat[9] << 16)
                            + (dat[10] << 24);
                        if (maxSize < size)
                        {
                            maxSize = size;
                        }
                    }
                }
            }
            if (pcmDataEasy != null && pcmDataEasy.Length > 0)
            {
                pcmDataEasy[7]  = (byte)maxSize;
                pcmDataEasy[8]  = (byte)(maxSize >> 8);
                pcmDataEasy[9]  = (byte)(maxSize >> 16);
                pcmDataEasy[10] = (byte)(maxSize >> 24);
            }
            if (pcmDataDirect.Count > 0)
            {
                foreach (byte[] dat in pcmDataDirect)
                {
                    if (dat != null && dat.Length > 0)
                    {
                        dat[7]  = (byte)maxSize;
                        dat[8]  = (byte)(maxSize >> 8);
                        dat[9]  = (byte)(maxSize >> 16);
                        dat[10] = (byte)(maxSize >> 24);
                    }
                }
            }

            if (pcmDataEasy != null && pcmDataEasy.Length > 0)
            {
                parent.OutData(pcmDataEasy);
            }

            if (pcmDataDirect.Count < 1)
            {
                return;
            }

            foreach (byte[] dat in pcmDataDirect)
            {
                if (dat != null && dat.Length > 0)
                {
                    parent.OutData(dat);
                }
            }
        }
Exemplo n.º 2
0
        private void makeTrackDiv()
        {
            log.Write("Track division");

            long waitCounter  = 0;
            int  endChannel   = 0;
            int  totalChannel = 0;

            TrackInfo ti = new TrackInfo();

            ti.offset = mmlInfo.dat.Count;
            track.Add(ti);

            foreach (byte b in TrackTemp)
            {
                outDatum dt = new outDatum(enmMMLType.unknown, null, null, b);
                mmlInfo.dat.Add(dt);
            }

            //PCM Data block
            foreach (KeyValuePair <enmChipType, ClsChip[]> kvp in mmlInfo.chips)
            {
                foreach (ClsChip chip in kvp.Value)
                {
                    if (chip == null)
                    {
                        continue;
                    }

                    chip.SetPCMDataBlock(null);
                }
            }

            //Set Initialize data
            foreach (KeyValuePair <enmChipType, ClsChip[]> kvp in mmlInfo.chips)
            {
                foreach (ClsChip chip in kvp.Value)
                {
                    if (chip == null)
                    {
                        continue;
                    }
                    chip.InitChip();
                    foreach (partWork pw in chip.lstPartWork)
                    {
                        foreach (partPage pg in pw.pg)
                        {
                            mmlInfo.OutData(pg.sendData);
                            pg.sendData.Clear();
                        }
                    }
                }
            }

            foreach (KeyValuePair <enmChipType, ClsChip[]> kvp in mmlInfo.chips)
            {
                foreach (ClsChip chip in kvp.Value)
                {
                    if (chip == null)
                    {
                        continue;
                    }
                    totalChannel += chip.ChMax;
                }
            }

            do
            {
                log.Write("全パートコマンド解析");
                mmlInfo.AnalyzeAllPartCommand();

                log.Write("全パートのうち次のコマンドまで一番近い値を求める");
                waitCounter = mmlInfo.ComputeAllPartDistance();

                //log.Write("全パートのwaitcounterを減らす");
                //mmlInfo.DecAllPartWaitCounter(waitCounter);

                log.Write("終了パートのカウント");
                endChannel = mmlInfo.CountUpEndPart();

                if (endChannel < totalChannel)
                {
                    log.Write("全パートのwaitcounterを減らす");
                    mmlInfo.DecAllPartWaitCounter(waitCounter);
                }
            } while (endChannel < totalChannel && !mmlInfo.compileEnd);

            mmlInfo.CompClockCounter();
            //残カット
            //if (mmlInfo.loopClock != -1 && waitCounter > 0 && waitCounter != long.MaxValue)
            //{
            //    mmlInfo.lClock -= waitCounter;
            //    mmlInfo.dSample -= (long)(mmlInfo.info.samplesPerClock * waitCounter);
            //}

            Common.SetLE32(mmlInfo.dat, (uint)(ti.offset + 0x03), (uint)(mmlInfo.dat.Count - ti.offset));
            Common.SetLE32(mmlInfo.dat, (uint)(ti.offset + 0x07), (uint)(mmlInfo.dummyCmdLoopOffset));
        }