You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.0 KiB
144 lines
3.0 KiB
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; } |
|
/// <summary> |
|
/// The height of a strip for this music box, in millimetres. |
|
/// </summary> |
|
public float StripHeightMm = 58.19f; |
|
public List<string> 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<string> inValidNotes) |
|
{ |
|
Name = inName; |
|
ValidNotes = inValidNotes; |
|
} |
|
|
|
|
|
/// <summary> |
|
/// Calculates whether the specified note can be played by this music box. |
|
/// </summary> |
|
/// <param name="note">The note to check.</param> |
|
/// <returns>Whether the note can be played by this music box.</returns> |
|
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<string>() { |
|
"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" |
|
} |
|
); |
|
|
|
/// <summary> |
|
/// A 30 note music box. |
|
/// @Starbeamrainbowlabs has one of these - it was the part of the |
|
/// inspiration for the whole project! |
|
/// </summary> |
|
public static MusicBox Note30 = new MusicBox( |
|
"30 Note Music Box", |
|
new List<string>() { |
|
// 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" |
|
} |
|
); |
|
} |
|
}
|
|
|