Post date: Dec 26, 2011 1:23:18 AM
(This post is a work in progress: stay tuned!)
I recently got my hands on a Malata Karaoke DVD player. It uses a special DVD, which they called "Midi-DVD", to store thousands of songs that can be selected on the player.
The first thing that I did was to use Brasero's Disk Copy function to copy the disc into an ISO and then to a DVD. It played just fine on the DVD player.
A list of the files on the disk:
# ls -l
total 3283812
dr-xr-xr-x 2 4294967295 4294967295 40 2011-06-29 23:37 AUDIO_TS
-r--r--r-- 1 4294967295 4294967295 1906324 2009-05-24 18:17 F6838.IDX
-r--r--r-- 1 4294967295 4294967295 3262464 2011-04-18 05:30 FONT.BIN
-r--r--r-- 1 4294967295 4294967295 2711552 2009-02-18 23:26 FONTFT.BIN
-r--r--r-- 1 4294967295 4294967295 3677324 2011-04-18 05:30 MALATAF1.BIN
-r--r--r-- 1 4294967295 4294967295 8653106 2011-04-18 05:30 MALATAF3.BIN
-r--r--r-- 1 4294967295 4294967295 3685516 2011-04-18 05:30 MALATAJ1.BIN
-r--r--r-- 1 4294967295 4294967295 25596 2006-09-11 21:05 MALATAM1.INF
-r--r--r-- 1 4294967295 4294967295 25920 2009-08-13 18:59 MALATAM2.INF
-r--r--r-- 1 4294967295 4294967295 25920 2009-08-13 18:59 MALATAM3.INF
-r--r--r-- 1 4294967295 4294967295 1572864 2008-06-26 04:06 MALATARM.DAT
-r--r--r-- 1 4294967295 4294967295 1085442 2011-04-18 05:31 MALATAS3.IDX
-r--r--r-- 1 4294967295 4294967295 1546530 2011-04-18 05:31 MALATAS4.IDX
-r--r--r-- 1 4294967295 4294967295 943179776 2011-04-18 05:27 MULTAK.DA1
-r--r--r-- 1 4294967295 4294967295 943138816 2011-04-18 05:29 MULTAK.DA2
-r--r--r-- 1 4294967295 4294967295 830457856 2011-04-18 05:30 MULTAK.DA3
-r--r--r-- 1 4294967295 4294967295 608137216 2011-04-18 05:30 MULTAK.DAT
-r--r--r-- 1 4294967295 4294967295 9193056 2009-07-08 05:43 SEARCH.IDX
-r--r--r-- 1 4294967295 4294967295 159880 2008-08-14 18:13 SONGREL1.BIN
-r--r--r-- 1 4294967295 4294967295 159880 2008-08-14 18:13 SONGREL2.BIN
dr-xr-xr-x 2 4294967295 4294967295 300 2011-06-29 23:38 VIDEO_TS
# ls -l AUDIO_TS/
total 0
# ls -l VIDEO_TS/
total 755466
-r--r--r-- 1 4294967295 4294967295 6144 2011-06-29 23:38 VIDEO_TS.BUP
-r--r--r-- 1 4294967295 4294967295 6144 2011-06-29 23:38 VIDEO_TS.IFO
-r--r--r-- 1 4294967295 4294967295 34816 2011-06-29 23:38 VTS_01_0.BUP
-r--r--r-- 1 4294967295 4294967295 34816 2011-06-29 23:38 VTS_01_0.IFO
-r--r--r-- 1 4294967295 4294967295 773515264 2011-06-29 23:38 VTS_01_1.VO
Then, I ran Strings on the files to pull out any strings on them. Most of the disc contains songs in Chinese, but there are enough bands and song titles in English that Strings is still helpful.
F6838.IDX seems to be an index into the songs. At the beginning is a header.
Multak MIDI Ver 4.082009-5-25
Then, a list of band names are found.
TANK
BEYOND
F.I.R.
S.H.E
BEYOND
F.I.R.
S.H.E
TANK
LOGOPP
Then, interestingly, some scrambled English words, made by shoving ASCII values into integers and saving them in the wrong endian.
GEPMrts maeocne dedU ybE BCdocn( regepmcne_)edo.1v o b5uT naM e81 y:01 0:3002 8
Decoder:
a = "GEPMrts maeocne dedU ybE BCdocn( regepmcne_)edo.1v o b5uT naM e81 y:01 0:3002 8";
b = "";for(var i = 0; i < a.length; i+=4) { b = b + a.substring(i, i+4).split("").reverse().join("");}; b;
Result:
"MPEG stream encoded by UCB Encoder (mpeg_encode) v1.5b on Tue May 18 10:03:08 20"
SONGREL1.BIN seems to be a file made up of song records in the format int32:int32. Both ints are little endian and increases as you go down the file. I assume the second int points to another record in another file.
00000000 03 00 00 00 D5 06 00 00 04 00 00 00 3A 0D 00 00 ............:...
00000010 05 00 00 00 7E 20 00 00 06 00 00 00 30 18 00 00 ....~ ......0...
00000020 07 00 00 00 41 16 00 00 09 00 00 00 15 00 00 00 ....A...........
00000030 0A 00 00 00 31 18 00 00 0C 00 00 00 17 00 00 00 ....1...........
00000040 11 00 00 00 3F 0D 00 00 12 00 00 00 21 00 00 00 ....?.......!...
00000050 13 00 00 00 AD 00 00 00 14 00 00 00 23 00 00 00 ............#...
00000060 15 00 00 00 26 00 00 00 16 00 00 00 48 0D 00 00 ....&.......H...
00000070 18 00 00 00 B3 00 00 00 19 00 00 00 BB 00 00 00 ................
00000080 1A 00 00 00 05 07 00 00 1B 00 00 00 4C 0D 00 00 ............L...
00000090 1C 00 00 00 2D 00 00 00 1D 00 00 00 08 0A 00 00 ....-...........
000000A0 1E 00 00 00 CF 00 00 00 1F 00 00 00 11 07 00 00 ................
000000B0 20 00 00 00 D1 00 00 00 21 00 00 00 18 07 00 00 .......!.......
000000C0 22 00 00 00 19 07 00 00 23 00 00 00 3D 00 00 00 ".......#...=...
000000D0 24 00 00 00 3F 00 00 00 26 00 00 00 4D 00 00 00 $...?...&...M...
000000E0 29 00 00 00 52 00 00 00 2A 00 00 00 58 00 00 00 )...R...*...X...
000000F0 2B 00 00 00 5C 00 00 00 2C 00 00 00 61 00 00 00 +...\...,...a...
00000100 2D 00 00 00 62 00 00 00 30 00 00 00 7A 00 00 00 -...b...0...z...
00000110 31 00 00 00 7B 00 00 00 37 00 00 00 DF 00 00 00 1...{...7.......
00000120 3A 00 00 00 E4 00 00 00 3C 00 00 00 EA 00 00 00 :.......<.......
00000130 3D 00 00 00 EF 00 00 00 3E 00 00 00 F0 00 00 00 =.......>.......
00000140 45 00 00 00 01 01 00 00 46 00 00 00 07 01 00 00 E.......F.......
00000150 47 00 00 00 09 01 00 00 48 00 00 00 0A 01 00 00 G.......H.......
00000160 4A 00 00 00 10 01 00 00 4B 00 00 00 1B 01 00 00 J.......K.......
And the same information, in big-endian format, is duplicated in SONGREL2.BIN. (?!)
00000000 00 00 00 03 00 00 06 D5 00 00 00 04 00 00 0D 3A ...............:
00000010 00 00 00 05 00 00 20 7E 00 00 00 06 00 00 18 30 ...... ~.......0
00000020 00 00 00 07 00 00 16 41 00 00 00 09 00 00 00 15 .......A........
00000030 00 00 00 0A 00 00 18 31 00 00 00 0C 00 00 00 17 .......1........
00000040 00 00 00 11 00 00 0D 3F 00 00 00 12 00 00 00 21 .......?.......!
00000050 00 00 00 13 00 00 00 AD 00 00 00 14 00 00 00 23 ...............#
00000060 00 00 00 15 00 00 00 26 00 00 00 16 00 00 0D 48 .......&.......H
00000070 00 00 00 18 00 00 00 B3 00 00 00 19 00 00 00 BB ................
00000080 00 00 00 1A 00 00 07 05 00 00 00 1B 00 00 0D 4C ...............L
00000090 00 00 00 1C 00 00 00 2D 00 00 00 1D 00 00 0A 08 .......-........
000000A0 00 00 00 1E 00 00 00 CF 00 00 00 1F 00 00 07 11 ................
000000B0 00 00 00 20 00 00 00 D1 00 00 00 21 00 00 07 18 ... .......!....
000000C0 00 00 00 22 00 00 07 19 00 00 00 23 00 00 00 3D ...".......#...=
000000D0 00 00 00 24 00 00 00 3F 00 00 00 26 00 00 00 4D ...$...?...&...M
000000E0 00 00 00 29 00 00 00 52 00 00 00 2A 00 00 00 58 ...)...R...*...X
000000F0 00 00 00 2B 00 00 00 5C 00 00 00 2C 00 00 00 61 ...+...\...,...a
00000100 00 00 00 2D 00 00 00 62 00 00 00 30 00 00 00 7A ...-...b...0...z
00000110 00 00 00 31 00 00 00 7B 00 00 00 37 00 00 00 DF ...1...{...7....
00000120 00 00 00 3A 00 00 00 E4 00 00 00 3C 00 00 00 EA ...:.......<....
00000130 00 00 00 3D 00 00 00 EF 00 00 00 3E 00 00 00 F0 ...=.......>....
00000140 00 00 00 45 00 00 01 01 00 00 00 46 00 00 01 07 ...E.......F....
00000150 00 00 00 47 00 00 01 09 00 00 00 48 00 00 01 0A ...G.......H....
00000160 00 00 00 4A 00 00 01 10 00 00 00 4B 00 00 01 1B ...J.......K....
MALATAM2.INF and MALATAM3.INF are identical.
The video background for the songs are stored like a normal DVD. It would probably play that part in a normal DVD player.
MULTAK.DA1 contains the string "LAME3.88 (beta)", suggesting that it contains MP3s concatenated together. I used dd to cut out a part of the file and it played in a MP3 player. I fed the file into ffplay and it played, skipping multiple times.
[mp3 @ 0x1f613c0]mdb:7, lastbuf:0 skipping granule 0
Last message repeated 1 times
[mp3 @ 0x1f613c0]mdb:464, lastbuf:458 skipping granule 0
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -4 enddists: -3 -3
[mp3 @ 0x1f613c0]overread, skip -6 enddists: -2 -2
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -6 -6
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -3 -3
[mp3 @ 0x1f613c0]mdb:453, lastbuf:428 skipping granule 0
[mp3 @ 0x1f613c0]overread, skip -9 enddists: -3 -3
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -6 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -5 -5
[mp3 @ 0x1f613c0]overread, skip -8 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -1 -1
Last message repeated 1 times
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -3 -3
[mp3 @ 0x1f613c0]overread, skip -9 enddists: -3 -3
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -2 -2
[mp3 @ 0x1f613c0]mdb:462, lastbuf:270 skipping granule 0
[mp3 @ 0x1f613c0]mdb:462, lastbuf:270 skipping granule 1
[mp3 @ 0x1f613c0]mdb:461, lastbuf:393 skipping granule 0
[mp3 @ 0x1f613c0]mdb:461, lastbuf:393 skipping granule 1
[mp3 @ 0x1f613c0]overread, skip -6 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -2 -2
[mp3 @ 0x1f613c0]overread, skip -9 enddists: -3 -3
[mp3 @ 0x1f613c0]mdb:469, lastbuf:467 skipping granule 0
[mp3 @ 0x1f613c0]overread, skip -10 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -3 -3
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -2 -2
[mp3 @ 0x1f613c0]mdb:424, lastbuf:414 skipping granule 0
[mp3 @ 0x1f613c0]overread, skip -4 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -5 -5
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -8 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -9 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -1 -1
[mp3 @ 0x1f613c0]overread, skip -9 enddists: -7 -7
[mp3 @ 0x1f613c0]overread, skip -5 enddists: -3 -3
Last message repeated 1 times
[mp3 @ 0x1f613c0]overread, skip -7 enddists: -4 -4
[mp3 @ 0x1f613c0]overread, skip -10 enddists: -1 -1
were some of the errors that it printed.
The other MULTAK files also contain MP3 streams and can also be played in ffplay.
I wrote a quick byteswap script for decoding F6838.idx. It borrows the concat function from nodecraft.
var buf= new Buffer(0); process.stdin.on("data", function(data) { buf = concat(buf, data); }); process.stdin.on("end", function() { dotheprocess(); }); process.stdin.resume(); function dotheprocess() { var newbuf = new Buffer(buf.length); for(var i = 0; i < buf.length; i+=4) { newbuf.writeUInt32BE(buf.readUInt32LE(i), i); } process.stdout.write(newbuf); } function concat(buf1, buf2) { var buf = new Buffer(buf1.length + buf2.length); buf1.copy(buf, 0, 0); buf2.copy(buf, buf1.length, 0); return buf; }
Running the output through ffplay reveals some menu screens.