예제 #1
0
    private int GetSoundIndex(Semitone semitone, int octave)
    {
        int octaveDifference   = octave - InitialOctave;
        int semitoneDifference = (int)semitone - (int)InitialSemitone;

        return((octaveDifference * 12) + semitoneDifference);
    }
예제 #2
0
파일: Program.cs 프로젝트: spareilleux/ga
        static void Main(string[] args)
        {
            Console.WriteLine("Guitar Alchemist");

            var allScales = ScaleDefinition.All;
            var major     = ScaleDefinition.Major;
            var lydian    = major[MajorScaleMode.Lydian];
            var a         = lydian.Intervals;

            var keyOfF = Key.Major[MajorKey.F];
            var b      = keyOfF.GetIntervalFromRoot(Note.B);

            var key = Key.Major[-6];
            var Fb  = new Note(DiatonicNote.F, Accidental.Flat);
            var Eb  = new Note(DiatonicNote.E, Accidental.Flat);
            var d   = Fb - Eb;

            var s     = new Semitone(10);
            var flat  = Accidental.Flat;
            var sharp = Accidental.Sharp;

            //var a = major.Absolute;
            //var b = lydian.Absolute;
            //var colorTones = b.Except(a).ToList();
            //var colorQualities = new IntervalsList(colorTones, AccidentalKind.Sharp);
        }
예제 #3
0
 private void SetupSelectableNote(KMSelectable selectable, Semitone semitone)
 {
     selectable.OnInteract += delegate()
     {
         ProcessSemitoneHit(semitone);
         return(false);
     };
 }
예제 #4
0
 public Note(
     DiatonicNote diatonicNote,
     Accidental accidental)
 {
     DiatonicNote  = diatonicNote;
     Accidental    = accidental;
     DistanceFromC = new Semitone((int)DiatonicNote + Accidental);
 }
예제 #5
0
 public ModeDefinition(
     IEnumerable <Semitone> relativeSemitones,
     ModalScaleDefinition parentScale,
     Semitone distanceFromParentScale,
     string modeName,
     int modeIndex)
     : base(relativeSemitones)
 {
     ParentScale             = parentScale;
     DistanceFromParentScale = distanceFromParentScale;
     ModeName  = modeName;
     ModeIndex = modeIndex;
 }
예제 #6
0
        public SettingsRequestEventArgs(Semitone pianorollSemitone, Semitone fretboardSemitone, Semitone circleSemitone, Note[] fretboardStrings, int lastVisibleString)
        {
            if (fretboardStrings == null)
            {
                throw new ArgumentNullException(nameof(fretboardStrings));
            }

            this.PianorollSemitone = pianorollSemitone;
            this.FretboardSemitone = fretboardSemitone;
            this.CircleSemitone    = circleSemitone;
            this.FretboardStrings  = fretboardStrings;
            this.LastVisibleString = lastVisibleString;
        }
예제 #7
0
        private static Semitone ParseSelector(string s)
        {
            s = s?.Trim();
            if (Semitone.TryParse(s, out var semitone))
            {
                return(semitone);
            }
            if (Interval.TryParse(s, out var quality))
            {
                return(quality);
            }

            throw new InvalidOperationException($"Failed parsing '{s}' into {nameof(Semitone)}");
        }
예제 #8
0
    public void Play(Semitone semitone, int octave)
    {
        if (Sounds == null)
        {
            return;
        }

        int soundIndex = GetSoundIndex(semitone, octave);

        if (soundIndex < 0 || soundIndex >= Sounds.Length)
        {
            return;
        }

        KMAudio.PlaySoundAtTransform(Sounds[soundIndex].name, transform);
    }
예제 #9
0
    private void ProcessSemitoneHit(Semitone semitone)
    {
        PlayNote(semitone);

        if (IsMelodyComplete)
        {
            return;
        }

        StringBuilder logString = new StringBuilder();

        logString.Append("The current valid sequence is the following: ");
        logString.AppendFormat("[{0}] ", _correctDecision.SequenceStringHandler(KMBombInfo));
        logString.Append(string.Join(", ", DecisionNotes.Select((x) => x.Semitone.GetDescription()).ToArray()));
        KMBombModule.Log(logString.ToString());
        KMBombModule.LogFormat("Input {0} was received; valid input at this stage is {1}", semitone.GetDescription(), CurrentSemitone.GetDescription());

        if (IsCorrectSemitone(semitone))
        {
            AdvanceCurrentNote();
            if (IsMelodyComplete)
            {
                KMBombModule.Log("Input was valid and sequence complete; module defused!");
                KMBombModule.HandlePass();
            }
            else
            {
                KMBombModule.Log("Input was valid; continuing the sequence...");
            }
        }
        else
        {
            KMBombModule.Log("Input was invalid; module caused a strike and reset!");
            ResetCurrentNote();
            KMBombModule.HandleStrike();
        }
    }
예제 #10
0
        public bool Contains(Semitone item)
        {
            var result = _absoluteSemitonesSet.Contains(item);

            return(result);
        }
예제 #11
0
        public static Interval GetSharp(Semitone semitone)
        {
            _sharpIntervalByDistance.TryGetValue(semitone, out var result);

            return(result);
        }
예제 #12
0
        public static Interval GetFlat(Semitone semitone)
        {
            _flatIntervalByDistance.TryGetValue(semitone, out var result);

            return(result);
        }
예제 #13
0
 public Note(Semitone semitone, int octave)
 {
     Semitone = semitone;
     Octave   = octave;
 }
예제 #14
0
        public bool Contains(Semitone item)
        {
            var result = Absolute.Contains(item);

            return(result);
        }
예제 #15
0
 private void PlayNote(Semitone semitone)
 {
     PianoPlayer.Play(semitone, CurrentOctave);
 }
예제 #16
0
 private bool IsCorrectSemitone(Semitone semitone)
 {
     return(CurrentSemitone == semitone);
 }