private void PlayTextStub(object sender, DoWorkEventArgs e) { // Получение параметров List <uint> parameters; uint currentVolume, currentChannel; try { parameters = (List <uint>)e.Argument; currentChannel = parameters[0]; currentVolume = AlignVolume(parameters[1]); } catch { return; } // Проигрывание for (int i = 2; i < parameters.Count; i += 2) { HardWorkExecutor hwe2 = new HardWorkExecutor(PlayNoteStub, new uint[] { parameters [i], currentVolume, parameters [i + 1], currentChannel }); Thread.Sleep((int)parameters[i + 1]); } // Завершено e.Result = null; }
/// <summary> /// Метод преобразует текстовую строку в проигрываемую мелодию и запускает воспроизведение /// </summary> /// <param name="Text">Преобразуемая строка</param> /// <param name="Volume">Громкость (0 –127)</param> /// <param name="NoteDuration">Длительность каждой ноты в миллисекундах</param> /// <param name="Channel">Канал воспроизведения</param> /// <returns>Возвращает true в случае успеха</returns> public bool PlayText(string Text, uint Channel, uint Volume, uint NoteDuration) { // Контроль if (!isInited || ((Channel & 0xFu) == beatsChannel)) { return(false); } if ((Volume * NoteDuration == 0) || (Text == null) || (Text == "")) { return(true); } // Сборка нот для проигрывания byte[] values = Encoding.Default.GetBytes(Text.ToCharArray()); List <uint> message = new List <uint> (); message.Add(Channel); message.Add(Volume); for (int i = 0; i < values.Length; i++) { if (values[i] > 128) { // Нужен нормальный алгоритм преобразования /*message.Add ((uint)values[i] % 12 + NoteAndOctaveToCommand (MIDINotes.До, MIDIOctaves.Первая));*/ message.Add(NoteDuration); } else { message[message.Count - 1] += NoteDuration; } } message[message.Count - 1] += (2 * NoteDuration); // Запуск HardWorkExecutor hwe = new HardWorkExecutor(PlayTextStub, message); return(true); }
/// <summary> /// Метод воспроизводит указанный бит /// </summary> /// <param name="BeatInstrument">Инструмент бита</param> /// <param name="Volume">Громкость (0 – 127)</param> /// <param name="Duration">Длительность в миллисекундах</param> /// <param name="WaitForNextNote">Время ожидания до начала следующей ноты в миллисекундах</param> /// <returns>Возвращает true в случае успеха</returns> public bool PlayBeat(MIDIBeatsInstruments BeatInstrument, uint Volume, uint Duration, uint WaitForNextNote) { // Контроль if (!isInited) { return(false); } if (Volume * Duration == 0) { return(true); } // Запуск HardWorkExecutor hwe = new HardWorkExecutor(PlayNoteStub, new uint[] { (uint)BeatInstrument, Volume, Duration, beatsChannel }); if (WaitForNextNote > 0) { Thread.Sleep((int)WaitForNextNote); } return(true); }
/// <summary> /// Метод воспроизводит указанную ноту /// </summary> /// <param name="Note">Нота</param> /// <param name="Octave">Октава</param> /// <param name="Volume">Громкость (0 – 127)</param> /// <param name="Duration">Длительность в миллисекундах</param> /// <param name="Channel">Канал воспроизведения (0 – 15)</param> /// <param name="WaitForNextNote">Время ожидания до начала следующей ноты в миллисекундах</param> /// <returns>Возвращает true в случае успеха</returns> public bool PlayNote(uint Channel, MIDINotes Note, MIDIOctaves Octave, uint Volume, uint Duration, uint WaitForNextNote) { // Контроль if (!isInited || ((Channel & 0xFu) == beatsChannel)) { return(false); } if (Volume * Duration == 0) { return(true); } // Запуск HardWorkExecutor hwe = new HardWorkExecutor(PlayNoteStub, new uint[] { NoteAndOctaveToCommand(Note, Octave), Volume, Duration, Channel }); if (WaitForNextNote > 0) { Thread.Sleep((int)WaitForNextNote); } return(true); }