Exemplo n.º 1
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 (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);

            //残カット
            //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));
        }