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); }
// 绘制一行乐谱线,根据小节数来绘制 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); } }
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()); }