Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
            }
        }