Byte型の配列を引数に指定するには、引数を何型にして置けばいいんでしょうか?
バリアント型でならいいんですけど、そうするとその配列を引数にして、他の関数を実行できないんです。
リファレンスには、ParamArray 〜〜というのがあるけど、それもなぜか使えないし、記述がおかしいのかな…。
質問の意味がよくわからないのですが、
byte配列を素直にbyte配列で渡しては
まずいのですか?
たとえば
Sub disparray(a() As Byte)
Dim i As Long
For i = 0 To 100
List1.AddItem a(i)
Next
End Sub
Private Sub Command1_Click()
Dim i As Long
Dim a(100) As Byte
For i = 0 To 100
a(i) = i * 2
Next
Call disparray(a())
End Sub
とかやるだけでいいと思うのですが・・・
ごめんなさい^^;引数()の"()"を忘れてました^^;
ところで、それを使って、こんな関数を作ったんですけど、
みょうに重いんです。
どこかで見つけた、MIDIデータタイトル取得のモジュールでは、1秒もかからないのに…。
Public Function inbit(start As Long, bytecode() As Byte, search As String, Optional Searchend As Long = -1) As Long
Dim i As Long, Leng As Integer, b As Integer
On Error GoTo 2
i = start
Leng = Len(search)
1 Do
If Searchend <> -1 And Searchend <= i Then Exit Do
If bytecode(i) = "&H" & Mid(search, 1, 2) Then
For b = 2 To Leng / 2
If "&H" & Mid(search, b + (b - 1), 2) <> bytecode(i + (b - 1)) Then _
i = i + 1: GoTo 1
If b = Leng / 2 Then inbit = i
Next
End If
i = i + 1
Loop
2
End Function
たとえば、MIDIの楽譜にむかって"00FF0316"を検索すると、
22あたりが返ってきます。
検索文字列が長すぎなのかなぁ…。
文字列型っていうのが一番の問題でしょう。
また、ループ内に関数や数式が多すぎます。
bytecode関数がどの程度の規模なのかはりりませんが・・・。
検索するものを文字列で指定するにしても
ループ内部で変換していては、遅いのは当然では?
変数に待避するなどするべきでしょう。
また、このぐらいの処理ではたいしたことも無いと思いますが
配列等で大量にメモリを消費する場合以外は
Long型を使用した方がより高速になります。
>bytecode関数がどの程度の規模なのかはりりませんが・・・。
bytecode()は引数ですよ。
MIDIデータの場合、だいたい100000くらいですね。
でも、検索では使わないので、あんまり意味ないです。
それにしても…。
サンプル内では、文字列で検索してると思うんですけど…。
if data(a+c)=&HFF Then という節がありましたけど、
これは最初から数値…?
とにかく、文字列を数値型配列22文字ずつ入れておいたほうがいいみたいですね。
> bytecode()は引数ですよ。
すいません、うっかり。
っていうか、掲示板だとコードが字下げされなくて
見にくいんですよね・・・。
(いいわけ)
所で、サンプルってどのサンプルなんでしょうか???
&HFFってのは16進表記で記載されている数値です。
文字列の値であるなら必ず「"」で囲む必要があるので。
所で、22文字ってのは何なんでしょう?
上限が22文字ってことでしょうか???
>所で、22文字ってのは何なんでしょう?
>上限が22文字ってことでしょうか???
MIDIでは、恐らくだいたい、"00FF0316"は22文字あたりに来ると思います。
まだあまり理解していないのでどうとも言えませんけど、
これは第一トラックのタイトル(曲名)のはじまりをあらわすからです。
まあ、まさか曲の途中に書くこともないと思うので…^^;
ところで数値扱いなんですか。(やっぱり)
サンプルというのは…。まあ、サンプル内にURLが書いてなかったのでわからないんです。
たしかどこか…。VBRingかそのほかの場所…?
MIDIデータをバイナリで開いて、曲名のところを調べ、そこから閉じるまでの文章を返すものです。
>っていうか、掲示板だとコードが字下げされなくて
>見にくいんですよね・・・。
>(いいわけ)
初心者掲示板では、こういうことしてもだいじょうぶ(らしい)のに…。
同じ掲示板使ってるのに…。
空白を置換えて消してると思うけど、CGIからその部分を消せば…。
やってみたところ、すごく早くなりました。ありがとうございます。
ところで、あとは文字列変換ですけど、
Public Function AsString(bytecode As String) As String
Dim i As Long, bit() As Byte
ReDim bit(Len(bytecode) / 2)
For i = 1 To Len(bytecode) / 2
bit(i) = "&H" & Mid(bytecode, (i + i - 1), 2)
Next
AsString = StrConv(bit, vbUnicode)
End Function
としてみたら、からの文字列しか返ってきませんでした。
引数には、同じMIDIファイルの26バイト目から22バイト分をあつめて、Hexs(Hexのテーブル化したもの)で文字列にしたものです。
vbFromUnicodeを使ったら、ヘンな文字が返ってきたので、
失敗して空っぽの文字列になったというわけではないようです。けど…。
検索というか、フォーマット調べて正確にやるのを
お薦めしますが・・・・。
00FF0316って
メタイベントのシーケンス名やトラック名を示す
コードのことでしょうか。
別に最初にくるとは限らないはずですよ。
コメント等、文字列データを含むメタイベントも他にありますし。
まぁ、適当でいいって言うなら別にいいんですが・・・。
んで、変換関数ですがiが1なのはいいんでしょうか?
配列が1から始まる宣言(名前忘れた・・・)を使ってますよね?
使ってないと、最初が0になってNULLになりそうですが。
>配列が1から始まる宣言(名前忘れた・・・)
Option Base 1
のことですね
>んで、変換関数ですがiが1なのはいいんでしょうか?
忘れてました^^;
…で、でも、先頭文字がナル文字(ほんとはヌル文字って読むのは知ってます)になっちゃうんですけど。
あれはもう、当然と思っていいんでしょうか?
(同関数で、bytes(bytecode,0,4)とした場合、"・MThd"になりました、bytesは前に書きこんだとおりの、寄せ集めて文字列にする関数です)
>00FF0316って
>メタイベントのシーケンス名やトラック名を示す
>コードのことでしょうか。
そうですけど、どうやらちがいますね、
00FFまでは固定だけど、0316はデータ長のようです。
最後が00FFというのは決まってるらしいですけど。
ところで、これって仕様書とまったく違うんですけど…。
00FFって、たしかフォーマット0や1にはないような…。
理解のし方が悪いんでしょうか?
こうなったら自分で解釈しちゃったほうがいいのかな…。
>まぁ、適当でいいって言うなら別にいいんですが・・・。
てきとうでいいです。歌詞とSTOPイベント以外は。たぶん。
リアルタイムで歌詞表示は、ちょっと当分ムリかも。
理解のし方が悪いんですね^^;
OOFF02で、FF02だけとってが正解ですね。
データ長の文字列削除は、何とか成功しました。
Asciiコードで13以下だったら、それを消す関数です。
というわけで解決ということにします。
ありがとうございました。
あとはMIDIの読み取りですね
わすれた^^;
ツイート | ![]() |