Exemplo n.º 1
0
    //-----------------------------------------------------------------
    //! @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);
    }
Exemplo n.º 2
0
    //-----------------------------------------------------------------
    //! @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);
    }