Пример #1
0
    //-----------------------------------------------------------------
    //! @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);
        }
    }
Пример #2
0
    //-----------------------------------------------------------------
    //! @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);
    }
Пример #3
0
    //-----------------------------------------------------------------
    //! @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();
    }
Пример #4
0
    //-----------------------------------------------------------------
    //! @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);
            }
        }
    }
Пример #5
0
    //-----------------------------------------------------------------
    //! @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();
    }
Пример #6
0
    //-----------------------------------------------------------------
    //! @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();
    }
Пример #7
0
 // メンバ関数の定義 =====================================================
 #region 初期化処理
 //-----------------------------------------------------------------
 //! @summary   初期化処理
 //!
 //! @parameter [void] なし
 //!
 //! @return    なし
 //-----------------------------------------------------------------
 private void Awake()
 {
     m_tempoData = ScriptableObject.CreateInstance <PiarhythmDatas.TempoData>();
     m_tempoData.m_startMeasure = 0;
     m_tempoData.m_tempo        = 60;
 }
Пример #8
0
    //-----------------------------------------------------------------
    //! @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);
    }
Пример #9
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);
    }