private static MelodyElement TransposeElement(MelodyElement element, int tonesToTransponse) { var noteElement = element as NoteElement; if (noteElement == null) { return(element); } // Every octave consists of 12 notes numberd from 1 to 12. Each octave numbered from 1 to 8. // To transpose over octaves we will get absolute index of note like (octave index - 1) * 12 + (note index - 1). // As far as octave and note numbered starting from 1 we decrease it's values by 1 for farher calculation. var absoluteNoteNumber = ((int)noteElement.Octave - 1) * 12 + ((int)noteElement.Note - 1); // Then we transpose absolute number. In case gotten value exceeds maximum value of 96 (12 notes * 8 octave) // we calculate remainder of dividing by 96. In case gotten value is below 0 we add 96. absoluteNoteNumber = (absoluteNoteNumber + tonesToTransponse) % 96; absoluteNoteNumber = absoluteNoteNumber >= 0 ? absoluteNoteNumber : absoluteNoteNumber + 96; // Then to get transposed octave index we divide transposed absolute index // value by 12 and increase it by 1 due to we decreased it by 1 before. // To get transposed note index we will get remainder of dividing by 12 // and increase it by 1 due to we decreased it by 1 before. noteElement.Octave = (Octave)(absoluteNoteNumber / 12 + 1); noteElement.Note = (Note)(absoluteNoteNumber % 12 + 1); return(noteElement); }
private void PlayElement(MelodyElement element) { var durationInMilliseconds = _wholeNoteDurationInMilliseconds / (int)element.Duration; var noteElement = element as NoteElement; if (noteElement == null) { // In case it's a pause element we have only just wait desired time. Thread.Sleep(durationInMilliseconds); } else { // In case it's a note element we play it. var frequency = GetFrequency(noteElement.Note, noteElement.Octave); _buzzer.PlayTone(frequency, (int)(durationInMilliseconds * 0.7)); Thread.Sleep((int)(durationInMilliseconds * 0.3)); } }