![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Структура файлов караоке - kar. Или как извлеч текст [D7, XP]
worldmen © (2010-06-08 13:08:00)Нашел струкруру kar файла:
KAR files are based on standard Midi files with the following additional events:
The KAR text meta events start with an @ followed by a character indicating the type of KAR text meta event, then followed by text for that event. The following text meta events occur embedded in regular MIDI text events:
FileType: @KMIDI KARAOKE FILE
Version: @V0100
Information: @I<text>
Language: @LENGL
Title 1: @T<title>
Title 2: @T<author>
Title 3: @T<copyright>
The following lyric text indicators are defined. A \ (backslash) in the text is to clear the screen. A / (forwardslash) in the text is a line feed (next line).
Только я это описание немойму. Как текст вытащить?
brother (2010-06-16 15:58:00) [1]тыб исходничек то показал ;)
worldmen (2010-06-16 15:45:00) [2]> RWolf © - БОЛЬШОЕ ТЕБЕ СПАСИБО ЗА ТЕРПЕНИЕ И ОТВЕТЫ.
worldmen (2010-06-16 15:43:00) [3]Так как мне нужен только текст песни, я сделал просто и тупо:
искал в каждой записи MTrk в цикле байт FF и признак текста и ормально все получилось.
worldmen (2010-06-16 12:05:00) [4]
> Отметим, что величина len представляется в виде значения
> переменной длины.
Я так и не понял как определять какая длина у тега. Для самого текста песни она всегда будет 1 байт, т.к. там пишется только один слог.
RWolf (2010-06-16 11:25:00) [5]
> worldmen (16.06.10 10:37) [23]
>> а с чего ты взял, что длина равна одному байту?
> Определил методом тыка… Или я в чем-то неправ?
Отметим, что величина len представляется в виде значения переменной длины.
В данном конкретном случае получился байт, но в случае длинного текста может получиться и больше.
worldmen (2010-06-16 10:37:00) [6]> а с чего ты взял, что длина равна одному байту?
Определил методом тыка, смотри сам:
4D 54 72 6B 00 00 06 17 00 FF 03
0557 6F 72 64 73 01 FF 02 2D43 72 65 61 74 65
64 20 77 69 74 68 20 4B 61 72 4D 61 6B 65 72 3A
20 74 65 61 6D 40 6B 61 72 61 6F 6B 65 67 61 6C
61 78 79 2E 63 6F 6D
Расшифровуем:
4D 54 72 6B, 00 00 06 17 = Mtrk, длина трека Mtrk
00 FF 03 05 - текстовый тэг длиной 5 байт
57 6F 72 64 73 - тексттовая инфа = "Words"
01 FF 02 2D - текстовый тэг длиной 45 байт
43 72 65 61 74 65
64 20 77 69 74 68 20 4B 61 72 4D 61 6B 65 72 3A
20 74 65 61 6D 40 6B 61 72 61 6F 6B 65 67 61 6C
61 78 79 2E 63 6F 6D - тексттовая инфа = "-Created with KarMaker: team@karaokegalaxy.com"
Или я в чем-то неправ?
KilkennyCat (2010-06-16 00:19:00) [7]
>
> 00 FF 03 00 - текстовый тэг, но почему длина =0?
а с чего ты взял, что длина равна одному байту?
KilkennyCat (2010-06-16 00:13:00) [8]потому что там допускается любой текст, вот туда и зафигачили, ибо проще.
> Я так понял, что бы выбрать слова, мне надо искать мета-
> событие
> Слова
> FF 05 len text
> и байт 05 всегда является идентификатором этого события
не совсем.
не байт, а два байта FF05, и не слово, а слог.
worldmen (2010-06-16 00:04:00) [9]А еще есть такие записи:
4D 54 72 6B 00 00 04 29 00 FF 03 00 00 B0
если расшфровать:
4D 54 72 6B - Mtrk
00 00 04 29 - длина трека Mtrk
00 FF 03 00- текстовый тэг, но почему длина =0?
worldmen (2010-06-15 23:42:00) [10]У меня получилось, что текст песни в основном в теге
FF 01 len text
почему?
worldmen (2010-06-11 17:48:00) [11]Я так понял, что бы выбрать слова, мне надо искать мета-событие
Слова
FF 05 len text
и байт 05 всегда является идентификатором этого события
RWolf (2010-06-11 10:10:00) [12]там написано, как хранятся числа переменной длины.
Вкратце — несколько байт подряд, у всех, кроме последнего 7-й бит равен 1. Оставшиеся 7 бит(с 0-го по 6-й) каждого байта — это длина, факторизованная по основанию 128 и записанная в формате big endian.
.число.....запись
00000000 - 00
00000040 - 40
0000007F - 7F
00000080 - 81 00
00002000 - C0 00
00003FFF - FF 7F
00004000 - 81 80 00
00100000 - C0 80 00
worldmen (2010-06-11 09:42:00) [13]Программа находит все тэги MTrk. Я сразу думал, что вместо кокого-нибудь тэга MTrk будет тэг типа Text, оказывается нет. В тегах MTrk есть еще события и в них надо искать текст.
Но как их теперь вычислить если у них переменная длина?
События
Первые байты (байт 1 или байты с 1 по 4) записи MTrk задают значение времени дельта для первого события в формате величины переменной длины.
...
За байтом FFследует другой байт, указывающий какой тип не-MIDI событияописывается в данном событии. Это своеобразный второй статус байт. За этим байтом следует величина переменной длины, которая показывает, какое количество байтов содержится в данном событии. то есть задает длину события.
RWolf (2010-06-10 22:34:00) [14]
> 63635456
это если рассматривать 4 байта длины в формате little endian. А на самом деле в мидишке числа хранятся в big endian.
worldmen (2010-06-10 19:22:00) [15]Тогда точнее будет:
00*256^0 + 00^256^1+CB*256^2 + 03*256^3 =0+0+13303808+50331648= 63635456
Но у меня сам файл 51 Кб.
Или если первые нули, то читать как 2 байта?
RWolf (2010-06-10 11:50:00) [16]
> CB*256^0 + 03*256^1=769 - я правильно посчитал?
CB*256^0 + 03*256^1 = 971.
worldmen (2010-06-10 11:33:00) [17]> Германн © (10.06.10 02:38) [10]
Я уже разобраля в спецификации, я правильно читаю.
Вот первые 2-е строки файла:
D4 54 68 64 00 00 00 06 00 01 00 0E 00 78 4D 54
72 6B 00 00 03 CB 00 FF 21 01 00 00 F0 05 7E 7F
1-4 байт - D4 54 68 64- это MThd
5-8 байт - 00 00 00 06- это размер следующей инфы =6 байтам
9-10 б. - 00 01- количество треков, хранимых в файле
...
15-18 б.- 4D 54 72 B600 00 03 CB- тег MTrk
19-22 б.- 4D 54 72 B6 00 00 03 CB- длина следующей за тегом информации.
Если исходить из этого http://ru.wikipedia.org/wiki/Порядок_байтов, то это число : 769
CB*256^0 + 03*256^1=769 - я правильно посчитал?
И так нужно считать все цифры в этом файле?
RWolf (2010-06-10 09:26:00) [18]
> Почему-то выводит не те данные. Я читаю 18 бит:
байт
> и переменная int=3405971456, это в 16-тиричной системе
> = CB030000
http://ru.wikipedia.org/wiki/Порядок_байтов
> seek(myFile,14);
> Выводит: MtrK
так и должно, по смещению 14 именно эти четыре символа и лежат.
Германн (2010-06-10 02:38:00) [19]
> worldmen (10.06.10 00:05) [9]
>
> Почему-то выводит не те данные. Я читаю 18 бит:
> 00 00 03 CB
>
Во-первых ты читаешь не 18 бит, а 64. Во-вторых что ты читаешь? Пора наконец разобраться в спецификации файла!
worldmen (2010-06-10 00:05:00) [20]Почему-то выводит не те данные. Я читаю 18 бит:
00 00 03 CB
Var
int: Cardinal;
...
AssignFile(myFile, FName);
Reset(myFile, 1);
seek(myFile,18);
BlockRead(myFile, int, SizeOf(int));
и переменная int=3405971456, это в 16-тиричной системе = CB030000
Получается, что я не те байты читаю, но если прочитать:
ch : char;
S : string;
seek(myFile,14);
for i:=1 to 4 do
begin
BlockRead(myFile, ch, SizeOf(ch));
s:=s+ch;
end;
Выводит: MtrK