WAVEを内蔵するには?

解決


α  2001-05-25 21:59:53  No: 74366  IP: [192.*.*.*]

久しぶりの投稿です。
今作っているソフトはWAVEを使用しますが
たまにWAVEを改造する人間が現れます。

これを防ぐために、WAVEを内蔵したいのですが
できますか?

編集    削除
たかみちえ  2001-05-25 23:03:20  No: 74367  IP: [192.*.*.*]

>  これを防ぐために、WAVEを内蔵したいのですが
>  できますか?
  えっと、MSDNで見つけたんですけど、
WAVEはリソースに含むものの中では、けっこう標準らしいですねぇ。
"拡張子.wavを取り出します"って、堂々と書いてありますから、たぶんできるでしょうね。

  で、そのやり方なんですけど、わかんないんです^^;
あ、でも知ってる人がいそうですね。

  そうそう、これはめちゃくちゃでおすすめできませんけど、
WAVEの変わりにMIDIを使う方法もあります。
MIDIOutShortMsgなどを使って…。

編集    削除
α  2001-05-26 04:14:44  No: 74368  IP: [192.*.*.*]

MIDI音源つかわないけないから
無理ですね

編集    削除
α  2001-05-26 23:07:49  No: 74369  IP: [192.*.*.*]

BMPはPictureBoxとかでできるんだから
WAVEもそういう物があるといいんですがねぇ・・・

編集    削除
たかみちえ  2001-05-27 03:30:14  No: 74370  IP: [192.*.*.*]

えっと…。わたしも入れ方を知らないわけじゃない…かもしれません。

とりあえず、リソースエディタで、カスタムリソースとして、wavファイルをいれて…。
それからどうやって読めばいいんだろうですねぇ^^;
じかにsndplaysound ID,定数
って言うわけでもなさそうだし…。
(その前に何かやるような、そんなことが書いてあったりしたような、なかったような…)

編集    削除
こころ  URL  2001-05-27 09:41:18  No: 74371  IP: [192.*.*.*]

外部リソースの参照はそれ用にAPIが用意されています。
こころ自身も外部リソースを参照するモジュールを公開してます。
また、リソースの抜き出しソフトも多数出回ってますよ。
これを防ぐには暗号化等で対処するしかありません。
または、特定の箇所をデータチェックし
勝手に改造された場合はアプリを終了しても良いと思います。

リソースの作成自体はリソースエディタか
リソース定義ファイルを作成しrc.exeでコンパイルします。
リソースやメモリ上からの再生方法は
ここの掲示板の同じ様な質問で回答がでてましたよ。

編集    削除
こころ  URL  2001-05-27 09:49:03  No: 74372  IP: [192.*.*.*]

追記です。
連続でWAVEをスムーズにならすには?
という質問に対する答えに
リソースからの再生方法が書かれていました。

編集    削除
たかみちえ  2001-05-28 07:59:42  No: 74373  IP: [192.*.*.*]

