public void SimpsonsText() { var result = Rtttl.TryParse("Simpsons:d=4,o=5,b=160:32p,c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Name.Should().Be("Simpsons"); rtttl.Settings.Should() .BeEquivalentTo(new { Duration = Duration.Four, Scale = Scale.Five, BeatsPerMinute = 160 }); rtttl.Notes.Should().BeEquivalentTo(new[] { new Note(Pitch.Pause, Duration.ThirtyTwo, null, false), //32p, new Note(Pitch.C, null, Scale.Six, true), //c.6, new Note(Pitch.E, null, Scale.Six, false), //e6, new Note(Pitch.FSharp, null, Scale.Six, false), //f#6, new Note(Pitch.A, Duration.Eight, Scale.Six, false), //8a6, new Note(Pitch.G, null, Scale.Six, true), //g.6, new Note(Pitch.E, null, Scale.Six, false), //e6, new Note(Pitch.C, null, Scale.Six, false), //c6, new Note(Pitch.A, Duration.Eight, null, false), //8a, new Note(Pitch.FSharp, Duration.Eight, null, false), //8f#, new Note(Pitch.FSharp, Duration.Eight, null, false), //8f#, new Note(Pitch.FSharp, Duration.Eight, null, false), //8f#, new Note(Pitch.G, Duration.Two, null, false), //2g }, options => options.WithStrictOrdering()); }
public void OnlyInvalidScaleSettingText(string scale) { var result = Rtttl.TryParse($":o={scale}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(false); rtttl.Should().BeNull(); }
public void OnlyInvalidDurationSettingText(string duration) { var result = Rtttl.TryParse($":d={duration}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(false); rtttl.Should().BeNull(); }
public void OnlyInvalidBeatsPerMinuteSettingText(string bpm) { var result = Rtttl.TryParse($":b={bpm}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(false); rtttl.Should().BeNull(); }
public void OnlySingleInvalidNoteWithTrailingJunkText(string note) { var result = Rtttl.TryParse($"::{note}", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(false); rtttl.Should().BeNull(); }
public void OnlySingleNotesWithSpaces(string note, Pitch pitch, Duration?duration, Scale?scale, bool dotted) { var result = Rtttl.TryParse($"::{note}", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Notes.Should().HaveCount(1) .And.BeEquivalentTo( new Note(pitch, duration, scale, dotted)); }
public void OnlySingleNotePitchText(string note, Pitch expectedPitch) { var result = Rtttl.TryParse($"::{note}", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Notes.Should().HaveCount(1) .And.BeEquivalentTo(new { Pitch = expectedPitch }); }
static void Main(string[] args) { var song = args[0]; if (!Rtttl.TryParse(song, out var rtttl)) { Console.WriteLine($"Failed to parse song: {song}"); return; } Console.WriteLine($"Playing: {rtttl.Name}"); rtttl.PlayWithConsoleBeep(); }
public void OnlyBeatsPerMinuteSettingText(string bpm, int expectedbpm) { var result = Rtttl.TryParse($":b={bpm}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Name.Should().BeEmpty(); rtttl.Settings.Should() .BeEquivalentTo(new { Duration = Duration.Four, Scale = Scale.Six, BeatsPerMinute = expectedbpm }); }
public void OnlyScaleSettingText(string scale, Scale expectedScale) { var result = Rtttl.TryParse($":o={scale}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Name.Should().BeEmpty(); rtttl.Settings.Should() .BeEquivalentTo(new { Duration = Duration.Four, Scale = expectedScale, BeatsPerMinute = 63 }); }
public void OnlyDurationSettingText(string duration, Duration expectedDuration) { var result = Rtttl.TryParse($":d={duration}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Name.Should().BeEmpty(); rtttl.Settings.Should() .BeEquivalentTo(new { Duration = expectedDuration, Scale = Scale.Six, BeatsPerMinute = 63 }); }
public void MultipleSettingText(string settingsText, Duration duration, Scale scale, int beatsPerMinute) { var result = Rtttl.TryParse($":{settingsText}:", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Name.Should().BeEmpty(); rtttl.Settings.Should() .BeEquivalentTo(new { Duration = duration, Scale = scale, BeatsPerMinute = beatsPerMinute }); }
public void OnlyNameText() { var result = Rtttl.TryParse("HauntHouse::", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Name.Should().Be("HauntHouse"); rtttl.Settings.Should() .BeEquivalentTo(new { Duration = Duration.Four, Scale = Scale.Six, BeatsPerMinute = 63 }); }
static void Main(string[] args) { // https://github.com/dotnet/iot/blob/main/Documentation/raspi-pwm.md Console.WriteLine("Hello PWM!"); using var pwm = PwmChannel.Create(0, 0, 700); var rtttls = new [] { "Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6", "Super Mario - Main Theme:d=4,o=5,b=125:a,8f.,16c,16d,16f,16p,f,16d,16c,16p,16f,16p,16f,16p,8c6,8a.,g,16c,a,8f.,16c,16d,16f,16p,f,16d,16c,16p,16f,16p,16a#,16a,16g,2f,16p,8a.,8f.,8c,8a.,f,16g#,16f,16c,16p,8g#.,2g,8a.,8f.,8c,8a.,f,16g#,16f,8c,2c6", "Muppets:d=4,o=5,b=250:c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,8a,8p,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,8e,8p,8e,g,2p,c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,a,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,d,8d,c", "Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f" } .Select(song => (prased: Rtttl.TryParse(song, out var rtttl), rtttl: rtttl) switch { (true, _)x => x.rtttl !, (false, _) => throw new InvalidOperationException() })
public void OnlyMultipleNotes() { var notes = "a,2e,d#,b4,2a4,2e."; var result = Rtttl.TryParse($"::{notes}", out var rtttl); using var _ = new AssertionScope(); result.Should().Be(true); rtttl !.Notes.Should().HaveCount(6) .And.BeEquivalentTo(new[] { new Note(Pitch.A, null, null, false), new Note(Pitch.E, Duration.Two, null, false), new Note(Pitch.DSharp, null, null, false), new Note(Pitch.B, null, Scale.Four, false), new Note(Pitch.A, Duration.Two, Scale.Four, false), new Note(Pitch.E, Duration.Two, null, true) }, options => options.WithStrictOrdering()); }