using System; using System.Collections.Generic; using System.Linq; using Melanchall.DryWetMidi.Smf.Interaction; namespace MusicBoxConverter { public class MusicBox { public string Name { get; private set; } /// /// The height of a strip for this music box, in millimetres. /// public float StripHeightMm = 58.19f; public List ValidNotes { get; private set; } public Note LowestNote { get { return NoteUtilities.StringToNote(ValidNotes.First()); } } public Note HighestNote { get { return NoteUtilities.StringToNote(ValidNotes.Last()); } } public int NoteCount { get { return ValidNotes.Count; } } private MusicBox(string inName, List inValidNotes) { Name = inName; ValidNotes = inValidNotes; } /// /// Calculates whether the specified note can be played by this music box. /// /// The note to check. /// Whether the note can be played by this music box. public bool IsValidNote(Note note) { return ValidNotes.Contains( (note.NoteName.ToString() + note.Octave).Replace("Sharp", "") ); } public int NoteToBoxNumber(Note note) { return ValidNotes.FindIndex((string playableNote) => $"{note.NoteName}{note.Octave}".Replace("Sharp", "#") == playableNote); } public override string ToString() { return Name; //return string.Format("[MusicBox: Name={0}, ValidNotes={1}]", Name, ValidNotes); } /* * Real Life Music Box Printed * * * Middle C4 G * D4 A * E4 B * F4 C * G4 D * A5 E * * A#5 F * B5 F# * C G * D A * * * * * F#3 * G3 * C4 * D4 * E4 * F4 * G4 * A4 * A#4 * B4 * C5 * C#5 * D5 * D#5 * E5 * F5 * F#5 * G5 * G#5 * A5 * A#5 * B5 * C6 * C#6 * D6 * D#6 * E6 * F6 * G6 * A6 */ public static MusicBox Note30Corrected = new MusicBox( "30 Note Music Box (Corrected)", new List() { "F#3", "G3", "C4", "D4", "E4", "F4", "G4", "A4", "A#4", "B4", "C5", "C#5", "D5", "D#5", "E5", "F5", "F#5", "G5", "G#5", "A5", "A#5", "B5", "C6", "C#6", "D6", "D#6", "E6", "F6", "G6", "A6" } ); /// /// A 30 note music box. /// @Starbeamrainbowlabs has one of these - it was the part of the /// inspiration for the whole project! /// public static MusicBox Note30 = new MusicBox( "30 Note Music Box", new List() { // When we asked for a G4, it played an F4 // When we asked for an A4, it played a G4 // When we tried to translate C5 from the reference performance, it translated as a B4 "G3", "C4", "D4", "E4", "F4", "G4", "A4", "A#4", "B4", "C5", "C#5", "D5", "D#5", "E5", "F5", "F#5", "G5", "G#5", "A5", "A#5", "B5", "C6", "C#6", "D6", "D#6", "E6", "F6", "F#6", "G6", "A6" } ); } }