えっ、あれだけでいいんですか?
じゃあ、sndplaysound リソースIDナンバー,MEMORYなんとか(定数^^;)
で、再生できるんですか?
それなら、MIDIで作曲して、すぐWaveが作れますね(^^ゞ

編集    削除
こころ  URL  2001-05-28 08:22:28  No: 74374  IP: [192.*.*.*]

> それなら、MIDIで作曲して、すぐWaveが作れますね(^^ゞ
???
MIDIからWAVEへの変換とは関係ないのでは・・・。
sndPlaySoundはあくまで、WAVEの再生用ですし。
midiデータを解析して、sndPlaySoundで鳴らしたとしても
合成音はsndPlaySoundでは無理でしょうから。

ちなみに、Win32環境ではPlaySoundを使った方が良いようです。
sndPlaySoundはいつか(いつだ?)廃止になるんでしょう。

編集    削除
たかみちえ  2001-05-29 01:53:09  No: 74375  IP: [192.*.*.*]

>  MIDIからWAVEへの変換とは関係ないのでは・・・。
  それはそうですけど、
まあ、これでMIDIからWaveを作って、リソースにくみこんで、
好きな音が作れるじゃあないですか^^;

>  ちなみに、Win32環境ではPlaySoundを使った方が良いようです。
  今も16bitの開発ソフトも現役だし、
前までとの互換性の保持のためにあるんだし、
ふつうの人が使うようなものではなくならないんじゃないでしょうかねぇ…。
(INIファイルに書きこむのも、以前のWindowsのAPIだし…)
WindowsXPのエンタープライズ版では、16ビットの対応を止めるらしいですけど…。安定性を得るため…。

編集    削除
α  2001-05-29 02:30:14  No: 74376  IP: [192.*.*.*]

すみませんがリソースとかは余り理解してないので、
どのようにすればよいか手順をご教授願いますか?
すみません

編集    削除
こころ  URL  2001-05-29 06:20:02  No: 74377  IP: [192.*.*.*]

> まあ、これでMIDIからWaveを作って、リソースにくみこんで、
> 好きな音が作れるじゃあないですか^^;
MIDI音源のない人にはありがたい話しですが
2、3年前にパソコン始めたこころにとっては
MIDI音源がない環境ってのが信じられなかったり。
WAVEだと容量、大きくなるは、メモり食うはで
そこまでしてMIDI音源ない人を救う必要はあるのか、って話です。

リソースエディタって付いてません?
こころはVB5のLearningEditionなのでついてませんが。
VC++でも作成可能です。
なければ、リソース定義ファイルを作成して
rc.exeでコンパイルする必要があります。

作成したリソースをプロジェクトに追加すれば
自EXEのインスタンスハンドルから
データを参照することが可能です。
VBの関数ならインスタンスハンドルは指定できませんが。

編集    削除
たかみちえ  2001-05-29 08:50:27  No: 74378  IP: [192.*.*.*]

>そこまでしてMIDI音源ない人を救う必要はあるのか、って話です。
  わたしの作っているのは、おもにMIDI音源を使うものなので、
音源を使っちゃってますから^^;
割り込みするのも難しいし、
10秒とかのMIDI譜面を、一個ずつMIDIShortOutMsgで送ってたら時間がかかるし、メンドウだし…。
MIDI譜面はリソースにくみこめない(でもやり方によっては可能?)ですからねぇ…。

編集    削除
こころ  URL  2001-05-29 10:30:41  No: 74379  IP: [192.*.*.*]

リソースはあらゆるデータを格納できます。
用は、ファイルではなくメモリ上のデータになってしまうので
そこをどうするか、ってだけの話しです。

WAVEやBITMAPは標準でリソースから使用できるような
APIが用意されていますが、MIDIには確かにないんですよね・・・。
いちいち、データ読んで、変換してメッセージ送るのは
確かに、ちょっと・・・って気もします。

こころはリソースから読み込んだMIDIデータの再生には
midiStream使ってますが、デバッグで止めると落ちるので
デバッグ時はコンパイルオプションつけて、MCIで流してます。
(ファイルにいちいち書き出して・・・)

10秒ぐらいなら確かにWaveでもいいかもしれませんね。

編集    削除
α  2001-06-02 01:32:14  No: 74380  IP: [192.*.*.*]

>リソースエディタって付いてません?

すみません。どの辺についているのでしょうか・・・
フォームの追加などの変でしょうか、
それともスタートメニューにあるのですか?
理解が甘くすみませんが、ご教授お願いします。

編集    削除
たかみちえ  2001-06-02 02:36:58  No: 74381  IP: [192.*.*.*]

"アドインマネージャ"って言うメニューがありますよね?
それを選ぶと、アドインの候補があがるので、
"リソースエディタ"にListIndex(?)をあわせ、
したのチェックボックスをオンにしたりします。
あれ、よくわからないので、実際にオンにしたりオフにしたりしてみてください、
基本的に"起動時ロード"をオンにすると、まずは使えます。
くわしくはヘルプにもちょっとあったっけ…。

  それから、アドインマネージャには、ほかにもいろいろアドインがあります。
とくにコントロールセットをフォームにはりつけるアドインとかは、
Templateフォルダから貼り付けてるので、容易に追加・改造できて、
おすすめです。
(プロフェッショナルエディションの場合)

編集    削除
α  2001-06-02 05:58:42  No: 74382  IP: [192.*.*.*]

とりあえずできました。有り難う御座います。
WAVEを追加する分はカスタムリソースの追加を選べばよいのですか?

編集    削除
α  2001-06-02 05:59:28  No: 74383  IP: [192.*.*.*]

発言にあるから
>WAVEを追加する分はカスタムリソースの追加を選べばよいのですか?
の意味はありません。

編集    削除
α  2001-06-02 06:08:35  No: 74384  IP: [192.*.*.*]

Dim Ret As Variant
    ' 重要: バイナリ サウンド データをバイト型配列 SoundBuffer に格納してから、
    ' sndPlaySound API 関数を呼び出します。
    SoundBuffer = LoadResData(ResourceId, "ATM_SOUND")
    Ret = sndPlaySound(SoundBuffer(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY)
    ' サウンドの非同期再生を行うために DoEvents 関数を呼び出します。
    DoEvents

サンプルですが、このような記述で読み込みができるのですね

編集    削除
こころ  URL  2001-06-02 13:00:35  No: 74385  IP: [192.*.*.*]

RetはByte型の動的配列でも可能です。
一応の補足。

編集    削除
α  2001-06-05 00:45:33  No: 74386  IP: [192.*.*.*]

動きました。
この質問に参加していただいた皆様ありがとうございました。

編集    削除
α  2001-06-05 00:47:29  No: 74387  IP: [192.*.*.*]

図々しいことですが、
midiの鳴らし方はどのようにすればいいのでしょうか。

編集    削除
たかみちえ  2001-06-05 03:45:46  No: 74388  IP: [192.*.*.*]

単音でならすなら(デスクトップキーボードみたいに)MidiOutShortStringと言うAPIをつかいます。
と言っても、このAPI、使い方が特殊で難しいんです。
とりあえず、自作モジュールの中からちょっとだけ。


Public Type PlayInstulment
    PeddalDown As Boolean
    inst As Long
    Velosity As Long
    PlayOn As Long
    Corlas As Long
    Revorbe As Long
    Stereo As Long
    Picchi As Long
    DeviceOn As Boolean
    Modulation As Long
End Type
Dim hMid As Long
Public ComInst As PlayInstulment

Public Sub UseInst(inst As PlayInstulment, Optional NoteOfDrm As Boolean = False)
    With inst
        If .DeviceOn = False Then Exit Sub
        midiOutShortMsg hMid, &H80 + .PlayOn * 256 + .Velosity * 256 * 256
        midiOutShortMsg hMid, &H89 + .PlayOn * 256 + .Velosity * 256 * 256
        If NoteOfDrm = False Then
            midiOutShortMsg hMid, &HE0 + .Picchi * 256 * 256
            midiOutShortMsg hMid, &HB0 + 1 * 256 + .Modulation * 256 * 256
            midiOutShortMsg hMid, &HB0 + 10 * 256 + .Stereo * 256 * 256
            midiOutShortMsg hMid, &HB0 + 91 * 256 + .Revorbe * 256 * 256
            midiOutShortMsg hMid, &HB0 + 93 * 256 + .Corlas * 256 * 256
            midiOutShortMsg hMid, &HC0 + .inst * 256 + 0
            midiOutShortMsg hMid, &H90 + .PlayOn * 256 + .Velosity * 256 * 256
        Else
            midiOutShortMsg hMid, &HE9 + .Picchi * 256 * 256
            midiOutShortMsg hMid, &HB9 + 1 * 256 + .Modulation * 256 * 256
            midiOutShortMsg hMid, &HB9 + 10 * 256 + .Stereo * 256 * 256
            midiOutShortMsg hMid, &HB9 + 91 * 256 + .Revorbe * 256 * 256
            midiOutShortMsg hMid, &HB9 + 93 * 256 + .Corlas * 256 * 256
            midiOutShortMsg hMid, &HC9 + .inst * 256 + 0
            midiOutShortMsg hMid, &H99 + .PlayOn * 256 + .Velosity * 256 * 256
        End If
    End With
End Sub

ユーザー定義型変数の名前は、それぞれMIDI用語です。PlayOnは音階、60が4オクターブ目の"ド"です。

  MIDIデバイスを開いたり閉じたりも忘れないでくださいね。
やり方は、ここのAPI集参照。
それから、MIDIデバイスを使うものが近くにあって、同じタイミングで扱われてると、とっても危ないです。

  このモジュール、あげてもいいですけど、
(って、人から教えてもらって、やっと作ったのにいいのかなぁ…)
そのなかにもまだ上の危険性は残っているので^^;

MSDNでMIDIをひくと、いっぱい出てくると思いますけど…。

編集    削除
こころ  URL  2001-06-05 06:47:49  No: 74389  IP: [192.*.*.*]

midiOutShortMsgではシステムエクスクルーシブが送信できない
(と思う)ので、MIDIファイルを本格的に再生するには
midiOutLongMsgとかも使う必要があると思われます。

Midi専用ならともかく、MIDIを再生しながら・・・っていう場合、
マルチメディアタイマー等を利用して的確に
タイミングをとり、メッセージを送信しなくてはならないでしょう。
(通常のタイマーでは、処理が重いときに音がずれそう・・・)

他に、MidiStreamを使って、
指定サイズを一気に再生させることもできます。
こっちの方が処理が軽く、実用的とは思います。
MidiStreamでの再生をモジュール化したものなら
こころのページにおいてますが、動作は保証しません。
たまに、音がずれたり、原因不明の強制終了もあるような・・・。
いや、たまに・・・ね。

編集    削除
たかみちえ  2001-06-06 00:42:13  No: 74390  IP: [192.*.*.*]

>  midiOutShortMsgではシステムエクスクルーシブが送信できない
>  (と思う)ので、MIDIファイルを本格的に再生するには
>  midiOutLongMsgとかも使う必要があると思われます。
  作曲ソフトの補助ソフトを作ってるくせに、そういうのはあんまりしらないんです。
それに、わたしの使ってるシーケンサは、そこだけ対応してないらしいですから…。

  えっと、でも、単純にキーボードとして、
自分のを使うときもあるし、
Midishortの命令文と、コマンドとか同じですか?
あの…、上に書いた関数でなんですけど。

>  MidiStreamでの再生をモジュール化したものなら
>  こころのページにおいてますが、動作は保証しません。
>  たまに、音がずれたり、原因不明の強制終了もあるような・・・。
  とりあえず、今はほかのことをしなければならないので^^;
後で行かせてもらいます。

  原因不明の強制終了って、わたしのところでもよくあります、
シーケンサ側と、自分のソフト側でのMIDIデバイスの取りまちがいで生じるもので、
MIDIデバイスに送るはずの命令を、ほかのWindowsシステムに送ってしまい、
大変なことになるらしいですね。
うちは強制終了と、メモリを大幅にもって行かれるだけですみましたけど…。

  音がずれるのは、単にCPUに負荷がかかりすぎ、って事はないんでしょうか?
わたしのところではしょっちゅう。

編集    削除
こころ  URL  2001-06-06 05:48:23  No: 74391  IP: [192.*.*.*]

何だか、本題とどんどんかけ離れてますが。

システムエクスクルーシブ用にmidiOutLongを使う、
って感じになると思います。

音ずれの原因は、CPUの負荷ではなく、
単にループ再生に失敗しているだけです。
二度目の再生から、大抵ずれるので・・・。
そこまでわかってるならなおせよって感じですが。

マルチメディアタイマーの分解能を調整してやれば
おとずれも多少は防げませんか?

こちらの強制終了は、まぁそんなややこしいことではないと思います。
強制終了のダイアログがでてる間も音楽鳴ってるし・・・。

編集    削除
α  2001-06-07 03:00:56  No: 74392  IP: [192.*.*.*]

すみません。
>midiOutShortMsg
はどのように宣言すればよいのでしょうか。

編集    削除
こころ  URL  2001-06-07 04:44:35  No: 74393  IP: [192.*.*.*]

APIビューアよりの引用です。
Declare Function midiOutShortMsg Lib "winmm.dll" Alias "midiOutShortMsg" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long

編集    削除
α  2001-06-08 03:34:49  No: 74394  IP: [192.*.*.*]

とっても図々しいのですが、
>midiOutShortMsg
でMIDIをならすにはどのようにすればいいのですか?
まことにすみません。

編集    削除
たかみちえ  2001-06-08 04:03:13  No: 74395  IP: [192.*.*.*]

上で書いた関数を使ってください。
ここのAPIサンプル集に書いてあるやりかたで、デバイスを開きます。
その後、変数に値を設定した後、あの関数を使えば音が鳴ります。
最後にデバイスを閉じてください。

♪初期値(内は説明、","の後のは限界値を示します、それ以上やそれ以下をいれるとハングアップするかも)

Public Type PlayInstulment
PeddalDown As Boolean=False(ダンバーペダル。今のところ使えない^^;)
inst As Long=0(グランドピアノ,いくらでも、127以降は効果不明)
Velosity As Long=100(ベロシティ,127)
PlayOn As Long=60(4オクターブ目のド,96くらい)
Corlas As Long=0(多いほど楽器を大勢で鳴らすことを示す,127)
Revorbe As Long=40(音の残響、0にするとフラットな音になる,127)
Stereo As Long=0(パンポット,-64から+64まで、ここくわしく知りません^^;)
Picchi As Long=0(ピッチ、音の微妙な変化,-240から+240、ここくわしく知りません^^;)
DeviceOn As Boolean=False(デバイスが開かれたかどうか、ここをTrueにしないと、関数が無効になります、
Falseのまま(デバイスを開かないまま)、強引に音を鳴らそうとすると、危険です)
Modulation As Long=0(音のゆらぎ,127)
End Type
hmid As Long=これは一切いじくらなくていいです。ただMIDIデバイスのIDを示すだけ。ここになにか変な値をいれると、とんでもないことになるので注意!

♪引数について
inst As PlayInstulment=APIと同じ要領で、PlayInstulment形変数をいれる
NoteOfDrm As Boolean=Trueにすると楽器ではなくドラムで音をならす。この場合、音階でドラムを操作。

  くわしくはDTMを扱ったホームページや雑誌を見てみてください。
またはわたしの使ってるシーケンサ、Museを使ってみてくださいませ〜♪
(講座をやっている人も、いっぱいいるし)

編集    削除
α  2001-06-12 00:32:04  No: 74396  IP: [192.*.*.*]

Dim Ret As Long
 
 '開く
 Ret = mciSendString("open " &****& " alias MIDIFILE", vbNullString, 0, 0)

で****のところにリソースIDを そのまま 入れればいいのですか?

編集    削除
たかみちえ  URL  2001-06-12 00:47:41  No: 74397  IP: [192.*.*.*]

mciの使いかたですか^^;
たしか、そんな感じでしたねぇ、
リソースを使ったことはないものの、
まあ、そんな感じだと思います。

編集    削除
こころ  URL  2001-06-12 05:16:54  No: 74398  IP: [192.*.*.*]

無理です。
mciではリソースは使用できないはずです。
どうしても、というなら
リソースを一端ファイルに書き出してから
指定するようにして下さい。

編集    削除
α  2001-06-13 00:56:43  No: 74399  IP: [192.*.*.*]

だめかぁ。残念。
色々探してみます。

編集    削除
たかみちえ  URL  2001-06-13 03:29:39  No: 74400  IP: [192.*.*.*]

え?確か前にこころさんが言っていた、
"MidiStream"ではできるんじゃないですか?
それか、MIDIデータを"てんぷ.mid"としてTempフォルダとかに作りだし、
あたらしいのを読みこむごとに上書きとか…。

編集    削除
こころ  URL  2001-06-13 07:37:05  No: 74401  IP: [192.*.*.*]

たかみちえさんの言ってた
midiShortとmidiLongを使ってもいけますよ。

後は、DirectXを使用してもいけるはずです。
やったことはないんですが。

編集    削除
α  2001-06-14 02:23:35  No: 74402  IP: [192.*.*.*]

図々しい事ですが
Midishort
はどのように使用するのですか?

編集    削除
たかみちえ  2001-06-14 02:34:39  No: 74403  IP: [192.*.*.*]

MidiShortOutMsgのことだと思います、たぶん。
APIビューアで、検索して入力してみましょう。
ごくまれに間違ってるらしいですけど^^;
(SendMessageとか、APIサンプルにもう宣言が載ってるものは、そっちをコピーペーストで貼り付けた方が安全です)

  http://take.cjb.net/のTakesoftさんの、
API Viewer Acceleがおすすめです。
なんだか人気も高いとか。
宣言とか、それに関する構造体のはりつけとか、
一回でできるし。

編集    削除
こころ  URL  2001-06-14 03:42:57  No: 74404  IP: [192.*.*.*]

はい、midiOutShortMsg,midiOutLongMsgのことでした。
紛らわしい書き方してすいません。
ちなみに、この2つを使う前にmidiOutOpenやmidiOutPrepareHeader
等のAPIも必要になると思います。(これはmidiStreamでも同じ)
他にも、必要になるAPIがもろもろあり、
結構てごわい奴です、はい。

編集    削除
たかみちえ  URL  2001-07-22 21:20:07  No: 74405  IP: [192.*.*.*]

えーっと、上の方法を使って、リソースからwaveを取ろうとやってみたんですけど、
最初から失敗してしまいました^^;
    Dim res
    res = LoadResData(20, "USERWAVE")
    sndPlaySound res, 7
と、書いたんですけど、
音がなってくれません、エラーは起こらないんですけど…。
でも、"動的配列"というのが気にかかります
res(0)だと、型が一致しないし…。

編集    削除
こころ  URL  2001-07-23 03:43:08  No: 74406  IP: [192.*.*.*]

バリアント型をつかっても大丈夫なんでしょうか?
バリアントはバイト配列を格納していても
メモリ上の構造は純粋なバイト配列とは異なります。
APIが期待するのは純粋なバイト配列なわけで・・・。

VBがAPIに渡す際はバリアント型から
バイト配列に変換してるんでしょうか。

まぁ、それはともかく型が一致しない等は
API宣言次第でどうにでも回避できるのでは?
ByRef xxx As Anyとすれば大抵のデータ型は通りますよ。
もちろん、呼び出す際に適切な指定をしなければいけませんが。

後、第二引数ですが直値で書かれると、フラグ指定が正しいかどうかの
判断が非常に面倒なので、こういう場に書くときは
なるべく定数の方がいいような・・・・。

編集    削除
こころ  URL  2001-07-23 03:44:41  No: 74407  IP: [192.*.*.*]

ちなみに、動的配列だろうがなんだろうが
正常にポインタが渡せていれば問題なく音は鳴ります。

編集    削除
たかみちえ  URL  2001-07-23 04:47:16  No: 74408  IP: [192.*.*.*]

うーん…。Byteだと思ったけど、そうするとエラーになっちゃったので…。
APIじゃなくて、これくらいはVBだけでやりたいんですけど…。
型については、関数のナビゲーション("LoadResData("を引き金にして出るポップヒント)に乗らないんですよね…。



>後、第二引数ですが直値で書かれると、フラグ指定が正しいかどうかの
  フラグ?フラグは使ってませんけど…。
2つ目の引数は、リソースエディタでつけた"値"の文章です。言い忘れてましたけど…。
それから、Ubound(res)で、全部のバイト配列を別のに入れてみたところ、ちゃんと数列が出てきました。

  あ、上のはsndPlaySoundのことですね^^;
SND_ASYNC Or SND_NODEFAULT Or SND_MEMORYです^^;ほんとは。
ミスもあるかもしれないし、こう言うのは定数がいいですね…。

編集    削除
こころ  URL  2001-07-23 11:32:24  No: 74409  IP: [192.*.*.*]

> Byteだと思ったけど、そうするとエラーになっちゃったので…。
どこでどうエラーがでたのかはわかりませんが、
Byte型の動的配列で試してみましたか?
Dim res() As Byte
res = LoadResData(...)
とすれば普通のバイト配列に格納できるでしょう。

> 関数のナビゲーションに乗らないんですよね…。
データ型が明示的にヘルプにでない場合は、
結構色々な型が使えたりします。
LoadResDataの引数等もLong型だったり、String型だったり・・・。

> あ、上のはsndPlaySoundのことですね
そうですね。
VBユーザーは自前で定義しなくてはならないので
面倒で直値を使う人も結構いたりしますが
可読性を考えた場合、やはり定数を指定すべきでしょう。

> Ubound(res)で、全部のバイト配列を別のに入れてみたところ、
> ちゃんと数列が出てきました。
UboundはVBの関数ですからねぇ・・・。
正確にどうだったかは覚えてませんが、
バリアント型では内部にどういったデータを格納しているか等の
ヘッダー情報みたいなものが存在します。
参照渡しでバリアント型を指定した場合、
このヘッダー情報からのポインタがAPIに渡されてしまった場合、
当然ながら、正常に動作はしません。
VBがバリアント型への参照の場合はバリアント型変数内部に
格納されている実データへの参照に置き換えているのであれば
特に問題なく動作するとは思うのですが
こころはこの辺の確認は行っていません。
たかみちえさんは、その辺の動作について確認はされたのでしょうか?

編集    削除
たかみちえ  URL  2001-07-24 23:16:39  No: 74410  IP: [192.*.*.*]

>とすれば普通のバイト配列に格納できるでしょう。
  格納はできましたけど…。
あとは、どうやって再生するかです。
sndPlaysound res,〜〜?
sndPlaysound res(0),〜〜?
sndPlaysound res(),〜〜?
うーん、いろいろ試しては見たんですけど…。

>> あ、上のはsndPlaySoundのことですね
>そうですね。
>VBユーザーは自前で定義しなくてはならないので
>面倒で直値を使う人も結構いたりしますが
>可読性を考えた場合、やはり定数を指定すべきでしょう。
  別に宣言するのはめんどくさくないです。
  sndかなにかいれて、定数を探して、コピーすればいいんですから。けど、書くのが面倒ですからね…。

>VBがバリアント型への参照の場合はバリアント型変数内部に
>格納されている実データへの参照に置き換えているのであれば
>特に問題なく動作するとは思うのですが
>こころはこの辺の確認は行っていません。
>たかみちえさんは、その辺の動作について確認はされたのでしょうか?
  別に確認も何もしてませんけど…。
あ、いちおう変数を、Msgboxで見てみましたけど…。
"$$?"という3文字が出てきました。なんでしょ?
リソースの設定が間違ってたんでしょうか?
あの標準のリソースエディタじゃ、よくわからないですからねぇ…。

編集    削除
たかみちえ  URL  2001-07-25 06:15:40  No: 74411  IP: [192.*.*.*]

wavファイルをバイナリで読みこんで、表示させてみました。
方法はここhttp://ww2.tiki.ne.jp/~kotb/で見たとおりです。
で、また同じ"$$?"が出てきて、それで音はならせませんでした。
なので、snd〜〜の書きまちがいだと思います。
さて、どうすればいいんでしょう…。

編集    削除
こころ  URL  2001-07-25 08:37:36  No: 74412  IP: [192.*.*.*]

面倒なので試してみました。
バリアント型は使わないようにして下さい。
バイト配列に読み込んで再生すると成功するのに
バリアント型で同様のことをすると再生できません。
やはり、VBでのデータ変換は行ってくれないようです。

VBで扱えるからと言ってAPIで使えるわけではありません。
バリアント型はAPIが前提としているC言語には存在しない
データ型なので、当然こういう自体はあり得ます。

編集    削除
たかみちえ  URL  2001-07-26 19:38:20  No: 74413  IP: [192.*.*.*]

引数をAnyに、もどりちをLongに変えたら再生できました。
ありがとうございます。

  そうそう、MIDIをリソースに格納することですけど、
一般のシーケンサーを作ってる人は、普通にしてることじゃないでしょうか?

編集    削除