
No.3ベストアンサー
- 回答日時:
サンプル作ってみました。
ID3=MP3のタグ情報と勝手に思って作ってます。
やはり、MP3のファイル末尾の128バイトに情報が入っているようです。
そのタグの中身は
TAG [文字列 3BYTE "TAG"で固定]
TRACK NAME トラック名 [文字列 30BYTE]
AIRTIST NAME アーティスト名 [文字列 30BYTE]
ALUBM NAME アルバム名 [文字列 30BYTE]
YEAR リリース年号 [文字列 4BYTE]
COMMENT コメント [文字列 30BYTE] (ID3 Tag v1.1 では 28BYTE)
GENRE ジャンル番号 [数値 0~255]
です。
サンプルのソースはエラーチェックを入れてませんので、ジャンル番号に文字列や大きな数字を入れたらバグると思います。それと、直接そのファイルを操作するのではなく、タグを読み取り、新たなタグ情報をもったファイルを作成する仕組みになってます。擬似的に作成して、ファイルをコピーしたら、元のファイルを操作したように見えるので、そこら辺は適当に扱ってください。
サンプルに必要なもの
フォーム
コマンドボタン1と2
ラベル1~6
テキストボックス1~6
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long _
)
Private Const testFile1 As String = "C:\1.mp3" '元となるファイル
Private Const testFile2 As String = "C:\2.mp3" '作成されるファイル
Private Const AREA_TAG As Long = 128 'タグの領域は128バイト
Private lngFileSize As Long 'ファイルサイズ
Private fileBuf() As Byte '読み込みバッファ
Private Sub Command1_Click()
Dim lngFile As Long 'ファイルナンバ
Dim tagBuf() As Byte 'タグ情報
'ファイル操作の初期化
Reset
'ファイルサイズを取得
lngFileSize = FileLen(testFile1)
'読み込みバッファの領域確保
ReDim fileBuf(lngFileSize - 1) As Byte
'バッファを取得
lngFile = FreeFile
Open testFile1 For Binary As #lngFile
Get #lngFile, , fileBuf
Close #lngFile
'タグエリアの領域確保
ReDim tagBuf(AREA_TAG - 1) As Byte
'バッファからタグ情報のみ取得
Call copyAry(tagBuf(0), fileBuf(lngFileSize - AREA_TAG), AREA_TAG)
With Me
'TRACK NAME を取得(3バイト目から30バイト)
.Text1.Text = getStringforUniByte(tagBuf, 4, 30)
'AIRTIST NAME を取得(34バイト目から30バイト)
.Text2.Text = getStringforUniByte(tagBuf, 34, 30)
'ALUBM NAME を取得(64バイト目から30バイト)
.Text3.Text = getStringforUniByte(tagBuf, 64, 30)
'YEAR を取得(94バイト目から4バイト)
.Text4.Text = getStringforUniByte(tagBuf, 94, 4)
'COMMENT を取得(98バイト目から30バイト)
.Text5.Text = getStringforUniByte(tagBuf, 98, 30)
'GENRE を取得(128バイト目の値)
.Text6.Text = tagBuf(128 - 1)
End With
End Sub
Private Sub Command2_Click()
Dim lngFile As Long 'ファイルナンバ
Dim tagBuf() As Byte 'タグ情報
Dim wkStr As String 'ワークの文字列
Dim setStr As String '実際に収納する文字列
'ファイル操作の初期化
Reset
With Me
'お決まりの部分です
setStr = "TAG"
'TRACK NAME を取得
wkStr = fixStr_setNullChar(.Text1.Text, 30)
setStr = setStr & wkStr
'AIRTIST NAME を取得
wkStr = fixStr_setNullChar(.Text2.Text, 30)
setStr = setStr & wkStr
'ALUBM NAME を取得
wkStr = fixStr_setNullChar(.Text3.Text, 30)
setStr = setStr & wkStr
'YEAR を取得
wkStr = fixStr_setNullChar(.Text4.Text, 4)
setStr = setStr & wkStr
'COMMENT を取得
wkStr = fixStr_setNullChar(.Text5.Text, 30)
setStr = setStr & wkStr
'ここまでの文字列をFormUnicodeに変換
setStr = StrConv(setStr, vbFromUnicode)
'バッファにセット(この情報をセットすると、tagBufは127バイトの領域を持つ)
tagBuf = setStr
'GENRE を取得
wkStr = .Text6.Text
'GENRE の情報は末尾のバイト目にそのまま値をセット
ReDim Preserve tagBuf(AREA_TAG - 1) As Byte
tagBuf(AREA_TAG - 1) = wkStr
End With
'バッファにタグ情報をセット
Call copyAry(fileBuf(lngFileSize - AREA_TAG), tagBuf(0), AREA_TAG)
'新たなタグ情報をもったファイルを作成する
lngFile = FreeFile
Open testFile2 For Binary As #lngFile
'バッファ取得
Put #lngFile, , fileBuf
Close #lngFile
End Sub
Private Sub Form_Load()
With Me
'各コントロールの初期化
.Command1.Caption = "取得"
.Command2.Caption = "更新"
.Label1.Caption = "TRACK NAME"
.Label2.Caption = "AIRTIST NAME"
.Label3.Caption = "ALUBM NAME"
.Label4.Caption = "YEAR"
.Label5.Caption = "COMMENT"
.Label6.Caption = "GENRE"
.Text1.Text = ""
.Text2.Text = ""
.Text3.Text = ""
.Text4.Text = ""
.Text5.Text = ""
.Text6.Text = ""
'一応最長文字数を指定しておきますが、あくまで半角での文字数です。全角文字は無理です。
.Text1.MaxLength = 30
.Text2.MaxLength = 30
.Text3.MaxLength = 30
.Text4.MaxLength = 4
.Text5.MaxLength = 30
.Text6.MaxLength = 3 'ここは0~255です
End With
End Sub
'配列の中身をエリアの分だけコピーする関数
Private Sub copyAry(inDest As Byte, inSrc As Byte, inArea As Long)
Call CopyMemory(inDest, ByVal VarPtr(inSrc), ByVal LenB(inSrc) * inArea)
End Sub
'バイトで納められたUNICODE文字列を指定位置から、指定の長さを取得する関数
Private Function getStringforUniByte(inByte() As Byte, inStartPos As Long, inLength As Long) As String
Dim wkBuf() As Byte 'ワークのバッファ
Dim wkStr As String 'ワークの文字列
Dim lngFindNull As Long 'vbNullChar を見つけるときのワーク
ReDim wkBuf(inLength - 1) As Byte
'指定範囲の文字列を得る
Call copyAry(wkBuf(0), inByte(inStartPos - 1), inLength)
wkStr = StrConv(wkBuf, vbUnicode)
'文字列にvbNullCharが含まれている時、それをはずす
lngFindNull = InStr(1, wkStr, vbNullChar)
If lngFindNull > 0 Then
wkStr = Mid(wkStr, 1, lngFindNull - 1)
End If
'戻りの文字列セット
getStringforUniByte = wkStr
End Function
'文字数をvbNullCharで調整して返す関数
Private Function fixStr_setNullChar(inStrings As String, inLength As Long) As String
Dim wkStr As String 'ワークの文字列
'引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
wkStr = inStrings & String(30, vbNullChar)
'FromUnicodeに変換
wkStr = StrConv(wkStr, vbFromUnicode)
'左からinLength分の文字を取得
wkStr = LeftB(wkStr, inLength)
'Unicodeに変換して返す
fixStr_setNullChar = StrConv(wkStr, vbUnicode)
End Function
参考URL:http://www.angel.ne.jp/~mike/about_mp3/id3_v1.html
こんな立派なサンプルを作っていただき,ありがとうございます。
之でID3をいじる部分は完成しました。
多分完成したら,ベクターに飾るので,よかったら,見にきてください(11月終わりごろだと思います)
MP3スタジオという名前です
No.4
- 回答日時:
何度もすいません。
自己レスです。。。'引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
wkStr = inStrings & String(30, vbNullChar)
っていうのが最後の方にあるんですが、
'引数の文字列に、引数の長さの分だけのvbNullCharを追加して一時記憶
wkStr = inStrings & String(inLength, vbNullChar)
に修正してください。
30→inLength です。
No.2
- 回答日時:
ID3タグっていうのはMPEGとかの情報ですか?
もしそうなら、ファイル末尾の128バイトという情報がありました。
もうちょっと調査が必要です。
もう少し調べてみますが、ほかに詳しい人がいたらお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- WordPress(ワードプレス) ワードプレスで、投稿一覧ページにタグを表示する方法 投稿につけたタグを、記事一覧ページにもカテゴリと 1 2023/05/10 21:41
- HTML・CSS HPに文章で改行はすべてBRタグとかで改行しなきゃだめなのですか?改行が活きたまま書く方法ないの? 1 2022/12/03 21:00
- PHP PHPの変わった閉じタグの必要性と意味を教えてください。 1 2022/08/28 15:15
- メンズ 同じようなTシャツの区別 1 2023/03/14 15:58
- メンズ 同じようなデザインの半そでTシャツと長袖Tシャツがあります。 1 2022/09/21 11:32
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- PHP PHP・Wordpress preg_replaceを条件分岐で処理させる方法が知りたい 1 2023/05/01 14:25
- その他(開発・運用・管理) 動画をダウンロードできないようにする方法について 4 2022/11/18 15:12
- ハッキング・フィッシング詐欺 webサイトでIPアドレスを抜く方法を聞きたいです。 1 2022/06/09 17:33
- Visual Basic(VBA) VBでExcelの表形式の様なデザインを作りDBと連携させる。 4 2023/02/28 11:39
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
Excel VBAでmp3ファイルプロパティ書換え
その他(Microsoft Office)
-
コマンドボタンがあるかどうかを取得するには?
PowerPoint(パワーポイント)
-
mp3の音楽ファイルの「アルバム」名を一括入力する方法
画像編集・動画編集・音楽編集
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
ファイル名の一部削除について
-
機種依存文字と特殊文字について
-
VB6.0 文字列のファイル書...
-
エクセルで13,410円を数値の134...
-
「シフトJIS X 0213」形式の文...
-
VB.NET ListBox内の前方一致で...
-
文字の並び替え
-
文字列から、null値を除去する方法
-
urlencodeがうまくいかない
-
アクセス ステータスバーの文...
-
一番右のスペース以降の文字列...
-
TextFieldParserの固定長桁数を...
-
VBA 変数名に変数を使用したい。
-
エクセルでXY座標に並べられた...
-
C# DataTableに最後に追加した...
-
『列名 '担当者CD' があいま...
-
accessでフィールド追加のあと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
一番右のスペース以降の文字列...
-
ファイル名の一部削除について
-
TextFieldParserの固定長桁数を...
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
文字列から、null値を除去する方法
-
機種依存文字と特殊文字について
-
アクセス ステータスバーの文...
-
マルチバイト混在の文字列整形
-
ASC関数
-
WSTRINGとは?
-
全角文字と半角文字を判別して...
-
「シフトJIS X 0213」形式の文...
-
エクセルで13,410円を数値の134...
-
Access VBAの参照設定(DAO)につ...
-
HEX
-
VB6のテキストボックスに入力し...
-
【Excel VBA】セル内テキストの...
-
C言語とWin32APIで全角かなの...
おすすめ情報