//----------------------------------------------------------------- //! @summary ノーツの開始時間を設定する //! //! @parameter [startTime] 設定する開始時間 //----------------------------------------------------------------- public void SetNotesStartTime(float startTime) { // 開始位置がマイナスだった場合は処理を終了する if (startTime < 0.0f) { return; } // データを更新する m_notesData.m_startBeat = PiarhythmUtility.MRound(startTime, 0.25f); // 位置の更新 PiarhythmDatas.PositionData positionData = m_optionSheetController.ConvertToPositionData(m_notesData.m_startBeat, m_notesData.m_noteLength); m_transform.offsetMin = new Vector2(m_transform.offsetMin.x, positionData.m_position); m_transform.offsetMax = new Vector2(m_transform.offsetMax.x, m_transform.offsetMin.y + positionData.m_lenght); // UIを更新 m_notesSheetController.DisplayNotes(this); }
//----------------------------------------------------------------- //! @summary ノーツの開始座標と長さから開始拍と音符に変換する //! //! @parameter [positionData] 座標データ //! //! @return ノーツデータ //----------------------------------------------------------------- public PiarhythmDatas.NoteData ConvertToNotesData(PiarhythmDatas.PositionData positionData) { PiarhythmDatas.NoteData notesData = ScriptableObject.CreateInstance <PiarhythmDatas.NoteData>(); float elapsedBeat = 0.0f; float elapsedPosition = 0.0f; // 所属しているテンポデータを調べる PiarhythmDatas.TempoData tempoData = m_tempoDataList[0]; for (int i = 1; i < m_tempoDataList.Count; ++i) { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / tempoData.m_tempo; // 時間を座標に変換する float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, NotesManager.NOTES_SPEED); // テンポデータの終了座標を求める float endPosition = beatPosition * ((m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4) + elapsedPosition; if (positionData.m_position >= endPosition) { // 経過座標を更新する elapsedPosition = endPosition; // 経過拍数を増やす elapsedBeat += (m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4; // 現在のテンポデータを更新する tempoData = m_tempoDataList[i]; } else { break; } } // 現在のテンポデータから正確な位置を確定させる { float beatPerTempo = 60.0f / tempoData.m_tempo; float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, NotesManager.NOTES_SPEED); // 残りの座標を求める float residualPosition = positionData.m_position - elapsedPosition; // 残りの拍数を求める float residualBeat = residualPosition / beatPosition; // 残りの拍数を0.25倍に丸める residualBeat = PiarhythmUtility.MRound(residualBeat, 0.25f); // 経過拍数に加算する elapsedBeat += residualBeat; // データを保存する notesData.m_startBeat = elapsedBeat; // 長さを求める float noteLength = positionData.m_lenght / beatPosition; // 0.25倍に丸める noteLength = PiarhythmUtility.MRound(noteLength, 0.25f); // 一番近い長さを元に音符を決める if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE)) { notesData.m_noteLength = 0; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.HALF_NOTE_MININ)) { notesData.m_noteLength = 1; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET)) { notesData.m_noteLength = 2; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER)) { notesData.m_noteLength = 3; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER)) { notesData.m_noteLength = 4; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE)) { notesData.m_noteLength = 5; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ)) { notesData.m_noteLength = 6; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET)) { notesData.m_noteLength = 7; } else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER)) { notesData.m_noteLength = 8; } else { notesData.m_noteLength = 2; } } return(notesData); }