Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Вниз

Структура файлов караоке - kar. Или как извлеч текст   Найти похожие ветки 

 
worldmen   (2010-06-08 13:08) [0]

Нашел струкруру 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).

Только я это описание немойму. Как текст вытащить?


 
RWolf ©   (2010-06-08 13:14) [1]

отыскать в MIDI текстовые события и отфильтровать из них помеченные вышеприведёнными тэгами.


 
worldmen   (2010-06-08 13:45) [2]

Надо ведь знать с какого бита начинается эти заголовки. Или пупо считывать данные пока ненайдеш @I и до  @LENGL ?


 
RWolf ©   (2010-06-08 14:41) [3]

у файла MIDI есть формат, а у формата — спецификация. Вот с её чтения и надо начинать. Тогда станет ясно, что такое MIDI text events, и как их добывать из файла.
google:midi format


 
worldmen   (2010-06-09 11:31) [4]

Читаю про формат MIDI - http://ru.wikipedia.org/wiki/MIDI
Получается выводить заголовки MTrk и MThd. А дальше я непонял сколько занимает байт сама музыка.
И для того, чтобы вывести текст, нужно найти:
Слова
FF 05 len text
Текстовое мета-событие, содержащее слова вокального произведения, приходящиеся на ту или иную музыкальную долю. Одно мета-событие «Слова» должно содержать один единственный слог текста.
Отметим, что величина len представляется в виде значения переменной длины.

Я не понимаю как его найти. Нужно искать идентификатор text? Или как?


 
RWolf ©   (2010-06-09 12:41) [5]


>  А дальше я непонял сколько занимает байт сама музыка.

MTrk запись содержит в себе MIDI данные... Заголовок записи MTrk начинается с идентификатора записи, который представляет собой четыре ascii байта "M", "T", "r", "k", за которым следует значение длины записи, то есть число, равное количеству байтов в данной записи


 
RWolf ©   (2010-06-09 12:51) [6]


> Я не понимаю как его найти. Нужно искать идентификатор text?
>  Или как?

Трек секвенсора содержит последовательность событий.
Текст
FF 01 len text
Это мета-событие содержит любой объем текста любого назначения. Значение len содержит длину текстового сообщения в байтах... Отметим, что величина len представляется в виде значения переменной длины.

Очевидно, нужно прочесть из трека все события и выбрать из них те, которые текст.


 
worldmen   (2010-06-09 19:21) [7]

> RWolf ©

> то есть число, равное количеству байтов в данной записи

Так это именно в данной записи. Или это для всех записей одинаково?
> Это мета-событие
Я уже целый день долбаюсь, не пойму как это мета-событие искать.


 
worldmen   (2010-06-09 23:04) [8]

Я разобрался!
Только вопрос по размерам. Есть запись:
MtrK 00 00 03 CB
Так вот 4 байта - 00 00 03 CB - составляют размер последующей записи. Как их переводить, по отдельности или вместе.
По отдельности 03 = 3, СВ= 203
или 03СВ = 971 ?


 
worldmen   (2010-06-10 00:05) [9]

Почему-то выводит не те данные. Я читаю 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


 
Германн ©   (2010-06-10 02:38) [10]


> worldmen   (10.06.10 00:05) [9]
>
> Почему-то выводит не те данные. Я читаю 18 бит:
> 00 00 03 CB
>

Во-первых ты читаешь не 18 бит, а 64. Во-вторых что ты читаешь? Пора наконец разобраться в спецификации файла!


 
RWolf ©   (2010-06-10 09:26) [11]


> Почему-то выводит не те данные. Я читаю 18 бит:

байт


>  и переменная int=3405971456, это в 16-тиричной системе
> = CB030000

http://ru.wikipedia.org/wiki/Порядок_байтов


> seek(myFile,14);
> Выводит: MtrK

так и должно, по смещению 14 именно эти четыре символа и лежат.


 
worldmen   (2010-06-10 11:33) [12]

> Германн ©   (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 B6 00 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 11:50) [13]


> CB*256^0 + 03*256^1=769 - я правильно посчитал?

CB*256^0 + 03*256^1 = 971.


 
worldmen   (2010-06-10 19:22) [14]

