#!/usr/bin/gawk -f BEGIN { if (ARGC < 3 || ((ARGV[1] == "-c" || ARGV[1] == "--clear") && ARGC < 4)) { print "copy-to-h205.awk ver. 0.02" print "Params : [-c|--clear] " exit(1) } asc_font = "a12.bdf" knj_font = "k12.bdf" height = 12 asc_w = 6 knj_w = 12 asc_byte_w = 8 knj_byte_w = 16 ptn[ 0] = 0x04 ptn[ 1] = 0x08 ptn[ 2] = 0x10 ptn[ 3] = 0x20 ptn[ 4] = 0x40 ptn[ 5] = 0x80 ptn[ 6] = 0x01 ptn[ 7] = 0x02 ptn[ 8] = 0x04 ptn[ 9] = 0x08 ptn[10] = 0x10 ptn[11] = 0x20 half_limit = 6 conv = " | nkf -s " conv_e = " | nkf -e " target = ARGV[ARGC - 1] print "target dir is " target start = 1 if (ARGV[1] == "-c" || ARGV[1] == "--clear") { system("/bin/rm " target "/h2.pl") system("/bin/rm -rf " target "/music/") system("/bin/rm -rf " target "/info/") start = 2 } if (system("test -d " target "/info")) { system("/bin/mkdir " target "/info") } if (system("test -d " target "/music")) { system("/bin/mkdir " target "/music") } create_ord() no = 0 # h2.plの読み込み。 if (!system("test -e " target "/h2.pl")) { getline < (target "/h2.pl") while ((getline < (target "/h2.pl")) > 0) { mp3names[no++] = $0 } close(target "/h2.pl") } $0 = "0000" while (("ls -1 " target "/info/????.mp3 2> /dev/null" | getline) > 0) { } close("ls -1 " target "/info/????.mp3 2> /dev/null") target_no = (substr($0, length(target "/info/") + 1, 2) + 1) * 100 + 1 for (i = start ; i < ARGC - 1 ; i++) { mp3name = ARGV[i] gsub(/^.*\//, "", mp3name) target_name = target_no "" if (length(target_name) == 3) { target_name = "0" target_name } mp3names[no] = target_name = target_name ".mp3" print mp3name " -> " target_name system("/bin/cp " ARGV[i] " " target "/music/" target_name) "/bin/ls -l " ARGV[i] | getline size = $5 close("ls -l " ARGV[i]) "mp3info -p \"%S %Q %r\" " ARGV[i] | getline timelen = $1 bps = int(size / timelen) freq = $2 rate = $3 * 1000 close("mp3info -p \"%S %Q %r\" " ARGV[i]) clear_buffer() # 0008 1秒あたりのバイト数 buf[0x0008] = bps % 0x100 buf[0x0009] = int(bps / 0x100) # 000a 秒数 buf[0x000a] = timelen % 0x100 buf[0x000b] = int(timelen / 0x100 % 0x100) buf[0x000c] = int(timelen / 0x10000 % 0x100) buf[0x000d] = int(timelen / 0x1000000) # 0044 サンプリング周波数 buf[0x0044] = freq % 0x100 buf[0x0045] = int(freq / 0x100 % 0x100) buf[0x0046] = int(freq / 0x10000 % 0x100) buf[0x0047] = int(freq / 0x1000000) # 0048 ビットレート buf[0x0048] = rate % 0x100 buf[0x0049] = int(rate / 0x100 % 0x100) buf[0x004a] = int(rate / 0x10000 % 0x100) buf[0x004b] = int(rate / 0x1000000) # 00c0 - 010f 曲名 "mp3info -p \"%t\" " ARGV[i] conv | getline title close("mp3info -p \"%t\" " ARGV[i] conv) "mp3info -p \"%t\" " ARGV[i] conv_e | getline title_e close("mp3info -p \"%t\" " ARGV[i] conv_e) set_str(0x00c0, title) # 0110 - 015f アーティスト "mp3info -p \"%a\" " ARGV[i] conv | getline artist close("mp3info -p \"%a\" " ARGV[i] conv) # "mp3info -p \"%a\" " ARGV[i] conv_e | getline artist_e # close("mp3info -p \"%a\" " ARGV[i] conv_e) set_str(0x0110, artist) # 0160 - 01af アルバム "mp3info -p \"%l\" " ARGV[i] conv | getline album close("mp3info -p \"%l\" " ARGV[i] conv) # "mp3info -p \"%l\" " ARGV[i] conv_e | getline album_e # close("mp3info -p \"%l\" " ARGV[i] conv_e) set_str(0x0160, album) # 01b0 - 01ff コメント "mp3info -p \"%c\" " ARGV[i] conv | getline comment close("mp3info -p \"%c\" " ARGV[i] conv) # "mp3info -p \"%c\" " ARGV[i] conv_e | getline comment_e # close("mp3info -p \"%c\" " ARGV[i] conv_e) set_str(0x01b0, comment) if (title_e == "") { # id3タグに曲名情報がなければファイル名を使う。 # ファイル名がsjisの場合どうしよう。 s = mp3name sub(/\.mp3$/, "", s) create_display_data(s) } else { create_display_data(title_e) } # infoファイルの書き出し printf "" > target "/info/" target_name for (j = 0 ; j < 0x0400 ; j++) { printf("%c", buf[j]) >> target "/info/" target_name } close(target "/info/" target_name) system("sync") no++ target_no++ } # h2.plの書き込み printf("%d\n", no) > target "/h2.pl" for (i = 0 ; i < no ; i++) { printf("%s\n", toupper(mp3names[i])) >> target "/h2.pl" } system("sync") exit } function clear_buffer( i) { for (i = 0 ; i < 0x400 ; i++) { buf[i] = 0 } # 0000 buf[0x0000] = 0x00 buf[0x0001] = 0x01 # 0002 buf[0x0002] = 0x00 buf[0x0003] = 0x00 # 0006 buf[0x0006] = 0x10 buf[0x0007] = 0x00 # 0040 buf[0x0040] = 0x01 buf[0x0041] = 0x03 buf[0x0042] = 0x02 buf[0x0043] = 0x00 } # 文字列 str を buf[pos] から書き込む。 function set_str(pos, str, i) { for (i = 0 ; i < length(str) ; i++) { buf[pos + i] = substr(str, i + 1, 1) } } # 文字コードテーブルを作る。 function create_ord( i) { for (i = 0 ; i < 256 ; i++) { ord[sprintf("%c", i)] = i } } # 表示用のデータ(フォントデータ)を作る。 # 文字列はEUC。 function create_display_data(str, i, l, l2, c, c2, p1, p2, r) { l = length(str) l2 = l * asc_w if (l2 > 0xff) { l2 = 0xff } # 0004 液晶表示データの長さ buf[0x0004] = l2 % 0x100 buf[0x0005] = int(l2 / 0x100) p1 = 0x200 p2 = 0x200 + l2 for (i = 0 ; i < l ; i++) { c = ord[substr(str, i + 1, 1)] if (c < 0x80) { # msb が立ってなければ ascii。 set_font(c, asc_font, asc_byte_w, p1, p2, 0x200 + l2, 0x200 + l2 * 2) p1 += asc_w p2 += asc_w } else { # 立ってれば euc。 if (i == l - 1) { # 最後。2バイト目はなし。 return } i++ c2 = c * 0x100 + ord[substr(str, i + 1, 1)] - 0x8080 set_font(c2, knj_font, knj_byte_w, p1, p2, 0x200 + l2, 0x200 + l2 * 2) p1 += knj_w p2 += knj_w } if (p1 > 0x200 + l2) { return } } } # フォントデータをセットする。 function set_font(c, font, width, p1, p2, limit1, limit2, i, l, n, p, lim) { scan_font(c, font) l = 0 # 0 - 13 while ((getline < font) > 0) { if ($0 == "ENDCHAR") { break } if (l < half_limit) { p = p1 lim = limit1 } else { p = p2 lim = limit2 } n = hex2num($0) for (i = 0 ; i < width ; i++) { if ((n % 2) && (p + width - 1 - i < lim)) { buf[p + width - 1 - i] += ptn[l] } n = int(n / 2) } l++ if (l >= height) { break } } close(font) } function scan_font(c, font) { while ((getline < font) > 0) { if ($1 == "ENCODING" && $2 == c) { break } } while ((getline < font) > 0) { if ($0 == "BITMAP") { break } } } function hex2num(s, i, n) { n = 0 for (i = 0 ; i < length(s) ; i++) { n = n * 0x10 + index("123456789ABCDEF", substr(s, i + 1, 1)) } return n }