Sha256: 60e73c63cbacb59693236fd041cc293dca6c45fe1253e81d35bba3c9b6498036

Contents?: true

Size: 1.56 KB

Versions: 28

Compression:

Stored size: 1.56 KB

Contents

using System;
using System.Collections.Generic;
using System.Linq;

public static class ScaleGenerator
{
    private static readonly string[] ChromaticScale = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
    private static readonly string[] FlatChromaticScale = { "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B" };
    private static readonly string[] FlatKeys = { "F", "Bb", "Eb", "Ab", "Db", "Gb", "d", "g", "c", "f", "bb", "eb" };

    private static readonly Dictionary<char, int> Intervals = new Dictionary<char, int> { ['m'] = 1, ['M'] = 2, ['A'] = 3 };
    
    private static string[] Scale(string tonic) => FlatKeys.Contains(tonic) ? FlatChromaticScale : ChromaticScale;
    private static string[] SkipInterval(char interval, string[] scale) => scale.Skip(Intervals[interval]).ToArray();
    private static string[] Shift(int index, string[] scale) => scale.Skip(index).Concat(scale.Take(index)).ToArray();

    public static string[] Pitches(string tonic)
    {
        return Pitches(tonic, "mmmmmmmmmmmm");
    }

    public static string[] Pitches(string tonic, string pattern)
    {
        var scale = Scale(tonic);
        var index = Array.FindIndex(scale, pitch => string.Equals(pitch, tonic, StringComparison.OrdinalIgnoreCase));
        var shiftedScale = Shift(index, scale);

        var pitches = new List<string>();

        foreach (var interval in pattern)
        {
            pitches.Add(shiftedScale[0]);
            shiftedScale = SkipInterval(interval, shiftedScale);
        }

        return pitches.ToArray();
    }
}

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.179 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.178 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.177 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.176 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.175 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.174 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.173 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.172 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.171 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.170 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.169 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.167 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.166 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.165 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.164 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.163 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.162 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.161 tracks/csharp/exercises/scale-generator/Example.cs
trackler-2.2.1.160 tracks/csharp/exercises/scale-generator/Example.cs