Тогда точнее будет:
00*256^0 + 00^256^1+CB*256^2 + 03*256^3 =0+0+13303808+50331648= 63635456
Но у меня сам файл 51 Кб.
Или если первые нули, то читать как 2 байта?


 
RWolf ©   (2010-06-10 22:34) [15]


> 63635456

это если рассматривать 4 байта длины в формате little endian. А на самом деле в мидишке числа хранятся в big endian.


 
worldmen   (2010-06-11 09:42) [16]

Программа находит все тэги MTrk. Я сразу думал, что вместо кокого-нибудь тэга MTrk будет тэг типа Text, оказывается нет. В тегах MTrk есть еще события и в них надо искать текст.
Но как их теперь вычислить если у них переменная длина?

События
Первые байты (байт 1 или байты с 1 по 4) записи MTrk задают значение времени дельта для первого события в формате величины переменной длины.
...
За байтом FF следует другой байт, указывающий какой тип не-MIDI события описывается в данном событии. Это своеобразный второй статус байт. За этим байтом следует величина переменной длины, которая показывает, какое количество байтов содержится в данном событии. то есть задает длину события.


 
RWolf ©   (2010-06-11 10:10) [17]

там написано, как хранятся числа переменной длины.
Вкратце — несколько байт подряд, у всех, кроме последнего 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 17:48) [18]

Я так понял, что бы выбрать слова, мне надо искать мета-событие
Слова
FF 05 len text

и байт 05 всегда является идентификатором этого события


 
worldmen   (2010-06-15 23:42) [19]

У меня получилось, что текст песни в основном в теге
FF 01 len text
почему?


 
worldmen   (2010-06-16 00:04) [20]

А еще есть такие записи:
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?


 
KilkennyCat ©   (2010-06-16 00:13) [21]

потому что там допускается любой текст, вот туда и зафигачили, ибо проще.


> Я так понял, что бы выбрать слова, мне надо искать мета-
> событие
> Слова
> FF 05 len text
> и байт 05 всегда является идентификатором этого события


не совсем.
не байт, а два байта FF05, и не слово, а слог.


 
KilkennyCat ©   (2010-06-16 00:19) [22]


>
> 00 FF 03 00 - текстовый тэг, но почему длина =0?

а с чего ты взял, что длина равна одному байту?


 
worldmen   (2010-06-16 10:37) [23]

> а с чего ты взял, что длина равна одному байту?
Определил методом тыка, смотри сам:
4D 54 72 6B 00 00 06 17 00 FF 03
05 57 6F 72 64 73 01 FF 02 2D 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

Расшифровуем:
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"
Или я в чем-то неправ?


 
RWolf ©   (2010-06-16 11:25) [24]


> worldmen   (16.06.10 10:37) [23]
>> а с чего ты взял, что длина равна одному байту?
> Определил методом тыка… Или я в чем-то неправ?

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


 
worldmen   (2010-06-16 12:05) [25]

> Отметим, что величина len представляется в виде значения
> переменной длины.

Я так и не понял как определять какая длина у тега. Для самого текста песни она всегда будет 1 байт, т.к. там пишется только один слог.


 
worldmen   (2010-06-16 15:43) [26]

Так как мне нужен только текст песни, я сделал просто и тупо:
искал в каждой записи MTrk в цикле байт FF и признак текста и ормально все получилось.


 
worldmen   (2010-06-16 15:45) [27]

> RWolf ©   - БОЛЬШОЕ ТЕБЕ СПАСИБО ЗА ТЕРПЕНИЕ И ОТВЕТЫ.


 
brother ©   (2010-06-16 15:58) [28]

тыб исходничек то показал ;)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
15-1276546519
xayam
2010-06-15 00:15
2010.09.12
Задача для математиков и/или программистов


2-1276607756
ixen
2010-06-15 17:15
2010.09.12
Как закрыть программу в окне авторизации?


15-1276810212
Юрий
2010-06-18 01:30
2010.09.12
С днем рождения ! 18 июня 2010 пятница


15-1276625703
George
2010-06-15 22:15
2010.09.12
Импровизация


2-1276588631
_REA
2010-06-15 11:57
2010.09.12
AnsiChar constant





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский