Untitled - Vitajte na stránkach www.einsty.hostujem.sk
Untitled - Vitajte na stránkach www.einsty.hostujem.sk
Untitled - Vitajte na stránkach www.einsty.hostujem.sk
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
P R O G R A M U J E M E<br />
Vytvorené pole char idb je <strong>na</strong>jfunkènejšou premennou<br />
tejto procedúry. Postupným obmieòaním hodnôt identifikátora<br />
a dåžky textu vznikajú kompletné identifikátory<br />
jednotlivých informácií.<br />
//TENC write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘E’;<br />
idb[3]:= ‘N’;<br />
idb[4]:= ‘C’;<br />
idb[8]:= chr(length(TENC)+1);<br />
idb[9]:= ‘@’;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TENC) do begin<br />
txt[i]:= TENC[i];<br />
end;<br />
blockwrite(temp, txt, length(TENC));<br />
TENC – Encoded by. Identifikátor s dåžkou 11 z<strong>na</strong>kov<br />
<strong>na</strong> deviatej pozícii uchováva ‘@’. Uložením hodnoty TENC<br />
do premennej txt (pole char) a následným zápisom do súboru<br />
vzniká kompletne zapísaná informácia Encoded by.<br />
//WXXX write<br />
idb[1]:= ‘W’;<br />
idb[2]:= ‘X’;<br />
idb[3]:= ‘X’;<br />
idb[4]:= ‘X’;<br />
idb[8]:= chr(length(WXXX)+2);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 12);<br />
for i:= 1 to length(WXXX) do begin<br />
txt[i]:= WXXX[i];<br />
end;<br />
blockwrite(temp, txt, length(WXXX));<br />
WXXX – Url. Neviem, z akého dôvodu je identifikátor dlhší<br />
o jeden z<strong>na</strong>k ako v ostatných prípadoch. Dåžka re azca<br />
zapísaného v ôsmom bite je vyjadrená ako <strong>sk</strong>utoèná dåžka<br />
url plus dva. To asi preto, že je zmenená aj dåžka identifikátora.<br />
//TCOP write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘C’;<br />
idb[3]:= ‘O’;<br />
idb[4]:= ‘P’;<br />
idb[8]:= chr(length(TCOP)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TCOP) do begin<br />
txt[i]:= TCOP[i];<br />
end;<br />
blockwrite(temp, txt, length(TCOP));<br />
//TOPE write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘O’;<br />
idb[3]:= ‘P’;<br />
idb[4]:= ‘E’;<br />
idb[8]:= chr(length(TOPE)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TOPE) do begin<br />
txt[i]:= TOPE[i];<br />
end;<br />
blockwrite(temp, txt, length(TOPE));<br />
//TCON write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘C’;<br />
idb[3]:= ‘O’;<br />
idb[4]:= ‘N’;<br />
idb[8]:= chr(length(TCON)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TCON) do begin<br />
txt[i]:= TCON[i];<br />
end;<br />
blockwrite(temp, txt, length(TCON));<br />
//TCOM write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘C’;<br />
idb[3]:= ‘O’;<br />
idb[4]:= ‘M’;<br />
idb[8]:= chr(length(TCOM)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TCOM) do begin<br />
txt[i]:= TCOM[i];<br />
end;<br />
blockwrite(temp, txt, length(TCOM));<br />
//TYER write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘Y’;<br />
idb[3]:= ‘E’;<br />
idb[4]:= ‘R’;<br />
idb[8]:= chr(length(TYER)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TYER) do begin<br />
txt[i]:= TYER[i];<br />
end;<br />
blockwrite(temp, txt, length(TYER));<br />
//TRCK write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘R’;<br />
idb[3]:= ‘C’;<br />
idb[4]:= ‘K’;<br />
idb[8]:= chr(length(TRCK)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TRCK) do begin<br />
txt[i]:= TRCK[i];<br />
end;<br />
blockwrite(temp, txt, length(TRCK));<br />
//TALB write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘A’;<br />
idb[3]:= ‘L’;<br />
idb[4]:= ‘B’;<br />
idb[8]:= chr(length(TALB)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TALB) do begin<br />
txt[i]:= TALB[i];<br />
end;<br />
blockwrite(temp, txt, length(TALB));<br />
//TPE1 write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘P’;<br />
idb[3]:= ‘E’;<br />
idb[4]:= ‘1’;<br />
idb[8]:= chr(length(TPE1)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TPE1) do begin<br />
txt[i]:= TPE1[i];<br />
end;<br />
blockwrite(temp, txt, length(TPE1));<br />
//TIT2 write<br />
idb[1]:= ‘T’;<br />
idb[2]:= ‘I’;<br />
idb[3]:= ‘T’;<br />
idb[4]:= ‘2’;<br />
idb[8]:= chr(length(TIT2)+1);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 11);<br />
for i:= 1 to length(TIT2) do begin<br />
txt[i]:= TIT2[i];<br />
end;<br />
blockwrite(temp, txt, length(TIT2));<br />
Na zápis parametrov TCOP, TOPE, TCON, TCOM, TYER,<br />
TRCK, TALB, TPE1, TIT2 bola použitá rov<strong>na</strong>ká dåžka identifikátora.<br />
Za povšimnutie stojí fakt, že niektoré informácie<br />
a ich zápis majú inú štruktúru. Otázka znie: preèo? Bolo<br />
by ove¾a jednoduchšie vytvori takú procedúru, ktorá by<br />
nemusela každý parameter zapisova zvláš , èím by sa procedúra<br />
stala rýchlejšou a pružnejšou, èo sa týka pridávania,<br />
respektíve zapísania ostatných informácií, potrebných<br />
z h¾adi<strong>sk</strong>a použitia. Preèo by potom vytvárali popis, ktorý<br />
dokáže uchova 83 informácií? Veï komu by sa nepáèil<br />
systém karaoke, ktorý je jednou z funkcií ID3 TAG v2!<br />
//COMM write<br />
idb[1]:= ‘C’;<br />
idb[2]:= ‘O’;<br />
idb[3]:= ‘M’;<br />
idb[4]:= ‘M’;<br />
idb[8]:= chr(length(COMM)+5);<br />
idb[9]:= #00;<br />
blockwrite(temp, idb, 15);<br />
for i:= 1 to length(COMM) do begin<br />
txt[i]:= COMM[i];<br />
end;<br />
blockwrite(temp, txt, length(COMM));<br />
COMM – komentár. Priznám sa, že tento zápis komentára<br />
nie je celkom v poriadku. Preštudoval som si viacero<br />
príruèiek s popisom ID3 TAG v2, ktoré som <strong>na</strong>šiel pri potulkách<br />
internetom. Jed<strong>na</strong> informácia ostala doposia¾<br />
mnou nepochopená. Ide o 4 bity, ktoré sú pravdepodobne<br />
súèas ou identifikátora. V nich sa <strong>sk</strong>rývajú neznáme<br />
parametre, dy<strong>na</strong>micky sa meniace v závislosti od textu<br />
komentára. Preto som tieto bity jednoducho pre<strong>sk</strong>oèil a<br />
<strong>na</strong> moje prekvapenie komentár zapísalo správne, teda tak,<br />
že je èitate¾ný aj inými prehrávaèmi a editormi.<br />
// prazdne bity<br />
for i:= 1 to 10 do begin<br />
null[i]:= #00;<br />
end;<br />
blockwrite(temp, null, sizeof(null));<br />
Prázdne bity sú jednoduchou ochranou celého zápisu.<br />
Dåžka je pravdepodobne pevne daná, ale správne pracuje aj<br />
pri desiatich vo¾ných bitoch, ktoré sú uložené <strong>na</strong> konci popisu<br />
ID3 TAG v2. Takto nám v doèasnom súbore vznikol popis<br />
ID3 TAG v2, za ktorý je prekopírovaná „MP-trojka“.<br />
//kopirovanie mp3 file<br />
assignfile(f, file<strong>na</strong>me);<br />
reset(f, 1);<br />
repeat<br />
blockread(f, copy, sizeof(copy), read);<br />
blockwrite(temp, copy, read, write);<br />
until ((read= 0) or (read write));<br />
closefile(f);<br />
closefile(temp);<br />
erase(f);<br />
re<strong>na</strong>me(temp, file<strong>na</strong>me);<br />
end;<br />
Tu som mohol použi aj všeobecne známy príkaz Copy-<br />
File, ktorý som zavrhol hneï <strong>na</strong> zaèiatku práce s ním. Po<br />
prekopírovaní jadra MP3 do doèasného súboru sa <strong>sk</strong>utoèný<br />
súbor MP3 vymaže a ten doèasný sa premenuje <strong>na</strong><br />
názov originálu. Použitie procedúry vysvet¾ujem <strong>na</strong> tom<br />
istom príklade ako v predchádzajúcej èasti, kde sme túto<br />
tému zaèali rozobera .<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
if checkbox1.Checked= true then begin<br />
clearTag2(edit1.text);<br />
setTag2(edit11.text, edit10.text, edit9.text,<br />
edit8.text, edit7.text, combobox1.text,<br />
edit6.text, edit2.text, memo1.Lines.Text,<br />
edit5.text, edit4.text, edit3.text, edit1.text);<br />
end else clearTag2(edit1.text);<br />
end;<br />
Procedúra je spustená po kliknutí, resp. stlaèení tlaèidla<br />
button1. Ak kontrola oz<strong>na</strong>èenia CheckBox1 bola úspešná,<br />
je spustená èas rutiny, kde sú použité dve <strong>na</strong>mi vytvorené<br />
procedúry ClearTag2 a SetTag2. Mazanie neaktuálneho<br />
popisu sme si ukázali minule a po dosadení vstupných<br />
parametrov do procedúry zápisu vznikne takýto<br />
(zobrazený) „chaos“. Ak CheckBox1 nie je oz<strong>na</strong>èený, to<br />
z<strong>na</strong>mená, že MP3 nebude nosite¾om nijakej informácie<br />
ID3 TAG v2. Verím, že táto téma vás dostatoène zaujala a<br />
<strong>na</strong>dobudnuté vedomosti pri èítaní tohto, ako aj predchádzajúcich<br />
èlánkov využijete vo vašej programátor<strong>sk</strong>ej praxi<br />
pri tvorení zaujímavého programu alebo komponentu pre<br />
programovací jazyk Borland Delphi.<br />
NABUDÚCE. Neviem, èi som si náhodou nezamenil<br />
témy. Hneï pochopíte preèo. V <strong>na</strong>sledujúcej èasti sa dozviete<br />
nieèo o práci so súbormi, ako ich kopírova , ako<br />
èíta , ako zapisova , a ostatné operácie súvisiace s nimi.<br />
Teraz si uvedomujem, že viac by sa hodila táto téma o<br />
nieèo <strong>sk</strong>ôr ako zápis a èítanie ID3 TAG. Ale èo už teraz?<br />
Prajem vám teda krásny zvyšok mesiaca.<br />
Jozef KOZÁK ml.<br />
12/2001 PC REVUE 143