Конференция "Media" » Работа с .kar файлом??? [D3, D4, D5, D6, D7]
 
  • skiner © (08.07.09 16:21) [0]
    Здравствуйте! Нужно написать караоке программу с использование kar файлов, никак не могу найти описание по етому формату, как с ним работать! может есть какието исходники или описание, в общем все что может помочь!
    Зарание спасибо!
    P.S.: Ужке гуглил
  • Сергей М. © (08.07.09 17:44) [1]
    http://jedi.ks.uiuc.edu/~johns/links/music/midifile.html

    см. meta-events

    FF 05 len text Lyric
    A lyric to be sung. Generally, each syllable will be a separate lyric event which begins at the event's time.
  • skiner © (09.07.09 11:33) [2]
    мда тяжеловато, а ненайдется гдето примерчик на Delphi????
  • Сергей М. © (09.07.09 13:11) [3]
    Что не понятно ?
  • skiner © (09.07.09 13:20) [4]
    не получается вытянуть текст с временем, сам звук будет проигровать другой произгователь, а мне нужно сами титры отображать! подскад\жите как их вытянуть
  • Сергей М. © (09.07.09 14:46) [5]

    > мне нужно сами титры отображать


    А как ты собрался титры синхронизировать с MIDI-событиями в треках, воспроизводимых другой программой-плейером ?

    Или тебе просто статическую картинку нужно показать с полным текстом "песни" ?

    И вообще - чем твой вновь изобретаемый велосипед будет лучше уже существующих неплохих kar-плейеров, например,vanBasco Karaoke Player'а ?
  • skiner © (09.07.09 15:10) [6]
    В ӕтом и проблема что стороние мне не подходят, нужен свой маленький караоке
  • Сергей М. © (09.07.09 15:12) [7]
    Я и спрашиваю - чем они не подходят ?
  • skiner © (09.07.09 15:27) [8]
    пишу музыкальный автомат, и нужно припаять туда караоке, для ӕтого нужно сделать маленький караоке который будет только выводить текст(как в обычном караоке)
  • Сергей М. © (09.07.09 15:31) [9]
    А чем этот "мызыкальный автомат" с "припаянным караоке" будет принципиально отличаться от просто караоке-плейера ?
  • Сергей М. © (09.07.09 15:32) [10]

    > не получается вытянуть текст с временем


    Показывай как пытался и что не получилось..
  • skiner © (09.07.09 17:16) [11]
    да ка бы ничего не выходит с ӕтим типом kar. Буду признателен за пример!
  • Сергей М. © (09.07.09 19:50) [12]
    А входит ?
  • skiner © (10.07.09 00:30) [13]
    ну спасибо за помощь! ((
  • Сергей М. © (10.07.09 08:09) [14]
    Не за что
  • skiner © (10.07.09 10:18) [15]
    задам вопрос по другому! как можно достать программный путем текст песен и время из kar файла? какойто маленький примерчик !
  • Сергей М. © (10.07.09 10:43) [16]
    Что мешает самостоятельно изучить структуру mid-файла, проштудировав инф-цию по приведенной ссылке, и изучив ее самостоятельно же написать программу ?

    Формат kar полностью совместим с форматом mid - там записаны те же самые миди-события..
  • skiner © (10.07.09 10:59) [17]
    вот пытаюсь разобраться с hex
  • Сергей М. © (10.07.09 11:01) [18]
  • Сергей М. © (10.07.09 11:02) [19]

    > пытаюсь разобраться с hex


    И что не понятно ?
  • skiner © (10.07.09 11:03) [20]
    пищю пример как можно по hex адресу вытянуть строку
  • Сергей М. © (10.07.09 11:18) [21]
    В помощь вытягивающему:

    http://www.torry.net/vcl/mmedia/audio/fbmidiplay.zip
  • skiner © (10.07.09 11:51) [22]
    щас буду разбираться, проблемно что нужно под линукс ӕто сделать ((
  • Сергей М. © (10.07.09 12:01) [23]

    > проблемно что нужно под линукс ӕто сделать


    Не вижу никаки проблем в этом)
  • skiner © (10.07.09 15:05) [24]
    всетакие не получается прочитать хоть какуето информацию с midi\kar, все из за ӕтого линукса, на винде получилосяб уже!! ((((((
  • Сергей М. © (10.07.09 15:10) [25]

    > все из за ӕтого линукса


    Ах этот "гадкий линукс" !)
    Вечно он виноват, вечно палки в колеса велосипедистам вставляет !)


    > не получается прочитать хоть какуето информацию


    Показывай как пытался ..
  • skiner © (10.07.09 15:17) [26]
    под линукс не писал ничего раньше, вот по ӕтому ...
    использую lazarus
    В общем пытался сделать по ссылке которую вы кидали, мудрували и все в пустую
    открывал файл так

    var
    midiFile: file of byte;
    begin
    AssignFile(midiFile, '/windows/C/paketu/Kim.mid');
    FileMode := 0;
     Reset(midiFile);  
    CloseFile(midiFile);
    end;



    дальше немогу с ним что-то сделать, даже вытянуть информацию об авторе
    мне бы хоть какойто рабочий пример как читать данные, воспроизводить сам файл мне не нужно
    описание протокола на русском нашел
    http://last.h16.ru/protokol/prot.shtml
  • Сергей М. © (10.07.09 15:57) [27]

    > открывал файл так


    > дальше немогу с ним что-то сделать


    Так ты ж его открыл и тут же закрыл !
    см. CloseFile(midiFile);

    Или что понимать под "дальше не могу" ?
    Показывай это самое "дальше" и комментируй что в этом "дальше" ты не можешь ..


    > как читать данные


    А что, в Лазаре разве класс TFileStream отсутствует ?
    Насколько мне известно, FPC поддерживает этот класс:

    http://www.freepascal.org/docs-html/rtl/classes/tfilestream.html

    А также имеется класс TMemoryStream

    http://www.freepascal.org/docs-html/rtl/classes/tmemorystream.html

    который позволяет загрузить файл методом LoadFromFile

    И вообще

    http://www.freepascal.org/docs-html/fcl/index.html

    матчасть нужно знать !)


    > описание протокола на русском нашел


    Это ты не в тот огород полез)

    MIDI-протокол, хоть и имеет прямое отношение к формату и содержимому файлов в форматах SMF/MID/KAR, нужен для управления MIDI-совместимыми устройствами.
    А ты сам сказал, что никакими MIDI-устройствами ты управлять не собираешься..
  • skiner © (10.07.09 16:33) [28]
    еще вопрос!
    в лазарусе не хочет компилить ӕтот код

    fst.Seek(4, spBegin);     //'MThd'
    fst.Seek(1, spCurrent);
    fst.Seek(1, spCurrent);  



    ему ненравится spBegin, spCurrent, spCurrent

    использую TMemoryStream

    чем их можно заменить и что они выполняют (за что отвечают)???
  • skiner © (10.07.09 16:43) [29]
    разобрался, заменил их на  soFromBeginning , soFromCurrent
  • Сергей М. © (10.07.09 16:45) [30]

    > ему ненравится spBegin, spCurrent, spCurrent


    Я ж тебе дал ссылку на референс по FPC

    http://www.freepascal.org/docs-html/fcl/index.html

    Там черным по белому написаны допустимые идентификаторы констант

    http://www.freepascal.org/docs-html/rtl/classes/tstream.seek.html

    С какой луны к тебе свалились эти spBegin, spCurrent, spCurrent - не понятно ..


    > за что отвечают


    Читай референс - там подробно описано назначение каждой из констант
  • skiner © (14.07.09 11:29) [31]
    Так толком и не разобрался! текст достать смох с kar файла, а вот время по которому оно отображается нет, и снова ступор! (((((((( помогите!!!!!!!!!!!!
  • Сергей М. © (14.07.09 11:36) [32]
    Показывай код ..
  • skiner © (14.07.09 11:51) [33]
    Листинг Unit1
    ----------------------------------------------------------------

    type

     // Объявление записи клиента
     TCustomer = Record
       greep : String[50];
      // lastName  : String[30];
     end;

     { TForm1 }

     TForm1 = class(TForm)
       Button1: TButton;
       Button2: TButton;
       Memo1: TMemo;
       StringGrid1: TStringGrid;
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
       procedure FormCreate(Sender: TObject);
     private
       { private declarations }
     public
       { public declarations }
     end;

    var
     Form1: TForm1;
       STF_text : string;
     STF_file : text;
    { Dummy variable, current Track: }
     tel : byte;     trk : word;
    { Decide whether to Adapt or not: }
     OK : boolean;
     nr : byte;
     tijd : Longint;
       i2:integer=1;
    {************************************}

    implementation

    { TForm1 }

    {************************************}

    procedure Read_Parameters;
    begin
    // if ParamCount <> 2 then Some_Help;
     SourceText := '/windows/C/paketu/Amore_no.kar'; // '/home/user/Desktop/Amore_no.kar'
     STF_Text := '/windows/C/12.txt';

      ///windows/C/paketu/Aktrisa.kar  /windows/C/11.txt
    { if ouder(Paramstr(0), STF_Text) and
        ouder(SourceText , STF_Text) then
     begin
       Writeln('Nothing to do.') ; Halt;
     end; }


     Assign(SourceFile, SourceText);
     {$I-}
     Reset(SourceFile, 1);
     {$I+}
     if IOresult <> 0 then
     begin
     { If the source MidiFile does NOT exist: }
      // Writeln(SourceText, ' not found.');
       Halt;
     end;

     AssignFile(STF_File, STF_Text);
     Rewrite(STF_File);
    end;

    {************************************}

    {************************************}

    procedure verwerk_tekst;
    var
    // greep : string[50];
     customer : TCustomer;
     i, j : byte;

    begin
     R := R + 2;
     tel := Get_Byte(R);
     Aantal := Aantal - Longint(tel) - 2;
     customer.greep[0] := char(tel);
     for k := 1 to tel do
     begin
       R := R + 1;
       nr := Get_Byte(R);
       customer.greep[k] := char(nr);

                      inc(i2);
            form1.StringGrid1.RowCount:=i2+5;
         form1.StringGrid1.Cells[1,i2]:= Utf8ToAnsi(customer.greep);

       //form1.memo1.text:=form1.memo1.text+Utf8ToAnsi(char(nr)); //************
     end;

     if customer.greep[1] = '\' then
    { New verse: }
     begin
       customer.greep := '/';
       Writeln(STF_file);

     end;
     if customer.greep[1] = '/' then
    { New line: }
     begin
       customer.greep[0] := char(tel-1);
       for k := 2 to tel do
         customer.greep[k-1] := customer.greep[k];
       Writeln(STF_file);
       Write(STF_file,Utf8ToAnsi(customer.greep));

    // form1.memo1.lines.add(Utf8ToAnsi(char(tel-1)));    ///*************
       Exit;
     end;

     if (customer.greep[1] = '@') and (customer.greep[2]<>'T') then Exit;
    { Title material : }
     if (customer.greep[1] = '@') then
     begin
       customer.greep[0] := char(tel-2);
       for k := 3 to tel do
         customer.greep[k-2] := customer.greep[k];
       Writeln(STF_file,customer.greep);

    // form1.memo1.lines.add(char(tel-2));    ///*************
       Exit;
     end;

    { Escape sequence: }
     i := 1;
     for k := 2 to tel do
     begin
       i := i + 1;
       if (customer.greep[i] = ' ') or (customer.greep[i] = '-') then
       begin
         for j := i to tel do
           customer.greep[tel-j+i+1] := customer.greep[tel-j+i];
         customer.greep[i] := '\';
         i := i + 1;
         tel := tel + 1;
       end;
     end;
     customer.greep[0] :=char(i);

     if customer.greep[1] = char(' ') then
     begin
       Write(STF_file,customer.greep);
    // form1.memo1.lines.add(Utf8ToAnsi(char(i)));    ///*************
       end
     else
     begin
       Write(STF_file,'_'+customer.greep);
    //  form1.memo1.lines.add(Utf8ToAnsi(customer.greep));    ///*************
       end;
    end;

    {************************************}

    procedure TForm1.FormCreate(Sender: TObject);
    begin

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
       Read_Parameters;

     Read_MidiFile;

     R := 1;
     Check_MidiFile_Header;
     if soort <> 1 then
     begin
    //   Writeln('Not a type 1 MidiFile');
       Halt;
     end;
     Write('# bytes =');
    { Loop through all tracks: }
     for trk := 1 to tracks do
     begin
       Check_Track_Header;
       if trk-1 <> 2 then
       begin
         R := R + Aantal;
         Continue;
       end;
       while Aantal > 0 do
       begin
         tijd := Get_Delta_Time;
         OK := New_Status;
         kind := (status shr 4);
         nr := Get_Byte(R+1);
         if kind = 15 then
           if (status=$FF) and (nr=1) then
           verwerk_tekst
           else tel := byte(Skips_Meta_Event)
         else tel := Skips_Midi_Event;
         if Aantal <= 0 then End_of_Track;
       end;
     end;
     Writeln;
     if R < Gelezen then Writeln('Not at EOF');
     if R > Gelezen then Writeln('Beyond EOF');

     Writeln(STF_file);
     CloseFile(STF_file);
    //memo1.Lines.LoadFromFile('/windows/C/12.txt');
    end;

    procedure TForm1.Button2Click(Sender: TObject);

    var
    i:integer;
    st:string[1];
    myFile : TextFile;
    text1: string;
    begin   {
    st[0]:='r';
    //ShowMessage(st[0]);

    form1.memo1.lines.Append(st);      ///*************
            }

           //  memo1.Lines.LoadFromFile('/windows/C/12.txt');
             // memo1.text:=Utf8ToAnsi(memo1.text);

                           // myFile:='/windows/C/12.txt';
                            AssignFile(myFile, '/windows/C/12.txt');
                            Reset(myFile);
               while not Eof(myFile) do
     begin
       ReadLn(myFile, text1);
       ShowMessage(text1);
     end;
    end;  


  • Сергей М. © (14.07.09 11:56) [34]
    И где здесь собственно "доставание времени" ?
  • skiner © (14.07.09 12:04) [35]
    второй модуль не влазит, с которым работает ӕтот пример щас http://huizen.dto.tudelft.nl/deBruijn/muziek/pascal/midifile.pas

    брал все здесь
    http://huizen.dto.tudelft.nl/deBruijn/muziek/midicode.htm#stf2trk
  • Сергей М. © (14.07.09 12:12) [36]
    Понятно.
    Ну так что конкретно не работает в этом коде ?
  • skiner © (14.07.09 12:15) [37]
    в коде все выводит, незнаю как сделать что бы достать время для вывода текста, как караоке!!!!??
  • Сергей М. © (14.07.09 12:17) [38]
    Откуда достать-то ?
  • skiner © (14.07.09 12:21) [39]
    Я понимаю вы подержуете форум, что бы он не заснул, но я всетаки надеюсь услышать ответы людей которые уже сталкивались с ӕтой темой или знают как помочь!
  • Сергей М. © (14.07.09 12:23) [40]
    Ну не хочешь уточнять - тогда сиди жди у моря погоды)
  • skiner © (14.07.09 12:27) [41]
    так а что здесь уточнять, темо идет то о kar типе файла!! вот мне нужно сделать маленький караоке проигрователь
  • Сергей М. © (14.07.09 12:42) [42]

    > мне нужно сделать


    Заметь - тебе !
    А не мне)
    Что ты предпринял для этого, кроме как содрал чужой код, к тому же под ДОС писаный ?


    > темо идет то о kar типе файла


    Нет, "темо идет" конкретно о "как сделать что бы достать время" ..
 
Конференция "Media" » Работа с .kar файлом??? [D3, D4, D5, D6, D7]
Есть новые Нет новых   [133926   +461][b:0][p:0.005]