//----------------------------------------------------------------- //! @summary ノーツの開始時間を取得する //! //! @parameter [startBeat] 開始拍数 //! //! @return 開始時間 //----------------------------------------------------------------- public float GetStartTime(float startBeat) { float elapsedBeat = 0.0f; float elapsedTime = 0.0f; // 所属しているテンポデータを調べる PiarhythmDatas.TempoData tempoData = m_tempoDataList[0]; for (int i = 1; i < m_tempoDataList.Count; ++i) { if (startBeat >= m_tempoDataList[i].m_startMeasure * 4) { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / tempoData.m_tempo; // 経過拍数を増やす elapsedBeat += (m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4; elapsedTime += beatPerTempo * (m_tempoDataList[i].m_startMeasure * 4); tempoData = m_tempoDataList[i]; } else { break; } } { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / tempoData.m_tempo; return(elapsedTime + (startBeat - elapsedBeat) * beatPerTempo); } }
//----------------------------------------------------------------- //! @summary 全体時間を計算する //! //! @parameter [void] なし //! //! @return なし //----------------------------------------------------------------- private void CalculateWholeTime() { // 背景をリセットする m_musicalScoreController.ResetMusicScoreBackGround(); // 時間を初期化 m_wholeTime = 0.0f; // テンポデータ分計算する PiarhythmDatas.TempoData prevTempData = ScriptableObject.CreateInstance <PiarhythmDatas.TempoData>(); prevTempData.m_tempo = 0; foreach (PiarhythmDatas.TempoData tempData in m_tempoDataList) { if (prevTempData.m_tempo != 0) { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / prevTempData.m_tempo; for (int i = prevTempData.m_startMeasure; i < tempData.m_startMeasure; ++i) { // 開始時間を保存する float startTime = m_wholeTime; // 1小節分加算する m_wholeTime += beatPerTempo * 4.0f; // 背景を生成する m_musicalScoreController.CreateMusicScoreBackGround(startTime, m_wholeTime); } } prevTempData = tempData; } // 最後に残りの小節分加算する // 一拍当たりの時間を求める { float beatPerTempo = 60.0f / prevTempData.m_tempo; for (int i = prevTempData.m_startMeasure; i < m_wholeMeasure; ++i) { // 開始時間を保存する float startTime = m_wholeTime; // 1小節分加算する m_wholeTime += beatPerTempo * 4.0f; // 背景を生成する m_musicalScoreController.CreateMusicScoreBackGround(startTime, m_wholeTime); } } // 各UIへ反映させる m_musicalScoreController.ChangeScoreLength(m_wholeTime); m_menuController.UpdateDisplayWholeTimeText(m_wholeTime); // スクロールバーのテクスチャを更新する m_notesEditScrollbarController.UpdateTexture(m_bgmSheetController.GetBGMData(), m_wholeTime); }
//----------------------------------------------------------------- //! @summary ノーツデータを設定する //! //! @parameter [tempoData] 設定するテンポデータ //----------------------------------------------------------------- public void SetTempoData(PiarhythmDatas.TempoData tempData) { // データを設定する m_tempoData = tempData; // UIへ反映させる m_startMeasureInputField.text = m_tempoData.m_startMeasure.ToString(); m_tempoInputField.text = m_tempoData.m_tempo.ToString(); }
//----------------------------------------------------------------- //! @summary 設定データから背景を作成する //! //! @parameter [optionData] 設定データ //! //! @return なし //----------------------------------------------------------------- public void CreateMusicScoreBackGround(PiarhythmDatas.OptionData optionData) { // テンポデータの保存 m_tempoDataList = optionData.m_tempDatas; // 時間を初期化 m_wholeTime = 0.0f; // テンポデータ分計算する PiarhythmDatas.TempoData prevTempData = ScriptableObject.CreateInstance <PiarhythmDatas.TempoData>(); prevTempData.m_tempo = 0; foreach (PiarhythmDatas.TempoData tempoData in optionData.m_tempDatas) { if (prevTempData.m_tempo != 0) { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / prevTempData.m_tempo; for (int i = prevTempData.m_startMeasure; i < tempoData.m_startMeasure; ++i) { // 開始時間を保存する float startTime = m_wholeTime; // 1小節分加算する m_wholeTime += beatPerTempo * 4.0f; // 背景を生成する CreateMusicScoreBackGround(startTime, m_wholeTime); } } prevTempData = tempoData; } // 最後に残りの小節分加算する // 一拍当たりの時間を求める { float beatPerTempo = 60.0f / prevTempData.m_tempo; for (int i = prevTempData.m_startMeasure; i < optionData.m_wholeMeasure; ++i) { // 開始時間を保存する float startTime = m_wholeTime; // 1小節分加算する m_wholeTime += beatPerTempo * 4.0f; // 背景を生成する CreateMusicScoreBackGround(startTime, m_wholeTime); } } }
//----------------------------------------------------------------- //! @summary リスト内にあるテンポデータを更新する //! //! @parameter [tempoData] 更新するテンポデータ //! @parameter [index] 要素番号 //! //! @return なし //----------------------------------------------------------------- public void UpdateTempoData(PiarhythmDatas.TempoData tempData, int index) { // データがリストの範囲外だった場合、処理を終了する if ((index < 0) || (index > m_tempoDataList.Count)) { return; } // データを更新する m_tempoDataList[index] = tempData; // 全体の時間の更新 CalculateWholeTime(); }
//----------------------------------------------------------------- //! @summary リスト内から指定したテンポデータを削除する //! //! @parameter [tempoData] 削除するテンポデータ //! //! @return なし //----------------------------------------------------------------- public void RemoveTempoData(PiarhythmDatas.TempoData tempData) { // データを探す int index = m_tempoDataList.IndexOf(tempData); // 見つからなかった場合は処理を終了する if (index < 0) { return; } // リストから削除する m_tempoDataList.Remove(tempData); // 全体の時間を更新する CalculateWholeTime(); }
// メンバ関数の定義 ===================================================== #region 初期化処理 //----------------------------------------------------------------- //! @summary 初期化処理 //! //! @parameter [void] なし //! //! @return なし //----------------------------------------------------------------- private void Awake() { m_tempoData = ScriptableObject.CreateInstance <PiarhythmDatas.TempoData>(); m_tempoData.m_startMeasure = 0; m_tempoData.m_tempo = 60; }
//----------------------------------------------------------------- //! @summary ノーツの開始拍と音符から開始座標と長さに変換する //! //! @parameter [startBeat] 開始の拍数 //! @parameter [noteLength] 音符の長さ //! //! @return 変換された座標 //----------------------------------------------------------------- public PiarhythmDatas.PositionData ConvertToPositionData(float startBeat, int noteLenght) { PiarhythmDatas.PositionData positionData = new PiarhythmDatas.PositionData(); float elapsedBeat = 0.0f; float elapsedPosition = 0.0f; // 所属しているテンポデータを調べる PiarhythmDatas.TempoData tempoData = m_tempoDataList[0]; for (int i = 1; i < m_tempoDataList.Length; ++i) { if (startBeat >= m_tempoDataList[i].m_startMeasure * 4) { // 一拍当たりの時間を求める float beatPerTempo = 60.0f / tempoData.m_tempo; // 時間を座標に変換する float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, m_settingData.m_noteSpeed * 20.0f); // テンポデータの終了座標を求める elapsedPosition += beatPosition * ((m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4); // 経過拍数を増やす 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, m_settingData.m_noteSpeed * 20.0f); // テンポデータを元に座標と長さを決める positionData.m_position = elapsedPosition + (startBeat - elapsedBeat) * beatPosition; switch (noteLenght) { case 0: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE; break; case 1: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.HALF_NOTE_MININ; break; case 2: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET; break; case 3: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER; break; case 4: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER; break; case 5: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE; break; case 6: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ; break; case 7: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET; break; case 8: positionData.m_lenght = beatPosition * PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER; break; } } return(positionData); }
//----------------------------------------------------------------- //! @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); }