Как выбрать напольный конвектор водолей.рф.

Караоке и MIDI плейер c возможностью синхронного вывода лирики

© 2006 Youri Sh.

Очень часто, на различных форумах, встречаются вопросы: как проиграть MIDI без использования стандартного MediaPlayer? Как извлечь нужную информацию (название песни, длительность, BPM и др.) из файлов с расширением *.mid и *.kar? Но ответы на эти вопросы встречаются гораздо реже вопросов, и то, только относительно MIDI.

В данной статье я хочу рассказать, как решается эта проблема. Я не являюсь экспертом в области MIDI – так что прошу не судить слишком строго. Я надеюсь, что эта статья хоть как-то сможет помочь тем, кто делает первые шаги в этой области. Если Вы знаете больше относительно интерфейса MIDI, буду очень признателен за помощь и указания на ошибки (которых, увы, наверняка, сделал не мало).

Напишем простой проигрыватель файлов MIDI и караоке, с возможностью извлечения информации, изменения тональности и темпа. Для начала Вам потребуется установить бесплатный компонент FbMidiPlay (при этом на вкладке Synth должно появиться четыре компонента).

Создадим новое приложение под названием MIDI Player. Положим на форму пять TButton (Для загрузки файла, воспроизведения, продолжения воспроизведения, остановки и изменения тональности), четыре TEdit (Имя загруженного файла, прошедшее время, длина песни, BPM), три TLabel (Время, длина, BPM), один TComboBox (MIDI выходы), один TMemo (для показа слов), один TOpenDialog (Диалог выбора песни) и самые главные компоненты MidiFile и MidiOutput. Также не забудьте записать в список uses модуль MidiType.

Далее для открытия и закрытия устройства вывода звука запишите следующие процедуры:

procedure TForm1.MidiOpen;
begin
if not (ComboBox1.Text = '') then
begin
MidiOutput1.ProductName := ComboBox1.Text;
MidiOutput1.Open;
MidiOpened := True;
end;
end;

procedure TForm1.MidiClose;
begin
if MidiOpened then
begin
MidiOutput1.Close;
MidiOpened := False;
end;
end;

Следующая процедура нужна для сброса всех нот (чтобы ноты не залипали):

procedure TForm1.SentAllNotesOff;
var
mEvent : TMyMidiEvent;
Channel : integer;
begin
mEvent := TMyMidiEvent.Create;
{Перебор всех 16 каналов}
for Channel:= 0 to 15 do
begin
mEvent.MidiMessage := $B0 + Channel;
mEvent.data1 := $78;
mEvent.data2 := 0;
if MidiOpened then
MidiOutput1.PutMidiEvent(mEvent);
end;
mEvent.Destroy;
end;

В обработчике события Change компонента ComboBox, запишите следующий код:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
{При выборе устройства MIDI звук начинает выводиться через него}
MidiClose;
MidiOpen;
end;

При создании формы должна выполнятся процедура:

procedure TForm1.FormCreate(Sender: TObject);
var
thisDevice : integer;
begin
{Перебор всех MIDI устройств, установленных на компьютере и
запись названий устройств в ComboBox}
for thisDevice := 0 to MidiOutput1.NumDevs - 1 do
begin
MidiOutput1.DeviceID := thisDevice;
ComboBox1.Items.Add(MidiOutput1.ProductName);
end;
ComboBox1.ItemIndex := 0;
MidiOpened := False;
MidiOpen;
end;

Если после этого Вы запустите приложения, то с помощью ComboBox сможете выбрать устройство для вывода звука. Для загрузки файла MIDI вставьте следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
i,: integer;
begin
if OpenDialog1.Execute then
begin Memo1.Clear;
MidiFile1.FileName := OpenDialog1.FileName;
{ExtractFileNameEx – функция для преобразования пути файла в короткий формат
и без расширения. Данная функция есть в исходниках плейера}
Edit1.Text:=ExtractFileNameEx(OpenDialog1.FileName, False);
MidiFile1.ReadFile;
Edit4.Text := IntToStr(MidiFile1.Bpm);
Edit3.Text := MyTimeToStr(MidiFile1.GetTrackLength);
end;
end;

Процедура для начала воспроизведения:

procedure TForm1.Button2Click(Sender: TObject);
begin
MidiFile1.StartPlaying;
end;

Для продолжения воспроизведения после остановки (с места на котором остановились):

procedure TForm1.Button3Click(Sender: TObject);
begin
MidiFile1.ContinuePlaying;
end;

Для остановки воспроизведения:

procedure TForm1.Button4Click(Sender: TObject);
begin
MidiFile1.StopPlaying;
SentAllNotesOff;
end;

Обработчик события OnMidiEvent и OnUpdateEvent компонента MidiFile:

procedure TForm1.MidiFile1MidiEvent(event: PMidiEvent);
var
mEvent : TMyMidiEvent;
begin
mEvent := TMyMidiEvent.Create;
if not (event.event = $FF) then
begin
mEvent.MidiMessage := event.event;
mEvent.data1 := event.data1;
mEvent.data2 := event.data2;
MidiOutput1.PutMidiEvent(mEvent);
end
else
begin
if (event.data1 >= 1) and (event.data1 < 15) then
begin
{Синхронный вывод текста песни в TMemo}
Memo1.Lines.Add(event.str);
end
end;
mEvent.Destroy;
end;

procedure TForm1.MidiFile1UpdateEvent(Sender: TObject);
begin
Edit2.Text := MyTimeToStr(MidiFile1.GetCurrentTime);
Edit2.Update;
if MidiFile1.ready then
begin
MidiFile1.StopPlaying;
SentAllNotesOff;
end;
end;

После запуска программы, выбора нужной песни и нажатия кнопки "Воспроизвести" в Edit'ах можно увидеть время звучания, длину песни, BPM, а в Memo Вы увидите информацию о названии песни, исполнители. Также по мере звучания появятся слова (караоке).

Теперь доработаем проигрыватель – добавим возможность изменения темпа и тональности. Темп будем увеличивать или уменьшать путём ввода в поле BPM нужного значения (для простоты):

procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
if Key = char(13) then
begin
MidiFile1.Bpm := StrToInt(Edit4.Text);
Edit4.Text := IntToStr(MidiFile1.Bpm);
Abort;
end;
end;

Тональность можно изменить подменой нот. Например, так (увеличиваем тональность на один полутон):

procedure TForm1.Button5Click(Sender: TObject);
var
MidiTrack : TMidiTrack;
i : integer;
k : integer;
event : PMidiEvent;
begin
{Перебор всех треков и событий и транспонирование нот на один полутон вверх}
for k:=0 to (MidiFile1.NumberOfTracks-1) do
begin
MidiTrack := MidiFile1.GetTrack(k);
for i := 0 to MidiTrack.GetEventCount-1 do
begin
event := MidiTrack.getEvent(i);
if not (event.len = -1) then
if not (event.event = $FF) then
begin
event.data1:=event.data1+$01;
event.data2:=event.data2+$02;
end;
end;
end;
SentAllNotesOff;
end;

На этом наш проигрыватель готов. При желании его можно доработать до полноценного караоке плейера. Исходники плейера и необходимые компоненты можно скачать отсюда.

Copyright© 2006 Youri Sh. Специально для Delphi Plus


Пожалуйста, оцените статью

Отлично
Хорошо
Средне
Плохо
Очень плохо



Новости за месяц

  • Ноябрь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс