public List <List <Measure> > Generate(List <Measure> measureList, int scoreWidth)
        {
            List <List <Measure> > scoreList = new List <List <Measure> >(); // 整张乐谱

            for (int i = 0; i < measureList.Count; i += 4)
            {
                List <Measure> paragraphList = new List <Measure>(); // 一行
                int            measureRest   = scoreWidth;
                for (int j = i; j < i + 4 && j < measureList.Count; j++)
                {
                    if (measureList[j].HasHead()) // 去掉谱号长度
                    {
                        measureRest -= _paramsGetter.GetHeadWidth();
                    }
                    if (measureList[j].HasBeat()) // 去掉拍号长度
                    {
                        measureRest -= _paramsGetter.GetBeatWidth();
                    }
                    measureRest -= measureList[j].GetMaxCount() * _paramsGetter.GetUnit(); // 去掉每一个小节中音符压缩到最挤的时候所占的长度
                }
                // 此时将measureRest剩下的长度平分给每一个小节
                int averageRest = measureRest / 4;
                for (int j = i; j < i + 4 && j < measureList.Count; j++)
                {
                    int measureLength = measureList[j].GetMaxCount() * _paramsGetter.GetUnit() + averageRest;
                    if (measureList[j].HasHead()) // 加上谱号长度
                    {
                        measureLength += _paramsGetter.GetHeadWidth();
                    }
                    if (measureList[j].HasBeat()) // 加上拍号长度
                    {
                        measureLength += _paramsGetter.GetBeatWidth();
                    }
                    measureList[j].SetMeasureLength(measureLength);
                    paragraphList.Add(measureList[j]);
                }
                scoreList.Add(paragraphList);
            }

//            int index = 0;
//            while (index < measureList.Count)
//            {
//                List<Measure> paragraphList = new List<Measure>(); // 一行
//                paragraphList.Add(measureList[index]); // 首先在一行中放入一个小节
//                int usedLen = measureList[index].GetMaxCount() * 10; // 此时一行中使用的长度
//                while (usedLen < screenSize[0])
//                {
//
//                    usedLen += measureList[index].GetMaxCount() * 10;
//                    index++;
//                }
//
//                scoreList.Add(paragraphList);
//            }
            return(scoreList);
        }
        public List <List <Measure> > Generate(List <Measure> measureList, int scoreWidth)
        {
            List <List <Measure> > scoreList = new List <List <Measure> >(); // 整张乐谱

            int maxMeasureInLine = 4;                                        // 固定一节最多放四个小节

            for (int i = 0; i < measureList.Count; i += maxMeasureInLine)
            {
                // 为每一行第一个小节自动添加谱号信息
                List <Head> headList = measureList[0].GetHead();
                if (headList != null)
                {
                    measureList[i].SetHead(headList[0], headList[1]);
                    measureList[i].SetHasHead(true);
                }

                List <Measure> paragraphList = new List <Measure>(); // 一行
                int            measureRest   = scoreWidth;
                for (int j = i; j < i + 4 && j < measureList.Count; j++)
                {
                    if (measureList[j].HasHead()) // 去掉谱号长度
                    {
                        measureRest -= _paramsGetter.GetHeadWidth();
                    }
                    if (measureList[j].HasBeat()) // 去掉拍号长度
                    {
                        measureRest -= _paramsGetter.GetBeatWidth();
                    }
                    measureRest -= measureList[j].GetMaxCount() * _paramsGetter.GetUnit(); // 去掉每一个小节中音符压缩到最挤的时候所占的长度
                }
                // 此时将measureRest剩下的长度平分给每一个小节
                int averageRest = measureRest / maxMeasureInLine;
                for (int j = i; j < i + 4 && j < measureList.Count; j++)
                {
                    int measureLength = measureList[j].GetMaxCount() * _paramsGetter.GetUnit() + averageRest;
                    if (measureList[j].HasHead()) // 加上谱号长度
                    {
                        measureLength += _paramsGetter.GetHeadWidth();
                    }
                    if (measureList[j].HasBeat()) // 加上拍号长度
                    {
                        measureLength += _paramsGetter.GetBeatWidth();
                    }
                    measureList[j].SetMeasureLength(measureLength);
                    paragraphList.Add(measureList[j]);
                }
                scoreList.Add(paragraphList);
            }

            return(scoreList);
        }
Exemple #3
0
        // 绘制一行乐谱线,根据小节数来绘制
        private void DrawMeasureLines()
        {
            // 为线段构建一个Lines目录放置
            _measureLines = new GameObject("Lines");
            _measureLines.transform.SetParent(_parentObject.transform);
            _measureLines.transform.localPosition = new Vector3(0, 0, 0);

            int measureLength = _measure.GetMeasureLength();

            // 绘制高音五条横乐谱线
            for (int i = 0; i < 5; i++)
            {
                // 横线的纵坐标固定,第三条线(j==2)在乐谱中心位置
                float yPosition = _paramsGetter.GetTotalHeight() + _paramsGetter.GetStaffCenterPosition() + (i - 2) * _paramsGetter.GetUnit();
                // 设置线段宽高,横线,宽度为小节长度,高度为1
                DrawLine(0, yPosition, measureLength, yPosition);
            }
            // 绘制每个高音小节的两条竖线
            for (int i = 0; i < 2; i++)
            {
                // 竖线的纵坐标起点为五条横线的最下面一条线的纵坐标
                float startY = _paramsGetter.GetTotalHeight() + _paramsGetter.GetStaffCenterPosition() - 2 * _paramsGetter.GetUnit();
                float stopY  = _paramsGetter.GetTotalHeight() + _paramsGetter.GetStaffCenterPosition() + 2 * _paramsGetter.GetUnit();
                // 设置线段宽高,竖线,宽度为1,高度五线谱高度
                DrawLine(measureLength * i, startY, measureLength * i, stopY);
            }

            // 绘制低音五条横乐谱线
            for (int i = 0; i < 5; i++)
            {
                // 横线的纵坐标固定,第三条线(j==2)在乐谱中心位置
                float yPosition = _paramsGetter.GetTotalHeight() - _paramsGetter.GetStaffCenterPosition() + (i - 2) * _paramsGetter.GetUnit();
                // 设置线段宽高,横线,宽度为小节长度,高度为1
                DrawLine(0, yPosition, measureLength, yPosition);
            }
            // 绘制每个低音小节的两条竖线
            for (int i = 0; i < 2; i++)
            {
                // 竖线的纵坐标起点为五条横线的最下面一条线的纵坐标
                float startY = _paramsGetter.GetTotalHeight() - _paramsGetter.GetStaffCenterPosition() - 2 * _paramsGetter.GetUnit();
                float stopY  = _paramsGetter.GetTotalHeight() - _paramsGetter.GetStaffCenterPosition() + 2 * _paramsGetter.GetUnit();
                // 设置线段宽高,竖线,宽度为1,高度五线谱高度
                DrawLine(measureLength * i, startY, measureLength * i, stopY);
            }
        }
Exemple #4
0
 private void OnDraw()
 {
     DrawText(_beat.GetBeats(), _paramsGetter.GetBeatPortraitShift(), _paramsGetter.GetStaffCenterPosition() + _paramsGetter.GetUnit() + _paramsGetter.GetTotalHeight());
     DrawText(_beat.GetBeatType(), _paramsGetter.GetBeatPortraitShift(), _paramsGetter.GetStaffCenterPosition() - _paramsGetter.GetUnit() + _paramsGetter.GetTotalHeight());
 }