void Start() { //Setting up the references if (audioSource == null) { audioSource = GetComponent <AudioSource>(); } if (soundLevelSlider == null) { soundLevelSlider = GameObject.FindGameObjectWithTag("SoundLevelSlider").GetComponent <Slider>(); } if (musicSlider == null) { musicSlider = GameObject.FindGameObjectWithTag("MusicSlider").GetComponent <Slider>(); } if (musicTime == null) { musicTime = GameObject.FindGameObjectWithTag("MusicTime").GetComponent <MusicTime>(); } //Set sound level slider boundary soundLevelSlider.minValue = 0; soundLevelSlider.maxValue = 1; //Set the initial audio clip SetUpAudioClip(0, playOnStart); audioSource.clip = currentAudioClip; }
/// <summary> /// Set up the audio clip for the audio source. /// </summary> /// <param name="index">Index.</param> /// <param name="playClip">If set to true , play the clip.</param> private void SetUpAudioClip(int index, bool playClip) { if (!(index >= 0 && index < L_AudioClip.Count)) { return; } currentClipIndex = index; currentAudioClip = L_AudioClip[index]; if (currentAudioClip != null) { musicSlider.minValue = 0; musicSlider.maxValue = currentAudioClip.length; totalTime = MusicTime.TimeToString(currentAudioClip.length); } else { Debug.Log("AudioClip is undefined"); } audioSource.clip = currentAudioClip; StopAudioClip(); if (playClip) { PlayAudioClip(); } }
/// <summary> /// ユーザ指定したRangeにコードを転回してPivotRangeを移動する /// </summary> public void SetRange(int Range, MusicTime time, int mode) { // 小節のコードのPivotRangeとユーザが指定したRangeとの差分だけ転回 for (int measure = time.Measure; measure < chordProgList[mode].Count; measure++) { //ユーザが指定したRangeとの差分だけ転回 Turn(Range - chordProgList[mode][measure].PivotRange, measure, chordProgList[mode][measure]); } }
/// <summary> /// 自由なタイミングに和音 /// </summary> public void SetOnNote(MusicTime time) { //タップタイミングの1ms後のタイミングに演奏音を書き換え if (time.Measure < inputedChord.Length) { foreach (var note in chordProgList[MODE_FREE][time.Measure].NoteList) { note.Tick = TICK_UNIT * time.Measure + time.Tick + 1; note.Velocity = 80; note.Gate = 240; note.Speed = 120; } } }
/// <summary> /// コードを短調(暗い)に書き換える /// </summary> public void TurnMinor(MusicTime time, int mode) { for (int i = 0; i < 5; i++) // 1小節内で複数回の音を鳴らす場合があるためループ(最大がDelayモードの5回) { // 以降のコードをマイナーに書き換える for (int measure = time.Measure; measure < chordProgList[mode].Count; measure++) { if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12) //1→1m { chordProgList[mode][measure].NoteList[1 + (3 * i)].Note -= 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 2) //2m→2m(-5) { chordProgList[mode][measure].NoteList[2 + (3 * i)].Note -= 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 4) //3m→3m { } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 5) //4→4m { chordProgList[mode][measure].NoteList[1 + (3 * i)].Note -= 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 7) //5→5 { } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 9) //6m→6m(-5) { chordProgList[mode][measure].NoteList[2 + (3 * i)].Note -= 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 11) //7m(-5)→7m(-5) { } } if (mode == 0 || mode == 2 || mode == 4) { break; //Whole, Arpeggio, Free なら1ループで抜け出す. } if (mode == 1 && i == 3) { break; //Quarterは4回音が鳴るので,4ループで抜け出す. } } }
/* MEMO * * 将来的にユーザがコード進行を作っていく場合に、 * 曲内で使われるコードはダイアトニックコード内から選択されることを想定している。 * その場合、システムがダイアトニックコードを決定するためにユーザは最初に曲のKey(調)を指定することになる。 * その入力をKeyNoteとする。 * (参考)ダイアトニックコードについて:https://www.studiorag.com/blog/fushimiten/diatonic-chord?disp=more * * ただしメジャーダイアトニックコード⇔マイナーダイアトニックコードの変換だと不自然に聞こえたため、今回は以下の変換を行った。 * Ⅰ, Ⅱm, Ⅲm, Ⅳ, Ⅴ, Ⅵm, Ⅶm-5 * ↓ * Ⅰm, Ⅱm-5, Ⅲm, Ⅳm, Ⅴ, Ⅵm-5, Ⅶm-5 * */ /// <summary> /// コードを長調(明るい)に書き換える /// </summary> public void TurnMajor(MusicTime time, int mode) { for (int i = 0; i < 5; i++) { // 以降のコードをメジャーに書き換える for (int measure = time.Measure; measure < chordProgList[mode].Count; measure++) { if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12) //1 { chordProgList[mode][measure].NoteList[1 + (3 * i)].Note += 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 2) //2 { chordProgList[mode][measure].NoteList[2 + (3 * i)].Note += 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 4) //3 { } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 5) //4 { chordProgList[mode][measure].NoteList[1 + (3 * i)].Note += 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 7) //5 { } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 9) //6 { chordProgList[mode][measure].NoteList[2 + (3 * i)].Note += 1; } else if (chordProgList[mode][measure].NoteList[0].Note % 12 == KeyNoteNumber % 12 + 11) //7 { } } if (mode == 0 || mode == 2 || mode == 4) { break; //Whole, Arpeggio, Free なら1ループで抜け出す. } if (mode == 1 && i == 3) { break; //Quarterは4回音が鳴るので,4ループで抜け出す. } } }
public static float MusicTimeInFractions(MusicTime time) { if (MusicTime.FULL == time) return 1.0f; else if (MusicTime.HALF == time) return .5f; else if (MusicTime.HALF_DOTTED == time) return .75f; else if (MusicTime.QUARTER == time) return .25f; else if (MusicTime.QUARTER_DOTTED == time) return .375f; else if (MusicTime.EIGTH == time) return .125f; else if (MusicTime.EIGTH_DOTTED == time) return .1875f; else if (MusicTime.SIXTEENTH == time) return .0625f; else if (MusicTime.SIXTEENTH_DOTTED == time) return .09375f; return 0; }
public static float MusicTimeInFractions(MusicTime time, Boolean asPartOfTriole) { float t = Song.MusicTimeInFractions(time); if (asPartOfTriole) { t = 2f / 3f * t; } return t; }
// Start is called before the first frame update void Start() { music = GetComponent <AudioSource>(); instance = this; DontDestroyOnLoad(this.gameObject); }