2009-12-08 2 views
1

Я хотел бы создать программу, которая позволяет воспроизводить тексты песен по экрану. Что-то вроде этого:Тексты песен (Delphi/псевдокод)

http://www.youtube.com/watch?v=kIAiBvD9njM

Можете ли вы мне помочь?

Алгоритм:

  • толкает маркер справа от линии фитинга музыки
  • позволяет строку выше текущей строки исчезает
  • вставляют новую строку выше текущей строки

Что необходимо?

  • Текст песни (строка за строкой)
  • времени в текстовые данные? (когда начинается/заканчивается линия)

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

ответ

3

Предположим, у вас есть текстовый файл с текстом, который будет отображаться, и аннотированное время, когда он загорается (вид файла субтитров, например, стандартное предложение w3c timed text (http://www.w3.org/AudioVideo/TT/) или субтитр SUB - Movie формат файла используется несколько медиа-плеер.

Вашей программа должна сначала прочитать и разобрать текстовый файл и декодировать аннотированное время. Вставьте его в StringList под названием Субтитры, какие элементы будут также держать объекты, подобные этому одной

type tSubtitle = class 
    num : integer; 
    prevTime, fromTime : tdatetime; 
    toTime, nextTime: tdatetime; 
    text: string; 
end; 

Возможно, вы захотите расширить объект, чтобы удерживать подсветку attri но также.

Затем вам просто нужно отобразить те объекты, синхронизированные с таймером.

procedure TForm1.Timer1Timer(Sender: TObject); 
var rt : TDateTime; 
    done:boolean; 
    si,st,sb:integer; 
    s:string; 
begin 
    rt:=now-startTime; 
    st:=0; 
    sb:=subtitles.Count; // binary search the subtitle for the current time 
    repeat 
    si:=(st+sb) div 2; 
    s:=TSubtitle(subtitles.Objects[si-1]); 
    done:= ((t>=s.prevTime) and (t<=s.nextTime)); 
    if not done then 
    begin 
     if t>s.prevTime then st:=si 
     else if t<s.nextTime then sb:=si; 
     if st=sb then done:=true; 
    end; 
    until done; 
    // do what you want with s 
end; 
0

Вы должны создать новый класс на основе TGraphicControl/TCustomControl (что-нибудь с холстом) и добавить свойство строки, теперь вам нужно создать таймер в качестве частной переменной с его значением интервала, опубликованным через ваш класс, что-то вроде этого ...

type TLyricViewer = class(TGraphicControl) 
    private 
     FTimer : TTimer; 
     FLyric : string; 
     FBitmap : TBitmap;// offset bitmap on which you draw 
     // some more variables to store paint information 
    private 
     procedure OnNextWord(Sender: TObject);// assign this to FTimer.OnTimer event 
    public 
     constructor Create(AOwner: TComponent); 
     destructor Destroy; override; 
    public 
     procedure StartLyric; 
     procedure StopLyric; 
     procedure Paint; override; 
    published 
     property WordInterval : Integer|Cardinal 
     read GetWordInterval write SetWordInterval; 
end; 
... 
procedure TLyricViewer.Paint; 
begin 
// here is where the magic happends 
end; 

constructor TLyricViewer.Create(AOwner: TComponent); 
begin 
// create timer, bitmap and set default properties 
end; 

destructor TLyricViewer.Destroy; 
begin 
    // free and nil the timer and bitmap 
    inherited Destroy; 
end; 

остальное зависит от вас, ведь ваша одна получать деньги, работа для него :)

+0

... оплачивается ... или нивелируется. ;-) –

+0

ни как ... просто хобби: P – caw

+0

Ну, я бы не рекомендовал инвестировать время в эту тему, вы можете узнать больше, развивая интерпретатор или алгоритм шифрования и т. Д., Чем на лирическом буфере *** iet ... но это только я ... В нижней строке требуется некоторое время для создания компонента/приложения с учетом вышеупомянутых потребностей. Либо отбросьте идею, либо отправьтесь в ближайший магазин и купите много лотов и (вы получите идею) о кофе, а затем вернитесь домой и выходите из проекта после 30 минут кофе и отжиманий «256»: P – delphigeist

2

Другим вариантом было бы создать свой собственный код, вы синтаксического анализа для этого содержит как текст, так и время задержки. Хотя таймер будет работать, проблема в том, что он не будет достаточно точным с течением времени, чтобы дать вам надежные результаты с момента его запуска на основе обмена сообщениями. Вместо этого я бы выполнил триггеры, основанные на том, как далеко от начала музыкального файла вы хотите, чтобы событие произошло. Это также позволяет системе догонять, если какой-то другой процесс блокировки приложений мешает и должен помочь синхронизировать ситуацию.

Что-то же просто, как:

00:00:15;LYRIC;This is lyric line 1 
00:00:18;FADEOUT 

вы затем можете разобрать этот в список соответствующих объектов, которые принимают соответствующие меры.

5

Если вы заинтересованы в караоке код в паскале, убедитесь, чтобы посмотреть на Ultrastar Делюкс.

Это супер гладкое и очень популярное приложение для караоке. Проект активен и является открытым исходным кодом. Его можно скомпилировать на различные платформы с помощью FPC. Вы можете скомпилировать его как из Delphi, так и из Lazarus .. приятно.

http://ultrastardx.sourceforge.net/

Мои соседи считали, что моя собака была их худший кошмар, пока я не нашел эту программу.

в действии: po-po-po-pokerface po-po-pokerface.. mum mum mum mah! :)

Смежные вопросы